More walk control optimization and fixes:

* Finished off the walking control optimization! (Should be smooth controlling now).
* Fixed issue #151
* Fixed an issue with the character list.
* Fixed a bug in the g_keyboard.isKeySetPressed function.
This commit is contained in:
BeniS 2012-12-30 19:14:49 +13:00
parent 1782de7336
commit abf0ee4303
10 changed files with 53 additions and 25 deletions

View File

@ -231,17 +231,13 @@ function CharacterList.create(characters, account, otui)
end end
function CharacterList.destroy() function CharacterList.destroy()
charactersWindow:hide() CharacterList.hide(true)
if charactersWindow then if charactersWindow then
characterList = nil characterList = nil
charactersWindow:destroy() charactersWindow:destroy()
charactersWindow = nil charactersWindow = nil
end end
if EnterGame and not g_game.isOnline() then
EnterGame.show()
end
end end
function CharacterList.show() function CharacterList.show()
@ -252,8 +248,13 @@ function CharacterList.show()
end end
end end
function CharacterList.hide() function CharacterList.hide(showLogin)
showLogin = showLogin or false
charactersWindow:hide() charactersWindow:hide()
if showLogin and EnterGame and not g_game.isOnline() then
EnterGame.show()
end
end end
function CharacterList.showAgain() function CharacterList.showAgain()

View File

@ -46,7 +46,7 @@ MainWindow
size: 250 248 size: 250 248
visible: false visible: false
@onEnter: CharacterList.doLogin() @onEnter: CharacterList.doLogin()
@onEscape: CharacterList.hide() @onEscape: CharacterList.hide(true)
@onSetup: | @onSetup: |
g_keyboard.bindKeyPress('Up', function() self:getChildById('characters'):focusPreviousChild(KeyboardFocusReason) end, self) g_keyboard.bindKeyPress('Up', function() self:getChildById('characters'):focusPreviousChild(KeyboardFocusReason) end, self)
g_keyboard.bindKeyPress('Down', function() self:getChildById('characters'):focusNextChild(KeyboardFocusReason) end, self) g_keyboard.bindKeyPress('Down', function() self:getChildById('characters'):focusNextChild(KeyboardFocusReason) end, self)
@ -113,4 +113,4 @@ MainWindow
width: 64 width: 64
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
@onClick: CharacterList.destroy() @onClick: CharacterList.hide(true)

View File

@ -196,9 +196,9 @@ function g_keyboard.isKeySetPressed(keys, all)
local result = {} local result = {}
for k,v in pairs(keys) do for k,v in pairs(keys) do
if type(v) == 'string' then if type(v) == 'string' then
key = getKeyCode(v) v = getKeyCode(v)
end end
if g_window.isKeyPressed(key) then if g_window.isKeyPressed(v) then
if not all then if not all then
return true return true
end end

View File

