master
Eduardo Bart 12 years ago
parent 3f689e0edf
commit beaba25af1

22
BUGS

@ -0,0 +1,22 @@
== CRASHS
modules recursivity makes client crash, it should generate a warning
== P1 BUGS (affects game play)
private channels are not closed when switching characters
sometimes minimap desync Z pos
follow and autowalk doesn't cancel when walking via hotkeys
== P2 BUGS
battle sometimes doesn't clear attacked/followed creatures when they go out of range
if you move a backpack to left panel, and resize it, client will go into a infinite loop resizing the backpack switching 4,5 columns
when looking from floor 5 in floor 7, sometimes a tile have 2 invisible grounds in floor 6 that should be ignored
== P3 BUGS
widgets may have been destroyed when adding event in onSetup (UIResizeBorder), generating invalid events
too many talk messages in game map make the messages boxes disappear
hotkeys works while windows are locked, it shouldn't
skulls is rendering outside map bounds
party options does not work when re-logging inside a party
sometimes we can still view hits from above/bottom floors from a fight that is not visible
must removeThing in protocol parseTileAdd when stackpos is greater than 11

107
TODO

@ -1,51 +1,78 @@
== Core == MODULES
create a class for reading binary files game_shaders (with shader manager)
rework lua/c++ logger game_map (with save/load/options)
game_minimap (with all tibia functionality)
game_playertrade
game_textbooks
game_questlog
game_ruleviolations
== Graphics == NOTABLE FEATURES
map zoom rendering could be optimized using framebuffer caches make left panel optional
implement graphics options menu must close last container when opening a new containers
add options "Copy Text", "Copy Name", "Message" in console labels with a popupmenu
move chat tabs
save/load mini windows states/location when restarting the client
graphics options menu
load modules from zip files
manual autoload setting in module manager
complete a smarter miniwindow moving/resizing
make miniwindow borderless on double click
== Modules == BEFORE RELEASE
fix modules recursivity, it makes client crash polish interface skin
new optional skin
send otclient/system information to a third party server
== LATER FEATURES
reload spr/dat while ingame
create and bind new game events
text selection
login queue
port to MacOs and iphone
allow multiple Map and Game instances ?
== MINOR FEATURES
display exit box when exiting from game
case insensitive npctrade
load modules from zip packages load modules from zip packages
move up/down in lineedits
select characters in lineedits
scrolling multiline edit
mouse wheel lineedits
== Lua engine == OPTIMIZATIONS AND REWORKS
make possible to bind non LuaObject derived classes on lua engine (for usage with Point,Rect,Color,Size) * game
review usage of x,y/width,height in lua instead of point/size do not redraw in MapView far zoom
map zoom rendering could be optimized using framebuffer caches
multisample option in map view
move redering of creatures names, skulls, etc to UI and scripts
clean sprites cache periodically
handle corrupt errors in dat/spr
== Platform * framework
port to MacOs and iphone rework Settings/g_configs
platform cursor cache
replace onKey events with Hotkeys.bind
add -no-sound option
rework lua/c++ logger
== UI * ui
review anchors API, add possibility to get/remove anchors rework hover => onWidgetVisibilityChange onWidgetEnableChange onWidgetMove onAppear onDisappear
multiline rich text widget reset dragging widget on destruction/visibility change/enable change
move layout proprieties to widget style cancel layout changes on non visible widgets (acts like it doesn't exist)
multiline text editor widget add more anchors warnings to make creation of OTUIs easier
fix style inheritance using a style translator
find a way to add new widgets without focusing them
review UI/style loader and make more error prone with more warnings review UI/style loader and make more error prone with more warnings
change Align/Anchors lua API from enum to text
review widgets rendering order, consider adding z-index
reapply anchor styles when adding new childs reapply anchor styles when adding new childs
style inheritance using a style translator
find a way to add new widgets without focusing them
make set of background/icon/image width alone work make set of background/icon/image width alone work
check for recursive anchors and print a error instead of crashing
make api to enable/disable capture of events like mouseMove to avoid massive event processing make api to enable/disable capture of events like mouseMove to avoid massive event processing
review style apply system move layout proprieties to widget style
review widgets rendering order, consider adding z-index terminate rework of ui events propagation (for Key events)
change Align/Anchors lua API from enum to text
== Game
clean sprites cache periodically
create a shader manager
find a way to load map rendering styles
move redering of creatures names, skulls, etc to UI
handle corrupt errors in dat/spr
remake spr/dat using OTML and image files
== Game modules
minimap window
login queue
questlog
edit texts
trade window
shop window
* lua engine
make possible to bind non LuaObject derived classes on lua engine (for usage with Point,Rect,Color,Size)
review usage of x,y/width,height in lua instead of point/size

@ -24,7 +24,7 @@ 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
print('Using configurated locale: ' .. userLocaleName) print('Using configured locale: ' .. userLocaleName)
else else
print('Using default locale: ' .. defaultLocaleName) print('Using default locale: ' .. defaultLocaleName)
Locales.setLocale(defaultLocaleName) Locales.setLocale(defaultLocaleName)

@ -26,14 +26,15 @@ ModuleInfoLabel < Label
ModuleValueLabel < UILabel ModuleValueLabel < UILabel
font: verdana-11px-antialised font: verdana-11px-antialised
color: #aaaaaa color: #aaaaaa
text-offset: 3 0 text-offset: 2 3
padding-bottom: 5
image-source: /core_styles/styles/images/panel_flat.png image-source: /core_styles/styles/images/panel_flat.png
image-border: 1 image-border: 1
height: 16 height: 20
MainWindow MainWindow
id: moduleManagerWindow id: moduleManagerWindow
size: 480 450 size: 450 450
!text: tr('Module Manager') !text: tr('Module Manager')
@onEscape: ModuleManager.hide() @onEscape: ModuleManager.hide()
@ -43,36 +44,47 @@ MainWindow
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: 180 width: 190
padding: 1 padding: 1
focusable: false focusable: false
margin-bottom: 30 margin-bottom: 30
vertical-scrollbar: moduleListScrollBar
VerticalScrollBar
id: moduleListScrollBar
anchors.top: moduleList.top
anchors.bottom: moduleList.bottom
anchors.left: moduleList.right
step: 14
pixels-scroll: true
Button Button
id: refreshModulesButton id: refreshModulesButton
anchors.top: moduleList.bottom anchors.top: moduleList.bottom
anchors.left: moduleList.left anchors.left: moduleList.left
margin-top: 8 margin-top: 8
width: 80
!text: tr('Refresh') !text: tr('Refresh')
text-auto-resize: true
@onClick: ModuleManager.refreshModules() @onClick: ModuleManager.refreshModules()
Button Button
id: reloadAllModulesButton id: reloadAllModulesButton
anchors.top: moduleList.bottom anchors.top: moduleList.bottom
anchors.right: moduleList.right anchors.right: moduleListScrollBar.right
margin-top: 8 margin-top: 8
width: 80
!text: tr('Reload All') !text: tr('Reload All')
text-auto-resize: true
@onClick: ModuleManager.reloadAllModules() @onClick: ModuleManager.reloadAllModules()
Panel Panel
id: moduleInfo id: moduleInfo
anchors.left: moduleList.right anchors.left: moduleListScrollBar.right
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
margin: 0 5 5 15 margin: 0 5 5 15
layout: verticalBox layout:
type: verticalBox
fit-children: true
height: 265 height: 265
ModuleInfoLabel ModuleInfoLabel
@ -84,8 +96,8 @@ MainWindow
!text: tr('Description') !text: tr('Description')
ModuleValueLabel ModuleValueLabel
id: moduleDescription id: moduleDescription
height: 100
text-wrap: true text-wrap: true
height: 100
//ModuleInfoLabel //ModuleInfoLabel
// !text: tr('Autoload') // !text: tr('Autoload')
@ -105,7 +117,7 @@ MainWindow
ModuleInfoLabel ModuleInfoLabel
!text: tr('Website') !text: tr('Website')
ModuleValueLabel TextEdit
id: moduleWebsite id: moduleWebsite
ModuleInfoLabel ModuleInfoLabel
@ -120,6 +132,7 @@ MainWindow
margin-top: 8 margin-top: 8
!text: tr('Load') !text: tr('Load')
enabled: false enabled: false
width: 90
@onClick: ModuleManager.reloadCurrentModule() @onClick: ModuleManager.reloadCurrentModule()
Button Button
@ -130,6 +143,7 @@ MainWindow
margin-top: 8 margin-top: 8
!text: tr('Unload') !text: tr('Unload')
enabled: false enabled: false
width: 90
@onClick: ModuleManager.unloadCurrentModule() @onClick: ModuleManager.unloadCurrentModule()
Button Button
@ -137,6 +151,6 @@ MainWindow
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
!text: tr('Close') !text: tr('Close')
width: 60 width: 90
@onClick: ModuleManager.hide() @onClick: ModuleManager.hide()

@ -6,6 +6,7 @@ Button < UIButton
image-color: white image-color: white
image-source: /core_styles/styles/images/button.png image-source: /core_styles/styles/images/button.png
image-border: 5 image-border: 5
padding: 5 10 5 10
$hover !disabled: $hover !disabled:
image-source: /core_styles/styles/images/button_hover.png image-source: /core_styles/styles/images/button_hover.png

@ -44,7 +44,7 @@ UIWidget
GameSidePanel GameSidePanel
id: gameRightPanel id: gameRightPanel
layout: verticalBox layout: verticalBox
anchors.left: rightSplitter.left width: 190
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
@ -60,17 +60,6 @@ UIWidget
@canUpdateMargin: function(self, newMargin) return math.max(math.min(newMargin, self:getParent():getHeight() - 300), 100) end @canUpdateMargin: function(self, newMargin) return math.max(math.min(newMargin, self:getParent():getHeight() - 300), 100) end
@onGeometryChange: function(self) self:setMarginBottom(math.min(math.max(self:getParent():getHeight() - 300, 100), self:getMarginBottom())) end @onGeometryChange: function(self) self:setMarginBottom(math.min(math.max(self:getParent():getHeight() - 300, 100), self:getMarginBottom())) end
Splitter
id: rightSplitter
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
relative-margin: right
margin-right: 190
enabled: false
@canUpdateMargin: function(self, newMargin) return math.max(math.min(newMargin, self:getParent():getWidth() - 300), 150) end
@onGeometryChange: function(self) self:setMarginRight(math.min(math.max(self:getParent():getWidth() - 300, 150), self:getMarginRight())) end
UIWidget UIWidget
id: mouseGrabber id: mouseGrabber
focusable: false focusable: false

@ -5,7 +5,6 @@ MiniWindow < UIMiniWindow
height: 200 height: 200
text-offset: 24 5 text-offset: 24 5
text-align: topLeft text-align: topLeft
margin-bottom: 2
image-source: /game/images/miniwindow.png image-source: /game/images/miniwindow.png
image-border: 4 image-border: 4
image-border-top: 23 image-border-top: 23
@ -84,7 +83,8 @@ MiniWindowContents < ScrollablePanel
id: contentsPanel id: contentsPanel
anchors.fill: parent anchors.fill: parent
anchors.right: miniwindowScrollBar.left anchors.right: miniwindowScrollBar.left
padding: 24 5 3 5 margin-top: 19
padding: 3 5 3 5
vertical-scrollbar: miniwindowScrollBar vertical-scrollbar: miniwindowScrollBar
BorderlessGameWindow < UIWindow BorderlessGameWindow < UIWindow

@ -50,6 +50,7 @@ MiniWindow
anchors.top: parent.top anchors.top: parent.top
anchors.right: next.left anchors.right: next.left
margin-right: 5 margin-right: 5
margin-top: 3
BattleNPCs BattleNPCs
id: hideNPCs id: hideNPCs
@ -57,12 +58,14 @@ MiniWindow
anchors.top: parent.top anchors.top: parent.top
anchors.right: next.left anchors.right: next.left
margin-right: 5 margin-right: 5
margin-top: 3
BattleMonsters BattleMonsters
id: hideMonsters id: hideMonsters
!tooltip: tr('Hide monsters') !tooltip: tr('Hide monsters')
anchors.top: parent.top anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
margin-top: 3
BattleSkulls BattleSkulls
id: hideSkulls id: hideSkulls

@ -99,7 +99,7 @@ local function onCreatureSpeak(name, level, speaktype, message, channelId, creat
if channel then if channel then
Console.addText(message, speaktype, channel) Console.addText(message, speaktype, channel)
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') warning('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

@ -27,9 +27,10 @@ ContainerWindow < MiniWindow
image-clip: 42 28 14 14 image-clip: 42 28 14 14
MiniWindowContents MiniWindowContents
padding: 27 6 6 8 padding-right: 0
layout: layout:
type: grid type: grid
cell-size: 34 34 cell-size: 40 40
flow: true flow: true
auto-spacing: true cell-spacing: 0

@ -24,6 +24,10 @@ local function onContainerOpen(container, previousContainer)
containerWindow:hide() containerWindow:hide()
end end
-- this disables scrollbar auto hiding
local scrollbar = containerWindow:getChildById('miniwindowScrollBar')
scrollbar:mergeStyle({ ['$disabled'] = { ['width'] = scrollbar:getWidth() } })
local upButton = containerWindow:getChildById('upButton') local upButton = containerWindow:getChildById('upButton')
upButton.onClick = function() upButton.onClick = function()
g_game.openParent(container) g_game.openParent(container)
@ -41,6 +45,7 @@ local function onContainerOpen(container, previousContainer)
local itemWidget = createWidget('Item', containerPanel) local itemWidget = createWidget('Item', containerPanel)
itemWidget:setId('item' .. slot) itemWidget:setId('item' .. slot)
itemWidget:setItem(container:getItem(slot)) itemWidget:setItem(container:getItem(slot))
itemWidget:setMargin(3)
itemWidget.position = container:getSlotPosition(slot) itemWidget.position = container:getSlotPosition(slot)
end end

@ -5,6 +5,7 @@ HealthBar < ProgressBar
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
margin-top: 3
ManaBar < ProgressBar ManaBar < ProgressBar
id: manaBar id: manaBar

@ -11,6 +11,7 @@ MiniWindow
id: slot1 id: slot1
anchors.top: parent.top anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
margin-top: 4
&position: {x=65535, y=1, z=0} &position: {x=65535, y=1, z=0}
Item Item

@ -72,6 +72,7 @@ void Application::registerLuaFunctions()
g_lua.bindClassMemberFunction<UIWidget>("moveChildToIndex", &UIWidget::moveChildToIndex); g_lua.bindClassMemberFunction<UIWidget>("moveChildToIndex", &UIWidget::moveChildToIndex);
g_lua.bindClassMemberFunction<UIWidget>("lockChild", &UIWidget::lockChild); g_lua.bindClassMemberFunction<UIWidget>("lockChild", &UIWidget::lockChild);
g_lua.bindClassMemberFunction<UIWidget>("unlockChild", &UIWidget::unlockChild); g_lua.bindClassMemberFunction<UIWidget>("unlockChild", &UIWidget::unlockChild);
g_lua.bindClassMemberFunction<UIWidget>("mergeStyle", &UIWidget::mergeStyle);
g_lua.bindClassMemberFunction<UIWidget>("applyStyle", &UIWidget::applyStyle); g_lua.bindClassMemberFunction<UIWidget>("applyStyle", &UIWidget::applyStyle);
g_lua.bindClassMemberFunction<UIWidget>("addAnchor", &UIWidget::addAnchor); g_lua.bindClassMemberFunction<UIWidget>("addAnchor", &UIWidget::addAnchor);
g_lua.bindClassMemberFunction<UIWidget>("removeAnchor", &UIWidget::removeAnchor); g_lua.bindClassMemberFunction<UIWidget>("removeAnchor", &UIWidget::removeAnchor);

@ -101,8 +101,10 @@ bool UIGridLayout::internalUpdate()
Point virtualPos = Point(column * (m_cellSize.width() + cellSpacing), line * (m_cellSize.height() + cellSpacing)); Point virtualPos = Point(column * (m_cellSize.width() + cellSpacing), line * (m_cellSize.height() + cellSpacing));
preferredHeight = virtualPos.y + m_cellSize.height(); preferredHeight = virtualPos.y + m_cellSize.height();
Point pos = topLeft + virtualPos - parentWidget->getVirtualOffset(); Point pos = topLeft + virtualPos - parentWidget->getVirtualOffset();
Rect dest = Rect(pos, m_cellSize);
dest.expand(-widget->getMarginTop(), -widget->getMarginRight(), -widget->getMarginBottom(), -widget->getMarginLeft());
if(widget->setRect(Rect(pos, m_cellSize))) if(widget->setRect(dest))
changed = true; changed = true;
index++; index++;

@ -458,6 +458,13 @@ void UIWidget::unlockChild(const UIWidgetPtr& child)
} }
} }
void UIWidget::mergeStyle(const OTMLNodePtr& styleNode)
{
applyStyle(styleNode);
m_style->merge(styleNode);
updateStyle();
}
void UIWidget::applyStyle(const OTMLNodePtr& styleNode) void UIWidget::applyStyle(const OTMLNodePtr& styleNode)
{ {
if(m_destroyed) if(m_destroyed)

@ -90,6 +90,7 @@ public:
void moveChildToIndex(const UIWidgetPtr& child, int index); void moveChildToIndex(const UIWidgetPtr& child, int index);
void lockChild(const UIWidgetPtr& child); void lockChild(const UIWidgetPtr& child);
void unlockChild(const UIWidgetPtr& child); void unlockChild(const UIWidgetPtr& child);
void mergeStyle(const OTMLNodePtr& styleNode);
void applyStyle(const OTMLNodePtr& styleNode); void applyStyle(const OTMLNodePtr& styleNode);
void addAnchor(Fw::AnchorEdge anchoredEdge, const std::string& hookedWidgetId, Fw::AnchorEdge hookedEdge); void addAnchor(Fw::AnchorEdge anchoredEdge, const std::string& hookedWidgetId, Fw::AnchorEdge hookedEdge);
void removeAnchor(Fw::AnchorEdge anchoredEdge); void removeAnchor(Fw::AnchorEdge anchoredEdge);

@ -43,7 +43,7 @@ void UIWidget::updateText()
// update rect size // update rect size
if(!m_rect.isValid() || m_textAutoResize) { if(!m_rect.isValid() || m_textAutoResize) {
Size textBoxSize = getTextSize(); Size textBoxSize = getTextSize();
textBoxSize += Size(m_padding.left + m_padding.right, m_padding.top + m_padding.left); textBoxSize += Size(m_padding.left + m_padding.right, m_padding.top + m_padding.bottom);
Size size = getSize(); Size size = getSize();
if(size.width() <= 0 || (m_textAutoResize && !m_textWrap)) if(size.width() <= 0 || (m_textAutoResize && !m_textWrap))
size.setWidth(textBoxSize.width()); size.setWidth(textBoxSize.width());

@ -38,7 +38,6 @@ void UIItem::drawSelf()
Rect drawRect = getClippingRect(); Rect drawRect = getClippingRect();
Point dest = drawRect.topLeft(); Point dest = drawRect.topLeft();
float scaleFactor = std::min(drawRect.width() / (float)m_item->getExactSize(), drawRect.height() / (float)m_item->getExactSize()); float scaleFactor = std::min(drawRect.width() / (float)m_item->getExactSize(), drawRect.height() / (float)m_item->getExactSize());
dest += (1 - scaleFactor)*32;
dest += m_item->getDisplacement() * scaleFactor; dest += m_item->getDisplacement() * scaleFactor;
g_painter->setColor(Color::white); g_painter->setColor(Color::white);

Loading…
Cancel
Save