Quick answer: Pygame collidelist returning −1 despite a clear visual overlap? An empty rect (width or height = 0) never collides — pygame returns no hit.

Boss bullet rects are zero-height because of a layout bug; collidelist with the player rect never reports a hit. Damage never lands.

Zero-Size Rects Don’t Collide

Pygame Rect collision uses strict-inclusive bounds. A zero-width or zero-height rect has no interior — nothing collides with it.

Guard the Source

if bullet_rect.width > 0 and bullet_rect.height > 0:
    hit = bullet_rect.collidelist(player_rects)

Skip collision logic if the rect is degenerate — usually a sign of an earlier bug worth investigating.

Inflate to Min Size

For trail / projectile rects, pygame.Rect.inflate(1, 1) guarantees a 1-pixel area. Quick fix when you can’t change the rect’s source.

Sprite Group Collide Same

pygame.sprite.spritecollideany follows the same rule. Empty sprite rects never trigger group collisions.

Verifying

Bullets always have positive size. Collide logic fires when rects overlap. No silent −1 returns.

“Empty rects don’t collide. Guard for positive size or inflate.”

Log every Rect creation in debug builds — zero-size rects almost always trace to a constructor / arithmetic bug worth fixing at the source.