Colossal Cave Adventure
Crowther and Woods's cave game, read through Open Adventure, a BSD-licensed C port of the 1995 Adventure 2.5.
On this page
The atlas reads Open Adventure 1.22, a C port of Adventure 2.5, the 430-point version Will Crowther and Don Woods finished in 1995. Raymond’s history dates Crowther’s earliest version to 1976 and Woods’s 350-point version to 19771. The rules below are Open Adventure’s, which follow 2.5 except where a claim notes a fix.
The parser refuses more than two words and reads the first five letters of each, so “northeast” has to be typed “ne”2. The lamp lasts 330 lit turns, or 1,000 for a player who asks for instructions, and fresh batteries add 2,5003. The player can carry 7 objects4.
The score routine tallies 430 points; a treasure gives 2 when found and the rest of its worth while it lies in the building, unbroken5. Dwarves throw knives: the first volley always misses, later knives hit 9.5% of the time (computed), and one hit kills6.
Mechanics
| Mechanic | Kind | How |
|---|---|---|
| Text parser | Verb and noun | at most two words, each matched on its first five letters |
| Light-source timer | Refillable count | 330 lit turns, or 1,000 with instructions; fresh batteries add 2,500 |
| Inventory limit | Object count | 7 objects, the bird not counted |
| Treasure score | Find, then deposit | 2 points for finding a treasure, the rest of its 12 to 16 while it lies in the building |
| Hit chance | Flat chance | a dwarf's knife hits 9.5% of the time after the first volley, more once the dwarves are fed |
Every claim about this game, by concept (6)
References
- ^Eric S. Raymond's history in the Open Adventure repository dates Will Crowther's earliest version to 1976 on a PDP-10 at Bolt, Beranek and Newman, and Don Woods's expanded 350-point version to June 3, 1977 at the Stanford AI Lab; Crowther and Woods's own line ended with the 430-point Adventure 2.5 in 1995.Code notesOpen Adventure 1.22
How we know
16The very first version was released by Crowther in 1976, in FORTRAN onhistory.adoc lines 16–17 at e616052 · upstream ↗ 24released on a PDP-10 at the Stanford AI Lab by Don Woods on June 3rd, 251977 (some sources erroneously say 1976). That version is sometimes 26known as 350-point Adventure.
history.adoc lines 23–26 at e616052 · upstream ↗ 30in the 1995 release of Adventure 2.5, also known as 430-point Adventurehistory.adoc lines 28–30 at e616052 · upstream ↗ The quote matches our archived copy.
Checked by a second AI model, 2026-10-22.
- ^Open Adventure, the C port of Crowther and Woods's Adventure 2.5 (1995), refuses any input of more than two words, answering “Please stick to 1- and 2-word commands.” It matches each word against its vocabulary on the first five letters only, ignoring case, and the instructions it shows a player who asks for them say to type “ne” for northeast, since “northeast” would read as “north”.CodeOpen Adventure 1.22revised
How we know
567 if (word_count(input) > 2) {misc.c lines 567–571 at e616052 · upstream ↗ 2920- TWO_WORDS: 'Please stick to 1- and 2-word commands.'adventure.yaml line 2920 at e616052 · upstream ↗ 22#define TOKLEN 5 // # outputting characters in a token */advent.h line 22 at e616052 · upstream ↗ 401 if (strncasecmp(word, objects[i].words.strs[j], 402 TOKLEN) == 0) {
misc.c lines 401–402 at e616052 · upstream ↗ 384 if (strncasecmp(word, motions[i].words.strs[j], 385 TOKLEN) == 0 &&
misc.c lines 384–385 at e616052 · upstream ↗ 2862 you that I look at only the first five letters of each word, so you'll 2863 have to enter "northeast" as "ne" to distinguish it from "north".
adventure.yaml lines 2861–2863 at e616052 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^In Open Adventure (Adventure 2.5) the lamp's limit starts at 330 turns, or 1,000 if the player answers yes to “Would you like instructions?” Once per command, while the lamp is lit, the limit drops by 1; the check runs at the end of the cave-closing check, which returns before it on the turn the cave starts to close and the turn it closes. At 30 or below, fresh batteries in the room or carried, with the lamp also here, are used up and add 2,500; otherwise the game warns once. At 0 the lamp goes dark.CodeOpen Adventure 1.22
How we know
32#define BATTERYLIFE 2500 // turn limit increment from batteriesadvent.h lines 27–32 at e616052 · upstream ↗ 26 .loc = LOC_START, .limit = GAMELIMIT, .foobar = WORD_EMPTY,init.c line 26 at e616052 · upstream ↗ 1547 game.limit = NOVICELIMIT;main.c lines 1543–1548 at e616052 · upstream ↗ 2935- WELCOME_YOU: 'Welcome to Adventure!! Would you like instructions?'adventure.yaml line 2935 at e616052 · upstream ↗ 874 if (game.objects[LAMP].prop == LAMP_BRIGHT) { 875 --game.limit;
main.c lines 874–875 at e616052 · upstream ↗ 900 game.limit += BATTERYLIFE;main.c lines 884–901 at e616052 · upstream ↗ 915 game.objects[LAMP].prop = LAMP_DARK;main.c lines 913–915 at e616052 · upstream ↗ 1044 lampcheck();main.c line 1044 at e616052 · upstream ↗ 1326 if (closecheck()) {main.c lines 1321–1326 at e616052 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^Open Adventure (Adventure 2.5) refuses to take an object while 7 are already carried: “You can't carry anything more. You'll have to drop something first.” The bird doesn't count, a fix of the original's counting the caged bird as two items.CodeOpen Adventure 1.22
How we know
25#define INVLIMIT 7 // inventory limit (# of objects)advent.h line 25 at e616052 · upstream ↗ 386 if (game.holdng >= INVLIMIT) { 387 rspeak(CARRY_LIMIT);
actions.c lines 386–388 at e616052 · upstream ↗ 2945- CARRY_LIMIT: 'You can''t carry anything more. You''ll have to drop something first.'adventure.yaml line 2945 at e616052 · upstream ↗ 672 if (object != BIRD) { 673 ++game.holdng;
misc.c lines 672–674 at e616052 · upstream ↗ 57* The caged bird used to be counted as two items in your inventory.notes.adoc line 57 at e616052 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^Open Adventure's score routine (Adventure 2.5) tallies 430 points in its comment, 298 of them for treasures (computed: 60 + 14 + 224). Each treasure gives 2 points once found, and the rest of its worth (12 for treasures numbered before the chest, 14 for the chest, 16 for those after it) while it lies in the building in its found state, so a broken one doesn't pay.CodeOpen Adventure 1.22
How we know
33 * TOTAL: 430score.c lines 18–35 at e616052 · upstream ↗ First tally up the treasures. Must be in building and not broken.
score.c#L37-L38 · upstream ↗ 55 if (game.objects[i].place == LOC_BUILDING && 56 OBJECT_IS_FOUND(i)) { 57 score += k - 2;
score.c lines 44–58 at e616052 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^In Open Adventure (Adventure 2.5), each dwarf that was already in the hero's location before the dwarves moved throws a knife, which hits if a roll of 0–999 is below 95 × (dflag − 2). The first volley always misses, at dflag 2; it raises dflag to 3, so each later knife hits 9.5% of the time (computed). Feeding a dwarf while food is here adds 2 to dflag, so 28.5% after one feeding (computed). Any hit kills the hero.CodeOpen Adventure 1.22
How we know
313 /* Dwarves move. Return true if player survives, false if he dies. */main.c lines 312–313 at e616052 · upstream ↗ 442 if (randrange(1000) < 95 * (game.dflag - 2)) {main.c lines 437–444 at e616052 · upstream ↗ 457 if (game.dflag == 2) { 458 game.dflag = 3;
main.c lines 457–458 at e616052 · upstream ↗ 472 game.oldlc2 = game.loc; 473 return false;
main.c lines 469–473 at e616052 · upstream ↗ 3 A knife has been thrown (first set always misses) 3+
advent.h#L198-L202 · upstream ↗ 717 if (HERE(FOOD)) { 718 game.dflag += 2;
actions.c lines 716–719 at e616052 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
Sources
Code
- Crowther, Will, Don Woods, Eric S. Raymond, and Jason Ninneman. 2026. “Open Adventure 1.22 source code.” Commit e616052. esr/open-adventure @ e616052 · licence, all uses