Refactoring and flexibility changes
* Split game module into game and game_interface * Move core_lib to corelib * Move miniwindow to corelib * Introduce init.lua script for initializing the client, giving much more flexibility * OTClient is no longer Application derived and is much simpler
|
@ -9,7 +9,9 @@ SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-Map=otclient.map")
|
||||||
|
|
||||||
OPTION(PCH "Use precompiled header (speed up compile)" OFF)
|
OPTION(PCH "Use precompiled header (speed up compile)" OFF)
|
||||||
|
|
||||||
SET(executable_SOURCES src/main.cpp)
|
SET(executable_SOURCES
|
||||||
|
src/main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
# add executable icon for win32 platforms
|
# add executable icon for win32 platforms
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
-- this is the first file executed when the application starts
|
||||||
|
-- we have to load the first modules form here
|
||||||
|
|
||||||
|
-- setup application name and version
|
||||||
|
g_app.setName('OTClient')
|
||||||
|
g_app.setCompactName('otclient')
|
||||||
|
g_app.setVersion('0.4.0_dev')
|
||||||
|
|
||||||
|
-- setup logger
|
||||||
|
g_logger.setLogFile(g_resources.getWorkDir() .. g_app.getCompactName() .. ".log")
|
||||||
|
|
||||||
|
-- print first terminal message
|
||||||
|
g_logger.info(g_app.getName() .. ' ' .. g_app.getVersion() .. ' (rev ' .. g_app.getBuildRevision() .. ') built on ' .. g_app.getBuildDate())
|
||||||
|
|
||||||
|
-- add modules directory to the search path
|
||||||
|
if not g_resources.addToSearchPath(g_resources.getWorkDir() .. "modules", true) then
|
||||||
|
g_logger.fatal("Unable to add modules directory to the search path.")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- try to add addons path too
|
||||||
|
g_resources.addToSearchPath(g_resources.getWorkDir() .. "addons", true)
|
||||||
|
|
||||||
|
-- setup directory for saving configurations
|
||||||
|
g_resources.setupWriteDir(g_app.getCompactName())
|
||||||
|
|
||||||
|
-- load configurations
|
||||||
|
g_configs.load("/config.otml")
|
||||||
|
|
||||||
|
g_modules.discoverModules()
|
||||||
|
|
||||||
|
-- core modules 0-99
|
||||||
|
g_modules.autoLoadModules(99);
|
||||||
|
g_modules.ensureModuleLoaded("corelib")
|
||||||
|
|
||||||
|
-- client modules 100-499
|
||||||
|
g_modules.autoLoadModules(499);
|
||||||
|
g_modules.ensureModuleLoaded("client")
|
||||||
|
|
||||||
|
-- game modules 500-999
|
||||||
|
g_modules.autoLoadModules(999);
|
||||||
|
g_modules.ensureModuleLoaded("game")
|
||||||
|
|
||||||
|
-- addons 1000-9999
|
||||||
|
g_modules.autoLoadModules(9999)
|
||||||
|
|
||||||
|
if g_resources.fileExists("/otclientrc.lua") then
|
||||||
|
dofile("/otclientrc.lua")
|
||||||
|
end
|
|
@ -1,8 +1,8 @@
|
||||||
Client = {}
|
Client = {}
|
||||||
|
|
||||||
function Client.reloadScripts()
|
function Client.reloadScripts()
|
||||||
dofile '/otclientrc'
|
|
||||||
reloadModules()
|
reloadModules()
|
||||||
|
dofile '/otclientrc'
|
||||||
local message = tr('All modules and scripts were reloaded.')
|
local message = tr('All modules and scripts were reloaded.')
|
||||||
TextMessage.displayEventAdvance(message)
|
TextMessage.displayEventAdvance(message)
|
||||||
print(message)
|
print(message)
|
||||||
|
@ -35,16 +35,13 @@ function Client.init()
|
||||||
g_window.setTitle('OTClient')
|
g_window.setTitle('OTClient')
|
||||||
g_window.setIcon(resolvepath('clienticon.png'))
|
g_window.setIcon(resolvepath('clienticon.png'))
|
||||||
|
|
||||||
-- show the only window after the first frame is rendered
|
addEvent(function()
|
||||||
scheduleEvent(function()
|
|
||||||
scheduleEvent(function()
|
scheduleEvent(function()
|
||||||
g_window.show()
|
|
||||||
|
|
||||||
-- Play startup music (The Silver Tree, by Mattias Westlund)
|
-- Play startup music (The Silver Tree, by Mattias Westlund)
|
||||||
g_sounds.playMusic("startup.ogg", 3)
|
g_sounds.playMusic("startup.ogg", 3)
|
||||||
connect(g_game, { onGameStart = function() g_sounds.stopMusic(3) end })
|
connect(g_game, { onGameStart = function() g_sounds.stopMusic(3) end })
|
||||||
connect(g_game, { onGameEnd= function() g_sounds.playMusic("startup.ogg", 3) end })
|
connect(g_game, { onGameEnd= function() g_sounds.playMusic("startup.ogg", 3) end })
|
||||||
end, 0)
|
end, 100)
|
||||||
end, 0)
|
end, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@ Module
|
||||||
description: Initialize the client and setups its main window
|
description: Initialize the client and setups its main window
|
||||||
author: edubart
|
author: edubart
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
autoload: true
|
|
||||||
autoload-priority: 100
|
|
||||||
reloadable: false
|
reloadable: false
|
||||||
|
|
||||||
load-later:
|
load-later:
|
||||||
|
|
|
@ -47,9 +47,9 @@ function Locales.init()
|
||||||
|
|
||||||
local userLocaleName = Settings.get('locale')
|
local userLocaleName = Settings.get('locale')
|
||||||
if userLocaleName and Locales.setLocale(userLocaleName) then
|
if userLocaleName and Locales.setLocale(userLocaleName) then
|
||||||
--info('Using configured locale: ' .. userLocaleName)
|
pdebug('Using configured locale: ' .. userLocaleName)
|
||||||
else
|
else
|
||||||
--info('Using default locale: ' .. defaultLocaleName)
|
pdebug('Using default locale: ' .. defaultLocaleName)
|
||||||
Locales.setLocale(defaultLocaleName)
|
Locales.setLocale(defaultLocaleName)
|
||||||
Settings.set('locale', defaultLocaleName)
|
Settings.set('locale', defaultLocaleName)
|
||||||
end
|
end
|
||||||
|
@ -100,7 +100,7 @@ end
|
||||||
function Locales.setLocale(name)
|
function Locales.setLocale(name)
|
||||||
local locale = installedLocales[name]
|
local locale = installedLocales[name]
|
||||||
if not locale then
|
if not locale then
|
||||||
warning("Locale " .. name .. ' does not exist.')
|
pwarning("Locale " .. name .. ' does not exist.')
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
currentLocale = locale
|
currentLocale = locale
|
||||||
|
@ -125,7 +125,7 @@ function tr(text, ...)
|
||||||
local translation = currentLocale.translation[text]
|
local translation = currentLocale.translation[text]
|
||||||
if not translation then
|
if not translation then
|
||||||
if currentLocale.name ~= defaultLocaleName then
|
if currentLocale.name ~= defaultLocaleName then
|
||||||
warning('Unable to translate: \"' .. text .. '\"')
|
pwarning('Unable to translate: \"' .. text .. '\"')
|
||||||
end
|
end
|
||||||
translation = text
|
translation = text
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,7 +15,8 @@ local function onSkinComboBoxOptionChange(self, optionText, optionData)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function getSkinPath(name)
|
local function getSkinPath(name)
|
||||||
return g_modules.getModulesPath() .. g_lua.getCurrentSourcePath(0) .. '/skins/' .. string.lower(name) .. '/'
|
local current = getfsrcpath()
|
||||||
|
return g_resources.getRealDir(current) .. current .. '/skins/' .. string.lower(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- public functions
|
-- public functions
|
||||||
|
@ -30,9 +31,9 @@ function Skins.init()
|
||||||
|
|
||||||
local userSkinName = Settings.get('skin')
|
local userSkinName = Settings.get('skin')
|
||||||
if userSkinName and Skins.setSkin(userSkinName) then
|
if userSkinName and Skins.setSkin(userSkinName) then
|
||||||
info('Using configured skin: ' .. userSkinName)
|
pdebug('Using configured skin: ' .. userSkinName)
|
||||||
else
|
else
|
||||||
info('Using default skin: ' .. defaultSkinName)
|
pdebug('Using default skin: ' .. defaultSkinName)
|
||||||
Skins.setSkin(defaultSkinName)
|
Skins.setSkin(defaultSkinName)
|
||||||
Settings.set('skin', defaultSkinName)
|
Settings.set('skin', defaultSkinName)
|
||||||
end
|
end
|
||||||
|
@ -65,7 +66,7 @@ function Skins.installSkin(skin)
|
||||||
end
|
end
|
||||||
|
|
||||||
if installedSkins[skin.name] then
|
if installedSkins[skin.name] then
|
||||||
warning(skin.name .. ' has been replaced.')
|
pwarning(skin.name .. ' has been replaced.')
|
||||||
end
|
end
|
||||||
|
|
||||||
installedSkins[skin.name] = skin
|
installedSkins[skin.name] = skin
|
||||||
|
@ -79,7 +80,7 @@ end
|
||||||
function Skins.setSkin(name)
|
function Skins.setSkin(name)
|
||||||
local skin = installedSkins[name]
|
local skin = installedSkins[name]
|
||||||
if not skin then
|
if not skin then
|
||||||
warning("Skin " .. name .. ' does not exist.')
|
pwarning("Skin " .. name .. ' does not exist.')
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 385 B After Width: | Height: | Size: 385 B |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 763 B After Width: | Height: | Size: 763 B |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
@ -1,10 +1,8 @@
|
||||||
Module
|
Module
|
||||||
name: core_lib
|
name: corelib
|
||||||
description: Contains core lua classes, functions and constants used by other modules
|
description: Contains core lua classes, functions and constants used by other modules
|
||||||
author: OTClient team
|
author: OTClient team
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
autoload: true
|
|
||||||
autoload-priority: 10
|
|
||||||
reloadable: false
|
reloadable: false
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
|
@ -15,7 +15,9 @@ function translateKeyCombo(keyCombo)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function retranslateKeyComboDesc(keyComboDesc)
|
local function retranslateKeyComboDesc(keyComboDesc)
|
||||||
if keyComboDesc == nil then return nil end
|
if keyComboDesc == nil then
|
||||||
|
error('Unable to translate key combo \'' .. keyComboDesc .. '\'')
|
||||||
|
end
|
||||||
local keyCombo = {}
|
local keyCombo = {}
|
||||||
for i,currentKeyDesc in ipairs(keyComboDesc:split('+')) do
|
for i,currentKeyDesc in ipairs(keyComboDesc:split('+')) do
|
||||||
for keyCode, keyDesc in pairs(KeyCodeDescs) do
|
for keyCode, keyDesc in pairs(KeyCodeDescs) do
|
||||||
|
@ -97,11 +99,7 @@ function Keyboard.bindKeyDown(keyComboDesc, callback, widget)
|
||||||
widget = widget or rootWidget
|
widget = widget or rootWidget
|
||||||
connectKeyDownEvent(widget)
|
connectKeyDownEvent(widget)
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if keyComboDesc then
|
widget.boundKeyDownCombos[keyComboDesc] = callback
|
||||||
widget.boundKeyDownCombos[keyComboDesc] = callback
|
|
||||||
else
|
|
||||||
error('key combo \'' .. keyComboDesc .. '\' is failed')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function Keyboard.bindKeyPress(keyComboDesc, callback, widget, autoRepeatDelay)
|
function Keyboard.bindKeyPress(keyComboDesc, callback, widget, autoRepeatDelay)
|
||||||
|
@ -109,12 +107,8 @@ function Keyboard.bindKeyPress(keyComboDesc, callback, widget, autoRepeatDelay)
|
||||||
widget = widget or rootWidget
|
widget = widget or rootWidget
|
||||||
connectKeyPressEvent(widget)
|
connectKeyPressEvent(widget)
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if keyComboDesc then
|
widget.boundKeyPressCombos[keyComboDesc] = { callback = callback, autoRepeatDelay = autoRepeatDelay }
|
||||||
widget.boundKeyPressCombos[keyComboDesc] = { callback = callback, autoRepeatDelay = autoRepeatDelay }
|
widget:setAutoRepeatDelay(math.min(autoRepeatDelay, widget:getAutoRepeatDelay()))
|
||||||
widget:setAutoRepeatDelay(math.min(autoRepeatDelay, widget:getAutoRepeatDelay()))
|
|
||||||
else
|
|
||||||
error('key combo \'' .. keyComboDesc .. '\' is failed')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function Keyboard.unbindKeyDown(keyComboDesc, widget)
|
function Keyboard.unbindKeyDown(keyComboDesc, widget)
|
|
@ -45,7 +45,7 @@ function ToolTip.init()
|
||||||
onHoverChange = onWidgetHoverChange})
|
onHoverChange = onWidgetHoverChange})
|
||||||
|
|
||||||
addEvent(function()
|
addEvent(function()
|
||||||
toolTipLabel = createWidget('Label', rootWidget)
|
toolTipLabel = createWidget('UILabel', rootWidget)
|
||||||
toolTipLabel:setId('toolTip')
|
toolTipLabel:setId('toolTip')
|
||||||
toolTipLabel:setBackgroundColor('#111111cc')
|
toolTipLabel:setBackgroundColor('#111111cc')
|
||||||
toolTipLabel:setTextAlign(AlignCenter)
|
toolTipLabel:setTextAlign(AlignCenter)
|
|
@ -6,18 +6,27 @@ function print(...)
|
||||||
g_logger.log(LogInfo, msg)
|
g_logger.log(LogInfo, msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
function info(msg)
|
function pinfo(msg)
|
||||||
g_logger.log(LogInfo, msg)
|
g_logger.log(LogInfo, msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
function warning(msg)
|
function perror(msg)
|
||||||
|
g_logger.log(LogError, msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
function pwarning(msg)
|
||||||
g_logger.log(LogWarning, msg)
|
g_logger.log(LogWarning, msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function pdebug(msg)
|
||||||
|
g_logger.log(LogDebug, msg)
|
||||||
|
end
|
||||||
|
|
||||||
function fatal(msg)
|
function fatal(msg)
|
||||||
g_logger.log(LogFatal, msg)
|
g_logger.log(LogFatal, msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
exit = g_app.exit
|
exit = g_app.exit
|
||||||
quit = g_app.exit
|
quit = g_app.exit
|
||||||
|
|
||||||
|
@ -161,3 +170,7 @@ function signalcall(param, ...)
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function tr(s)
|
||||||
|
return s
|
||||||
|
end
|
|
@ -1,15 +1,16 @@
|
||||||
Module
|
Module
|
||||||
name: game
|
name: game
|
||||||
description: Create the game interface, where the ingame stuff starts
|
description: Contains game related classes
|
||||||
author: OTClient team
|
author: OTClient team
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- client_extended
|
- client_extended
|
||||||
- game_tibiafiles
|
|
||||||
- client_background
|
- client_background
|
||||||
|
- game_tibiafiles
|
||||||
|
|
||||||
load-later:
|
load-later:
|
||||||
|
- game_interface
|
||||||
- game_textmessage
|
- game_textmessage
|
||||||
- game_console
|
- game_console
|
||||||
- game_outfit
|
- game_outfit
|
||||||
|
@ -31,26 +32,9 @@ Module
|
||||||
- game_shaders
|
- game_shaders
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
importStyle 'styles/items.otui'
|
|
||||||
importStyle 'styles/creatures.otui'
|
|
||||||
importStyle 'styles/miniwindow.otui'
|
|
||||||
importStyle 'styles/countwindow.otui'
|
|
||||||
|
|
||||||
dofile 'const'
|
dofile 'const'
|
||||||
|
|
||||||
dofile 'protocollogin'
|
dofile 'protocollogin'
|
||||||
|
|
||||||
dofile 'widgets/uigamemap'
|
|
||||||
dofile 'widgets/uiitem'
|
|
||||||
dofile 'widgets/uiminiwindow'
|
|
||||||
dofile 'widgets/uiminiwindowcontainer'
|
|
||||||
|
|
||||||
dofile 'creature'
|
dofile 'creature'
|
||||||
dofile 'player'
|
dofile 'player'
|
||||||
|
|
||||||
dofile 'gameinterface'
|
|
||||||
|
|
||||||
GameInterface.init()
|
|
||||||
|
|
||||||
@onUnload: |
|
|
||||||
GameInterface.terminate()
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ Module
|
||||||
icon: battle.png
|
icon: battle.png
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'battle'
|
dofile 'battle'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'bugreport'
|
dofile 'bugreport'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'combatcontrols'
|
dofile 'combatcontrols'
|
||||||
|
|
|
@ -106,7 +106,7 @@ local function onCreatureSpeak(name, level, speaktype, message, channelId, creat
|
||||||
Console.addText(composedMessage, speaktype, channel, name)
|
Console.addText(composedMessage, speaktype, channel, name)
|
||||||
elseif channelId ~= 0 then
|
elseif channelId ~= 0 then
|
||||||
-- server sent a message on a channel that is not open
|
-- server sent a message on a channel that is not open
|
||||||
warning('message in channel id ' .. channelId .. ' which is unknown, this is a server bug, relogin if you want to see messages in this channel')
|
pwarning('message in channel id ' .. channelId .. ' which is unknown, this is a server bug, relogin if you want to see messages in this channel')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'console'
|
dofile 'console'
|
||||||
|
|
|
@ -17,7 +17,7 @@ ContainerWindow < MiniWindow
|
||||||
anchors.right: minimizeButton.left
|
anchors.right: minimizeButton.left
|
||||||
margin-right: 3
|
margin-right: 3
|
||||||
size: 14 14
|
size: 14 14
|
||||||
image-source: /game/images/miniwindowbuttons.png
|
image-source: /images/miniwindowbuttons.png
|
||||||
image-clip: 42 0 14 14
|
image-clip: 42 0 14 14
|
||||||
|
|
||||||
$hover:
|
$hover:
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'containers'
|
dofile 'containers'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'healthbar'
|
dofile 'healthbar'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'hotkeys_manager'
|
dofile 'hotkeys_manager'
|
||||||
|
|
|
@ -25,7 +25,7 @@ function GameInterface.init()
|
||||||
gameLeftPanel = gameRootPanel:getChildById('gameLeftPanel')
|
gameLeftPanel = gameRootPanel:getChildById('gameLeftPanel')
|
||||||
gameBottomPanel = gameRootPanel:getChildById('gameBottomPanel')
|
gameBottomPanel = gameRootPanel:getChildById('gameBottomPanel')
|
||||||
|
|
||||||
logoutButton = TopMenu.addRightButton('logoutButton', 'Logout', 'images/logout.png', GameInterface.tryLogout)
|
logoutButton = TopMenu.addRightButton('logoutButton', 'Logout', '/images/logout.png', GameInterface.tryLogout)
|
||||||
logoutButton:hide()
|
logoutButton:hide()
|
||||||
|
|
||||||
Keyboard.bindKeyPress('Up', function() g_game.walk(North) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
Keyboard.bindKeyPress('Up', function() g_game.walk(North) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
|
@ -1,15 +1,15 @@
|
||||||
GameSidePanel < UIMiniWindowContainer
|
GameSidePanel < UIMiniWindowContainer
|
||||||
image-source: images/sidepanel.png
|
image-source: /images/sidepanel.png
|
||||||
image-border: 4
|
image-border: 4
|
||||||
padding: 4
|
padding: 4
|
||||||
|
|
||||||
GameBottomPanel < Panel
|
GameBottomPanel < Panel
|
||||||
image-source: images/bottompanel.png
|
image-source: /images/bottompanel.png
|
||||||
image-border: 4
|
image-border: 4
|
||||||
|
|
||||||
GameMapPanel < UIGameMap
|
GameMapPanel < UIGameMap
|
||||||
padding: 4
|
padding: 4
|
||||||
image-source: images/mappanel.png
|
image-source: /images/mappanel.png
|
||||||
image-border: 4
|
image-border: 4
|
||||||
|
|
||||||
UIWidget
|
UIWidget
|
|
@ -0,0 +1,21 @@
|
||||||
|
Module
|
||||||
|
name: game_interface
|
||||||
|
description: Create the game interface, where the ingame stuff starts
|
||||||
|
author: OTClient team
|
||||||
|
website: www.otclient.info
|
||||||
|
|
||||||
|
@onLoad: |
|
||||||
|
importStyle 'styles/items.otui'
|
||||||
|
importStyle 'styles/creatures.otui'
|
||||||
|
importStyle 'styles/miniwindow.otui'
|
||||||
|
importStyle 'styles/countwindow.otui'
|
||||||
|
|
||||||
|
dofile 'widgets/uigamemap'
|
||||||
|
dofile 'widgets/uiitem'
|
||||||
|
|
||||||
|
dofile 'gameinterface'
|
||||||
|
|
||||||
|
GameInterface.init()
|
||||||
|
|
||||||
|
@onUnload: |
|
||||||
|
GameInterface.terminate()
|
|
@ -1,6 +1,6 @@
|
||||||
Item < UIItem
|
Item < UIItem
|
||||||
size: 34 34
|
size: 34 34
|
||||||
padding: 1
|
padding: 1
|
||||||
image-source: /game/images/item.png
|
image-source: /images/item.png
|
||||||
font: verdana-11px-rounded
|
font: verdana-11px-rounded
|
||||||
border-color: white
|
border-color: white
|
|
@ -5,7 +5,7 @@ MiniWindow < UIMiniWindow
|
||||||
height: 200
|
height: 200
|
||||||
text-offset: 24 5
|
text-offset: 24 5
|
||||||
text-align: topLeft
|
text-align: topLeft
|
||||||
image-source: /game/images/miniwindow.png
|
image-source: /images/miniwindow.png
|
||||||
image-border: 4
|
image-border: 4
|
||||||
image-border-top: 23
|
image-border-top: 23
|
||||||
image-border-bottom: 4
|
image-border-bottom: 4
|
||||||
|
@ -22,7 +22,7 @@ MiniWindow < UIMiniWindow
|
||||||
margin-top: 5
|
margin-top: 5
|
||||||
margin-right: 5
|
margin-right: 5
|
||||||
size: 14 14
|
size: 14 14
|
||||||
image-source: /game/images/miniwindowbuttons.png
|
image-source: /images/miniwindowbuttons.png
|
||||||
image-clip: 28 0 14 14
|
image-clip: 28 0 14 14
|
||||||
|
|
||||||
$hover:
|
$hover:
|
||||||
|
@ -37,7 +37,7 @@ MiniWindow < UIMiniWindow
|
||||||
anchors.right: closeButton.left
|
anchors.right: closeButton.left
|
||||||
margin-right: 3
|
margin-right: 3
|
||||||
size: 14 14
|
size: 14 14
|
||||||
image-source: /game/images/miniwindowbuttons.png
|
image-source: /images/miniwindowbuttons.png
|
||||||
image-clip: 0 0 14 14
|
image-clip: 0 0 14 14
|
||||||
|
|
||||||
$hover:
|
$hover:
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'inventory'
|
dofile 'inventory'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'minimap'
|
dofile 'minimap'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'npctrade'
|
dofile 'npctrade'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'outfit'
|
dofile 'outfit'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'playertrade'
|
dofile 'playertrade'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'questlog'
|
dofile 'questlog'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'ruleviolation'
|
dofile 'ruleviolation'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'shaders'
|
dofile 'shaders'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'skills'
|
dofile 'skills'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'textbooks'
|
dofile 'textbooks'
|
||||||
|
|
|
@ -5,7 +5,7 @@ Module
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- game
|
- game_interface
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
dofile 'textmessage'
|
dofile 'textmessage'
|
||||||
|
|
|
@ -10,11 +10,7 @@ OPTION(CRASH_HANDLER "Generate crash reports" ON)
|
||||||
OPTION(LUAJIT "Use lua jit" OFF)
|
OPTION(LUAJIT "Use lua jit" OFF)
|
||||||
SET(OPENGLES "OFF" CACHE "Use OpenGL ES 1.0 or 2.0 (for mobiles devices)" STRING)
|
SET(OPENGLES "OFF" CACHE "Use OpenGL ES 1.0 or 2.0 (for mobiles devices)" STRING)
|
||||||
SET(BUILD_REVISION "custom" CACHE "Git revision string (intended for releases)" STRING)
|
SET(BUILD_REVISION "custom" CACHE "Git revision string (intended for releases)" STRING)
|
||||||
|
SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE "Build type (Release, MinSizeRel, RelWithDebInfo or Debug)" STRING)
|
||||||
# set debug as default build type
|
|
||||||
IF(NOT CMAKE_BUILD_TYPE)
|
|
||||||
SET(CMAKE_BUILD_TYPE RelWithDebInfo)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
SET(ARCH_FLAGS "-m64 -march=x86-64 -mtune=generic")
|
SET(ARCH_FLAGS "-m64 -march=x86-64 -mtune=generic")
|
||||||
|
@ -26,10 +22,11 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNS_FLAGS} ${ARCH_
|
||||||
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
|
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
|
||||||
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -ggdb -fno-omit-frame-pointer")
|
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -ggdb -fno-omit-frame-pointer")
|
||||||
SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
|
SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
|
||||||
|
SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os")
|
||||||
|
|
||||||
SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -static-libgcc -static-libstdc++ -Wl,--as-needed")
|
SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -static-libgcc -static-libstdc++ -Wl,--as-needed")
|
||||||
|
|
||||||
IF(CMAKE_BUILD_TYPE STREQUAL "Release")
|
IF(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
|
||||||
SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-s")
|
SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-s")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#include <framework/luascript/luainterface.h>
|
#include <framework/luascript/luainterface.h>
|
||||||
#include <framework/platform/crashhandler.h>
|
#include <framework/platform/crashhandler.h>
|
||||||
|
|
||||||
Application *g_app = nullptr;
|
Application g_app;
|
||||||
|
|
||||||
void exitSignalHandler(int sig)
|
void exitSignalHandler(int sig)
|
||||||
{
|
{
|
||||||
|
@ -53,18 +53,14 @@ void exitSignalHandler(int sig)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::Application(const std::string& appName)
|
Application::Application()
|
||||||
{
|
{
|
||||||
g_app = this;
|
m_appName = "application";
|
||||||
m_appName = appName;
|
m_appCompactName = "app";
|
||||||
|
m_appVersion = "none";
|
||||||
m_foregroundFrameCounter.setMaxFps(60);
|
m_foregroundFrameCounter.setMaxFps(60);
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application()
|
|
||||||
{
|
|
||||||
g_app = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Application::init(const std::vector<std::string>& args)
|
void Application::init(const std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
// capture exit signals
|
// capture exit signals
|
||||||
|
@ -75,24 +71,28 @@ void Application::init(const std::vector<std::string>& args)
|
||||||
installCrashHandler();
|
installCrashHandler();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// initialize lua
|
std::string startupOptions;
|
||||||
g_lua.init();
|
for(uint i=1;i<args.size();++i) {
|
||||||
registerLuaFunctions();
|
const std::string& arg = args[i];
|
||||||
|
startupOptions += " ";
|
||||||
|
startupOptions += arg;
|
||||||
|
}
|
||||||
|
if(startupOptions.length() > 0)
|
||||||
|
g_logger.info(stdext::format("Startup options: %s", startupOptions));
|
||||||
|
|
||||||
|
m_startupOptions = startupOptions;
|
||||||
|
|
||||||
// initialize resources
|
// initialize resources
|
||||||
g_resources.init(args[0].c_str());
|
g_resources.init(args[0].c_str());
|
||||||
|
|
||||||
// setup configs write directory
|
// initialize lua
|
||||||
if(!g_resources.setupWriteDir(m_appName))
|
g_lua.init();
|
||||||
g_logger.error("Could not setup write directory");
|
registerLuaFunctions();
|
||||||
|
|
||||||
// load configs
|
// initialize ui
|
||||||
if(!g_configs.load("/config.otml"))
|
|
||||||
g_logger.info("Using default configurations.");
|
|
||||||
|
|
||||||
// setup platform window
|
|
||||||
g_ui.init();
|
g_ui.init();
|
||||||
|
|
||||||
|
// setup platform window
|
||||||
g_window.init();
|
g_window.init();
|
||||||
g_window.hide();
|
g_window.hide();
|
||||||
g_window.setOnResize(std::bind(&Application::resize, this, std::placeholders::_1));
|
g_window.setOnResize(std::bind(&Application::resize, this, std::placeholders::_1));
|
||||||
|
@ -105,14 +105,9 @@ void Application::init(const std::vector<std::string>& args)
|
||||||
// initialize sound
|
// initialize sound
|
||||||
g_sounds.init();
|
g_sounds.init();
|
||||||
|
|
||||||
// fire first resize
|
// fire first resize event
|
||||||
resize(g_window.getSize());
|
resize(g_window.getSize());
|
||||||
|
|
||||||
// display window when the application starts running
|
|
||||||
//g_eventDispatcher.addEvent([]{ g_window.show(); });
|
|
||||||
|
|
||||||
g_modules.discoverModulesPath();
|
|
||||||
|
|
||||||
m_initialized = true;
|
m_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,15 +127,15 @@ void Application::deinit()
|
||||||
|
|
||||||
// poll remaining events
|
// poll remaining events
|
||||||
poll();
|
poll();
|
||||||
|
|
||||||
// destroy any remaining widget
|
|
||||||
g_ui.terminate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::terminate()
|
void Application::terminate()
|
||||||
{
|
{
|
||||||
assert(m_initialized);
|
assert(m_initialized);
|
||||||
|
|
||||||
|
// destroy any remaining widget
|
||||||
|
g_ui.terminate();
|
||||||
|
|
||||||
// terminate network
|
// terminate network
|
||||||
Connection::terminate();
|
Connection::terminate();
|
||||||
|
|
||||||
|
@ -164,7 +159,7 @@ void Application::terminate()
|
||||||
g_graphics.terminate();
|
g_graphics.terminate();
|
||||||
g_window.terminate();
|
g_window.terminate();
|
||||||
|
|
||||||
g_logger.info("Application ended successfully.");
|
g_logger.debug("Application ended successfully.");
|
||||||
|
|
||||||
m_terminated = true;
|
m_terminated = true;
|
||||||
}
|
}
|
||||||
|
@ -184,6 +179,9 @@ void Application::run()
|
||||||
// first clock update
|
// first clock update
|
||||||
g_clock.update();
|
g_clock.update();
|
||||||
|
|
||||||
|
// show the application window
|
||||||
|
g_window.show();
|
||||||
|
|
||||||
while(!m_stopping) {
|
while(!m_stopping) {
|
||||||
// poll all events before rendering
|
// poll all events before rendering
|
||||||
poll();
|
poll();
|
||||||
|
|
|
@ -34,29 +34,31 @@ class Application
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Application(const std::string& appName);
|
Application();
|
||||||
~Application();
|
|
||||||
|
|
||||||
virtual void init(const std::vector<std::string>& args);
|
void init(const std::vector<std::string>& args);
|
||||||
virtual void registerLuaFunctions();
|
void deinit();
|
||||||
virtual void deinit();
|
void terminate();
|
||||||
virtual void terminate();
|
void run();
|
||||||
virtual void run();
|
void exit();
|
||||||
virtual void exit();
|
void poll();
|
||||||
virtual void poll();
|
void close();
|
||||||
virtual void close();
|
|
||||||
|
|
||||||
bool willRepaint() { return m_mustRepaint; }
|
bool willRepaint() { return m_mustRepaint; }
|
||||||
void repaint() { m_mustRepaint = true; }
|
void repaint() { m_mustRepaint = true; }
|
||||||
|
|
||||||
void setForegroundPaneMaxFps(int maxFps) { m_foregroundFrameCounter.setMaxFps(maxFps); }
|
void setForegroundPaneMaxFps(int maxFps) { m_foregroundFrameCounter.setMaxFps(maxFps); }
|
||||||
void setBackgroundPaneMaxFps(int maxFps) { m_backgroundFrameCounter.setMaxFps(maxFps); }
|
void setBackgroundPaneMaxFps(int maxFps) { m_backgroundFrameCounter.setMaxFps(maxFps); }
|
||||||
|
void setName(const std::string& name) { m_appName = name; }
|
||||||
|
void setCompactName(const std::string& compactName) { m_appCompactName = compactName; }
|
||||||
|
void setVersion(const std::string& version) { m_appVersion = version; }
|
||||||
|
|
||||||
bool isRunning() { return m_running; }
|
bool isRunning() { return m_running; }
|
||||||
bool isStopping() { return m_stopping; }
|
bool isStopping() { return m_stopping; }
|
||||||
bool isTermianted() { return m_terminated; }
|
bool isTermianted() { return m_terminated; }
|
||||||
bool isOnInputEvent() { return m_onInputEvent; }
|
bool isOnInputEvent() { return m_onInputEvent; }
|
||||||
const std::string& getName() { return m_appName; }
|
const std::string& getName() { return m_appName; }
|
||||||
|
const std::string& getCompactName() { return m_appCompactName; }
|
||||||
const std::string& getVersion() { return m_appVersion; }
|
const std::string& getVersion() { return m_appVersion; }
|
||||||
|
|
||||||
int getForegroundPaneFps() { return m_foregroundFrameCounter.getLastFps(); }
|
int getForegroundPaneFps() { return m_foregroundFrameCounter.getLastFps(); }
|
||||||
|
@ -67,14 +69,17 @@ public:
|
||||||
std::string getBuildDate() { return BUILD_DATE; }
|
std::string getBuildDate() { return BUILD_DATE; }
|
||||||
std::string getBuildRevision() { return BUILD_REVISION; }
|
std::string getBuildRevision() { return BUILD_REVISION; }
|
||||||
std::string getBuildType() { return BUILD_TYPE; }
|
std::string getBuildType() { return BUILD_TYPE; }
|
||||||
|
std::string getStartupOptions() { return m_startupOptions; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void resize(const Size& size);
|
void resize(const Size& size);
|
||||||
virtual void inputEvent(const InputEvent& event);
|
void inputEvent(const InputEvent& event);
|
||||||
|
void registerLuaFunctions();
|
||||||
|
|
||||||
std::string m_appName;
|
std::string m_appName;
|
||||||
|
std::string m_appCompactName;
|
||||||
std::string m_appVersion;
|
std::string m_appVersion;
|
||||||
std::string m_appBuildDate;
|
std::string m_startupOptions;
|
||||||
Boolean<false> m_initialized;
|
Boolean<false> m_initialized;
|
||||||
Boolean<false> m_running;
|
Boolean<false> m_running;
|
||||||
Boolean<false> m_stopping;
|
Boolean<false> m_stopping;
|
||||||
|
@ -86,7 +91,7 @@ protected:
|
||||||
TexturePtr m_foreground;
|
TexturePtr m_foreground;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Application *g_app;
|
extern Application g_app;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ bool ConfigManager::load(const std::string& file)
|
||||||
m_confsDoc = confsDoc;
|
m_confsDoc = confsDoc;
|
||||||
return true;
|
return true;
|
||||||
} catch(stdext::exception& e) {
|
} catch(stdext::exception& e) {
|
||||||
g_logger.error(stdext::format("Unable to load configuration file: %s", e.what()));
|
g_logger.error(stdext::format("Unable to parse configuration file '%s'", e.what()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public:
|
||||||
Event(const std::function<void()>& callback) : m_callback(callback), m_canceled(false), m_executed(false) { }
|
Event(const std::function<void()>& callback) : m_callback(callback), m_canceled(false), m_executed(false) { }
|
||||||
virtual ~Event() {
|
virtual ~Event() {
|
||||||
// assure that we lost callback refs
|
// assure that we lost callback refs
|
||||||
assert(m_callback == nullptr);
|
//assert(m_callback == nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void execute() {
|
virtual void execute() {
|
||||||
|
|
|
@ -28,6 +28,11 @@ Logger g_logger;
|
||||||
|
|
||||||
void Logger::log(Fw::LogLevel level, const std::string& message)
|
void Logger::log(Fw::LogLevel level, const std::string& message)
|
||||||
{
|
{
|
||||||
|
#ifdef NDEBUG
|
||||||
|
if(level == Fw::LogDebug)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool ignoreLogs = false;
|
static bool ignoreLogs = false;
|
||||||
if(ignoreLogs)
|
if(ignoreLogs)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -53,7 +53,7 @@ bool Module::load()
|
||||||
m_loadCallback();
|
m_loadCallback();
|
||||||
|
|
||||||
m_loaded = true;
|
m_loaded = true;
|
||||||
//g_logger.info(stdext::format("Loaded module '%s'", m_name));
|
g_logger.debug(stdext::format("Loaded module '%s'", m_name));
|
||||||
g_modules.updateModuleLoadOrder(asModule());
|
g_modules.updateModuleLoadOrder(asModule());
|
||||||
|
|
||||||
for(const std::string& modName : m_loadLaterModules) {
|
for(const std::string& modName : m_loadLaterModules) {
|
||||||
|
|
|
@ -64,44 +64,6 @@ void ModuleManager::autoLoadModules(int maxPriority)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModuleManager::discoverModulesPath()
|
|
||||||
{
|
|
||||||
// search for modules directory
|
|
||||||
std::string possibleModulesDirs[] = { "modules",
|
|
||||||
g_resources.getBaseDir() + "modules",
|
|
||||||
g_resources.getBaseDir() + "../modules",
|
|
||||||
g_resources.getBaseDir() + "../share/" + g_app->getName() + "/modules",
|
|
||||||
"" };
|
|
||||||
bool found = false;
|
|
||||||
for(const std::string& dir : possibleModulesDirs) {
|
|
||||||
// try to add module directory
|
|
||||||
if(g_resources.addToSearchPath(dir, false)) {
|
|
||||||
//g_logger.info(stdext::format("Using modules directory '%s'", dir.c_str()));
|
|
||||||
m_modulesPath = dir;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found)
|
|
||||||
g_logger.fatal("Could not find modules directory");
|
|
||||||
|
|
||||||
// search for addons directory
|
|
||||||
std::string possibleAddonsDirs[] = { "addons",
|
|
||||||
g_resources.getBaseDir() + "addons",
|
|
||||||
g_resources.getBaseDir() + "../addons",
|
|
||||||
g_resources.getBaseDir() + "../share/" + g_app->getName() + "/addons",
|
|
||||||
"" };
|
|
||||||
for(const std::string& dir : possibleAddonsDirs) {
|
|
||||||
// try to add module directory
|
|
||||||
if(g_resources.addToSearchPath(dir, true)) {
|
|
||||||
//g_logger.info(stdext::format("Using addons directory '%s'", dir.c_str()));
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ModulePtr ModuleManager::discoverModule(const std::string& moduleFile)
|
ModulePtr ModuleManager::discoverModule(const std::string& moduleFile)
|
||||||
{
|
{
|
||||||
ModulePtr module;
|
ModulePtr module;
|
||||||
|
|
|
@ -30,14 +30,12 @@ class ModuleManager
|
||||||
public:
|
public:
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
void discoverModulesPath();
|
|
||||||
void discoverModules();
|
void discoverModules();
|
||||||
void autoLoadModules(int maxPriority);
|
void autoLoadModules(int maxPriority);
|
||||||
ModulePtr discoverModule(const std::string& moduleFile);
|
ModulePtr discoverModule(const std::string& moduleFile);
|
||||||
void ensureModuleLoaded(const std::string& moduleName);
|
void ensureModuleLoaded(const std::string& moduleName);
|
||||||
void unloadModules();
|
void unloadModules();
|
||||||
void reloadModules();
|
void reloadModules();
|
||||||
std::string getModulesPath() { return m_modulesPath; }
|
|
||||||
|
|
||||||
ModulePtr getModule(const std::string& moduleName);
|
ModulePtr getModule(const std::string& moduleName);
|
||||||
std::deque<ModulePtr> getModules() { return m_modules; }
|
std::deque<ModulePtr> getModules() { return m_modules; }
|
||||||
|
@ -48,7 +46,6 @@ protected:
|
||||||
friend class Module;
|
friend class Module;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_modulesPath;
|
|
||||||
std::deque<ModulePtr> m_modules;
|
std::deque<ModulePtr> m_modules;
|
||||||
std::multimap<int, ModulePtr> m_autoLoadModules;
|
std::multimap<int, ModulePtr> m_autoLoadModules;
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,22 +40,58 @@ void ResourceManager::terminate()
|
||||||
PHYSFS_deinit();
|
PHYSFS_deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ResourceManager::discoverWorkDir(const std::string& appName, const std::string& existentFile)
|
||||||
|
{
|
||||||
|
// search for modules directory
|
||||||
|
std::string sep = PHYSFS_getDirSeparator();
|
||||||
|
std::string possiblePaths[] = { "",
|
||||||
|
g_resources.getBaseDir(),
|
||||||
|
g_resources.getBaseDir() + ".." + sep,
|
||||||
|
g_resources.getBaseDir() + ".." + sep + "share" + sep + appName + sep,
|
||||||
|
g_resources.getBaseDir() + appName + sep };
|
||||||
|
bool found = false;
|
||||||
|
for(const std::string& dir : possiblePaths) {
|
||||||
|
// try to directory to modules path to see if it exists
|
||||||
|
std::ifstream fin(dir + existentFile);
|
||||||
|
if(fin) {
|
||||||
|
g_logger.debug(stdext::format("Found work dir at '%s'", dir.c_str()));
|
||||||
|
m_workDir = dir;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found)
|
||||||
|
g_logger.fatal("Unable to find application work directory.");
|
||||||
|
}
|
||||||
|
|
||||||
bool ResourceManager::setupWriteDir(const std::string& appWriteDirName)
|
bool ResourceManager::setupWriteDir(const std::string& appWriteDirName)
|
||||||
{
|
{
|
||||||
std::string userDir = PHYSFS_getUserDir();
|
std::string userDir = PHYSFS_getUserDir();
|
||||||
std::string dirName = stdext::format(".%s", appWriteDirName);
|
std::string dirName;
|
||||||
|
#ifndef WIN32
|
||||||
|
dirName = stdext::format(".%s", appWriteDirName);
|
||||||
|
#else
|
||||||
|
dirName = appWriteDirName;
|
||||||
|
#endif
|
||||||
std::string writeDir = userDir + dirName;
|
std::string writeDir = userDir + dirName;
|
||||||
|
|
||||||
if(!PHYSFS_setWriteDir(writeDir.c_str())) {
|
if(!PHYSFS_setWriteDir(writeDir.c_str())) {
|
||||||
if(!PHYSFS_setWriteDir(userDir.c_str()))
|
if(!PHYSFS_setWriteDir(userDir.c_str())) {
|
||||||
return false;
|
g_logger.error("User directory not found.");
|
||||||
if(!PHYSFS_mkdir(dirName.c_str())) {
|
|
||||||
PHYSFS_setWriteDir(NULL);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(!PHYSFS_setWriteDir(writeDir.c_str()))
|
if(!PHYSFS_mkdir(dirName.c_str())) {
|
||||||
|
g_logger.error("Cannot create directory for saving configurations.");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
if(!PHYSFS_setWriteDir(writeDir.c_str())) {
|
||||||
|
g_logger.error("Unable to set write directory.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
addToSearchPath(writeDir);
|
addToSearchPath(writeDir, true);
|
||||||
|
//g_logger.debug(stdext::format("Setup write dir %s", writeDir));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +99,8 @@ bool ResourceManager::addToSearchPath(const std::string& path, bool insertInFron
|
||||||
{
|
{
|
||||||
if(!PHYSFS_addToSearchPath(path.c_str(), insertInFront ? 0 : 1))
|
if(!PHYSFS_addToSearchPath(path.c_str(), insertInFront ? 0 : 1))
|
||||||
return false;
|
return false;
|
||||||
|
//g_logger.debug(stdext::format("Add search path %s", path));
|
||||||
|
m_hasSearchPath = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +108,7 @@ bool ResourceManager::removeFromSearchPath(const std::string& path)
|
||||||
{
|
{
|
||||||
if(!PHYSFS_removeFromSearchPath(path.c_str()))
|
if(!PHYSFS_removeFromSearchPath(path.c_str()))
|
||||||
return false;
|
return false;
|
||||||
|
//g_logger.debug(stdext::format("Remove search path %s", path));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,22 +133,32 @@ bool ResourceManager::directoryExists(const std::string& directoryName)
|
||||||
|
|
||||||
void ResourceManager::loadFile(const std::string& fileName, std::iostream& out)
|
void ResourceManager::loadFile(const std::string& fileName, std::iostream& out)
|
||||||
{
|
{
|
||||||
std::string fullPath = resolvePath(fileName);
|
|
||||||
out.clear(std::ios::goodbit);
|
out.clear(std::ios::goodbit);
|
||||||
PHYSFS_file* file = PHYSFS_openRead(fullPath.c_str());
|
if(m_hasSearchPath) {
|
||||||
if(!file) {
|
std::string fullPath = resolvePath(fileName);
|
||||||
out.clear(std::ios::failbit);
|
PHYSFS_file* file = PHYSFS_openRead(fullPath.c_str());
|
||||||
stdext::throw_exception(stdext::format("failed to load file '%s': %s", fullPath.c_str(), PHYSFS_getLastError()));
|
if(!file) {
|
||||||
|
out.clear(std::ios::failbit);
|
||||||
|
stdext::throw_exception(stdext::format("failed to load file '%s': %s", fullPath.c_str(), PHYSFS_getLastError()));
|
||||||
|
} else {
|
||||||
|
int fileSize = PHYSFS_fileLength(file);
|
||||||
|
if(fileSize > 0) {
|
||||||
|
std::vector<char> buffer(fileSize);
|
||||||
|
PHYSFS_read(file, (void*)&buffer[0], 1, fileSize);
|
||||||
|
out.write(&buffer[0], fileSize);
|
||||||
|
} else
|
||||||
|
out.clear(std::ios::eofbit);
|
||||||
|
PHYSFS_close(file);
|
||||||
|
out.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int fileSize = PHYSFS_fileLength(file);
|
std::ifstream fin(fileName);
|
||||||
if(fileSize > 0) {
|
if(!fin) {
|
||||||
std::vector<char> buffer(fileSize);
|
out.clear(std::ios::failbit);
|
||||||
PHYSFS_read(file, (void*)&buffer[0], 1, fileSize);
|
stdext::throw_exception(stdext::format("failed to load file '%s': %s", fileName.c_str(), PHYSFS_getLastError()));
|
||||||
out.write(&buffer[0], fileSize);
|
} else {
|
||||||
} else
|
out << fin.rdbuf();
|
||||||
out.clear(std::ios::eofbit);
|
}
|
||||||
PHYSFS_close(file);
|
|
||||||
out.seekg(0, std::ios::beg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,6 +272,15 @@ std::string ResourceManager::resolvePath(const std::string& path)
|
||||||
return fullPath;
|
return fullPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string ResourceManager::getRealDir(const std::string& path)
|
||||||
|
{
|
||||||
|
std::string dir;
|
||||||
|
const char *cdir = PHYSFS_getRealDir(path.c_str());
|
||||||
|
if(cdir)
|
||||||
|
dir = cdir;
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
std::string ResourceManager::getBaseDir()
|
std::string ResourceManager::getBaseDir()
|
||||||
{
|
{
|
||||||
return PHYSFS_getBaseDir();
|
return PHYSFS_getBaseDir();
|
||||||
|
|
|
@ -31,6 +31,7 @@ public:
|
||||||
void init(const char *argv0);
|
void init(const char *argv0);
|
||||||
void terminate();
|
void terminate();
|
||||||
|
|
||||||
|
void discoverWorkDir(const std::string& appName, const std::string& existentFile);
|
||||||
bool setupWriteDir(const std::string& appWriteDirName);
|
bool setupWriteDir(const std::string& appWriteDirName);
|
||||||
|
|
||||||
bool addToSearchPath(const std::string& path, bool insertInFront = true);
|
bool addToSearchPath(const std::string& path, bool insertInFront = true);
|
||||||
|
@ -55,7 +56,13 @@ public:
|
||||||
std::list<std::string> listDirectoryFiles(const std::string& directoryPath = "");
|
std::list<std::string> listDirectoryFiles(const std::string& directoryPath = "");
|
||||||
|
|
||||||
std::string resolvePath(const std::string& path);
|
std::string resolvePath(const std::string& path);
|
||||||
|
std::string getRealDir(const std::string& path);
|
||||||
std::string getBaseDir();
|
std::string getBaseDir();
|
||||||
|
std::string getWorkDir() { return m_workDir; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_workDir;
|
||||||
|
Boolean<false> m_hasSearchPath;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ResourceManager g_resources;
|
extern ResourceManager g_resources;
|
||||||
|
|
|
@ -47,7 +47,7 @@ void FrameBuffer::internalCreate()
|
||||||
|
|
||||||
FrameBuffer::~FrameBuffer()
|
FrameBuffer::~FrameBuffer()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
if(g_graphics.ok() && m_fbo != 0)
|
if(g_graphics.ok() && m_fbo != 0)
|
||||||
glDeleteFramebuffers(1, &m_fbo);
|
glDeleteFramebuffers(1, &m_fbo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ HardwareBuffer::HardwareBuffer(Type type)
|
||||||
|
|
||||||
HardwareBuffer::~HardwareBuffer()
|
HardwareBuffer::~HardwareBuffer()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
if(g_graphics.ok())
|
if(g_graphics.ok())
|
||||||
glDeleteBuffers(1, &m_id);
|
glDeleteBuffers(1, &m_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ Shader::Shader(Shader::ShaderType shaderType)
|
||||||
|
|
||||||
Shader::~Shader()
|
Shader::~Shader()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
if(g_graphics.ok())
|
if(g_graphics.ok())
|
||||||
glDeleteShader(m_shaderId);
|
glDeleteShader(m_shaderId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ ShaderProgram::ShaderProgram()
|
||||||
|
|
||||||
ShaderProgram::~ShaderProgram()
|
ShaderProgram::~ShaderProgram()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
if(g_graphics.ok())
|
if(g_graphics.ok())
|
||||||
glDeleteProgram(m_programId);
|
glDeleteProgram(m_programId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ Texture::Texture(const ImagePtr& image, bool buildMipmaps)
|
||||||
|
|
||||||
Texture::~Texture()
|
Texture::~Texture()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
// free texture from gl memory
|
// free texture from gl memory
|
||||||
if(g_graphics.ok() && m_id != 0)
|
if(g_graphics.ok() && m_id != 0)
|
||||||
glDeleteTextures(1, &m_id);
|
glDeleteTextures(1, &m_id);
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "application.h"
|
||||||
#include <framework/luascript/luainterface.h>
|
#include <framework/luascript/luainterface.h>
|
||||||
#include <framework/application.h>
|
|
||||||
#include <framework/graphics/fontmanager.h>
|
#include <framework/graphics/fontmanager.h>
|
||||||
#include <framework/ui/ui.h>
|
#include <framework/ui/ui.h>
|
||||||
#include <framework/net/protocol.h>
|
#include <framework/net/protocol.h>
|
||||||
|
@ -480,35 +480,41 @@ void Application::registerLuaFunctions()
|
||||||
|
|
||||||
// Application
|
// Application
|
||||||
g_lua.registerSingletonClass("g_app");
|
g_lua.registerSingletonClass("g_app");
|
||||||
g_lua.bindSingletonFunction("g_app", "exit", &Application::exit, g_app);
|
g_lua.bindSingletonFunction("g_app", "exit", &Application::exit, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "setForegroundPaneMaxFps", &Application::setForegroundPaneMaxFps, g_app);
|
g_lua.bindSingletonFunction("g_app", "setForegroundPaneMaxFps", &Application::setForegroundPaneMaxFps, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "setBackgroundPaneMaxFps", &Application::setBackgroundPaneMaxFps, g_app);
|
g_lua.bindSingletonFunction("g_app", "setBackgroundPaneMaxFps", &Application::setBackgroundPaneMaxFps, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "isRunning", &Application::isRunning, g_app);
|
g_lua.bindSingletonFunction("g_app", "setName", &Application::setName, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "isStopping", &Application::isStopping, g_app);
|
g_lua.bindSingletonFunction("g_app", "setCompactName", &Application::setCompactName, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "isOnInputEvent", &Application::isOnInputEvent, g_app);
|
g_lua.bindSingletonFunction("g_app", "setVersion", &Application::setVersion, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getName", &Application::getName, g_app);
|
g_lua.bindSingletonFunction("g_app", "isRunning", &Application::isRunning, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getVersion", &Application::getVersion, g_app);
|
g_lua.bindSingletonFunction("g_app", "isStopping", &Application::isStopping, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getForegroundPaneFps", &Application::getForegroundPaneFps, g_app);
|
g_lua.bindSingletonFunction("g_app", "isOnInputEvent", &Application::isOnInputEvent, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBackgroundPaneFps", &Application::getBackgroundPaneFps, g_app);
|
g_lua.bindSingletonFunction("g_app", "getName", &Application::getName, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getForegroundPaneMaxFps", &Application::getForegroundPaneMaxFps, g_app);
|
g_lua.bindSingletonFunction("g_app", "getCompactName", &Application::getName, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBackgroundPaneMaxFps", &Application::getBackgroundPaneMaxFps, g_app);
|
g_lua.bindSingletonFunction("g_app", "getVersion", &Application::getVersion, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildCompiler", &Application::getBuildCompiler, g_app);
|
g_lua.bindSingletonFunction("g_app", "getForegroundPaneFps", &Application::getForegroundPaneFps, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildDate", &Application::getBuildDate, g_app);
|
g_lua.bindSingletonFunction("g_app", "getBackgroundPaneFps", &Application::getBackgroundPaneFps, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildRevision", &Application::getBuildRevision, g_app);
|
g_lua.bindSingletonFunction("g_app", "getForegroundPaneMaxFps", &Application::getForegroundPaneMaxFps, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildType", &Application::getBuildType, g_app);
|
g_lua.bindSingletonFunction("g_app", "getBackgroundPaneMaxFps", &Application::getBackgroundPaneMaxFps, &g_app);
|
||||||
|
g_lua.bindSingletonFunction("g_app", "getBuildCompiler", &Application::getBuildCompiler, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "exit", &Application::exit, g_app);
|
g_lua.bindSingletonFunction("g_app", "getBuildDate", &Application::getBuildDate, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "isRunning", &Application::isRunning, g_app);
|
g_lua.bindSingletonFunction("g_app", "getBuildRevision", &Application::getBuildRevision, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "isStopping", &Application::isStopping, g_app);
|
g_lua.bindSingletonFunction("g_app", "getBuildType", &Application::getBuildType, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getName", &Application::getName, g_app);
|
g_lua.bindSingletonFunction("g_app", "exit", &Application::exit, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getVersion", &Application::getVersion, g_app);
|
g_lua.bindSingletonFunction("g_app", "isRunning", &Application::isRunning, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildCompiler", &Application::getBuildCompiler, g_app);
|
g_lua.bindSingletonFunction("g_app", "isStopping", &Application::isStopping, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildDate", &Application::getBuildDate, g_app);
|
g_lua.bindSingletonFunction("g_app", "getName", &Application::getName, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildRevision", &Application::getBuildRevision, g_app);
|
g_lua.bindSingletonFunction("g_app", "getCompactName", &Application::getCompactName, &g_app);
|
||||||
g_lua.bindSingletonFunction("g_app", "getBuildType", &Application::getBuildType, g_app);
|
g_lua.bindSingletonFunction("g_app", "getVersion", &Application::getVersion, &g_app);
|
||||||
|
g_lua.bindSingletonFunction("g_app", "getBuildCompiler", &Application::getBuildCompiler, &g_app);
|
||||||
|
g_lua.bindSingletonFunction("g_app", "getBuildDate", &Application::getBuildDate, &g_app);
|
||||||
|
g_lua.bindSingletonFunction("g_app", "getBuildRevision", &Application::getBuildRevision, &g_app);
|
||||||
|
g_lua.bindSingletonFunction("g_app", "getBuildType", &Application::getBuildType, &g_app);
|
||||||
|
|
||||||
// ConfigManager
|
// ConfigManager
|
||||||
g_lua.registerSingletonClass("g_configs");
|
g_lua.registerSingletonClass("g_configs");
|
||||||
|
g_lua.bindSingletonFunction("g_configs", "load", &ConfigManager::load, &g_configs);
|
||||||
|
g_lua.bindSingletonFunction("g_configs", "save", &ConfigManager::save, &g_configs);
|
||||||
g_lua.bindSingletonFunction("g_configs", "set", &ConfigManager::set, &g_configs);
|
g_lua.bindSingletonFunction("g_configs", "set", &ConfigManager::set, &g_configs);
|
||||||
g_lua.bindSingletonFunction("g_configs", "setList", &ConfigManager::setList, &g_configs);
|
g_lua.bindSingletonFunction("g_configs", "setList", &ConfigManager::setList, &g_configs);
|
||||||
g_lua.bindSingletonFunction("g_configs", "get", &ConfigManager::get, &g_configs);
|
g_lua.bindSingletonFunction("g_configs", "get", &ConfigManager::get, &g_configs);
|
||||||
|
@ -574,7 +580,13 @@ void Application::registerLuaFunctions()
|
||||||
g_lua.registerSingletonClass("g_logger");
|
g_lua.registerSingletonClass("g_logger");
|
||||||
g_lua.bindSingletonFunction("g_logger", "log", &Logger::log, &g_logger);
|
g_lua.bindSingletonFunction("g_logger", "log", &Logger::log, &g_logger);
|
||||||
g_lua.bindSingletonFunction("g_logger", "fireOldMessages", &Logger::fireOldMessages, &g_logger);
|
g_lua.bindSingletonFunction("g_logger", "fireOldMessages", &Logger::fireOldMessages, &g_logger);
|
||||||
|
g_lua.bindSingletonFunction("g_logger", "setLogFile", &Logger::setLogFile, &g_logger);
|
||||||
g_lua.bindSingletonFunction("g_logger", "setOnLog", &Logger::setOnLog, &g_logger);
|
g_lua.bindSingletonFunction("g_logger", "setOnLog", &Logger::setOnLog, &g_logger);
|
||||||
|
g_lua.bindSingletonFunction("g_logger", "debug", &Logger::debug, &g_logger);
|
||||||
|
g_lua.bindSingletonFunction("g_logger", "info", &Logger::info, &g_logger);
|
||||||
|
g_lua.bindSingletonFunction("g_logger", "warning", &Logger::warning, &g_logger);
|
||||||
|
g_lua.bindSingletonFunction("g_logger", "error", &Logger::error, &g_logger);
|
||||||
|
g_lua.bindSingletonFunction("g_logger", "fatal", &Logger::fatal, &g_logger);
|
||||||
|
|
||||||
// UI
|
// UI
|
||||||
g_lua.registerSingletonClass("g_ui");
|
g_lua.registerSingletonClass("g_ui");
|
||||||
|
@ -593,7 +605,6 @@ void Application::registerLuaFunctions()
|
||||||
|
|
||||||
// ModuleManager
|
// ModuleManager
|
||||||
g_lua.registerSingletonClass("g_modules");
|
g_lua.registerSingletonClass("g_modules");
|
||||||
g_lua.bindSingletonFunction("g_modules", "discoverModulesPath", &ModuleManager::discoverModulesPath, &g_modules);
|
|
||||||
g_lua.bindSingletonFunction("g_modules", "discoverModules", &ModuleManager::discoverModules, &g_modules);
|
g_lua.bindSingletonFunction("g_modules", "discoverModules", &ModuleManager::discoverModules, &g_modules);
|
||||||
g_lua.bindSingletonFunction("g_modules", "autoLoadModules", &ModuleManager::autoLoadModules, &g_modules);
|
g_lua.bindSingletonFunction("g_modules", "autoLoadModules", &ModuleManager::autoLoadModules, &g_modules);
|
||||||
g_lua.bindSingletonFunction("g_modules", "discoverModule", &ModuleManager::discoverModule, &g_modules);
|
g_lua.bindSingletonFunction("g_modules", "discoverModule", &ModuleManager::discoverModule, &g_modules);
|
||||||
|
@ -602,7 +613,6 @@ void Application::registerLuaFunctions()
|
||||||
g_lua.bindSingletonFunction("g_modules", "reloadModules", &ModuleManager::reloadModules, &g_modules);
|
g_lua.bindSingletonFunction("g_modules", "reloadModules", &ModuleManager::reloadModules, &g_modules);
|
||||||
g_lua.bindSingletonFunction("g_modules", "getModule", &ModuleManager::getModule, &g_modules);
|
g_lua.bindSingletonFunction("g_modules", "getModule", &ModuleManager::getModule, &g_modules);
|
||||||
g_lua.bindSingletonFunction("g_modules", "getModules", &ModuleManager::getModules, &g_modules);
|
g_lua.bindSingletonFunction("g_modules", "getModules", &ModuleManager::getModules, &g_modules);
|
||||||
g_lua.bindSingletonFunction("g_modules", "getModulesPath", &ModuleManager::getModulesPath, &g_modules);
|
|
||||||
|
|
||||||
// FontManager
|
// FontManager
|
||||||
g_lua.registerSingletonClass("g_fonts");
|
g_lua.registerSingletonClass("g_fonts");
|
||||||
|
@ -633,11 +643,9 @@ void Application::registerLuaFunctions()
|
||||||
// ResourceManager
|
// ResourceManager
|
||||||
g_lua.registerSingletonClass("g_resources");
|
g_lua.registerSingletonClass("g_resources");
|
||||||
g_lua.bindSingletonFunction("g_resources", "addToSearchPath", &ResourceManager::addToSearchPath, &g_resources);
|
g_lua.bindSingletonFunction("g_resources", "addToSearchPath", &ResourceManager::addToSearchPath, &g_resources);
|
||||||
|
g_lua.bindSingletonFunction("g_resources", "setupWriteDir", &ResourceManager::setupWriteDir, &g_resources);
|
||||||
g_lua.bindSingletonFunction("g_resources", "removeFromSearchPath", &ResourceManager::removeFromSearchPath, &g_resources);
|
g_lua.bindSingletonFunction("g_resources", "removeFromSearchPath", &ResourceManager::removeFromSearchPath, &g_resources);
|
||||||
g_lua.bindSingletonFunction("g_resources", "fileExists", &ResourceManager::fileExists, &g_resources);
|
g_lua.bindSingletonFunction("g_resources", "fileExists", &ResourceManager::fileExists, &g_resources);
|
||||||
|
g_lua.bindSingletonFunction("g_resources", "getRealDir", &ResourceManager::getRealDir, &g_resources);
|
||||||
// LuaInterface
|
g_lua.bindSingletonFunction("g_resources", "getWorkDir", &ResourceManager::getWorkDir, &g_resources);
|
||||||
g_lua.registerSingletonClass("g_lua");
|
|
||||||
g_lua.bindSingletonFunction("g_lua", "getCurrentSourcePath", &LuaInterface::getCurrentSourcePath, &g_lua);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -292,6 +292,17 @@ int LuaInterface::luaObjectCollectEvent(LuaInterface* lua)
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
bool LuaInterface::safeRunScript(const std::string& fileName)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
runScript(fileName);
|
||||||
|
return true;
|
||||||
|
} catch(LuaException& e) {
|
||||||
|
g_logger.error(stdext::format("Failed to load script '%s': %s", fileName, e.what()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LuaInterface::runScript(const std::string& fileName)
|
void LuaInterface::runScript(const std::string& fileName)
|
||||||
{
|
{
|
||||||
loadScript(fileName);
|
loadScript(fileName);
|
||||||
|
@ -312,7 +323,7 @@ void LuaInterface::loadScript(const std::string& fileName)
|
||||||
filePath = getCurrentSourcePath() + "/" + filePath;
|
filePath = getCurrentSourcePath() + "/" + filePath;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::string buffer = g_resources.loadFile(filePath);
|
std::string buffer = g_resources.loadFile(fileName);
|
||||||
std::string source = "@" + filePath;
|
std::string source = "@" + filePath;
|
||||||
loadBuffer(buffer, source);
|
loadBuffer(buffer, source);
|
||||||
} catch(stdext::exception& e) {
|
} catch(stdext::exception& e) {
|
||||||
|
|
|
@ -132,6 +132,9 @@ private:
|
||||||
static int luaObjectCollectEvent(LuaInterface* lua);
|
static int luaObjectCollectEvent(LuaInterface* lua);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/// Loads and runs a script, any errors are printed to stdout and returns false
|
||||||
|
bool safeRunScript(const std::string& fileName);
|
||||||
|
|
||||||
/// Loads and runs a script
|
/// Loads and runs a script
|
||||||
/// @exception LuaException is thrown on any lua error
|
/// @exception LuaException is thrown on any lua error
|
||||||
void runScript(const std::string& fileName);
|
void runScript(const std::string& fileName);
|
||||||
|
|
|
@ -31,7 +31,7 @@ LuaObject::LuaObject() : m_fieldsTableRef(-1)
|
||||||
|
|
||||||
LuaObject::~LuaObject()
|
LuaObject::~LuaObject()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
releaseLuaFieldsTable();
|
releaseLuaFieldsTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ Connection::Connection() :
|
||||||
|
|
||||||
Connection::~Connection()
|
Connection::~Connection()
|
||||||
{
|
{
|
||||||
assert(!g_app->isTermianted());
|
assert(!g_app.isTermianted());
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,8 @@ void crashHandler(int signum, siginfo_t* info, void* secret)
|
||||||
g_logger.error("Application crashed");
|
g_logger.error("Application crashed");
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << stdext::format("app name: %s\n", g_app->getName());
|
ss << stdext::format("app name: %s\n", g_app.getName());
|
||||||
ss << stdext::format("app version: %s\n", g_app->getVersion());
|
ss << stdext::format("app version: %s\n", g_app.getVersion());
|
||||||
ss << stdext::format("build compiler: %s\n", BUILD_COMPILER);
|
ss << stdext::format("build compiler: %s\n", BUILD_COMPILER);
|
||||||
ss << stdext::format("build date: %s\n", BUILD_DATE);
|
ss << stdext::format("build date: %s\n", BUILD_DATE);
|
||||||
ss << stdext::format("build type: %s\n", BUILD_TYPE);
|
ss << stdext::format("build type: %s\n", BUILD_TYPE);
|
||||||
|
|