@ -1,4 +1,4 @@
WALK_AUTO_REPEAT_DELAY = 80 WALK_AUTO_REPEAT_DELAY = 150
gameRootPanel = nil gameRootPanel = nil
gameMapPanel = nil gameMapPanel = nil
@ -14,7 +14,7 @@ bottomSplitter = nil
lastWalkDir = nil lastWalkDir = nil
arrowKeys = { arrowKeys = {
[North] = "Up", [North] = 'Up',
[South] = 'Down', [South] = 'Down',
[East] = 'Right', [East] = 'Right',
[West] = 'Left', [West] = 'Left',
@ -182,7 +182,6 @@ function tryLogout()
end end
function smartWalk(defaultDir) function smartWalk(defaultDir)
--[[ TODO: Add walk event stack ]]
local rebindKey = false local rebindKey = false
local lastKey = arrowKeys[lastWalkDir] local lastKey = arrowKeys[lastWalkDir]
@ -229,11 +228,7 @@ function smartWalk(defaultDir)
g_game.forceWalk(dir) g_game.forceWalk(dir)
end end
else else
--if g_game.getLocalPlayer():canWalk(dir) then
g_game.walk(dir) g_game.walk(dir)
--else
--end
end end
if rebindKey then if rebindKey then
@ -284,7 +279,7 @@ function onUseWith(clickedWidget, mousePosition)
if clickedWidget:getClassName() == 'UIMap' then if clickedWidget:getClassName() == 'UIMap' then
local tile = clickedWidget:getTile(mousePosition) local tile = clickedWidget:getTile(mousePosition)
if tile then if tile then
g_game.useWith(selectedThing, tile:getTopMultiUseThing()) g_game.useWith(selectedThing, tile:getTopMultiUseThing(false))
end end
elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then
g_game.useWith(selectedThing, clickedWidget:getItem()) g_game.useWith(selectedThing, clickedWidget:getItem())

View File

@ -89,6 +89,8 @@ public:
Position getLastStepFromPosition() { return m_lastStepFromPosition; } Position getLastStepFromPosition() { return m_lastStepFromPosition; }
Position getLastStepToPosition() { return m_lastStepToPosition; } Position getLastStepToPosition() { return m_lastStepToPosition; }
float getStepProgress() { return m_walkTimer.ticksElapsed() / getStepDuration(); } float getStepProgress() { return m_walkTimer.ticksElapsed() / getStepDuration(); }
float getStepTicksLeft() { return getStepDuration() - m_walkTimer.ticksElapsed(); }
ticks_t getWalkTicksElapsed() { return m_walkTimer.ticksElapsed(); }
double getSpeedFormula(Otc::SpeedFormula formula) { return m_speedFormula[formula]; } double getSpeedFormula(Otc::SpeedFormula formula) { return m_speedFormula[formula]; }
bool hasSpeedFormula(); bool hasSpeedFormula();
std::array<double, Otc::LastSpeedFormula> getSpeedFormulaArray() { return m_speedFormula; } std::array<double, Otc::LastSpeedFormula> getSpeedFormulaArray() { return m_speedFormula; }

View File

@ -76,6 +76,11 @@ void Game::resetGameStates()
m_pingEvent = nullptr; m_pingEvent = nullptr;
} }
if(m_walkEvent) {
m_walkEvent->cancel();
m_walkEvent = nullptr;
}
m_containers.clear(); m_containers.clear();
m_vips.clear(); m_vips.clear();
m_gmActions.clear(); m_gmActions.clear();
@ -501,8 +506,21 @@ bool Game::walk(Otc::Direction direction)
return false; return false;
} }
if(!m_localPlayer->canWalk(direction)) // must add a new walk event
if(!m_localPlayer->canWalk(direction)) {
if(m_lastWalkDir != direction) {
float ticks = m_localPlayer->getStepTicksLeft();
if(ticks < 0)
ticks = 0;
if(m_walkEvent) {
m_walkEvent->cancel();
m_walkEvent = nullptr;
}
m_walkEvent = g_dispatcher.scheduleEvent([=] { walk(direction); }, ticks);
}
return false; return false;
}
Position toPos = m_localPlayer->getPosition().translatedToDirection(direction); Position toPos = m_localPlayer->getPosition().translatedToDirection(direction);
TilePtr toTile = g_map.getTile(toPos); TilePtr toTile = g_map.getTile(toPos);
@ -546,6 +564,7 @@ bool Game::walk(Otc::Direction direction)
g_lua.callGlobalField("g_game", "onWalk", direction); g_lua.callGlobalField("g_game", "onWalk", direction);
forceWalk(direction); forceWalk(direction);
m_lastWalkDir = direction;
return true; return true;
} }

View File

@ -307,6 +307,7 @@ private:
uint m_seq; uint m_seq;
Otc::FightModes m_fightMode; Otc::FightModes m_fightMode;
Otc::ChaseModes m_chaseMode; Otc::ChaseModes m_chaseMode;
Otc::Direction m_lastWalkDir;
bool m_safeFight; bool m_safeFight;
bool m_canReportBugs; bool m_canReportBugs;
std::vector<uint8> m_gmActions; std::vector<uint8> m_gmActions;
@ -314,6 +315,7 @@ private:
std::string m_worldName; std::string m_worldName;
std::bitset<Otc::LastGameFeature> m_features; std::bitset<Otc::LastGameFeature> m_features;
ScheduledEventPtr m_pingEvent; ScheduledEventPtr m_pingEvent;
ScheduledEventPtr m_walkEvent;
int m_protocolVersion; int m_protocolVersion;
int m_clientVersion; int m_clientVersion;
}; };

