Skip to content

Proper fix for geron speed/screw collision #376

@biosp4rk

Description

@biosp4rk

Ideally we don't extend the hitbox of gerons to prevent bonking

Fix idea 1: Add clipdata that you can only pass through with speed boost / shinespark (with no breaking animation/sound)

Fix idea 2: Add extra logic in the samus/sprite collision function, something like this:

+ cantScrew = gSamusData.pose == SPOSE_SCREW_ATTACKING && !(ProjectileGetSpriteWeakness(i) & WEAKNESS_SCREW_ATTACK);

- if (!SpriteUtilCheckSamusDamagingPose())
+ if (!SpriteUtilCheckSamusDamagingPose() || cantScrew)
  {
      if (SpriteUtilCheckSamusPseudoScrew(i))
      {
          gIgnoreSamusAndSpriteCollision = TRUE;
          break;
      }

      if (collisionFlags & SPRITE_COLLISION_FLAG_ON_LEFT)
      {
          SpriteUtilCheckCollisionAtPosition(samusY, spriteLeft - gSamusData.drawDistanceRight + gSamusData.drawDistanceLeft);

          if (gPreviousCollisionCheck == COLLISION_AIR)
              gSamusData.xPosition = spriteLeft - gSamusData.drawDistanceRight;
      }
      else
      {
          SpriteUtilCheckCollisionAtPosition(samusY, spriteRight - gSamusData.drawDistanceLeft + gSamusData.drawDistanceRight);

          if (gPreviousCollisionCheck == COLLISION_AIR)
              gSamusData.xPosition = spriteRight - gSamusData.drawDistanceLeft;
      }

+     if (cantScrew)
+         break;

      if (gSamusData.invincibilityTimer == 0 && !SpriteUtilCheckSamusDamagingPose())
      {
          SpriteUtilTakeDamageFromSprite(TRUE, i, 1);
      }
      else
      {
          SpriteUtilCheckCollisionAtPosition(samusY + ONE_SUB_PIXEL + gSamusData.drawDistanceTop, samusX);

          if (gPreviousCollisionCheck == COLLISION_AIR)
          {
              if (collisionFlags & SPRITE_COLLISION_FLAG_ON_LEFT)
                  gSamusData.direction = KEY_RIGHT;
              else
                  gSamusData.direction = KEY_LEFT;

              SpriteUtilTakeKnockback(i);
          }
      }
  }

  gIgnoreSamusAndSpriteCollision = TRUE;
  break;

https://github.com/metroidret/mf/blob/f87c5dbee316cf949e09857bd2f42fa0a987cbc4/src/sprite_util.c#L749

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions