void Mole::kill_fall() { set_state(DEAD); SoundManager::current()->play("sounds/fall.wav", get_pos()); run_dead_script(); }
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); } }
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(); } }
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(); }
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; }
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(); }
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); }
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; }
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(); }
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(); }
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(); }
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(); }
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(); } }
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(); }
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); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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; }
void Mole::ignite() { set_state(BURNING); run_dead_script(); SoundManager::current()->play("sounds/fire.ogg", get_pos()); }