View File

@ -364,6 +364,10 @@ void OTClient::registerLuaFunctions()
g_lua.bindClassMemberFunction<Creature>("setOutfit", &Creature::setOutfit); g_lua.bindClassMemberFunction<Creature>("setOutfit", &Creature::setOutfit);
g_lua.bindClassMemberFunction<Creature>("getOutfit", &Creature::getOutfit); g_lua.bindClassMemberFunction<Creature>("getOutfit", &Creature::getOutfit);
g_lua.bindClassMemberFunction<Creature>("getDirection", &Creature::getDirection); g_lua.bindClassMemberFunction<Creature>("getDirection", &Creature::getDirection);
g_lua.bindClassMemberFunction<Creature>("getStepDuration", &Creature::getStepDuration);
g_lua.bindClassMemberFunction<Creature>("getStepProgress", &Creature::getStepProgress);
g_lua.bindClassMemberFunction<Creature>("getWalkTicksElapsed", &Creature::getWalkTicksElapsed);
g_lua.bindClassMemberFunction<Creature>("getStepTicksLeft", &Creature::getStepTicksLeft);
g_lua.bindClassMemberFunction<Creature>("setDirection", &Creature::setDirection); g_lua.bindClassMemberFunction<Creature>("setDirection", &Creature::setDirection);
g_lua.bindClassMemberFunction<Creature>("setSkullTexture", &Creature::setSkullTexture); g_lua.bindClassMemberFunction<Creature>("setSkullTexture", &Creature::setSkullTexture);
g_lua.bindClassMemberFunction<Creature>("setShieldTexture", &Creature::setShieldTexture); g_lua.bindClassMemberFunction<Creature>("setShieldTexture", &Creature::setShieldTexture);

View File

@ -433,15 +433,17 @@ ThingPtr Tile::getTopMoveThing()
return m_things[0]; return m_things[0];
} }
ThingPtr Tile::getTopMultiUseThing() ThingPtr Tile::getTopMultiUseThing(bool ignoreCreature)
{ {
// this is related to classic controls, getting top item, forceuse or creature // this is related to classic controls, getting top item, forceuse for creature
if(isEmpty()) if(isEmpty())
return nullptr; return nullptr;
for(uint i = 0; i < m_things.size(); ++i) { for(uint i = 0; i < m_things.size(); ++i) {
ThingPtr thing = m_things[i]; ThingPtr thing = m_things[i];
if(thing->isForceUse() || (!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop() && !thing->isCreature())) { if(thing->isForceUse() || (!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop())) {
if(thing->isCreature() && ignoreCreature)
continue;
if(i > 0 && thing->isSplash()) if(i > 0 && thing->isSplash())
return m_things[i-1]; return m_things[i-1];
return thing; return thing;
@ -450,9 +452,12 @@ ThingPtr Tile::getTopMultiUseThing()
for(uint i = 0; i < m_things.size(); ++i) { for(uint i = 0; i < m_things.size(); ++i) {
ThingPtr thing = m_things[i]; ThingPtr thing = m_things[i];
if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop() && !thing->isCreature()) if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop()) {
if(thing->isCreature() && ignoreCreature)
continue;
return thing; return thing;
} }
}
return m_things[0]; return m_things[0];
} }

View File

@ -81,7 +81,7 @@ public:
ThingPtr getTopUseThing(); ThingPtr getTopUseThing();
CreaturePtr getTopCreature(); CreaturePtr getTopCreature();
ThingPtr getTopMoveThing(); ThingPtr getTopMoveThing();
ThingPtr getTopMultiUseThing(); ThingPtr getTopMultiUseThing(bool ignoreCreature = true);
const Position& getPosition() { return m_position; } const Position& getPosition() { return m_position; }
int getDrawElevation() { return m_drawElevation; } int getDrawElevation() { return m_drawElevation; }