BadGuy::BadGuy()
: countMe(true), sprite(0), dir(LEFT), state(STATE_INIT)
{
+ set_group(COLGROUP_DISABLED);
}
BadGuy::~BadGuy()
{
}
+void
+BadGuy::collision_tile(uint32_t tile_attributes)
+{
+ if(tile_attributes & Tile::HURTS)
+ kill_fall();
+}
+
HitResponse
BadGuy::collision(GameObject& other, const CollisionHit& hit)
{
case STATE_INACTIVE:
return ABORT_MOVE;
case STATE_ACTIVE: {
- TileMap* tilemap = dynamic_cast<TileMap*> (&other);
- if(tilemap != 0) {
- const TilemapCollisionHit* thit
- = static_cast<const TilemapCollisionHit*> (&hit);
- if(thit->tileflags & Tile::SPIKE)
- kill_fall();
- if(thit->tileflags & Tile::SOLID)
- return collision_solid(other, hit);
- return FORCE_MOVE;
- }
+ if(other.get_flags() & FLAG_SOLID)
+ return collision_solid(other, hit);
BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
if(badguy && badguy->state == STATE_ACTIVE)
// hit from above?
if(player.get_movement().y - get_movement().y > 0 && player.get_bbox().p2.y <
(get_bbox().p1.y + get_bbox().p2.y) / 2) {
- // if it's not is it possible to squish us, then this will hurt
+ // if it's not possible to squish us, then this will hurt
if(!collision_squished(player))
player.kill(Player::SHRINK);
physic.set_velocity_x(0);
physic.set_velocity_y(0);
set_state(STATE_SQUISHED);
+ set_group(COLGROUP_MOVING_ONLY_STATIC);
global_stats.add_points(BADGUYS_KILLED_STAT, 1);
player.bounce(*this);
}
activate();
}
}
+
+bool
+BadGuy::may_fall_off_platform()
+{
+ int tile_x, tile_y;
+ // First, let's say the badguy moves once its width in the
+ // direction it's heading.
+ Vector pos = get_pos();
+ pos.x += (dir == LEFT ? -bbox.get_width() : bbox.get_width());
+
+ // Now, snap the badguy's X coordinate to the 32x32/cell grid.
+ if (dir == LEFT) // use the ceiling
+ tile_x = (int)ceilf(pos.x/32.0f);
+ else // use the floor
+ tile_x = (int)floorf(pos.x/32.0f);
+
+ // We might be falling down, so use the ceiling to round upward and
+ // get the lower position. (Positive Y goes downward.)
+ tile_y = (int)ceilf(pos.y/32.0f);
+
+ // Now, if the badguy intersects with a tile, he won't fall off.
+ // If he doesn't intersect, he probably will.
+ if (Sector::current()->solids->get_tile(tile_x, tile_y)->getAttributes() & FLAG_SOLID)
+ {
+ // It's a solid tile. Good.
+ return false;
+ }
+
+ // Watch out there buddy, you might take a sticky end!
+ return true;
+}