Spelunky is © 2008, 2009 Derek Yu and Mossmouth, LLC, and is used under the [Spelunky User License v1.1b](https://spelunky.ai/LICENSE.txt). spelunky.ai is an unofficial fan project, not affiliated with or endorsed by Mossmouth. The game and its assets may not be sold.

Music by George Buzinkai and Jonathan Perry; sound effects made in SFXR. From Spelunky Classic 1.1, © 2008, 2009 Derek Yu and Mossmouth, LLC.

# Piranha

From the spelunky.ai wiki: <https://spelunky.ai/wiki/piranha>. Verified against the spelunky.ai port [v0.1.10](https://github.com/851-labs/spelunky/releases/tag/v0.1.10) on 27 October 2026.

The Piranha is a small fish in Spelunky Classic that lives in the Jungle's water and swims at a player in the water, biting for 1 heart.

![A tiny dark fish with a red belly and bared teeth, swimming](https://spelunky.ai/wiki/media/1f61a00df79ad623/sprites/sPiranhaLeft/anim%404x.png)

| Piranha   |                                         |
| --------- | --------------------------------------- |
| Health    | 1 hit point[^1]                         |
| Damage    | 1 heart[^2]                             |
| Speed     | 1 pixel per step[^3][^4]                |
| Behaviour | Patrols the water; attacks swimmers[^5] |
| Object    | `oPiranha`                              |
| Found in  | The Jungle                              |
| Drops     | Fish Bone                               |

Level generation puts Piranhas in the water of the Jungle, from its pools to the lakes of
flooded levels. A Piranha leaves a player on dry land alone, but once he's swimming near it,
it swims straight at him and bites, and a pool may hold several. With 1 hit point, it dies to any
damage, but a swimming player can't stomp it.

## Behaviour

A Piranha swims back and forth at 1 pixel per step, turning around where the water ends or a wall is in its
way[^6]. It starts out heading left or right at random[^7], and lets off a bubble every 31–51 steps[^8].

**Clip: Piranhas bite.** The player drops into a pool, and the piranhas in it swim at him and bite, a heart at a time. ([video](https://spelunky.ai/wiki/media/1f61a00df79ad623/clips/piranha/bite/clip.mp4))

When the player is swimming within 90 pixels of it, and alive, it attacks: it swims
straight at him at 1 pixel per step (30 per second),
its heading wobbling by a degree each step, and moves only while the way ahead is water[^9][^10]. The game moves
it in whole pixels on each axis, so on a diagonal it covers 1 pixel across and 1 up or down in a step[^11]. When he leaves the water or its range, it stops for 20–40 steps
(0.67–1.33 seconds) and then patrols again[^12][^13]. The clip shows the player dropping into a pool and two
Piranhas closing in on him.

A Piranha also hunts other monsters in the water. It looks at the nearest living [Caveman](https://spelunky.ai/wiki/caveman), or if
there's none, the nearest Shopkeeper, then Hawkman, then [Yeti](https://spelunky.ai/wiki/yeti), and if that one is swimming, swims at it and,
within 4 pixels of it, bites it for 1 hit point at most once every 10
steps[^14][^15][^16].

**Out of the water.** A Piranha whose middle isn't in water turns into a Fish Bone at once[^17].

**Off screen.** Unlike most monsters, a Piranha has no check of its own for being on screen: it swims on
wherever the game keeps it running, which is up to 96 pixels outside the view, past which the game freezes
everything[^18][^19].

## Damage

When the player touches a Piranha without stomping it, he loses 1 heart, is knocked away
from it, and blinks, invincible, for 30 steps (1 second), and the bite draws
blood[^20][^21]. This is the touch code most monsters share. The
clip shows two bites, a second apart, taking the player from four hearts to two.

## Defeating

A Piranha has 1 hit point, so any damage kills it[^22]:

| Way                                                                | Damage                                                                     |       |
| ------------------------------------------------------------------ | -------------------------------------------------------------------------- | ----- |
| Whip                                                               | 1 hit point                                                                | [^23] |
| Machete                                                            | 2 hit points                                                               | [^23] |
| Stomp (landing on it), except while the player is swimming         | 1, plus 1 for every 16 steps of falling; three times that with Spike Shoes | [^24] |
| A thrown item moving faster than 2 pixels per step, such as a Rock | 1                                                                          | [^25] |
| A Shotgun or Pistol bullet                                         | 4 hit points                                                               | [^26] |
| A Bomb's explosion                                                 | 30 hit points                                                              | [^27] |
| Being out of the water                                             | Turns it into a Fish Bone                                                  | [^17] |

The Piranha's own step event replaces the one most monsters share, which is where Spikes,
Lava and Spear Traps hurt them, so none of those harm a Piranha[^28].

Piranhas killed count toward the player's kills, and the screen between levels draws a Piranha icon for each[^29][^30]. One that
turns into a Fish Bone out of the water isn't killed, so it isn't counted.

## Locations

Level generation makes Piranhas only in the Jungle: each water block with no solid block in it has
a 1 in 30 chance of one. That includes the lakes of flooded levels; on a
graveyard level, the same roll makes a [Dead Fish](https://spelunky.ai/wiki/dead-fish) instead[^31].

Custom levels can have them, as the level editor's tile `p`, a water block with a Piranha in
it[^32].

## Tips

- A Piranha only chases a swimming player, so one crossing above the water isn't chased.
- Several Piranhas each bite as the player's invincibility runs out, so a pool with a few of them costs a
  heart a second until he gets out.
- The player can't stomp a Piranha while swimming; a thrown item or the Whip kills one.

## Trivia

- The Piranha's code names an attacking state for other monsters, Caveman, Shopkeeper, [Hawkman](https://spelunky.ai/wiki/hawkman) and Yeti, as
  well as the player, and sets a bitten one's state to 2, which for a Caveman is charging[^33][^34].
- On a graveyard level, the Piranha's place is taken by the [Dead Fish](https://spelunky.ai/wiki/dead-fish), whose code is the
  Piranha's without its hunting of other monsters. A Dead Fish killed is added to the Piranha's row of the
  kills table the game writes to `stats.txt`[^35][^36].

## FAQ

### How much damage does a Piranha do in Spelunky Classic?

1 heart per bite. Each bite also knocks the player back and makes him invincible for 30 steps (1 second), so several Piranhas take a heart a second between them.

### Do Piranhas attack the player out of the water in Spelunky Classic?

No. A Piranha only goes for the player while he's swimming, within 90 pixels of it. One that leaves the water turns into a Fish Bone.

### How do you kill a Piranha in Spelunky Classic?

Hit it once with anything. A Piranha has 1 hit point, so a Whip hit, a thrown item, a bullet or a Bomb kills it. A swimming player can't stomp it.

### Where do Piranhas live in Spelunky Classic?

In the water of the Jungle, where level generation puts one in a water block with a 1 in 30 chance, including the lakes of flooded levels.

## See also

- **Damaged by:** Whip, Machete, Stomping[^24], Throwing[^25], Shotgun[^26], Pistol[^26], Bomb[^27]
- **Related:** [Megamouth](https://spelunky.ai/wiki/megamouth), [Dead Fish](https://spelunky.ai/wiki/dead-fish)
- **Damages:** [Caveman](https://spelunky.ai/wiki/caveman), [Hawkman](https://spelunky.ai/wiki/hawkman), [Yeti](https://spelunky.ai/wiki/yeti)

## References

[^1]: `objects/oPiranha/create.gml:16`

[^2]: `objects/oEnemy/collision_oCharacter.gml:25`

[^3]: `objects/oPiranha/step.gml:69`

[^4]: `objects/oPiranha/step.gml:100`

[^5]: `objects/oPiranha/step.gml:17-76`

[^6]: `objects/oPiranha/step.gml:17-30`

[^7]: `objects/oPiranha/create.gml:12-13`

[^8]: `objects/oPiranha/step.gml:123-128`

[^9]: `objects/oPiranha/step.gml:32-35`

[^10]: `objects/oPiranha/step.gml:63-70`

[^11]: `scripts/moveTo.gml:20-31`

[^12]: `objects/oPiranha/step.gml:53-62`

[^13]: `objects/oPiranha/step.gml:71-75`

[^14]: `objects/oPiranha/step.gml:37-51`

[^15]: `objects/oPiranha/step.gml:77-121`

[^16]: `objects/oPiranha/alarm_0.gml:1`

[^17]: `objects/oPiranha/step.gml:136-140`

[^18]: `objects/oPiranha/step.gml:1`

[^19]: `objects/oLevel/step.gml:64-77`

[^20]: `objects/oEnemy/collision_oCharacter.gml:14-25`

[^21]: `objects/oEnemy/collision_oCharacter.gml:55`

[^22]: `objects/oPiranha/step.gml:3-13`

[^23]: `objects/oEnemy/collision_oWhip.gml:1`

[^24]: `objects/oEnemy/collision_oCharacter.gml:6-10`

[^25]: `objects/oItem/step.gml:256-348`

[^26]: `objects/oBullet/collision_oEnemy.gml:16`

[^27]: `objects/oExplosion/collision_oEnemy.gml:14`

[^28]: `objects/oEnemy/step.gml:63-128`

[^29]: `objects/oPiranha/step.gml:6-11`

[^30]: `objects/oTransition/alarm_0.gml:149-154`

[^31]: `scripts/scrEntityGen.gml:326-336`

[^32]: `scripts/scrCreateTileObj.gml:172-176`

[^33]: `objects/oPiranha/create.gml:22-26`

[^34]: `objects/oPiranha/step.gml:110`

[^35]: `objects/oDeadFish/step.gml:10-15`

[^36]: `scripts/scrWriteStats.gml:198`

### Source code

- `objects/oPiranha/create.gml`
- `objects/oPiranha/step.gml`
- `objects/oPiranha/alarm_0.gml`
- `objects/oEnemy/create.gml`
- `objects/oEnemy/collision_oCharacter.gml`
- `objects/oEnemy/collision_oWhip.gml`
- `objects/oLevel/step.gml`
- `scripts/scrEntityGen.gml`
