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.

# Messages halved on lit levels

From the spelunky.ai wiki: <https://spelunky.ai/wiki/messages-halved-on-lit-levels>. Verified against the spelunky.ai port [v0.1.13](https://github.com/851-labs/spelunky/releases/tag/v0.1.13) on 28 October 2026.

Messages halved on lit levels is a quirk of Spelunky Classic in which a message lasts half as long on a lit level as on a dark one.

| Quirk     |                                                                                                                                                                                                              |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Status    | GML + Oracle                                                                                                                                                                                                 |
| Where     | [`objects/oLevel/draw.gml:11-27`](https://spelunky.ai/wiki/source/objects/oLevel/draw#L11-L27)                                                                                                               |
| Pinned by | `fidelity/replays/mines-seed-2.txt`                                                                                                                                                                          |
| Row       | [docs/quirks.md §1, Bugs and leftovers in the 1.1 source](https://github.com/851-labs/spelunky/blob/main/docs/quirks.md#1-bugs-and-leftovers-in-the-11-source): “Messages last half as long on a lit level.” |

Messages like "I HEAR SNAKES... I HATE SNAKES!" or "A COMPASS FOR $5400." appear at the bottom of the screen for
a set number of steps, 200 for a special level's. That's how long they last on a [dark level](https://spelunky.ai/wiki/dark-level). On
every other level, they last half as long, as two pieces of code each take a step off the timer, so a special
level's message is gone in about three seconds.

## What happens

Level 4 of the Mines is a [snake pit](https://spelunky.ai/wiki/snake-pit), and lit. Its message, "I HEAR SNAKES... I HATE SNAKES!", is
gone after 100 steps[^1].

**Clip: A message lasts half as long on a lit level.** Level 4 of the Mines loads as a snake pit, with the message "I HEAR SNAKES... I HATE SNAKES!". The level is lit, so the message is gone after 100 steps, about three seconds, where a dark level's lasts 200. ([video](https://spelunky.ai/wiki/media/clips/quirks/lit-message-halved/clip.mp4))

On level 2, which is dark, the dark level's message lasts the full 200[^2].

**Clip: A dark level.** Level 2 of the Mines loads dark, with the message "I CAN'T SEE A THING! I'D BETTER USE THESE FLARES!" A crate of flares glows by the entrance, and the player climbs down through the dark by the small light around him. ([video](https://spelunky.ai/wiki/media/clips/dark-level/arrival/clip.mp4))

## Why

`oScreen` draws the message on every level while the game isn't paused, and takes a step off its timer as it does[^3][^4]. The
level's own drawing, in `oLevel`, draws the same message again, and takes another step off, but only on a lit
level:

```gml objects/oLevel/draw.gml:11-27
if (not global.darkLevel and global.messageTimer > 0)
{
    draw_set_font(global.myFontSmall);
    draw_set_color(c_white);
    strLen = string_length(global.message)*8;
    n = 320 - strLen;
    n = ceil(n / 2);
    draw_text(view_xview[0]+n, view_yview[0]+216, string(global.message));
    
    if (not isLevel("rTutorial")) draw_set_color(c_yellow);
    strLen = string_length(global.message2)*8;
    n = 320 - strLen;
    n = ceil(n / 2);
    draw_text(view_xview[0]+n, view_yview[0]+224, string(global.message2));
    
    global.messageTimer -= 1;
}
```

[`objects/oLevel/draw.gml:11-27`](https://spelunky.ai/wiki/source/objects/oLevel/draw#L11-L27), from `spelunky.gmk`, Spelunky Classic 1.1's source, © 2008, 2009 Derek Yu and Mossmouth, LLC ([Spelunky User License v1.1b](https://spelunky.ai/LICENSE.txt)).

So on a lit level the timer goes down by 2 a step, and a message set to 200 lasts 100 steps[^5].
Every message sets the same timer, to 200 for a special level's or the Ghost's warning, 120 for an item picked up[^6], and less for others, and every one lasts half its time on a lit level. A tutorial
sign's is set to 200 again on every step the player touches the sign, so it only starts counting down once he
leaves it[^7]. A special level's second message comes
209 steps after the first[^8], which leaves a gap of about 109 steps
with no message on a lit level, and 9 on a dark one.

## Reproducing it

Every message on a lit level shows it. The replay of the clips plays the Mines' first four levels: level 2 is dark,
and its message, set to 200 on frame 1730, lasts until 1930; level 4 is a lit snake pit, and its message, set on
3651, is gone on 3751[^9]. A lit
[graveyard](https://spelunky.ai/wiki/restless-dead)'s message lasts 100 steps the same way[^10],
and a dark one's three messages 200 steps each[^11].

## In the port

The spelunky.ai port reproduces it exactly: it's in docs/quirks.md's list of the 1.1 source's bugs[^5], and the oracle's fingerprints of the replays pin both timers. No option turns it off.

## FAQ

### How long do messages last in Spelunky Classic?

Each message sets how long it lasts: 200 steps, about 6.7 seconds, for a special level's, 120 for an item picked up, 80 for a Shopkeeper's lines. That's how long it lasts on a dark level. On a lit level, which is most of them, it's gone in half the time: a special level's after 100 steps, about 3.3 seconds.

### Why do messages disappear so fast in Spelunky Classic?

On a lit level, the message's timer is counted down twice a step: once by the code that draws the screen and again by the level's own drawing, which only draws the message when the level isn't dark.

### Does it change the time between a special level's two messages?

Yes. A level with two messages shows the second about 209 steps after the first. On a lit one, such as a City of Gold that's a sacrifice pit, the first is gone 109 steps before the second comes; on a dark one, such as a dark graveyard, only 9.

## See also

- **Related:** [Dark level](https://spelunky.ai/wiki/dark-level), [Snake pit](https://spelunky.ai/wiki/snake-pit), [Graveyard level](https://spelunky.ai/wiki/restless-dead)

## References

[^1]: Clip quirks/lit-message-halved

[^2]: Clip dark-level/arrival

[^3]: [`objects/oScreen/step_begin.gml:148`](https://spelunky.ai/wiki/source/objects/oScreen/step_begin#L148)

[^4]: [`objects/oScreen/step_begin.gml:243-259`](https://spelunky.ai/wiki/source/objects/oScreen/step_begin#L243-L259)

[^5]: Quirk 1 (docs/quirks.md)

[^6]: [`scripts/scrStealItem.gml:33`](https://spelunky.ai/wiki/source/scripts/scrStealItem#L33)

[^7]: [`objects/oMsgSign/collision_oCharacter.gml:1-3`](https://spelunky.ai/wiki/source/objects/oMsgSign/collision_oCharacter#L1-L3)

[^8]: [`objects/oPlayer1/alarm_0.gml:5-13`](https://spelunky.ai/wiki/source/objects/oPlayer1/alarm_0#L5-L13)

[^9]: Replay `fidelity/replays/mines-seed-2.txt`

[^10]: Replay `fidelity/replays/jungle-seed-10.txt`

[^11]: Replay `fidelity/replays/jungle-seed-10-dark-graveyard-lake.txt`

### Source code

- [`objects/oScreen/step_begin.gml`](https://spelunky.ai/wiki/source/objects/oScreen/step_begin)
- [`objects/oLevel/draw.gml`](https://spelunky.ai/wiki/source/objects/oLevel/draw)
- [`objects/oPlayer1/alarm_0.gml`](https://spelunky.ai/wiki/source/objects/oPlayer1/alarm_0)
- [`objects/oMsgSign/collision_oCharacter.gml`](https://spelunky.ai/wiki/source/objects/oMsgSign/collision_oCharacter)
