Example #1
0
void Creature::walk(const Position& position, bool inverse)
{
    // set walking state
    bool sameWalk = m_walking && !m_inverseWalking && inverse;
    m_walking = true;
    m_inverseWalking = inverse;
    int walkTimeFactor = 1;

    // set new direction
    if(m_position + Position(0, -1, 0) == position) {
        setDirection(Otc::North);
        m_walkOffset.y = 32;
    }
    else if(m_position + Position(1, 0, 0) == position) {
        setDirection(Otc::East);
        m_walkOffset.x = -32;
    }
    else if(m_position + Position(0, 1, 0) == position) {
        setDirection(Otc::South);
        m_walkOffset.y = -32;
    }
    else if(m_position + Position(-1, 0, 0) == position) {
        setDirection(Otc::West);
        m_walkOffset.x = 32;
    }
    else if(m_position + Position(1, -1, 0) == position) {
        setDirection(Otc::NorthEast);
        m_walkOffset.x = -32;
        m_walkOffset.y = 32;
        walkTimeFactor = 2;
    }
    else if(m_position + Position(1, 1, 0) == position) {
        setDirection(Otc::SouthEast);
        m_walkOffset.x = -32;
        m_walkOffset.y = -32;
        walkTimeFactor = 2;
    }
    else if(m_position + Position(-1, 1, 0) == position) {
        setDirection(Otc::SouthWest);
        m_walkOffset.x = 32;
        m_walkOffset.y = -32;
        walkTimeFactor = 2;
    }
    else if(m_position + Position(-1, -1, 0) == position) {
        setDirection(Otc::NorthWest);
        m_walkOffset.x = 32;
        m_walkOffset.y = 32;
        walkTimeFactor = 2;
    }
    else { // Teleport
        // we teleported, dont walk or change direction
        m_walking = false;
        m_walkOffset.x = 0;
        m_walkOffset.y = 0;
        m_animation = 0;
    }

    if(!m_inverseWalking) {
        m_walkOffset.x = 0;
        m_walkOffset.y = 0;
    }

    if(m_walking) {
        // get walk speed
        int groundSpeed = 100;

        ItemPtr ground = g_map.getTile(position)->getGround();
        if(ground)
            groundSpeed = ground->getType()->parameters[ThingType::GroundSpeed];

        float walkTime = walkTimeFactor * 1000.0 * (float)groundSpeed / m_speed;
        walkTime = (walkTime == 0) ? 1000 : walkTime;

        m_walkTimePerPixel = walkTime / 32.0;
        if(!sameWalk)
            m_walkStartTicks = g_clock.ticks();
        updateWalk();
    }
}