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 Hovering::move(Map *map) { switch(m_action) { case Still: set_action(Move); break; case Move: face_reference(get_attribute("turn_width")); animate_move(); if (m_dir == Right) { if (m_x < m_x1) { set_vx(get_attribute("move_speed")); } else { set_vx(0); } } else { if (m_x > m_x0) { set_vx(-get_attribute("move_speed")); } else { set_vx(0); } } if (m_attack_timer.expired(get_attribute("attack_timer"))) { int dist = get_attribute("attack_distance"); int x = m_xref - get_front(); int y = m_yref - get_y(); if (x * x + y * y < dist * dist) { fire(); } } Body::move(map); break; case Hit: case HitPerish: set_vy(0); process_hit(); Monster::move(map); break; default: break; } // Move bullets unsigned n = m_bullets.size(); for (unsigned i = 0; i < n; i++) { m_bullets[i]->move(map); } }
void Monster::move(Map *map) { set_ay(get_attribute("weight")); switch(m_action) { case Still: break; case Move: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Fall: Body::move(map); if (!get_fall()) { m_hit_ground = true; set_vx(0); set_action(Still); } break; case Jump: Body::move(map); if (get_fall()) { set_action(Still); } break; case Hit: if (m_hit == HitPerish) { set_vx(0); if (m_perish_timer.expired(get_attribute("perish_time"))) { m_hit = HitPerished; } } else if (m_hit_timer.expired(get_attribute("hit_time"))) { m_hit_timer.reset(); set_vx(0); set_lock_direction(false); m_hit = HitNone; set_action(Still); } Body::move(map); break; default: break; } }
void Monster::process_hit() { if (m_action == HitPerish) { set_vx(0); if (m_perish_timer.expired(get_attribute("perish_time"))) { set_action(HitPerished); } } else if (m_hit_timer.expired(get_attribute("hit_time"))) { set_vx(0); set_lock_direction(false); reset_hit(); } }
void Dancer::move(Map *map) { Monster::move(map); switch(m_action) { case Still: set_action(Move); break; case Move: face_reference(get_attribute("turn_width")); animate_move(); if (m_attack_timer.check(get_attribute("attack_timer"))) { int dist = get_attribute("attack_distance"); int x = m_xref - get_front(); int y = m_yref - get_y(); if (x * x + y * y < dist * dist) { m_attack_timer.reset(); set_jump(map); if (get_reference() == Right) { set_speed(get_attribute("jump_forward"), -get_attribute("jump_speed")); } else { set_speed(-get_attribute("jump_forward"), -get_attribute("jump_speed")); } } } else { if (m_dir == Right) { set_vx(get_attribute("move_speed")); } else { set_vx(-get_attribute("move_speed")); } } break; default: break; } }
void Actor::set_attack(void) { if (m_action == Crouch) { set_action(AttackLow); } else { set_action(Attack); } set_vx(0); }
void Actor::set_attack(void) { if (m_action == Crouch) { set_action(LowAttack); } else { set_action(MediumAttack); } set_vx(0); }
bool Player::set_hit(Object *object, Status *status) { bool result = false; if (!m_invisible) { result = Actor::set_hit(object); if (result) { set_lock_direction(true); // Move backwards and upwards if (m_dir == Right) { set_vx(-get_attribute("move_speed")); } else { set_vx(get_attribute("move_speed")); } if (m_in_water) { set_vy(-get_attribute("water_jump_speed")); } else { set_vy(-get_attribute("jump_speed")); } m_hit_ground = false; Monster *monster = (Monster *) object; if (status->set_hit(monster->get_attribute("ap")) && !status->use_potion()) { set_invisible(true); set_solid(false); set_perish(false); } else { // Make player invisible for a certain time set_invisible(true); } } } return result; }
void Climber::leave_climb(Map *map) { #if 0 switch (m_climb_dir) { case ClimbRight: set_vx(-get_attribute("move_speed")); break; case ClimbLeft: set_vx(get_attribute("move_speed")); break; default: break; } #endif m_climb_dir = ClimbNone; set_vy(0); Player::set_jump(map); }
void Monster::move(Map *map) { switch(m_action) { case Still: set_vx(0); break; case Move: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Fall: Body::move(map); if (!get_fall()) { m_hit_ground = true; set_vx(0); set_action(Still); } break; case Jump: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Hit: case HitPerish: process_hit(); Body::move(map); break; default: break; } }
void Waver::move(Map *map) { switch(m_action) { case Still: set_action(Move); break; case Move: face_reference(get_attribute("turn_width")); animate_move(); if (m_dir == Right) { set_vx(get_move_speed(map)); } else { set_vx(-get_move_speed(map)); } m_wave_index += get_attribute("frequency"); if (m_wave_index >= c_num_steps) { m_wave_index = m_wave_index - c_num_steps; } set_vy(get_attribute("amplitude") * m_wave_y[m_wave_index] / 16); Body::move(map); break; case Hit: case HitPerish: set_ay(0); set_vy(0); process_hit(); Monster::move(map); break; default: break; } }
void Climber::move(Map *map) { int input = get_input(); if (m_climb_dir == ClimbNone && (m_action == Jump || m_action == Fall)) { const Tmx::Tileset *tileset = map->get_tileset(0); const Tmx::PropertySet prop = tileset->GetProperties(); // Check if on climb block int block_id = prop.GetNumericProperty("climb"); if (block_id) { if (m_dir == Right && (input & PRESS_RIGHT)) { if (check_ahead(map, 1, block_id, block_id) == 0) { set_vx(0); set_ay(0); m_leave_ready = false; m_climb_dir = ClimbRight; } } else if (m_dir == Left && (input & PRESS_LEFT)) { if (check_ahead(map, 1, block_id, block_id) == 0) { set_vx(0); set_ay(0); m_leave_ready = false; m_climb_dir = ClimbLeft; } } } } if (m_climb_dir == ClimbNone) { Knight::move(map); } else { move_climb(map, input); } }
void Player::player_move(Map *map) { Actor::move(map); check_water(map); int input = get_input(); const Tmx::Tileset *tileset = map->get_tileset(0); const Tmx::PropertySet prop = tileset->GetProperties(); // Check if on catapult int catid = prop.GetNumericProperty("catapult"); if (catid && check_below(map, 1, catid, catid) == 0) { if (input & PRESS_RIGHT) { set_vx(get_attribute("move_speed")); } else if (input & PRESS_LEFT) { set_vx(-get_attribute("move_speed")); } set_jump(map, true); } switch(m_action) { case Still: set_vx(0); case Move: // Check for crouch or move if (input & PRESS_DOWN) { set_action(Crouch); } else if (input & PRESS_RIGHT) { animate_move(); set_action(Move); set_vx(get_attribute("move_speed")); } else if (input & PRESS_LEFT) { animate_move(); set_action(Move); set_vx(-get_attribute("move_speed")); } else { set_action(Still); } // Check for jump if (input & PRESS_JUMP) { if (m_jump_ready && m_hit_ground) { if (input & PRESS_RIGHT) { set_vx(get_attribute("move_speed")); } else if (input & PRESS_LEFT) { set_vx(-get_attribute("move_speed")); } set_jump(map, false); } m_jump_ready = false; } else { // Restore jump lock m_jump_ready = true; } Body::move(map); if (get_fall()) { set_action(Fall); } break; case Fall: // Check for change of direction during fall if (input & PRESS_RIGHT) { set_vx(get_attribute("move_speed")); } else if (input & PRESS_LEFT) { set_vx(-get_attribute("move_speed")); } Body::move(map); if (!get_fall()) { m_hit_ground = true; set_action(Still); } break; case Jump: case Catapult: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Crouch: set_vx(0); Body::move(map); if (!get_fall()) { m_hit_ground = true; } if (!(input & PRESS_DOWN)) { set_action(Still); } break; case Hit: if (m_hit_timer.expired(get_attribute("hit_time"))) { set_vx(0); set_lock_direction(false); reset_hit(); } Body::move(map); break; case HitPerish: animate_perish(); set_speed(0, -get_attribute("move_speed")); Body::move(map); if (m_y < -get_image_height()) { set_solid(true); set_invisible(false); set_action(HitPerished); } break; case Attack: case AttackLow: if (animate_attack()) { reset_attack(); } Body::move(map); if (!get_fall()) { m_hit_ground = true; } break; default: Body::move(map); break; } }
void MekaDragon::move(Map *map) { Monster::move(map); switch(m_action) { case Still: set_action(Move); break; case Move: face_reference(get_attribute("turn_width")); set_lock_direction(true); if (m_horizontal_dir == HorizontalForward) { if (m_dir == Right) { set_vx(get_attribute("move_speed")); } else { set_vx(-get_attribute("move_speed")); } animate_move(); if (abs(m_xref - m_x) < get_attribute("attack_distance")) { m_horizontal_dir = HorizontalBackward; } } else if (m_horizontal_dir == HorizontalBackward) { if (m_dir == Right) { set_vx(-get_attribute("move_speed")); } else { set_vx(get_attribute("move_speed")); } animate_move(); if (abs(m_xref - m_x) > get_attribute("retreat_distance") || check_behind(map)) { m_horizontal_dir = HorizontalForward; } } if (m_attack_now || m_attack_timer.expired(get_attribute("attack_timer"))) { m_attack_timer.reset(); m_attack_now = false; set_attack(); } break; case Attack: if (m_idle_timer.check(get_attribute("attack_idle"))){ fire(); } break; case Hit: m_idle_timer.reset(); m_attack_now = true; break; default: break; } unsigned n = m_bullets.size(); for (unsigned i = 0; i < n; i++) { m_bullets[i]->move(map); } }
void Body::set_speed(int vx, int vy) { set_vx(vx); set_vy(vy); }
void Player::player_move(Map *map) { const Tmx::Tileset *tileset = map->get_tileset(0); const Tmx::PropertySet prop = tileset->GetProperties(); // Check if under water int start = prop.GetNumericProperty("water_start"); int end = prop.GetNumericProperty("water_end"); if (start && check_ahead(map, 1, start, end) == 0) { if (!m_water_timer.expired(get_attribute("water_treshold"))) { return; } m_water_timer.reset(); } // Check if on catapult int catid = prop.GetNumericProperty("catapult"); if (catid && check_below(map, 1, catid, catid) == 0) { set_vy(int(-get_attribute("catapult_speed"))); set_action(Jump); } Actor::move(map); set_ay(get_attribute("weight")); int input = get_input(); switch(m_action) { case Still: set_vx(0); case Move: // Check for jump if (input & PRESS_JUMP) { if (m_jump_ready) { m_jump_ready = false; set_action(Jump); if (input & PRESS_RIGHT) { set_speed(get_attribute("jump_forward"), -get_attribute("jump_speed")); } else if (input & PRESS_LEFT) { set_speed(-get_attribute("jump_forward"), -get_attribute("jump_speed")); } else { set_vy(-get_attribute("jump_speed")); } } } else { // Restore jump lock m_jump_ready = true; // Check for crouch or move if (input & PRESS_DOWN) { set_action(Crouch); } else if (input & PRESS_RIGHT) { animate_move(); set_action(Move); set_vx(get_attribute("move_speed")); } else if (input & PRESS_LEFT) { animate_move(); set_action(Move); set_vx(-get_attribute("move_speed")); } else { set_action(Still); set_vx(0); } } Body::move(map); if (get_fall()) { set_action(Fall); } break; case Fall: // Check for change of direction during fall if (input & PRESS_RIGHT) { set_vx(get_attribute("jump_forward")); } else if (input & PRESS_LEFT) { set_vx(-get_attribute("jump_forward")); } Body::move(map); if (!get_fall()) { set_action(Still); } break; case Jump: Body::move(map); if (get_fall()) { set_action(Fall); } break; case Crouch: set_vx(0); Body::move(map); if (!(input & PRESS_DOWN)) { set_action(Still); } break; case Hit: if (m_hit_timer.expired(get_attribute("hit_time"))) { m_hit_timer.reset(); set_vx(0); set_lock_direction(false); m_hit = HitNone; set_action(Still); } Body::move(map); break; default: Body::move(map); break; } }