void Walker::move(Map *map) { Monster::move(map); switch(m_action) { case Still: set_action(Move); break; case Move: if (check_ahead(map)) { swap_move_dir(); } if (m_dir == Right) { set_vx(get_attribute("move_speed")); } else { set_vx(-get_attribute("move_speed")); } animate_move(); break; default: break; } }
void MummyDragon::move(Map *map) { Monster::move(map); switch(m_action) { case Still: set_action(Move); break; case Move: if (m_is_flying) { set_speed(0, m_fly_speed); if (m_fly_timer.check(m_fly_time) || m_y < m_top || m_y > m_bottom) { m_fly_timer.reset(); m_is_flying = false; } } else { if (get_left() < m_left || get_right() > m_right) { swap_move_dir(); if (m_turn_counter.expired(get_attribute("num_turns"))) { m_fly_time = 600; if (m_y < m_top + 100) { m_fly_speed = get_attribute("fly_speed"); } else { m_fly_speed = -get_attribute("fly_speed"); } m_is_flying = true; } else { m_attack_timer.enable(true); } } if (m_dir == Right) { set_speed(get_move_speed(map), 0); } else { set_speed(-get_move_speed(map), 0); } } animate_move(); if (m_attack_timer.expired(get_attribute("attack_timer"))) { m_attack_timer.enable(false); set_attack(); } break; case Attack: fire(); break; case Hit: m_fly_time = get_attribute("fly_time_after_hit"); m_fly_speed = -get_attribute("fly_speed"); m_is_flying = true; break; default: break; } unsigned n = m_bullets.size(); for (unsigned i = 0; i < n; i++) { m_bullets[i]->move(map); } }