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.

# A Spectacles for sale

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

A Spectacles for sale is a quirk of Spelunky Classic in which four wares' price messages change their wording past level 2, as A SPECTACLES FOR $8800.

| Quirk     |                                                                                                                                                                                                             |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Status    | GML + Oracle                                                                                                                                                                                                |
| Where     | [`scripts/scrShopItemsGen.gml:179-191`](https://spelunky.ai/wiki/source/scripts/scrShopItemsGen#L179-L191)                                                                                                  |
| Pinned by | `fidelity/replays/item-seed-77-spectacles.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): “Four wares' messages change past level 2.” |

When the player picks up a ware in a shop, the [Shopkeeper](https://spelunky.ai/wiki/shopkeeper) names it and its price. Each ware writes
that message when it's made, and past level 2 the shop writes it again with the higher price, in a form of its
own. For most wares the two read the same, but four read differently past level 2.

## What happens

In a Clothing Shop on level 5, the player picks up the Spectacles, and the Shopkeeper prices them: A
SPECTACLES FOR $10400. He runs and jumps out of the shop with them[^1].

**Clip: Shoplifting from a Clothing Shop.** In a Clothing Shop on level 5, the shopkeeper prices the spectacles the player picks up at $10,400. He runs and jumps out of the shop with them, which puts them on, and the shopkeeper fires after him and misses. ([video](https://spelunky.ai/wiki/media/clips/clothing-shop/theft/clip.mp4))

## Why

Each ware's create event writes its message from its base price, as the Spectacles' does: "SPECTACLES FOR
$8000."[^2]. On a level past the second, the shop raises the
price by a tenth of the base price a level, and writes the message again:

```gml scripts/scrShopItemsGen.gml:182-190
    if (global.currLevel > 2)
    {
        with obj
        {
            cost += (cost/100)*10*(global.currLevel-2);
            if (shopDesc == "") buyMessage = "A " + string_upper(type) + " FOR $" + string(cost) + ".";
            else buyMessage = shopDesc + " FOR $" + string(cost) + ".";
        }
    }
```

[`scripts/scrShopItemsGen.gml:182-190`](https://spelunky.ai/wiki/source/scripts/scrShopItemsGen#L182-L190), 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)).

A ware with a shop name (`shopDesc`) keeps it: the bow, the bomb bag and box, the Pitcher's Mitt, the paste, the
spring shoes and the gloves. Every other ware gets "A", its `type` in capitals and the price. Most of those
messages already read that way ("A COMPASS FOR $3000."[^3]), but
four don't[^4]:

| Ware                                                | On levels 1 and 2      | Past level 2                       |      |
| --------------------------------------------------- | ---------------------- | ---------------------------------- | ---- |
| [Spectacles](https://spelunky.ai/wiki/spectacles)   | SPECTACLES FOR $8000.  | A SPECTACLES FOR $8800. (level 3)  | [^5] |
| [Spike Shoes](https://spelunky.ai/wiki/spike-shoes) | SPIKE SHOES FOR $4000. | A SPIKE SHOES FOR $4400. (level 3) | [^6] |
| [Jetpack](https://spelunky.ai/wiki/jetpack)         | JETPACK FOR $20000.    | A JETPACK FOR $22000. (level 3)    | [^7] |
| Rope pile                                           | EXTRA ROPE FOR $2500.  | A ROPE PILE FOR $2750. (level 3)   | [^8] |

The Shopkeeper shows the message of the ware the player holds while it has a price[^9].

## Reproducing it

Pick up the Spectacles, the Spike Shoes, the Jetpack or a rope pile in a shop on level 3 or later. Every one
of the four for sale past level 2 shows it. The replay of the clip finds a Clothing Shop on level 5 and picks up
the Spectacles: "A SPECTACLES FOR $10400.", frame 926[^10]. A Rare Shop on level 5 prices the Spike Shoes
"A SPIKE SHOES FOR $5200."[^11], and on level 2 the
Jetpack keeps its own "JETPACK FOR $20000."[^12].

## 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[^4], and the oracle's fingerprints of the replays pin the messages. No option turns it off.

## FAQ

### Why does the Shopkeeper say "A SPECTACLES" in Spelunky Classic?

Past level 2 the game writes each ware's price message again, with the higher price. A ware with no shop name of its own gets "A", its type in capitals and the price, which reads well for most wares but not for the [Spectacles](https://spelunky.ai/wiki/spectacles) or the [Spike Shoes](https://spelunky.ai/wiki/spike-shoes).

### Which wares' messages change past level 2?

Four: the Spectacles ("A SPECTACLES FOR ..."), the Spike Shoes ("A SPIKE SHOES FOR ..."), the [Jetpack](https://spelunky.ai/wiki/jetpack) ("JETPACK FOR ..." becomes "A JETPACK FOR ...") and the rope pile ("EXTRA ROPE FOR ..." becomes "A ROPE PILE FOR ..."). The others' come out the same, or keep their shop name.

### Does the wording change the price?

No. The price in the message is the ware's real price, which goes up a tenth of its base price for each level past the second.

## See also

- **Related:** [Spectacles](https://spelunky.ai/wiki/spectacles), [Spike Shoes](https://spelunky.ai/wiki/spike-shoes), [Jetpack](https://spelunky.ai/wiki/jetpack), Rope Pile, [Shopkeeper](https://spelunky.ai/wiki/shopkeeper)

## References

[^1]: Clip clothing-shop/theft

[^2]: [`objects/oSpectacles/create.gml:7-8`](https://spelunky.ai/wiki/source/objects/oSpectacles/create#L7-L8)

[^3]: [`objects/oCompass/create.gml:7-8`](https://spelunky.ai/wiki/source/objects/oCompass/create#L7-L8)

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

[^5]: [`objects/oSpectacles/create.gml:8`](https://spelunky.ai/wiki/source/objects/oSpectacles/create#L8)

[^6]: [`objects/oSpikeShoes/create.gml:8`](https://spelunky.ai/wiki/source/objects/oSpikeShoes/create#L8)

[^7]: [`objects/oJetpack/create.gml:8`](https://spelunky.ai/wiki/source/objects/oJetpack/create#L8)

[^8]: [`objects/oRopePile/create.gml:8`](https://spelunky.ai/wiki/source/objects/oRopePile/create#L8)

[^9]: [`objects/oShopkeeper/step.gml:72-84`](https://spelunky.ai/wiki/source/objects/oShopkeeper/step#L72-L84)

[^10]: Replay `fidelity/replays/item-seed-77-spectacles.txt`

[^11]: Replay `fidelity/replays/item-seed-7-spike-shoes.txt`

[^12]: Replay `fidelity/replays/item-seed-35-jetpack.txt`

### Source code

- [`scripts/scrShopItemsGen.gml`](https://spelunky.ai/wiki/source/scripts/scrShopItemsGen)
- [`objects/oSpectacles/create.gml`](https://spelunky.ai/wiki/source/objects/oSpectacles/create)
- [`objects/oSpikeShoes/create.gml`](https://spelunky.ai/wiki/source/objects/oSpikeShoes/create)
- [`objects/oJetpack/create.gml`](https://spelunky.ai/wiki/source/objects/oJetpack/create)
- [`objects/oRopePile/create.gml`](https://spelunky.ai/wiki/source/objects/oRopePile/create)
- [`objects/oShopkeeper/step.gml`](https://spelunky.ai/wiki/source/objects/oShopkeeper/step)
