fix a walk glitch

master
Eduardo Bart 13 years ago
parent 3b5dd3ecf9
commit afe095e292

@ -39,6 +39,7 @@ Creature::Creature() : Thing()
m_walking = false;
m_walkOffsetX = 0;
m_walkOffsetY = 0;
m_lastWalkAnim = 1;
m_informationFont = g_fonts.getFont("tibia-12px-rounded");
}
@ -112,7 +113,6 @@ void Creature::draw(int x, int y)
// Update animation and position
if(m_walking && type.animationPhases > 1) {
if(g_platform.getTicks() - m_lastTicks >= m_walkTimePerPixel) {
int pixelsWalked = std::floor((g_platform.getTicks() - m_lastTicks) / m_walkTimePerPixel);
int remainingTime = (g_platform.getTicks() - m_lastTicks) % (int)m_walkTimePerPixel;
@ -129,11 +129,12 @@ void Creature::draw(int x, int y)
int walkOffset = std::max(std::abs(m_walkOffsetX), std::abs(m_walkOffsetY));
if(walkOffset % (int)std::ceil(32 / (float)type.animationPhases) == 0) {
if((m_animation+1) % type.animationPhases == 0)
m_animation = 1;
if((m_lastWalkAnim+1) % type.animationPhases == 0)
m_lastWalkAnim = 1;
else
m_animation++;
m_lastWalkAnim++;
}
m_animation = m_lastWalkAnim;
if(((m_walkOffsetX == 0 && m_walkOffsetY == 0) && m_walkOffsetX != m_walkOffsetY) ||
((m_walkOffsetX == 0 || m_walkOffsetY == 0) && m_walkOffsetX == m_walkOffsetY)) {
@ -221,10 +222,8 @@ void Creature::walk(const Position& position)
}
// update map tiles
TilePtr oldTile = g_map.getTile(m_position);
TilePtr newTile = g_map.getTile(position);
oldTile->removeThing(asThing());
newTile->addThing(asThing(), -1);
g_map.removeThing(asThing());
g_map.addThing(asThing(), position);
if(m_walking) {
// Calculate xPattern
@ -241,7 +240,7 @@ void Creature::walk(const Position& position)
// get walk speed
int groundSpeed = 0;
ItemPtr ground = newTile->getGround();
ItemPtr ground = g_map.getTile(position)->getGround();
if(ground)
groundSpeed = ground->getType().groundSpeed;

@ -96,6 +96,7 @@ private:
bool m_walking;
float m_walkTimePerPixel;
Position m_walkingFromPosition;
int m_lastWalkAnim;
int m_walkOffsetX, m_walkOffsetY;
};

@ -54,7 +54,7 @@ void Tile::draw(int x, int y)
for(auto it = m_things.rbegin(); it != m_things.rend(); ++it) {
const ThingPtr& thing = *it;
const ThingType& type = thing->getType();
if(type.isOnTop || type.isOnBottom || type.isGround || type.isGroundClip)
if(thing->asCreature() || type.isOnTop || type.isOnBottom || type.isGroundClip || type.isGround)
break;
thing->draw(x - m_drawElevation, y - m_drawElevation);
m_drawElevation += type.elevation;

Loading…
Cancel
Save