bool entity_collides(level& lvl, const entity& e, MOVE_DIRECTION dir, collision_info* info) { if(!e.solid()) { return false; } if(!e.allow_level_collisions() && entity_collides_with_level(lvl, e, dir, info)) { return true; } const std::vector<entity_ptr>& solid_chars = lvl.get_solid_chars(); for(std::vector<entity_ptr>::const_iterator obj = solid_chars.begin(); obj != solid_chars.end(); ++obj) { if(obj->get() != &e && entity_collides_with_entity(e, **obj, info)) { if(info) { info->collide_with = *obj; } return true; } } return false; }
bool point_standable(const level& lvl, const entity& e, int x, int y, collision_info* info, ALLOW_PLATFORM allow_platform) { if(allow_platform == SOLID_AND_PLATFORMS && lvl.standable(x, y, info ? &info->surf_info : NULL) || allow_platform != SOLID_AND_PLATFORMS && lvl.solid(x, y, info ? &info->surf_info : NULL)) { if(info) { info->read_surf_info(); } if(info && !lvl.solid(x, y)) { info->platform = true; } return true; } const point pt(x, y); const std::vector<entity_ptr>& chars = lvl.get_solid_chars(); for(std::vector<entity_ptr>::const_iterator i = chars.begin(); i != chars.end(); ++i) { const entity_ptr& obj = *i; if(&e == obj.get()) { continue; } if(allow_platform == SOLID_AND_PLATFORMS || obj->solid_platform()) { const rect& platform_rect = obj->platform_rect_at(pt.x); if(point_in_rect(pt, platform_rect) && obj->platform()) { if(info) { info->collide_with = obj; info->friction = obj->surface_friction(); info->traction = obj->surface_traction(); info->adjust_y = y - platform_rect.y(); info->platform = !obj->solid_platform(); } return true; } } if((e.weak_solid_dimensions()&obj->solid_dimensions()) == 0 && (e.solid_dimensions()&obj->weak_solid_dimensions()) == 0) { continue; } if(!point_in_rect(pt, obj->solid_rect())) { continue; } const frame& f = obj->current_frame(); const int xpos = obj->face_right() ? x - obj->x() : obj->x() + f.width() - x - 1; const solid_info* solid = obj->solid(); if(solid && solid->solid_at(x - obj->x(), y - obj->y(), info ? &info->collide_with_area_id : NULL)) { if(info) { info->collide_with = obj; info->friction = obj->surface_friction(); info->traction = obj->surface_traction(); } return true; } } return false; }