示例#1
0
void
Mole::kill_fall()
{
  set_state(DEAD);
  SoundManager::current()->play("sounds/fall.wav", get_pos());
  run_dead_script();
}
示例#2
0
文件: yeti.cpp 项目: feilix/supertux
void Yeti::take_hit(Player& )
{
  if(safe_timer.started())
    return;

  SoundManager::current()->play("sounds/yeti_roar.wav");
  hit_points--;

  if(hit_points <= 0) {
    // We're dead
    physic.enable_gravity(true);
    physic.set_velocity_x(0);
    physic.set_velocity_y(0);

    // Set the badguy layer to be above the foremost, so that
    // this does not reveal secret tilemaps:
    layer = Sector::current()->get_foremost_layer() + 1;
    state = SQUISHED;
    state_timer.start(YETI_SQUISH_TIME);
    set_colgroup_active(COLGROUP_MOVING_ONLY_STATIC);
    sprite->set_action("dead");

    run_dead_script();
  }
  else {
    safe_timer.start(SAFE_TIME);
  }
}
示例#3
0
void
BadGuy::ignite()
{
  if (!is_flammable() || m_ignited) {
    return;
  }

  m_physic.enable_gravity(true);
  m_physic.set_velocity_x(0);
  m_physic.set_velocity_y(0);
  set_group(COLGROUP_MOVING_ONLY_STATIC);
  m_sprite->stop_animation();
  m_ignited = true;

  if (m_sprite->has_action("melting-left")) {

    // melt it!
    if (m_sprite->has_action("ground-melting-left") && on_ground()) {
      m_sprite->set_action(m_dir == Direction::LEFT ? "ground-melting-left" : "ground-melting-right", 1);
      SoundManager::current()->play("sounds/splash.ogg", get_pos());
      set_state(STATE_GROUND_MELTING);
    } else {
      m_sprite->set_action(m_dir == Direction::LEFT ? "melting-left" : "melting-right", 1);
      SoundManager::current()->play("sounds/sizzle.ogg", get_pos());
      set_state(STATE_MELTING);
    }

    run_dead_script();

  } else if (m_sprite->has_action("burning-left")) {
    // burn it!
    m_glowing = true;
    SoundManager::current()->play("sounds/fire.ogg", get_pos());
    m_sprite->set_action(m_dir == Direction::LEFT ? "burning-left" : "burning-right", 1);
    set_state(STATE_BURNING);
    run_dead_script();
  } else if (m_sprite->has_action("inside-melting-left")) {
    // melt it inside!
    SoundManager::current()->play("sounds/splash.ogg", get_pos());
    m_sprite->set_action(m_dir == Direction::LEFT ? "inside-melting-left" : "inside-melting-right", 1);
    set_state(STATE_INSIDE_MELTING);
    run_dead_script();
  } else {
    // Let it fall off the screen then.
    kill_fall();
  }
}
示例#4
0
void
MrBomb::kill_fall()
{
  if (is_valid()) {
    remove_me();
    Sector::get().add<Explosion>(m_col.m_bbox.get_middle());
  }

  run_dead_script();
}
void
Haywire::kill_fall()
{
  if(is_valid()) {
    remove_me();
    Explosion* explosion = new Explosion(get_bbox().get_middle());
    Sector::current()->add_object(explosion);
  }

  run_dead_script();
}
示例#6
0
void
BadGuy::update(float elapsed_time)
{
  if(!Sector::current()->inside(bbox)) {
    run_dead_script();
    is_active_flag = false;
    remove_me();
    // This was removed due to fixing a bug. If is it needed somewhere, then I'm sorry. --Hume2
    /**if(countMe) {
      // get badguy name from sprite_name ignoring path and extension
      std::string badguy = sprite_name.substr(0, sprite_name.length() - 7);
      int path_chars = badguy.rfind("/",badguy.length());
      badguy = badguy.substr(path_chars + 1, badguy.length() - path_chars);
      // log warning since badguys_killed can no longer reach total_badguys
      std::string current_level = "[" + Sector::current()->get_level()->filename + "] ";
      log_warning << current_level << "Counted badguy " << badguy << " starting at " << start_position << " has left the sector" <<std::endl;;
    }*/
    return;
  }
  if ((state != STATE_INACTIVE) && is_offscreen()) {
    if (state == STATE_ACTIVE) deactivate();
    set_state(STATE_INACTIVE);
  }

  switch(state) {
    case STATE_ACTIVE:
      is_active_flag = true;
      if (Editor::current()) if (Editor::current()->levelloaded) {
        break;
      }
      active_update(elapsed_time);
      break;
    case STATE_INIT:
    case STATE_INACTIVE:
      is_active_flag = false;
      inactive_update(elapsed_time);
      try_activate();
      break;
    case STATE_SQUISHED:
      is_active_flag = false;
      if(state_timer.check()) {
        remove_me();
        break;
      }
      movement = physic.get_movement(elapsed_time);
      break;
    case STATE_FALLING:
      is_active_flag = false;
      movement = physic.get_movement(elapsed_time);
      break;
  }

  on_ground_flag = false;
}
示例#7
0
void
MrBomb::kill_fall()
{
  if(is_valid()) {
    remove_me();
    auto explosion = std::make_shared<Explosion>(bbox.get_middle());
    Sector::current()->add_object(explosion);
  }

  run_dead_script();
}
示例#8
0
HitResponse
MrCandle::collision(GameObject& other, const CollisionHit& hit) {
  Lantern* l = dynamic_cast<Lantern*>(&other);
  if (l && !frozen) if (l->get_bbox().p2.y < bbox.p1.y) {
    l->add_color(lightcolor);
    run_dead_script();
    remove_me();
    return FORCE_MOVE;
  }
  return WalkingBadguy::collision(other, hit);
}
示例#9
0
文件: mole.cpp 项目: leyyin/supertux
bool
Mole::collision_squished(GameObject& )
{
  if (frozen)
    return true;

  set_state(DEAD);
  SoundManager::current()->play("sounds/squish.wav", get_pos());
  run_dead_script();
  return true;
}
示例#10
0
void
KamikazeSnowball::kill_collision()
{
    sprite->set_action(dir == LEFT ? "collision-left" : "collision-right");
    sound_manager->play(SPLAT_SOUND, get_pos());
    physic.set_velocity_x(0);
    physic.set_velocity_y(0);
    physic.enable_gravity(true);
    set_state(STATE_FALLING);

    run_dead_script();
}
示例#11
0
void
BadGuy::kill_fall()
{
  sound_manager->play("sounds/fall.wav", get_pos());
  physic.set_velocity_y(0);
  physic.set_acceleration_y(0);
  physic.enable_gravity(true);
  set_state(STATE_FALLING);

  // start dead-script
  run_dead_script();
}
示例#12
0
void
Stalactite::squish()
{
  state = STALACTITE_SQUISHED;
  physic.enable_gravity(true);
  physic.set_velocity_x(0);
  physic.set_velocity_y(0);
  set_state(STATE_SQUISHED);
  sprite->set_action("squished");
  SoundManager::current()->play("sounds/icecrash.ogg", get_pos());
  set_group(COLGROUP_MOVING_ONLY_STATIC);
  run_dead_script();
}
示例#13
0
void
GhostTree::die()
{
  mystate = STATE_DYING;
  sprite->set_action("dying", 1);
  glow_sprite->set_action("dying", 1);

  for(auto iter = willowisps.begin(); iter != willowisps.end(); ++iter) {
    TreeWillOWisp& willo = **iter;
    willo.vanish();
  }
  run_dead_script();
}
示例#14
0
void
BadGuy::kill_fall()
{
  if (!is_active()) return;

  if (m_frozen) {
    SoundManager::current()->play("sounds/brick.wav");
    Vector pr_pos;
    float cx = m_col.m_bbox.get_width() / 2;
    float cy = m_col.m_bbox.get_height() / 2;
    for (pr_pos.x = 0; pr_pos.x < m_col.m_bbox.get_width(); pr_pos.x += 16) {
      for (pr_pos.y = 0; pr_pos.y < m_col.m_bbox.get_height(); pr_pos.y += 16) {
        Vector speed = Vector((pr_pos.x - cx) * 8, (pr_pos.y - cy) * 8 + 100);
        Sector::get().add<SpriteParticle>(
            "images/particles/ice_piece1.sprite", "default",
            m_col.m_bbox.p1() + pr_pos, ANCHOR_MIDDLE,
            speed,
            Vector(0, Sector::get().get_gravity() * 100.0f));
      }
    }
    // start dead-script
    run_dead_script();
    remove_me();
  } else {
    SoundManager::current()->play("sounds/fall.wav", get_pos());
    m_physic.set_velocity_y(0);
    m_physic.set_acceleration_y(0);
    m_physic.enable_gravity(true);
    set_state(STATE_FALLING);

    // Set the badguy layer to be the foremost, so that
    // this does not reveal secret tilemaps:
    m_layer = Sector::get().get_foremost_layer() + 1;
    // start dead-script
    run_dead_script();
  }

}
示例#15
0
void
Flame::freeze()
{
  SoundManager::current()->play("sounds/sizzle.ogg", get_pos());
  sprite->set_action("fade", 1);
  Sector::current()->add_object(std::make_shared<SpriteParticle>("images/objects/particles/smoke.sprite",
                                                                 "default",
                                                                 bbox.get_middle(), ANCHOR_MIDDLE,
                                                                 Vector(0, -150), Vector(0,0), LAYER_BACKGROUNDTILES+2));
  set_group(COLGROUP_DISABLED);

  // start dead-script
  run_dead_script();
}
示例#16
0
void
Yeti::active_update(float elapsed_time)
{
  switch(state) {
    case JUMP_DOWN:
      physic.set_velocity_x((dir==RIGHT)?+JUMP_DOWN_VX:-JUMP_DOWN_VX);
      break;
    case RUN:
      physic.set_velocity_x((dir==RIGHT)?+RUN_VX:-RUN_VX);
      if (((dir == RIGHT) && (get_pos().x >= right_jump_x)) || ((dir == LEFT) && (get_pos().x <= left_jump_x))) jump_up();
      break;
    case JUMP_UP:
      physic.set_velocity_x((dir==RIGHT)?+JUMP_UP_VX:-JUMP_UP_VX);
      if (((dir == RIGHT) && (get_pos().x >= right_stand_x)) || ((dir == LEFT) && (get_pos().x <= left_stand_x))) be_angry();
      break;
    case BE_ANGRY:
      if(state_timer.check() && on_ground()) {
        physic.set_velocity_y(STOMP_VY);
        sprite->set_action((dir==RIGHT)?"stomp-right":"stomp-left");
        SoundManager::current()->play("sounds/yeti_gna.wav");
      }
      break;
    case SQUISHED:
      {
        Direction newdir = (int(state_timer.get_timeleft() * SNOW_EXPLOSIONS_FREQUENCY) % 2) ? LEFT : RIGHT;
        if (dir != newdir && dir == RIGHT) {
          SoundManager::current()->play("sounds/stomp.wav");
          add_snow_explosions();
          Sector::current()->camera->shake(.05f, 0, 5);
        }
        dir = newdir;
        sprite->set_action((dir==RIGHT)?"jump-right":"jump-left");
      }
      if (state_timer.check()) {
        BadGuy::kill_fall();
        state = FALLING;
        physic.set_velocity_y(JUMP_UP_VY / 2); // Move up a bit before falling
        // Add some extra explosions
        for (int i = 0; i < 10; i++) {
          add_snow_explosions();
        }
        run_dead_script();
      }
      break;
    case FALLING:
      break;
  }

  movement = physic.get_movement(elapsed_time);
}
示例#17
0
void
Haywire::kill_fall()
{
  if(is_exploding) {
    ticking->stop();
    grunting->stop();
  }
  if(is_valid()) {
    remove_me();
    auto explosion = std::make_shared<Explosion>(get_bbox().get_middle());
    Sector::current()->add_object(explosion);
  }

  run_dead_script();
}
示例#18
0
void
BadGuy::kill_fall()
{
  if (!is_active()) return;

  SoundManager::current()->play("sounds/fall.wav", get_pos());
  physic.set_velocity_y(0);
  physic.set_acceleration_y(0);
  physic.enable_gravity(true);
  set_state(STATE_FALLING);
  layer = LAYER_FALLING;

  // start dead-script
  run_dead_script();
}
示例#19
0
void
ShortFuse::explode()
{
    if (!is_valid())
        return;

    auto explosion = std::make_shared<Explosion>(get_bbox ().get_middle());

    explosion->hurts(false);
    explosion->pushes(true);
    Sector::current()->add_object(explosion);

    run_dead_script();
    remove_me();
}
示例#20
0
void
BadGuy::kill_squished(GameObject& object)
{
  sound_manager->play("sounds/squish.wav", get_pos());
  physic.enable_gravity(true);
  physic.set_velocity_x(0);
  physic.set_velocity_y(0);
  set_state(STATE_SQUISHED);
  set_group(COLGROUP_MOVING_ONLY_STATIC);
  Player* player = dynamic_cast<Player*>(&object);
  if (player) {
    player->bounce(*this);
  }

  // start dead-script
  run_dead_script();
}
示例#21
0
void
Owl::kill_fall()
{
  SoundManager::current()->play("sounds/fall.wav", get_pos());
  physic.set_velocity_y(0);
  physic.set_acceleration_y(0);
  physic.enable_gravity(true);
  set_state(STATE_FALLING);

  if (carried_object != NULL) {
    carried_object->ungrab (*this, dir);
    carried_object = NULL;
  }

  // start dead-script
  run_dead_script();
}
示例#22
0
void
BadGuy::kill_fall()
{
  if (!is_active()) return;

  SoundManager::current()->play("sounds/fall.wav", get_pos());
  physic.set_velocity_y(0);
  physic.set_acceleration_y(0);
  physic.enable_gravity(true);
  set_state(STATE_FALLING);

  // Set the badguy layer to be the foremost, so that
  // this does not reveal secret tilemaps:
  layer = Sector::current()->get_foremost_layer() + 1;

  // start dead-script
  run_dead_script();
}
示例#23
0
void
LiveFire::kill_fall()
{
  sound_manager->play(death_sound, get_pos());
  // throw a puff of smoke
  Vector ppos = bbox.get_middle();
  Vector pspeed = Vector(0, -150);
  Vector paccel = Vector(0,0);
  Sector::current()->add_object(new SpriteParticle("images/objects/particles/smoke.sprite", "default", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_BACKGROUNDTILES+2));
  // extinguish the flame
  sprite->set_action(dir == LEFT ? "extinguish-left" : "extinguish-right", 1);
  physic.set_velocity_y(0);
  physic.set_acceleration_y(0);
  physic.enable_gravity(false);
  lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
  lightsprite->set_color(Color(0.5f, 0.4f, 0.3f));
  set_group(COLGROUP_DISABLED);

  // start dead-script
  run_dead_script();
}
示例#24
0
void
Bomb::explode()
{
  ticking->stop();

  // Make the player let go before we explode, otherwise the player is holding
  // an invalid object. There's probably a better way to do this than in the
  // Bomb class.
  if (grabber != NULL) {
    Player* player = dynamic_cast<Player*>(grabber);

    if (player)
      player->stop_grabbing();
  }

  if(is_valid()) {
    remove_me();
    auto explosion = std::make_shared<Explosion>(get_bbox().get_middle());
    Sector::current()->add_object(explosion);
  }

  run_dead_script();
}
示例#25
0
void
GoldBomb::kill_fall()
{
  if(tstate == STATE_TICKING)
    ticking->stop();

  // Make the player let go before we explode, otherwise the player is holding
  // an invalid object. There's probably a better way to do this than in the
  // GoldBomb class.
  if (grabber != nullptr) {
    Player* player = dynamic_cast<Player*>(grabber);

    if (player)
      player->stop_grabbing();
  }

  if(is_valid()) {
    remove_me();
    Sector::get().add<Explosion>(bbox.get_middle());
    Sector::get().add<CoinExplode>(get_pos() + Vector (0, -40));
  }

  run_dead_script();
}
示例#26
0
void
BadGuy::update(float dt_sec)
{
  if (!Sector::get().inside(m_col.m_bbox)) {
    run_dead_script();
    m_is_active_flag = false;
    remove_me();
    // This was removed due to fixing a bug. If is it needed somewhere, then I'm sorry. --Hume2
    /**if(countMe) {
      // get badguy name from sprite_name ignoring path and extension
      std::string badguy = sprite_name.substr(0, sprite_name.length() - 7);
      int path_chars = badguy.rfind("/",badguy.length());
      badguy = badguy.substr(path_chars + 1, badguy.length() - path_chars);
      // log warning since badguys_killed can no longer reach total_badguys
      std::string current_level = "[" + Sector::get().get_level()->filename + "] ";
      log_warning << current_level << "Counted badguy " << badguy << " starting at " << start_position << " has left the sector" <<std::endl;;
    }*/
    return;
  }
  if ((m_state != STATE_INACTIVE) && is_offscreen()) {
    if (m_state == STATE_ACTIVE) deactivate();
    set_state(STATE_INACTIVE);
  }

  switch (m_state) {
    case STATE_ACTIVE:
      m_is_active_flag = true;
      if (Editor::is_active()) {
        break;
      }
      active_update(dt_sec);
      break;

    case STATE_INIT:
    case STATE_INACTIVE:
      m_is_active_flag = false;
      inactive_update(dt_sec);
      try_activate();
      break;

    case STATE_BURNING: {
      m_is_active_flag = false;
      m_col.m_movement = m_physic.get_movement(dt_sec);
      if ( m_sprite->animation_done() ) {
        remove_me();
      }
    } break;

    case STATE_GEAR:
    case STATE_SQUISHED:
      m_is_active_flag = false;
      if (m_state_timer.check()) {
        remove_me();
        break;
      }
      m_col.m_movement = m_physic.get_movement(dt_sec);
      break;

    case STATE_MELTING: {
      m_is_active_flag = false;
      m_col.m_movement = m_physic.get_movement(dt_sec);
      if ( m_sprite->animation_done() || on_ground() ) {
        Sector::get().add<WaterDrop>(m_col.m_bbox.p1(), get_water_sprite(), m_physic.get_velocity());
        remove_me();
        break;
      }
    } break;

    case STATE_GROUND_MELTING:
      m_is_active_flag = false;
      m_col.m_movement = m_physic.get_movement(dt_sec);
      if ( m_sprite->animation_done() ) {
        remove_me();
      }
      break;

    case STATE_INSIDE_MELTING: {
      m_is_active_flag = false;
      m_col.m_movement = m_physic.get_movement(dt_sec);
      if ( on_ground() && m_sprite->animation_done() ) {
        m_sprite->set_action(m_dir == Direction::LEFT ? "gear-left" : "gear-right", 1);
        set_state(STATE_GEAR);
      }
      int pa = graphicsRandom.rand(0,3);
      float px = graphicsRandom.randf(m_col.m_bbox.get_left(), m_col.m_bbox.get_right());
      float py = graphicsRandom.randf(m_col.m_bbox.get_top(), m_col.m_bbox.get_bottom());
      Vector ppos = Vector(px, py);
      Sector::get().add<SpriteParticle>(get_water_sprite(), "particle_" + std::to_string(pa),
                                             ppos, ANCHOR_MIDDLE,
                                             Vector(0, 0), Vector(0, 100 * Sector::get().get_gravity()),
                                             LAYER_OBJECTS-1);
    } break;

    case STATE_FALLING:
      m_is_active_flag = false;
      m_col.m_movement = m_physic.get_movement(dt_sec);
      break;
  }

  m_on_ground_flag = false;
}
示例#27
0
void
Mole::ignite() {
  set_state(BURNING);
  run_dead_script();
  SoundManager::current()->play("sounds/fire.ogg", get_pos());
}