HitResponse Block::collision(GameObject& other, const CollisionHit& ) { Player* player = dynamic_cast<Player*> (&other); if(player) { if(player->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) { hit(*player); } } // only interact with other objects if... // 1) we are bouncing // and // 2) the object is not portable (either never or not currently) Portable* portable = dynamic_cast<Portable*> (&other); if(bouncing && (portable == 0 || (!portable->is_portable()))) { // Badguys get killed BadGuy* badguy = dynamic_cast<BadGuy*> (&other); if(badguy) { badguy->kill_fall(); } // Coins get collected Coin* coin = dynamic_cast<Coin*> (&other); if(coin) { coin->collect(); } } return SOLID; }
HitResponse Kugelblitz::collision_badguy(BadGuy& other , const CollisionHit& chit) { //Let the Kugelblitz explode, too? The problem with that is that //two Kugelblitzes would cancel each other out on contact... other.kill_fall(); return hit(chit); }
HitResponse AngryStone::collision_badguy(BadGuy& badguy, const CollisionHit& ) { if (state == ATTACKING) { badguy.kill_fall(); return FORCE_MOVE; } return FORCE_MOVE; }
HitResponse MoleRock::collision_badguy(BadGuy& badguy, const CollisionHit& ) { // ignore collisions with parent if (&badguy == parent) { return FORCE_MOVE; } SoundManager::current()->play("sounds/stomp.wav", get_pos()); remove_me(); badguy.kill_fall(); return ABORT_MOVE; }
bool MrIceBlock::collision_squished(GameObject& object) { Player* player = dynamic_cast<Player*>(&object); if(player && (player->does_buttjump || player->is_invincible())) { player->bounce(*this); kill_fall(); return true; } switch(ice_state) { case ICESTATE_KICKED: { BadGuy* badguy = dynamic_cast<BadGuy*>(&object); if (badguy) { badguy->kill_fall(); break; } } // fall through case ICESTATE_NORMAL: { squishcount++; if (squishcount >= MAXSQUISHES) { kill_fall(); return true; } } set_state(ICESTATE_FLAT); nokick_timer.start(NOKICK_TIME); break; case ICESTATE_FLAT: { MovingObject* movingobject = dynamic_cast<MovingObject*>(&object); if (movingobject && (movingobject->get_pos().x < get_pos().x)) { dir = RIGHT; } else { dir = LEFT; } } if (nokick_timer.check()) set_state(ICESTATE_KICKED); break; case ICESTATE_GRABBED: assert(false); break; } if (player) player->bounce(*this); return true; }
HitResponse HurtingPlatform::collision(GameObject& other, const CollisionHit& ) { Player* player = dynamic_cast<Player*>(&other); if (player) { player->kill(false); } BadGuy* badguy = dynamic_cast<BadGuy*>(&other); if (badguy) { badguy->kill_fall(); } return FORCE_MOVE; }
HitResponse MrIceBlock::collision_badguy(BadGuy& badguy, const CollisionHit& hit) { switch(ice_state) { case ICESTATE_NORMAL: return WalkingBadguy::collision_badguy(badguy, hit); case ICESTATE_FLAT: return FORCE_MOVE; case ICESTATE_KICKED: badguy.kill_fall(); return FORCE_MOVE; default: assert(false); } return ABORT_MOVE; }
HitResponse Explosion::collision(GameObject& other, const CollisionHit& ) { if ((state != STATE_EXPLODING) || !hurt) return ABORT_MOVE; Player* player = dynamic_cast<Player*>(&other); if(player != 0) { player->kill(false); } BadGuy* badguy = dynamic_cast<BadGuy*>(&other); if(badguy != 0) { badguy->kill_fall(); } return ABORT_MOVE; }
HitResponse Stalactite::collision_badguy(BadGuy& other, const CollisionHit& hit) { if (state == STALACTITE_SQUISHED) return FORCE_MOVE; // ignore other Stalactites if (dynamic_cast<Stalactite*>(&other)) return FORCE_MOVE; if (state != STALACTITE_FALLING) return BadGuy::collision_badguy(other, hit); if (other.is_freezable()) { other.freeze(); } else { other.kill_fall(); } return FORCE_MOVE; }
HitResponse Block::collision(GameObject& other, const CollisionHit& ) { Player* player = dynamic_cast<Player*> (&other); if(player) { if(player->get_bbox().get_top() > get_bbox().get_bottom() - SHIFT_DELTA) { hit(*player); } } // only interact with other objects if... // 1) we are bouncing // 2) the object is not portable (either never or not currently) // 3) the object is being hit from below (baguys don't get killed for activating boxes) Portable* portable = dynamic_cast<Portable*> (&other); MovingObject* moving_object = dynamic_cast<MovingObject*> (&other); bool is_portable = ((portable != 0) && portable->is_portable()); bool hit_mo_from_below = ((moving_object == 0) || (moving_object->get_bbox().get_bottom() < (get_bbox().get_top() + SHIFT_DELTA))); if(bouncing && !is_portable && hit_mo_from_below) { // Badguys get killed BadGuy* badguy = dynamic_cast<BadGuy*> (&other); if(badguy) { badguy->kill_fall(); } // Coins get collected Coin* coin = dynamic_cast<Coin*> (&other); if(coin) { coin->collect(); } //Eggs get jumped GrowUp* growup = dynamic_cast<GrowUp*> (&other); if(growup) { growup->do_jump(); } } return FORCE_MOVE; }
HitResponse Snail::collision_badguy(BadGuy& badguy, const CollisionHit& hit) { if (m_frozen) return WalkingBadguy::collision_badguy(badguy, hit); switch (state) { case STATE_NORMAL: return WalkingBadguy::collision_badguy(badguy, hit); case STATE_FLAT: case STATE_KICKED_DELAY: return FORCE_MOVE; case STATE_KICKED: badguy.kill_fall(); return FORCE_MOVE; default: assert(false); } return ABORT_MOVE; }
HitResponse SnowSnail::collision_badguy(BadGuy& badguy, const CollisionHit& hit) { switch(ice_state) { case ICESTATE_NORMAL: if(fabsf(hit.normal.x) > .8) { dir = dir == LEFT ? RIGHT : LEFT; sprite->set_action(dir == LEFT ? "left" : "right"); physic.set_velocity_x(-physic.get_velocity_x()); } return CONTINUE; case ICESTATE_FLAT: return FORCE_MOVE; case ICESTATE_KICKED: badguy.kill_fall(); return FORCE_MOVE; default: assert(false); } return ABORT_MOVE; }
HitResponse Block::collision(GameObject& other, const CollisionHit& ) { Player* player = dynamic_cast<Player*> (&other); if(player) { if(player->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) { hit(*player); } } if(bouncing) { BadGuy* badguy = dynamic_cast<BadGuy*> (&other); if(badguy) { badguy->kill_fall(); } Coin* coin = dynamic_cast<Coin*> (&other); if(coin) { coin->collect(); } } return SOLID; }
HitResponse IceCrusher::collision(GameObject& other, const CollisionHit& hit) { Player* player = dynamic_cast<Player*>(&other); /* If the other object is the player, and the collision is at the bottom of * the ice crusher, hurt the player. */ if (player && hit.bottom) { SoundManager::current()->play("sounds/brick.wav"); if (state == CRUSHING) set_state(RECOVERING); if(player->is_invincible()) { return ABORT_MOVE; } player->kill(false); return FORCE_MOVE; } BadGuy* badguy = dynamic_cast<BadGuy*>(&other); if (badguy) { badguy->kill_fall(); } return FORCE_MOVE; }