pax_global_header 0000666 0000000 0000000 00000000064 13157513121 0014511 g ustar 00root root 0000000 0000000 52 comment=d51238481a6a752adc8ad4d8893209d13bb7ea91
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/ 0000775 0000000 0000000 00000000000 13157513121 0022660 5 ustar 00root root 0000000 0000000 open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/.gitignore 0000664 0000000 0000000 00000000166 13157513121 0024653 0 ustar 00root root 0000000 0000000 advent
*.gcda
*.gcno
*.o
*.html
dungeon.h
dungeon.c
advent.6
*.tar.gz
MANIFEST
*.adv
.*~
cheat
advent.info
coverage/*
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/.gitlab-ci.yml 0000664 0000000 0000000 00000003556 13157513121 0025325 0 ustar 00root root 0000000 0000000 image: opensuse:tumbleweed
stages:
- build
- test
- deploy
# build advent itself
binary:debug:
stage: build
before_script:
- zypper install -y make gcc libedit-devel libasan3 libubsan0 python python2-PyYAML lcov
script:
- make debug
artifacts:
paths:
- advent
- cheat
- "*.o"
- dungeon.c
- dungeon.h
binary:release:
stage: build
before_script:
- zypper install -y make gcc libedit-devel python python2-PyYAML
script:
- make advent cheat
artifacts:
paths:
- advent
- cheat
- "*.o"
- dungeon.c
- dungeon.h
manpage:
stage: build
before_script:
- zypper install -y make asciidoc
script:
- make advent.6
artifacts:
paths:
- advent.6
html:
stage: build
before_script:
- zypper install -y make asciidoc libxslt
script:
- make html
artifacts:
paths:
- "*.html"
dist:
stage: build
before_script:
- zypper install -y make asciidoc tar
script:
- export VERS=${CI_COMMIT_REF_NAME}
- make dist -e
artifacts:
paths:
- "*.tar.gz"
# run tests using the binary built before
test:debug:
stage: test
before_script:
- zypper install -y make gcc libedit-devel libasan3 libubsan0 python python2-PyYAML lcov
script:
- make coverage
artifacts:
paths:
- coverage
dependencies:
- binary:debug
test:debug_clang:
stage: test
before_script:
- zypper install -y make clang libedit-devel python python2-PyYAML lcov
script:
- CC=clang make debug check
test:release:
stage: test
before_script:
- zypper install -y make libedit
script:
- cd tests
- make
- cd ..
dependencies:
- binary:release
pages:
stage: deploy
script:
- mkdir public
- mv coverage public
artifacts:
paths:
- public
only:
- master
dependencies:
- test:debug
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/.shipper 0000664 0000000 0000000 00000000342 13157513121 0024332 0 ustar 00root root 0000000 0000000 extralines="""
There is a code coverage analysis and a symbol coverage analysis
"""
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/COPYING 0000664 0000000 0000000 00000002503 13157513121 0023713 0 ustar 00root root 0000000 0000000 BSD LICENSE
Copyright (c) 1977, 2005 by Will Crowther and Don Woods
Copyright (c) 2017 by Eric S. Raymond
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/INSTALL.adoc 0000664 0000000 0000000 00000001334 13157513121 0024617 0 ustar 00root root 0000000 0000000 = Installing Open Adventure =
The instructions below assume your system uses Python 3 by default,
but the actual Python code in Open Adventure is 2/3 agnostic. Adjust
the example commands below accordingly.
1. Install PyYAML for Python 3 (which requires Python 3), and libedit
(aka: editline) on your system.
On Debian and Ubuntu: 'apt-get install python3-yaml libedit-dev'.
On Fedora: 'dnf install python3-PyYAML libedit-devel'.
If you are using MacPorts on OS X: 'port install py3{5,6}-yaml', as
appropriate for your Python 3 version.
You can also use pip to install PyYAML: 'pip3 install PyYAML'.
2. 'make'.
3. Optionally run a regression test on the code with 'make check'.
4. Run the resulting 'advent' binary to play.
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/Makefile 0000664 0000000 0000000 00000007203 13157513121 0024322 0 ustar 00root root 0000000 0000000 # Makefile for the open-source release of adventure 2.5
# To build with save/resume disabled, pass CCFLAGS="-D ADVENT_NOSAVE"
VERS=$(shell sed -n MANIFEST
@(ln -s . advent-$(VERS))
(tar -T MANIFEST -czvf advent-$(VERS).tar.gz)
@(rm advent-$(VERS))
indent:
astyle -n -A3 --pad-header --min-conditional-indent=1 --pad-oper *.c
release: advent-$(VERS).tar.gz advent.html history.html hints.html notes.html
shipper version=$(VERS) | sh -e -x
refresh: advent.html notes.html history.html
shipper -N -w version=$(VERS) | sh -e -x
dist: advent-$(VERS).tar.gz
linty: CCFLAGS += -W
linty: CCFLAGS += -Wall
linty: CCFLAGS += -Wextra
linty: CCGLAGS += -Wpedantic
linty: CCFLAGS += -Wundef
linty: CCFLAGS += -Wstrict-prototypes
linty: CCFLAGS += -Wmissing-prototypes
linty: CCFLAGS += -Wmissing-declarations
linty: CCFLAGS += -Wshadow
linty: CCFLAGS += -Wfloat-equal
linty: CCFLAGS += -Wcast-align
linty: CCFLAGS += -Wwrite-strings
linty: CCFLAGS += -Waggregate-return
linty: CCFLAGS += -Wcast-qual
linty: CCFLAGS += -Wswitch-enum
linty: CCFLAGS += -Wwrite-strings
linty: CCFLAGS += -Wunreachable-code
linty: CCFLAGS += -Winit-self
linty: CCFLAGS += -Wpointer-arith
linty: advent cheat
debug: CCFLAGS += -O0
debug: CCFLAGS += --coverage
debug: CCFLAGS += -ggdb
debug: CCFLAGS += -U_FORTIFY_SOURCE
debug: CCFLAGS += -fsanitize=address
debug: CCFLAGS += -fsanitize=undefined
debug: linty
CSUPPRESSIONS = --suppress=missingIncludeSystem --suppress=invalidscanf
cppcheck:
cppcheck -I. --template gcc --enable=all $(CSUPPRESSIONS) *.[ch]
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/NEWS 0000664 0000000 0000000 00000002123 13157513121 0023355 0 ustar 00root root 0000000 0000000 = Open Adventure project news =
1.4: 2017-08-07::
Repair packaging error (omitted templates.)
Minor improvements in odd grammar cases.
1.3: 2017-08-01::
Split commands with objectless transitive verbs are handled correctly.
Test suite has 100% code coverage.
1.2: 2017-07-11::
Under oldstyle, new-school single-letter command synonyms are ignored.
Switched from linenoise to editline for new-style line input.
The -s option is no longer required to paste command input; it is removed.
1.1: 2017-06-29::
There is a 'version' command.
Include tests directory in generated tarball.
Support command-line editing with arrow keys and Emacs keystrokes.
Save format has changed.
1.0: 2017-06-05::
Forward port of Crowther & Woods's 430-point Adventure 2.5.
Added -l option for logging.
Game logs are now fully reproducible via the "seed" command.
Added regression-test suite using seed, with coverage checking.
Added command prompt; -o suppresses this. Otherwise no gameplay changes.
Fixed bug that caused reservoir word not to be randomized.
Makefile does parallel builds.
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/README.adoc 0000664 0000000 0000000 00000002613 13157513121 0024447 0 ustar 00root root 0000000 0000000 = README for Open Adventure =
If you are reading this anywhere but at http://www.catb.org/~esr/open-adventure
you can go there for tarball downloads and other resources.
This code is a forward-port of the Crowther/Woods Adventure 2.5 from
1995, last version in the main line of Colossal Cave Adventure
development written by the original authors. The authors have given
permission and encouragement for this releasel it obsolesces all
the 350-point versions and previous 2.x (430-point) ports.
The file history.adoc contains a more detailed history of this game
and its ancestors. The file notes.adoc is the maintainer's notes,
describing project goals and recent changes.
This project is called "Open Adventure" because it's not at all clear
how to number Adventure past 2.5 without misleading or causing
collisions or both. See the history file for discussion. The
original 6-character name on the PDP-10 has been reverted to for the
executable in order to avoid a collision with the BSD games port of
the ancestral 1977 version.
Please see INSTALL.adoc for build info.
Extreme care has been taken to not silently change gameplay. By
policy, all user-visible changes from 2.5 are revertible with the
-o (oldstyle) option.
If you encounter a bug (not likely; this code is old and well tested)
please try to make a test log that reproduces it, using the -l option,
and ship it to the maintainers.
// end
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/TODO 0000664 0000000 0000000 00000001334 13157513121 0023351 0 ustar 00root root 0000000 0000000 = Open Adventure TODO =
The FORTRANish mess that once was is now mostly idiomatic C. Some issues
remain to be cleaned up:
* Remaining unstructured gotos in do_command().
* The program is still pretty much typeless. Some attempt has been
made to introduce semantic types, but the job is barely started.
* More possible vase tests: FILL VASE while it's on the ground next to you;
DROP VASE in the Soft Room; DROP VASE in the well house and confirm
that you do/don't get points for it; die while carrying the vase and
confirm that it doesn't break.
We are aware that the lamp currently used as the project logo is a
hurricane lamp, not a proper miner's lamp. Submissions of potential
replacement images would be welcome.
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/actions.c 0000664 0000000 0000000 00000132630 13157513121 0024471 0 ustar 00root root 0000000 0000000 #include
#include
#include
#include "advent.h"
#include "dungeon.h"
#include
static int fill(verb_t, obj_t);
static int attack(command_t command)
/* Attack. Assume target if unambiguous. "Throw" also links here.
* Attackable objects fall into two categories: enemies (snake,
* dwarf, etc.) and others (bird, clam, machine). Ambiguous if 2
* enemies, or no enemies but 2 others. */
{
verb_t verb = command.verb;
obj_t obj = command.obj;
if (obj == INTRANSITIVE) {
int changes = 0;
if (atdwrf(game.loc) > 0) {
obj = DWARF;
++changes;
}
if (HERE(SNAKE)) {
obj = SNAKE;
++changes;
}
if (AT(DRAGON) && game.prop[DRAGON] == DRAGON_BARS) {
obj = DRAGON;
++changes;
}
if (AT(TROLL)) {
obj = TROLL;
++changes;
}
if (AT(OGRE)) {
obj = OGRE;
++changes;
}
if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
obj = BEAR;
++changes;
}
/* check for low-priority targets */
if (obj == INTRANSITIVE) {
/* Can't attack bird or machine by throwing axe. */
if (HERE(BIRD) && verb != THROW) {
obj = BIRD;
++changes;
}
if (HERE(VEND) && verb != THROW) {
obj = VEND;
++changes;
}
/* Clam and oyster both treated as clam for intransitive case;
* no harm done. */
if (HERE(CLAM) || HERE(OYSTER)) {
obj = CLAM;
++changes;
}
}
if (changes >= 2)
return GO_UNKNOWN;
}
if (obj == BIRD) {
if (game.closed) {
rspeak(UNHAPPY_BIRD);
} else {
DESTROY(BIRD);
rspeak(BIRD_DEAD);
}
return GO_CLEAROBJ;
}
if (obj == VEND) {
state_change(VEND,
game.prop[VEND] == VEND_BLOCKS ? VEND_UNBLOCKS : VEND_BLOCKS);
return GO_CLEAROBJ;
}
if (obj == BEAR) {
switch (game.prop[BEAR]) {
case UNTAMED_BEAR:
rspeak(BEAR_HANDS);
break;
case SITTING_BEAR:
rspeak(BEAR_CONFUSED);
break;
case CONTENTED_BEAR:
rspeak(BEAR_CONFUSED);
break;
case BEAR_DEAD:
rspeak(ALREADY_DEAD);
break;
}
return GO_CLEAROBJ;
}
if (obj == DRAGON && game.prop[DRAGON] == DRAGON_BARS) {
/* Fun stuff for dragon. If he insists on attacking it, win!
* Set game.prop to dead, move dragon to central loc (still
* fixed), move rug there (not fixed), and move him there,
* too. Then do a null motion to get new description. */
rspeak(BARE_HANDS_QUERY);
if (!silent_yes()) {
speak(arbitrary_messages[NASTY_DRAGON]);
return GO_MOVE;
}
state_change(DRAGON, DRAGON_DEAD);
game.prop[RUG] = RUG_FLOOR;
/* Hardcoding LOC_SECRET5 as the dragon's death location is ugly.
* The way it was computed before was worse; it depended on the
* two dragon locations being LOC_SECRET4 and LOC_SECRET6 and
* LOC_SECRET5 being right between them.
*/
move(DRAGON + NOBJECTS, IS_FIXED);
move(RUG + NOBJECTS, IS_FREE);
move(DRAGON, LOC_SECRET5);
move(RUG, LOC_SECRET5);
drop(BLOOD, LOC_SECRET5);
for (obj_t i = 1; i <= NOBJECTS; i++) {
if (game.place[i] == objects[DRAGON].plac ||
game.place[i] == objects[DRAGON].fixd)
move(i, LOC_SECRET5);
}
game.loc = LOC_SECRET5;
return GO_MOVE;
}
if (obj == OGRE) {
rspeak(OGRE_DODGE);
if (atdwrf(game.loc) == 0)
return GO_CLEAROBJ;
rspeak(KNIFE_THROWN);
DESTROY(OGRE);
int dwarves = 0;
for (int i = 1; i < PIRATE; i++) {
if (game.dloc[i] == game.loc) {
++dwarves;
game.dloc[i] = LOC_LONGWEST;
game.dseen[i] = false;
}
}
rspeak((dwarves > 1) ?
OGRE_PANIC1 :
OGRE_PANIC2);
return GO_CLEAROBJ;
}
switch (obj) {
case INTRANSITIVE:
rspeak(NO_TARGET);
break;
case CLAM:
case OYSTER:
rspeak(SHELL_IMPERVIOUS);
break;
case SNAKE:
rspeak(SNAKE_WARNING);
break;
case DWARF:
if (game.closed) {
return GO_DWARFWAKE;
}
rspeak(BARE_HANDS_QUERY);
break;
case DRAGON:
rspeak(ALREADY_DEAD);
break;
case TROLL:
rspeak(ROCKY_TROLL);
break;
default:
speak(actions[verb].message);
}
return GO_CLEAROBJ;
}
static int bigwords(vocab_t id)
/* FEE FIE FOE FOO (AND FUM). Advance to next state if given in proper order.
* Look up foo in special section of vocab to determine which word we've got.
* Last word zips the eggs back to the giant room (unless already there). */
{
if ((game.foobar == WORD_EMPTY && id == FEE) ||
(game.foobar == FEE && id == FIE) ||
(game.foobar == FIE && id == FOE) ||
(game.foobar == FOE && id == FOO) ||
(game.foobar == FOE && id == FUM)) {
game.foobar = id;
if ((id != FOO) && (id != FUM)) {
rspeak(OK_MAN);
return GO_CLEAROBJ;
}
game.foobar = WORD_EMPTY;
if (game.place[EGGS] == objects[EGGS].plac ||
(TOTING(EGGS) && game.loc == objects[EGGS].plac)) {
rspeak(NOTHING_HAPPENS);
return GO_CLEAROBJ;
} else {
/* Bring back troll if we steal the eggs back from him before
* crossing. */
if (game.place[EGGS] == LOC_NOWHERE && game.place[TROLL] == LOC_NOWHERE && game.prop[TROLL] == TROLL_UNPAID)
game.prop[TROLL] = TROLL_PAIDONCE;
if (HERE(EGGS))
pspeak(EGGS, look, EGGS_VANISHED, true);
else if (game.loc == objects[EGGS].plac)
pspeak(EGGS, look, EGGS_HERE, true);
else
pspeak(EGGS, look, EGGS_DONE, true);
move(EGGS, objects[EGGS].plac);
return GO_CLEAROBJ;
}
} else {
if (game.loc == LOC_GIANTROOM) {
rspeak(START_OVER);
} else {
/* This is new begavior in Open Adventure - sounds better when
* player isn't in the Giant Room. */
rspeak(WELL_POINTLESS);
}
game.foobar = WORD_EMPTY;
return GO_CLEAROBJ;
}
}
static void blast(void)
/* Blast. No effect unless you've got dynamite, which is a neat trick! */
{
if (game.prop[ROD2] == STATE_NOTFOUND ||
!game.closed)
rspeak(REQUIRES_DYNAMITE);
else {
if (HERE(ROD2)) {
game.bonus = splatter;
rspeak(SPLATTER_MESSAGE);
} else if (game.loc == LOC_NE) {
game.bonus = defeat;
rspeak(DEFEAT_MESSAGE);
} else {
game.bonus = victory;
rspeak(VICTORY_MESSAGE);
}
terminate(endgame);
}
}
static int vbreak(verb_t verb, obj_t obj)
/* Break. Only works for mirror in repository and, of course, the vase. */
{
switch (obj) {
case MIRROR:
if (game.closed) {
state_change(MIRROR, MIRROR_BROKEN);
return GO_DWARFWAKE;
} else {
rspeak(TOO_FAR);
break;
}
case VASE:
if (game.prop[VASE] == VASE_WHOLE) {
if (TOTING(VASE))
drop(VASE, game.loc);
state_change(VASE, VASE_BROKEN);
game.fixed[VASE] = IS_FIXED;
break;
}
/* FALLTHRU */
default:
speak(actions[verb].message);
}
return (GO_CLEAROBJ);
}
static int brief(void)
/* Brief. Intransitive only. Suppress full descriptions after first time. */
{
game.abbnum = 10000;
game.detail = 3;
rspeak(BRIEF_CONFIRM);
return GO_CLEAROBJ;
}
static int vcarry(verb_t verb, obj_t obj)
/* Carry an object. Special cases for bird and cage (if bird in cage, can't
* take one without the other). Liquids also special, since they depend on
* status of bottle. Also various side effects, etc. */
{
if (obj == INTRANSITIVE) {
/* Carry, no object given yet. OK if only one object present. */
if (game.atloc[game.loc] == NO_OBJECT ||
game.link[game.atloc[game.loc]] != 0 ||
atdwrf(game.loc) > 0)
return GO_UNKNOWN;
obj = game.atloc[game.loc];
}
if (TOTING(obj)) {
speak(actions[verb].message);
return GO_CLEAROBJ;
}
if (obj == MESSAG) {
rspeak(REMOVE_MESSAGE);
DESTROY(MESSAG);
return GO_CLEAROBJ;
}
if (game.fixed[obj] != IS_FREE) {
switch (obj) {
case PLANT:
/* Next guard tests whether plant is tiny or stashed */
rspeak(game.prop[PLANT] <= PLANT_THIRSTY ? DEEP_ROOTS : YOU_JOKING);
break;
case BEAR:
rspeak( game.prop[BEAR] == SITTING_BEAR ? BEAR_CHAINED : YOU_JOKING);
break;
case CHAIN:
rspeak( game.prop[BEAR] != UNTAMED_BEAR ? STILL_LOCKED : YOU_JOKING);
break;
case RUG:
rspeak(game.prop[RUG] == RUG_HOVER ? RUG_HOVERS : YOU_JOKING);
break;
case URN:
rspeak(URN_NOBUDGE);
break;
case CAVITY:
rspeak(DOUGHNUT_HOLES);
break;
case BLOOD:
rspeak(FEW_DROPS);
break;
case SIGN:
rspeak(HAND_PASSTHROUGH);
break;
default:
rspeak(YOU_JOKING);
}
return GO_CLEAROBJ;
}
if (obj == WATER ||
obj == OIL) {
if (!HERE(BOTTLE) ||
LIQUID() != obj) {
if (!TOTING(BOTTLE)) {
rspeak(NO_CONTAINER);
return GO_CLEAROBJ;
}
if (game.prop[BOTTLE] == EMPTY_BOTTLE) {
return (fill(verb, BOTTLE));
} else
rspeak(BOTTLE_FULL);
return GO_CLEAROBJ;
}
obj = BOTTLE;
}
if (game.holdng >= INVLIMIT) {
rspeak(CARRY_LIMIT);
return GO_CLEAROBJ;
}
if (obj == BIRD && game.prop[BIRD] != BIRD_CAGED && STASHED(BIRD) != BIRD_CAGED) {
if (game.prop[BIRD] == BIRD_FOREST_UNCAGED) {
DESTROY(BIRD);
rspeak(BIRD_CRAP);
return GO_CLEAROBJ;
}
if (!TOTING(CAGE)) {
rspeak(CANNOT_CARRY);
return GO_CLEAROBJ;
}
if (TOTING(ROD)) {
rspeak(BIRD_EVADES);
return GO_CLEAROBJ;
}
game.prop[BIRD] = BIRD_CAGED;
}
if ((obj == BIRD ||
obj == CAGE) &&
(game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED)) {
/* expression maps BIRD to CAGE and CAGE to BIRD */
carry(BIRD + CAGE - obj, game.loc);
}
carry(obj, game.loc);
if (obj == BOTTLE && LIQUID() != NO_OBJECT)
game.place[LIQUID()] = CARRIED;
if (GSTONE(obj) && game.prop[obj] != STATE_FOUND) {
game.prop[obj] = STATE_FOUND;
game.prop[CAVITY] = CAVITY_EMPTY;
}
rspeak(OK_MAN);
return GO_CLEAROBJ;
}
static int chain(verb_t verb)
/* Do something to the bear's chain */
{
if (verb != LOCK) {
if (game.prop[BEAR] == UNTAMED_BEAR) {
rspeak(BEAR_BLOCKS);
return GO_CLEAROBJ;
}
if (game.prop[CHAIN] == CHAIN_HEAP) {
rspeak(ALREADY_UNLOCKED);
return GO_CLEAROBJ;
}
game.prop[CHAIN] = CHAIN_HEAP;
game.fixed[CHAIN] = IS_FREE;
if (game.prop[BEAR] != BEAR_DEAD)
game.prop[BEAR] = CONTENTED_BEAR;
switch (game.prop[BEAR]) {
// LCOV_EXCL_START
case BEAR_DEAD:
/* Can't be reached until the bear can die in some way other
* than a bridge collapse. Leave in in case this changes, but
* exclude from coverage testing. */
game.fixed[BEAR] = IS_FIXED;
break;
// LCOV_EXCL_STOP
default:
game.fixed[BEAR] = IS_FREE;
}
rspeak(CHAIN_UNLOCKED);
return GO_CLEAROBJ;
}
if (game.prop[CHAIN] != CHAIN_HEAP) {
rspeak(ALREADY_LOCKED);
return GO_CLEAROBJ;
}
if (game.loc != objects[CHAIN].plac) {
rspeak(NO_LOCKSITE);
return GO_CLEAROBJ;
}
game.prop[CHAIN] = CHAIN_FIXED;
if (TOTING(CHAIN))
drop(CHAIN, game.loc);
game.fixed[CHAIN] = IS_FIXED;
rspeak(CHAIN_LOCKED);
return GO_CLEAROBJ;
}
static int discard(verb_t verb, obj_t obj)
/* Discard object. "Throw" also comes here for most objects. Special cases for
* bird (might attack snake or dragon) and cage (might contain bird) and vase.
* Drop coins at vending machine for extra batteries. */
{
if (obj == ROD && !TOTING(ROD) && TOTING(ROD2)) {
obj = ROD2;
}
if (!TOTING(obj)) {
speak(actions[verb].message);
return GO_CLEAROBJ;
}
if (GSTONE(obj) && AT(CAVITY) && game.prop[CAVITY] != CAVITY_FULL) {
rspeak(GEM_FITS);
game.prop[obj] = STATE_IN_CAVITY;
game.prop[CAVITY] = CAVITY_FULL;
if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != RUG_HOVER) ||
(obj == RUBY && game.prop[RUG] == RUG_HOVER))) {
if (obj == RUBY)
rspeak(RUG_SETTLES);
else if (TOTING(RUG))
rspeak(RUG_WIGGLES);
else
rspeak(RUG_RISES);
if (!TOTING(RUG) || obj == RUBY) {
int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER;
game.prop[RUG] = k;
if (k == RUG_HOVER)
k = objects[SAPPH].plac;
move(RUG + NOBJECTS, k);
}
}
drop(obj, game.loc);
return GO_CLEAROBJ;
}
if (obj == COINS && HERE(VEND)) {
DESTROY(COINS);
drop(BATTERY, game.loc);
pspeak(BATTERY, look, FRESH_BATTERIES, true);
return GO_CLEAROBJ;
}
if (LIQUID() == obj)
obj = BOTTLE;
if (obj == BOTTLE && LIQUID() != NO_OBJECT) {
game.place[LIQUID()] = LOC_NOWHERE;
}
if (obj == BEAR && AT(TROLL)) {
state_change(TROLL, TROLL_GONE);
move(TROLL, LOC_NOWHERE);
move(TROLL + NOBJECTS, IS_FREE);
move(TROLL2, objects[TROLL].plac);
move(TROLL2 + NOBJECTS, objects[TROLL].fixd);
juggle(CHASM);
drop(obj, game.loc);
return GO_CLEAROBJ;
}
if (obj == VASE) {
if (game.loc != objects[PILLOW].plac) {
state_change(VASE, AT(PILLOW)
? VASE_WHOLE
: VASE_DROPPED);
if (game.prop[VASE] != VASE_WHOLE)
game.fixed[VASE] = IS_FIXED;
drop(obj, game.loc);
return GO_CLEAROBJ;
}
}
if (obj == CAGE && game.prop[BIRD] == BIRD_CAGED) {
drop(BIRD, game.loc);
}
if (obj == BIRD) {
if (AT(DRAGON) && game.prop[DRAGON] == DRAGON_BARS) {
rspeak(BIRD_BURNT);
DESTROY(BIRD);
return GO_CLEAROBJ;
}
if (HERE(SNAKE)) {
rspeak(BIRD_ATTACKS);
if (game.closed)
return GO_DWARFWAKE;
DESTROY(SNAKE);
/* Set game.prop for use by travel options */
game.prop[SNAKE] = SNAKE_CHASED;
} else
rspeak(OK_MAN);
game.prop[BIRD] = FOREST(game.loc) ? BIRD_FOREST_UNCAGED : BIRD_UNCAGED;
drop(obj, game.loc);
return GO_CLEAROBJ;
}
rspeak(OK_MAN);
drop(obj, game.loc);
return GO_CLEAROBJ;
}
static int drink(verb_t verb, obj_t obj)
/* Drink. If no object, assume water and look for it here. If water is in
* the bottle, drink that, else must be at a water loc, so drink stream. */
{
if (obj == INTRANSITIVE && LIQLOC(game.loc) != WATER &&
(LIQUID() != WATER || !HERE(BOTTLE))) {
return GO_UNKNOWN;
}
if (obj == BLOOD) {
DESTROY(BLOOD);
state_change(DRAGON, DRAGON_BLOODLESS);
game.blooded = true;
return GO_CLEAROBJ;
}
if (obj != INTRANSITIVE && obj != WATER) {
rspeak(RIDICULOUS_ATTEMPT);
return GO_CLEAROBJ;
}
if (LIQUID() == WATER && HERE(BOTTLE)) {
game.place[WATER] = LOC_NOWHERE;
state_change(BOTTLE, EMPTY_BOTTLE);
return GO_CLEAROBJ;
}
speak(actions[verb].message);
return GO_CLEAROBJ;
}
static int eat(verb_t verb, obj_t obj)
/* Eat. Intransitive: assume food if present, else ask what. Transitive: food
* ok, some things lose appetite, rest are ridiculous. */
{
switch (obj) {
case INTRANSITIVE:
if (!HERE(FOOD))
return GO_UNKNOWN;
/* FALLTHRU */
case FOOD:
DESTROY(FOOD);
rspeak(THANKS_DELICIOUS);
break;
case BIRD:
case SNAKE:
case CLAM:
case OYSTER:
case DWARF:
case DRAGON:
case TROLL:
case BEAR:
case OGRE:
rspeak(LOST_APPETITE);
break;
default:
speak(actions[verb].message);
}
return GO_CLEAROBJ;
}
static int extinguish(verb_t verb, obj_t obj)
/* Extinguish. Lamp, urn, dragon/volcano (nice try). */
{
if (obj == INTRANSITIVE) {
if (HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT)
obj = LAMP;
if (HERE(URN) && game.prop[URN] == URN_LIT)
obj = URN;
if (obj == INTRANSITIVE)
return GO_UNKNOWN;
}
switch (obj) {
case URN:
if (game.prop[URN] != URN_EMPTY) {
state_change(URN, URN_DARK);
} else {
pspeak(URN, change, URN_DARK, true);
}
break;
case LAMP:
state_change(LAMP, LAMP_DARK);
rspeak(DARK(game.loc) ?
PITCH_DARK :
NO_MESSAGE);
break;
case DRAGON:
case VOLCANO:
rspeak(BEYOND_POWER);
break;
default:
speak(actions[verb].message);
}
return GO_CLEAROBJ;
}
static int feed(verb_t verb, obj_t obj)
/* Feed. If bird, no seed. Snake, dragon, troll: quip. If dwarf, make him
* mad. Bear, special. */
{
switch (obj) {
case BIRD:
rspeak(BIRD_PINING);
break;
case DRAGON:
if (game.prop[DRAGON] != DRAGON_BARS)
rspeak(RIDICULOUS_ATTEMPT);
else
rspeak(NOTHING_EDIBLE);
break;
case SNAKE:
if (!game.closed && HERE(BIRD)) {
DESTROY(BIRD);
rspeak(BIRD_DEVOURED);
} else
rspeak(NOTHING_EDIBLE);
break;
case TROLL:
rspeak(TROLL_VICES);
break;
case DWARF:
if (HERE(FOOD)) {
game.dflag += 2;
rspeak(REALLY_MAD);
} else
speak(actions[verb].message);
break;
case BEAR:
if (game.prop[BEAR] == BEAR_DEAD) {
rspeak(RIDICULOUS_ATTEMPT);
break;
}
if (game.prop[BEAR] == UNTAMED_BEAR) {
if (HERE(FOOD)) {
DESTROY(FOOD);
game.fixed[AXE] = IS_FREE;
game.prop[AXE] = AXE_HERE;
state_change(BEAR, SITTING_BEAR);
} else
rspeak(NOTHING_EDIBLE);
break;
}
speak(actions[verb].message);
break;
case OGRE:
if (HERE(FOOD))
rspeak(OGRE_FULL);
else
speak(actions[verb].message);
break;
default:
rspeak(AM_GAME);
}
return GO_CLEAROBJ;
}
int fill(verb_t verb, obj_t obj)
/* Fill. Bottle or urn must be empty, and liquid available. (Vase
* is nasty.) */
{
if (obj == VASE) {
if (LIQLOC(game.loc) == NO_OBJECT) {
rspeak(FILL_INVALID);
return GO_CLEAROBJ;
}
if (!TOTING(VASE)) {
rspeak(ARENT_CARRYING);
return GO_CLEAROBJ;
}
rspeak(SHATTER_VASE);
game.prop[VASE] = VASE_BROKEN;
game.fixed[VASE] = IS_FIXED;
drop(VASE, game.loc);
return GO_CLEAROBJ;
}
if (obj == URN) {
if (game.prop[URN] != URN_EMPTY) {
rspeak(FULL_URN);
return GO_CLEAROBJ;
}
if (!HERE(BOTTLE)) {
rspeak(FILL_INVALID);
return GO_CLEAROBJ;
}
int k = LIQUID();
switch (k) {
case WATER:
game.prop[BOTTLE] = EMPTY_BOTTLE;
rspeak(WATER_URN);
break;
case OIL:
game.prop[URN] = URN_DARK;
game.prop[BOTTLE] = EMPTY_BOTTLE;
rspeak(OIL_URN);
break;
case NO_OBJECT:
default:
rspeak(FILL_INVALID);
return GO_CLEAROBJ;
}
game.place[k] = LOC_NOWHERE;
return GO_CLEAROBJ;
}
if (obj != INTRANSITIVE && obj != BOTTLE) {
speak(actions[verb].message);
return GO_CLEAROBJ;
}
if (obj == INTRANSITIVE && !HERE(BOTTLE))
return GO_UNKNOWN;
if (HERE(URN) && game.prop[URN] != URN_EMPTY) {
rspeak(URN_NOPOUR);
return GO_CLEAROBJ;
}
if (LIQUID() != NO_OBJECT) {
rspeak(BOTTLE_FULL);
return GO_CLEAROBJ;
}
if (LIQLOC(game.loc) == NO_OBJECT) {
rspeak(NO_LIQUID);
return GO_CLEAROBJ;
}
state_change(BOTTLE, (LIQLOC(game.loc) == OIL)
? OIL_BOTTLE
: WATER_BOTTLE);
if (TOTING(BOTTLE))
game.place[LIQUID()] = CARRIED;
return GO_CLEAROBJ;
}
static int find(verb_t verb, obj_t obj)
/* Find. Might be carrying it, or it might be here. Else give caveat. */
{
if (TOTING(obj)) {
rspeak(ALREADY_CARRYING);
return GO_CLEAROBJ;
}
if (game.closed) {
rspeak(NEEDED_NEARBY);
return GO_CLEAROBJ;
}
if (AT(obj) ||
(LIQUID() == obj && AT(BOTTLE)) ||
obj == LIQLOC(game.loc) ||
(obj == DWARF && atdwrf(game.loc) > 0)) {
rspeak(YOU_HAVEIT);
return GO_CLEAROBJ;
}
speak(actions[verb].message);
return GO_CLEAROBJ;
}
static int fly(verb_t verb, obj_t obj)
/* Fly. Snide remarks unless hovering rug is here. */
{
if (obj == INTRANSITIVE) {
if (!HERE(RUG)) {
rspeak(FLAP_ARMS);
return GO_CLEAROBJ;
}
if (game.prop[RUG] != RUG_HOVER) {
rspeak(RUG_NOTHING2);
return GO_CLEAROBJ;
}
obj = RUG;
}
if (obj != RUG) {
speak(actions[verb].message);
return GO_CLEAROBJ;
}
if (game.prop[RUG] != RUG_HOVER) {
rspeak(RUG_NOTHING1);
return GO_CLEAROBJ;
}
game.oldlc2 = game.oldloc;
game.oldloc = game.loc;
if (game.prop[SAPPH] == STATE_NOTFOUND) {
game.newloc = game.place[SAPPH];
rspeak(RUG_GOES);
} else {
game.newloc = LOC_CLIFF;
rspeak(RUG_RETURNS);
}
return GO_TERMINATE;
}
static int inven(void)
/* Inventory. If object, treat same as find. Else report on current burden. */
{
bool empty = true;
for (obj_t i = 1; i <= NOBJECTS; i++) {
if (i == BEAR ||
!TOTING(i))
continue;
if (empty) {
rspeak(NOW_HOLDING);
empty = false;
}
pspeak(i, touch, -1, false);
}
if (TOTING(BEAR))
rspeak(TAME_BEAR);
if (empty)
rspeak(NO_CARRY);
return GO_CLEAROBJ;
}
static int light(verb_t verb, obj_t obj)
/* Light. Applicable only to lamp and urn. */
{
if (obj == INTRANSITIVE) {
int selects = 0;
if (HERE(LAMP) && game.prop[LAMP] == LAMP_DARK && game.limit >= 0) {
obj = LAMP;
selects++;
}
if (HERE(URN) && game.prop[URN] == URN_DARK) {
obj = URN;
selects++;
}
if (selects != 1)
return GO_UNKNOWN;
}
switch (obj) {
case URN:
state_change(URN, game.prop[URN] == URN_EMPTY ?
URN_EMPTY :
URN_LIT);
break;
case LAMP:
if (game.limit < 0) {
rspeak(LAMP_OUT);
break;
}
state_change(LAMP, LAMP_BRIGHT);
if (game.wzdark)
return GO_TOP;
break;
default:
speak(actions[verb].message);
}
return GO_CLEAROBJ;
}
static int listen(void)
/* Listen. Intransitive only. Print stuff based on object sound proprties. */
{
vocab_t sound = locations[game.loc].sound;
if (sound != SILENT) {
rspeak(sound);
if (!locations[game.loc].loud)
rspeak(NO_MESSAGE);
return GO_CLEAROBJ;
}
for (obj_t i = 1; i <= NOBJECTS; i++) {
if (!HERE(i) ||
objects[i].sounds[0] == NULL ||
game.prop[i] < 0)
continue;
int mi = game.prop[i];
/* (ESR) Some unpleasant magic on object states here. Ideally
* we'd have liked the bird to be a normal object that we can
* use state_change() on; can't do it, because there are
* actually two different series of per-state birdsounds
* depending on whether player has drunk dragon's blood. */
if (i == BIRD)
mi += 3 * game.blooded;
pspeak(i, hear, mi, true, game.zzword);
rspeak(NO_MESSAGE);
if (i == BIRD && mi == BIRD_ENDSTATE)
DESTROY(BIRD);
return GO_CLEAROBJ;
}
rspeak(ALL_SILENT);
return GO_CLEAROBJ;
}
static int lock(verb_t verb, obj_t obj)
/* Lock, unlock, no object given. Assume various things if present. */
{
if (obj == INTRANSITIVE) {
if (HERE(CLAM))
obj = CLAM;
if (HERE(OYSTER))
obj = OYSTER;
if (AT(DOOR))
obj = DOOR;
if (AT(GRATE))
obj = GRATE;
if (HERE(CHAIN))
obj = CHAIN;
if (obj == INTRANSITIVE) {
rspeak(NOTHING_LOCKED);
return GO_CLEAROBJ;
}
}
/* Lock, unlock object. Special stuff for opening clam/oyster
* and for chain. */
switch (obj) {
case CHAIN:
if (HERE(KEYS)) {
return chain(verb);
} else
rspeak(NO_KEYS);
break;
case GRATE:
if (HERE(KEYS)) {
if (game.closng) {
rspeak(EXIT_CLOSED);
if (!game.panic)
game.clock2 = PANICTIME;
game.panic = true;
} else {
state_change(GRATE, (verb == LOCK) ?
GRATE_CLOSED :
GRATE_OPEN);
}
} else
rspeak(NO_KEYS);
break;
case CLAM:
if (verb == LOCK)
rspeak(HUH_MAN);
else if (!TOTING(TRIDENT))
rspeak(CLAM_OPENER);
else {
DESTROY(CLAM);
drop(OYSTER, game.loc);
drop(PEARL, LOC_CULDESAC);
rspeak(PEARL_FALLS);
}
break;
case OYSTER:
if (verb == LOCK)
rspeak(HUH_MAN);
else if (TOTING(OYSTER))
rspeak(DROP_OYSTER);
else if (!TOTING(TRIDENT))
rspeak(OYSTER_OPENER);
else
rspeak(OYSTER_OPENS);
break;
case DOOR:
rspeak((game.prop[DOOR] == DOOR_UNRUSTED) ? OK_MAN : RUSTY_DOOR);
break;
case CAGE:
rspeak( NO_LOCK);
break;
case KEYS:
rspeak(CANNOT_UNLOCK);
break;
default:
speak(actions[verb].message);
}
return GO_CLEAROBJ;
}
static int pour(verb_t verb, obj_t obj)
/* Pour. If no object, or object is bottle, assume contents of bottle.
* special tests for pouring water or oil on plant or rusty door. */
{
if (obj == BOTTLE ||
obj == INTRANSITIVE)
obj = LIQUID();
if (obj == NO_OBJECT)
return GO_UNKNOWN;
if (!TOTING(obj)) {
speak(actions[verb].message);
return GO_CLEAROBJ;
}
if (obj != OIL && obj != WATER) {
rspeak(CANT_POUR);
return GO_CLEAROBJ;
}
if (HERE(URN) && game.prop[URN] == URN_EMPTY)
return fill(verb, URN);
game.prop[BOTTLE] = EMPTY_BOTTLE;
game.place[obj] = LOC_NOWHERE;
if (!(AT(PLANT) ||
AT(DOOR))) {
rspeak(GROUND_WET);
return GO_CLEAROBJ;
}
if (!AT(DOOR)) {
if (obj == WATER) {
/* cycle through the three plant states */
state_change(PLANT, MOD(game.prop[PLANT] + 1, 3));
game.prop[PLANT2] = game.prop[PLANT];
return GO_MOVE;
} else {
rspeak(SHAKING_LEAVES);
return GO_CLEAROBJ;
}
} else {
state_change(DOOR, (obj == OIL) ?
DOOR_UNRUSTED :
DOOR_RUSTED);
return GO_CLEAROBJ;
}
}
static int quit(void)
/* Quit. Intransitive only. Verify intent and exit if that's what he wants. */
{
if (yes(arbitrary_messages[REALLY_QUIT], arbitrary_messages[OK_MAN], arbitrary_messages[OK_MAN]))
terminate(quitgame);
return GO_CLEAROBJ;
}
static int read(command_t command)
/* Read. Print stuff based on objtxt. Oyster (?) is special case. */
{
if (command.obj == INTRANSITIVE) {
command.obj = NO_OBJECT;
for (int i = 1; i <= NOBJECTS; i++) {
if (HERE(i) && objects[i].texts[0] != NULL && game.prop[i] >= 0)
command.obj = command.obj * NOBJECTS + i;
}
if (command.obj > NOBJECTS ||
command.obj == NO_OBJECT ||
DARK(game.loc))
return GO_UNKNOWN;
}
if (DARK(game.loc)) {
sspeak(NO_SEE, command.word[0].raw);
} else if (command.obj == OYSTER && !game.clshnt && game.closed) {
game.clshnt = yes(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
} else if (objects[command.obj].texts[0] == NULL ||
game.prop[command.obj] == STATE_NOTFOUND) {
speak(actions[command.verb].message);
} else
pspeak(command.obj, study, game.prop[command.obj], true);
return GO_CLEAROBJ;
}
static int reservoir(void)
/* Z'ZZZ (word gets recomputed at startup; different each game). */
{
if (!AT(RESER) && game.loc != LOC_RESBOTTOM) {
rspeak(NOTHING_HAPPENS);
return GO_CLEAROBJ;
} else {
state_change(RESER,
game.prop[RESER] == WATERS_PARTED ? WATERS_UNPARTED : WATERS_PARTED);
if (AT(RESER))
return GO_CLEAROBJ;
else {
game.oldlc2 = game.loc;
game.newloc = LOC_NOWHERE;
rspeak(NOT_BRIGHT);
return GO_TERMINATE;
}
}
}
static int rub(verb_t verb, obj_t obj)
/* Rub. Yields various snide remarks except for lit urn. */
{
if (obj == URN && game.prop[URN] == URN_LIT) {
DESTROY(URN);
drop(AMBER, game.loc);
game.prop[AMBER] = AMBER_IN_ROCK;
--game.tally;
drop(CAVITY, game.loc);
rspeak(URN_GENIES);
} else if (obj != LAMP) {
rspeak(PECULIAR_NOTHING);
} else {
speak(actions[verb].message);
}
return GO_CLEAROBJ;
}
static int say(command_t command)
/* Say. Echo WD2. Magic words override. */
{
if (command.word[1].type == MOTION &&
(command.word[1].id == XYZZY ||
command.word[1].id == PLUGH ||
command.word[1].id == PLOVER)) {
return GO_WORD2;
}
if (command.word[1].type == ACTION && command.word[1].id == PART)
return reservoir();
if (command.word[1].type == ACTION &&
(command.word[1].id == FEE ||
command.word[1].id == FIE ||
command.word[1].id == FOE ||
command.word[1].id == FOO ||
command.word[1].id == FUM ||
command.word[1].id == PART)) {
return bigwords(command.word[1].id);
}
sspeak(OKEY_DOKEY, command.word[1].raw);
return GO_CLEAROBJ;
}
static int throw_support(vocab_t spk)
{
rspeak(spk);
drop(AXE, game.loc);
return GO_MOVE;
}
static int throw (command_t command)
/* Throw. Same as discard unless axe. Then same as attack except
* ignore bird, and if dwarf is present then one might be killed.
* (Only way to do so!) Axe also special for dragon, bear, and
* troll. Treasures special for troll. */
{
if (!TOTING(command.obj)) {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
if (objects[command.obj].is_treasure && AT(TROLL)) {
/* Snarf a treasure for the troll. */
drop(command.obj, LOC_NOWHERE);
move(TROLL, LOC_NOWHERE);
move(TROLL + NOBJECTS, IS_FREE);
drop(TROLL2, objects[TROLL].plac);
drop(TROLL2 + NOBJECTS, objects[TROLL].fixd);
juggle(CHASM);
rspeak(TROLL_SATISFIED);
return GO_CLEAROBJ;
}
if (command.obj == FOOD && HERE(BEAR)) {
/* But throwing food is another story. */
command.obj = BEAR;
return (feed(command.verb, command.obj));
}
if (command.obj != AXE)
return (discard(command.verb, command.obj));
else {
if (atdwrf(game.loc) <= 0) {
if (AT(DRAGON) && game.prop[DRAGON] == DRAGON_BARS)
return throw_support(DRAGON_SCALES);
if (AT(TROLL))
return throw_support(TROLL_RETURNS);
if (AT(OGRE))
return throw_support(OGRE_DODGE);
if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
/* This'll teach him to throw the axe at the bear! */
drop(AXE, game.loc);
game.fixed[AXE] = IS_FIXED;
juggle(BEAR);
state_change(AXE, AXE_LOST);
return GO_CLEAROBJ;
}
command.obj = INTRANSITIVE;
return (attack(command));
}
if (randrange(NDWARVES + 1) < game.dflag) {
return throw_support(DWARF_DODGES);
} else {
int i = atdwrf(game.loc);
game.dseen[i] = false;
game.dloc[i] = LOC_NOWHERE;
return throw_support((++game.dkill == 1) ?
DWARF_SMOKE :
KILLED_DWARF);
}
}
}
static int wake(verb_t verb, obj_t obj)
/* Wake. Only use is to disturb the dwarves. */
{
if (obj != DWARF ||
!game.closed) {
speak(actions[verb].message);
return GO_CLEAROBJ;
} else {
rspeak(PROD_DWARF);
return GO_DWARFWAKE;
}
}
static int seed(verb_t verb, const char *arg)
/* Set seed */
{
int32_t seed = strtol(arg, NULL, 10);
speak(actions[verb].message, seed);
set_seed(seed);
--game.turns;
return GO_TOP;
}
static int waste(verb_t verb, turn_t turns)
/* Burn turns */
{
game.limit -= turns;
speak(actions[verb].message, (int)game.limit);
return GO_TOP;
}
static int wave(verb_t verb, obj_t obj)
/* Wave. No effect unless waving rod at fissure or at bird. */
{
if (obj != ROD ||
!TOTING(obj) ||
(!HERE(BIRD) &&
(game.closng ||
!AT(FISSURE)))) {
speak(((!TOTING(obj)) && (obj != ROD ||
!TOTING(ROD2))) ?
arbitrary_messages[ARENT_CARRYING] :
actions[verb].message);
return GO_CLEAROBJ;
}
if (game.prop[BIRD] == BIRD_UNCAGED && game.loc == game.place[STEPS] && game.prop[JADE] == STATE_NOTFOUND) {
drop(JADE, game.loc);
game.prop[JADE] = STATE_FOUND;
--game.tally;
rspeak(NECKLACE_FLY);
return GO_CLEAROBJ;
} else {
if (game.closed) {
rspeak((game.prop[BIRD] == BIRD_CAGED) ?
CAGE_FLY :
FREE_FLY);
return GO_DWARFWAKE;
}
if (game.closng ||
!AT(FISSURE)) {
rspeak((game.prop[BIRD] == BIRD_CAGED) ?
CAGE_FLY :
FREE_FLY);
return GO_CLEAROBJ;
}
if (HERE(BIRD))
rspeak((game.prop[BIRD] == BIRD_CAGED) ?
CAGE_FLY :
FREE_FLY);
state_change(FISSURE,
game.prop[FISSURE] == BRIDGED ? UNBRIDGED : BRIDGED);
return GO_CLEAROBJ;
}
}
int action(command_t command)
/* Analyse a verb. Remember what it was, go back for object if second word
* unless verb is "say", which snarfs arbitrary second word.
*/
{
/* Previously, actions that result in a message, but don't do anything
* further were called "specials". Now they're handled here as normal
* actions. If noaction is true, then we spit out the message and return */
if (actions[command.verb].noaction) {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
if (command.part == unknown) {
/* Analyse an object word. See if the thing is here, whether
* we've got a verb yet, and so on. Object must be here
* unless verb is "find" or "invent(ory)" (and no new verb
* yet to be analysed). Water and oil are also funny, since
* they are never actually dropped at any location, but might
* be here inside the bottle or urn or as a feature of the
* location. */
if (HERE(command.obj))
/* FALL THROUGH */;
else if (command.obj == DWARF && atdwrf(game.loc) > 0)
/* FALL THROUGH */;
else if ((LIQUID() == command.obj && HERE(BOTTLE)) ||
command.obj == LIQLOC(game.loc))
/* FALL THROUGH */;
else if (command.obj == OIL && HERE(URN) && game.prop[URN] != URN_EMPTY) {
command.obj = URN;
/* FALL THROUGH */;
} else if (command.obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != PLANT_THIRSTY) {
command.obj = PLANT2;
/* FALL THROUGH */;
} else if (command.obj == KNIFE && game.knfloc == game.loc) {
game.knfloc = -1;
rspeak(KNIVES_VANISH);
return GO_CLEAROBJ;
} else if (command.obj == ROD && HERE(ROD2)) {
command.obj = ROD2;
/* FALL THROUGH */;
} else if ((command.verb == FIND ||
command.verb == INVENTORY) && (command.word[1].id == WORD_EMPTY || command.word[1].id == WORD_NOT_FOUND))
/* FALL THROUGH */;
else {
sspeak(NO_SEE, command.word[0].raw);
return GO_CLEAROBJ;
}
if (command.verb != 0)
command.part = transitive;
}
switch (command.part) {
case intransitive:
if (command.word[1].raw[0] != '\0' && command.verb != SAY)
return GO_WORD2;
if (command.verb == SAY)
/* KEYS is not special, anything not NO_OBJECT or INTRANSITIVE
* will do here. We're preventing interpretation as an intransitive
* verb when the word is unknown. */
command.obj = command.word[1].raw[0] != '\0' ? KEYS : NO_OBJECT;
if (command.obj == NO_OBJECT ||
command.obj == INTRANSITIVE) {
/* Analyse an intransitive verb (ie, no object given yet). */
switch (command.verb) {
case CARRY:
return vcarry(command.verb, INTRANSITIVE);
case DROP:
return GO_UNKNOWN;
case SAY:
return GO_UNKNOWN;
case UNLOCK:
return lock(command.verb, INTRANSITIVE);
case NOTHING: {
rspeak(OK_MAN);
return (GO_CLEAROBJ);
}
case LOCK:
return lock(command.verb, INTRANSITIVE);
case LIGHT:
return light(command.verb, INTRANSITIVE);
case EXTINGUISH:
return extinguish(command.verb, INTRANSITIVE);
case WAVE:
return GO_UNKNOWN;
case TAME:
return GO_UNKNOWN;
case GO: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case ATTACK:
command.obj = INTRANSITIVE;
return attack(command);
case POUR:
return pour(command.verb, INTRANSITIVE);
case EAT:
return eat(command.verb, INTRANSITIVE);
case DRINK:
return drink(command.verb, INTRANSITIVE);
case RUB:
return GO_UNKNOWN;
case THROW:
return GO_UNKNOWN;
case QUIT:
return quit();
case FIND:
return GO_UNKNOWN;
case INVENTORY:
return inven();
case FEED:
return GO_UNKNOWN;
case FILL:
return fill(command.verb, INTRANSITIVE);
case BLAST:
blast();
return GO_CLEAROBJ;
case SCORE:
score(scoregame);
return GO_CLEAROBJ;
case FEE:
case FIE:
case FOE:
case FOO:
case FUM:
return bigwords(command.word[0].id);
case BRIEF:
return brief();
case READ:
command.obj = INTRANSITIVE;
return read(command);
case BREAK:
return GO_UNKNOWN;
case WAKE:
return GO_UNKNOWN;
case SAVE:
return suspend();
case RESUME:
return resume();
case FLY:
return fly(command.verb, INTRANSITIVE);
case LISTEN:
return listen();
case PART:
return reservoir();
case SEED:
case WASTE:
rspeak(NUMERIC_REQUIRED);
return GO_TOP;
default: // LCOV_EXCL_LINE
BUG(INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
}
}
/* FALLTHRU */
case transitive:
/* Analyse a transitive verb. */
switch (command.verb) {
case CARRY:
return vcarry(command.verb, command.obj);
case DROP:
return discard(command.verb, command.obj);
case SAY:
return say(command);
case UNLOCK:
return lock(command.verb, command.obj);
case NOTHING: {
rspeak(OK_MAN);
return (GO_CLEAROBJ);
}
case LOCK:
return lock(command.verb, command.obj);
case LIGHT:
return light(command.verb, command.obj);
case EXTINGUISH:
return extinguish(command.verb, command.obj);
case WAVE:
return wave(command.verb, command.obj);
case TAME: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case GO: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case ATTACK:
return attack(command);
case POUR:
return pour(command.verb, command.obj);
case EAT:
return eat(command.verb, command.obj);
case DRINK:
return drink(command.verb, command.obj);
case RUB:
return rub(command.verb, command.obj);
case THROW:
return throw (command);
case QUIT: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case FIND:
return find(command.verb, command.obj);
case INVENTORY:
return find(command.verb, command.obj);
case FEED:
return feed(command.verb, command.obj);
case FILL:
return fill(command.verb, command.obj);
case BLAST:
blast();
return GO_CLEAROBJ;
case SCORE: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case FEE:
case FIE:
case FOE:
case FOO:
case FUM: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case BRIEF: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case READ:
return read(command);
case BREAK:
return vbreak(command.verb, command.obj);
case WAKE:
return wake(command.verb, command.obj);
case SAVE: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case RESUME: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
case FLY:
return fly(command.verb, command.obj);
case LISTEN: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;
}
// LCOV_EXCL_START
// This case should never happen - here only as placeholder
case PART:
return reservoir();
// LCOV_EXCL_STOP
case SEED:
return seed(command.verb, command.word[1].raw);
case WASTE:
return waste(command.verb, (turn_t)atol(command.word[1].raw));
default: // LCOV_EXCL_LINE
BUG(TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
}
case unknown:
/* Unknown verb, couldn't deduce object - might need hint */
sspeak(WHAT_DO, command.word[0].raw);
return GO_CLEAROBJ;
default: // LCOV_EXCL_LINE
BUG(SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN); // LCOV_EXCL_LINE
}
}
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/advent.adoc 0000664 0000000 0000000 00000005714 13157513121 0025000 0 ustar 00root root 0000000 0000000 = advent(6) =
:doctype: manpage
== NAME ==
advent - Colossal Cave Adventure
== SYNOPSIS ==
*advent* [-l logfile] [-o] [-r savefile] [-s]
== DESCRIPTION ==
The original Colossal Cave Adventure from 1976-77 was the origin of all
later text adventures, dungeon-crawl (computer) games, and computer-hosted
roleplaying games.
This is the last version released by Crowther & Woods, its original
authors, in 1995. It has been known as "adventure 2.5" and "430-point
adventure". To learn more about the changes since the 350-point
original, type 'news' at the command prompt.
There is an 'adventure' in the BSD games package that is a C port by
Jim Gillogly of the 1976 ancestor of this game. To avoid a name
collision, this game builds as 'advent', reflecting the fact that the
PDP-10 on which the game originally ran limited filenames to 6 characters.
This version is released as open source with the permission and
encouragement of the original authors.
Unlike the original, this version supports use of your arrow keys to edit
your command line in place. Basic Emacs keystrokes are supported, and
your up/down arrows access a command history.
Otherwise, the "version" command is about the only way to tell you're not
running Don's original.
To exit the game, type Ctrl-D (EOF).
There have been no gameplay changes.
== OPTIONS ==
-l:: Log commands to specified file.
-r:: Restore game from specified file
-o:: Old-style. Restores original interface, no prompt or line editing.
Also ignores new-school one-letter commands l, x, g, z, i. Also
case-smashes and truncates unrecognized text when echoed.
== BUGS ==
The binary save file format is fragile, dependent on your machine word
size and endianness, and unlikely to survive through version bumps. There
is a version check.
The input parser was the first attempt *ever* at natural-language
parsing in a game and has some known deficiencies. While later text
adventures distinguished between transitive and intransitive verbs,
Adventure's grammar distinguishes only between motion and action
verbs. Motions are always immediate in their behavior, so both ACTION
MOTION and MOTION ACTION (and even MOTION NOUN and MOTION MOTION) are
invariably equivalent to MOTION (thus GO NORTH means NORTH and JUMP
DOWN means JUMP). Whereas, with actions and nouns, the parser collects
words until it's seen one of each, and then dispatches; if it reaches
the end of the command without seeing a noun, it'll dispatch an
"intransitive" action. This makes ACTION1 ACTION2 equivalent to
ACTION2 (thus TAKE INVENTORY means INVENTORY), and NOUN ACTION
equivalent to ACTION NOUN.
Thus you get anomalies like "eat building" interpreted as a command
to move to the building. These should not be reported as bugs; instead,
consider them historical curiosities.
== REPORTING BUGS ==
Report bugs to Eric S. Raymond . The project page is
at http://catb.org/~esr/open-adventure
== SEE ALSO ==
wumpus(6), adventure(6), zork(6), rogue(6), nethack(6).
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/advent.desktop 0000664 0000000 0000000 00000000301 13157513121 0025526 0 ustar 00root root 0000000 0000000 [Desktop Entry]
Type=Application
Name=Open Adventure
Comment=Colossal Cave Adventure, the 1995 430-point version
Icon=advent
Exec=advent
Terminal=true
Categories=Game;AdventureGame;ConsoleOnly
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/advent.h 0000664 0000000 0000000 00000024640 13157513121 0024320 0 ustar 00root root 0000000 0000000 #include
#include
#include
#include
#include
#include "dungeon.h"
/* LCG PRNG parameters tested against
* Knuth vol. 2. by the original authors */
#define LCG_A 1093L
#define LCG_C 221587L
#define LCG_M 1048576L
#define LINESIZE 1024
#define TOKLEN 5 // â„– sigificant characters in a token */
#define NDWARVES 6 // number of dwarves
#define PIRATE NDWARVES // must be NDWARVES-1 when zero-origin
#define DALTLC LOC_NUGGET // alternate dwarf location
#define INVLIMIT 7 // inverntory limit (â„– of objects)
#define INTRANSITIVE -1 // illegal object number
#define GAMELIMIT 330 // base limit of turns
#define NOVICELIMIT 1000 // limit of turns for novice
#define WARNTIME 30 // late game starts at game.limit-this
#define FLASHTIME 50 // turns from first warning till blinding flash
#define PANICTIME 15 // time left after closing
#define BATTERYLIFE 2500 // turn limit increment from batteries
#define WORD_NOT_FOUND -1 // "Word not found" flag value for the vocab hash functions.
#define WORD_EMPTY 0 // "Word empty" flag value for the vocab hash functions
#define CARRIED -1 // Player is toting it
#define READ_MODE "rb" // b is not needed for POSIX but harmless
#define WRITE_MODE "wb" // b is not needed for POSIX but harmless
/* Special object-state values - integers > 0 are object-specific */
#define STATE_NOTFOUND -1 // 'Not found" state of treasures */
#define STATE_FOUND 0 // After discovered, before messed with
#define STATE_IN_CAVITY 1 // State value common to all gemstones
/* Special fixed object-state values - integers > 0 are location */
#define IS_FIXED -1
#define IS_FREE 0
/* Map a state property value to a negative range, where the object cannot be
* picked up but the value can be recovered later. Avoid colliding with -1,
* which has its own meaning. */
#define STASHED(obj) (-1 - game.prop[obj])
/*
* MOD(N,M) = Arithmetic modulus
* AT(OBJ) = true if on either side of two-placed object
* CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit)
* DARK(LOC) = true if location "LOC" is dark
* FORCED(LOC) = true if LOC moves without asking for input (COND=2)
* FOREST(LOC) = true if LOC is part of the forest
* GSTONE(OBJ) = true if OBJ is a gemstone
* HERE(OBJ) = true if the OBJ is at "LOC" (or is being carried)
* LIQUID() = object number of liquid in bottle
* LIQLOC(LOC) = object number of liquid (if any) at LOC
* PCT(N) = true N% of the time (N integer from 0 to 100)
* TOTING(OBJ) = true if the OBJ is being carried */
#define DESTROY(N) move(N, LOC_NOWHERE)
#define MOD(N,M) ((N) % (M))
#define TOTING(OBJ) (game.place[OBJ] == CARRIED)
#define AT(OBJ) (game.place[OBJ] == game.loc || game.fixed[OBJ] == game.loc)
#define HERE(OBJ) (AT(OBJ) || TOTING(OBJ))
#define CNDBIT(L,N) (tstbit(conditions[L],N))
#define LIQUID() (game.prop[BOTTLE] == WATER_BOTTLE? WATER : game.prop[BOTTLE] == OIL_BOTTLE ? OIL : NO_OBJECT )
#define LIQLOC(LOC) (CNDBIT((LOC),COND_FLUID)? CNDBIT((LOC),COND_OILY) ? OIL : WATER : NO_OBJECT)
#define FORCED(LOC) CNDBIT(LOC, COND_FORCED)
#define DARK(DUMMY) (!CNDBIT(game.loc,COND_LIT) && (game.prop[LAMP] == LAMP_DARK || !HERE(LAMP)))
#define PCT(N) (randrange(100) < (N))
#define GSTONE(OBJ) ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
#define FOREST(LOC) CNDBIT(LOC, COND_FOREST)
#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
#define INSIDE(LOC) (!OUTSID(LOC) || LOC == LOC_BUILDING)
#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
#define BUG(x) bug(x, #x)
enum bugtype {
SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST,
VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3,
INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,
TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,
CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION,
LOCATION_HAS_NO_TRAVEL_ENTRIES,
HINT_NUMBER_EXCEEDS_GOTO_LIST,
SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN,
ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH,
};
enum speaktype {touch, look, hear, study, change};
enum termination {endgame, quitgame, scoregame};
enum speechpart {unknown, intransitive, transitive};
typedef enum {NO_WORD_TYPE, MOTION, OBJECT, ACTION, NUMERIC} word_type_t;
typedef enum scorebonus {none, splatter, defeat, victory} score_t;
/* Phase codes for action returns.
* These were at one time FORTRAN line numbers.
* The values don't matter, but perturb their order at your peril.
*/
enum phase_codes {
GO_TERMINATE,
GO_MOVE,
GO_TOP,
GO_CLEAROBJ,
GO_WORD2,
GO_UNKNOWN,
GO_DWARFWAKE,
};
typedef long vocab_t; // index into a vocabulary array */
typedef long verb_t; // index into an actions array */
typedef long obj_t; // index into the object array */
typedef long loc_t; // index into the locations array */
typedef long turn_t; // turn counter or threshold */
struct game_t {
int32_t lcg_x;
long abbnum; // How often to print long descriptions
score_t bonus; // What kind of finishing bonus we are getting
loc_t chloc; // pirate chest location
loc_t chloc2; // pirate chest alternate location
turn_t clock1; // # turns from finding last treasure to close
turn_t clock2; // # turns from warning till blinding flash
bool clshnt; // has player read the clue in the endgame?
bool closed; // whether we're all the way closed
bool closng; // whether it's closing time yet
bool lmwarn; // has player been warned about lamp going dim?
bool novice; // asked for instructions at start-up?
bool panic; // has player found out he's trapped?
bool wzdark; // whether the loc he's leaving was dark
bool blooded; // has player drunk of dragon's blood?
long conds; // min value for cond[loc] if loc has any hints
long detail; // level of detail in descriptions
/* dflag controls the level of activation of dwarves:
* 0 No dwarf stuff yet (wait until reaches Hall Of Mists)
* 1 Reached Hall Of Mists, but hasn't met first dwarf
* 2 Met first dwarf, others start moving, no knives thrown yet
* 3 A knife has been thrown (first set always misses)
* 3+ Dwarves are mad (increases their accuracy) */
long dflag;
long dkill; // dwarves killed
long dtotal; // total dwarves (including pirate) in loc
long foobar; // progress in saying "FEE FIE FOE FOO".
long holdng; // number of objects being carried
long igo; // # uses of "go" instead of a direction
long iwest; // # times he's said "west" instead of "w"
long knfloc; // knife location; 0 if none, -1 after caveat
turn_t limit; // lifetime of lamp
loc_t loc; // where player is now
loc_t newloc; // where player is going
turn_t numdie; // number of times killed so far
loc_t oldloc; // where player was
loc_t oldlc2; // where player was two moves ago
obj_t oldobj; // last object player handled
long saved; // point penalty for saves
long tally; // count of treasures gained
long thresh; // current threshold for endgame scoring tier
turn_t trndex; // FIXME: not used, remove on next format bump
turn_t trnluz; // # points lost so far due to turns used
turn_t turns; // counts commands given (ignores yes/no)
char zzword[TOKLEN + 1]; // randomly generated magic word from bird
long abbrev[NLOCATIONS + 1]; // has location been seen?
long atloc[NLOCATIONS + 1]; // head of object linked list per location
long dseen[NDWARVES + 1]; // true if dwarf has seen him
loc_t dloc[NDWARVES + 1]; // location of dwarves, initially hard-wired in
loc_t odloc[NDWARVES + 1]; // prior loc of each dwarf, initially garbage
loc_t fixed[NOBJECTS + 1]; // fixed location of object (if not IS_FREE)
obj_t link[NOBJECTS * 2 + 1]; // object-list links
loc_t place[NOBJECTS + 1]; // location of object
long hinted[NHINTS]; // hinted[i] = true iff hint i has been used.
long hintlc[NHINTS]; // hintlc[i] = how long at LOC with cond bit i
long prop[NOBJECTS + 1]; // object state array */
};
/*
* Game application settings - settings, but not state of the game, per se.
* This data is not saved in a saved game.
*/
struct settings_t {
FILE *logfp;
bool oldstyle;
bool prompt;
};
typedef struct {
char raw[LINESIZE];
vocab_t id;
word_type_t type;
} command_word_t;
typedef struct {
enum speechpart part;
command_word_t word[2];
verb_t verb;
obj_t obj;
} command_t;
extern struct game_t game;
extern struct settings_t settings;
extern bool get_command_input(command_t *);
extern void speak(const char*, ...);
extern void sspeak(int msg, ...);
extern void pspeak(vocab_t, enum speaktype, int, bool, ...);
extern void rspeak(vocab_t, ...);
extern void echo_input(FILE*, const char*, const char*);
extern bool silent_yes(void);
extern bool yes(const char*, const char*, const char*);
extern void juggle(obj_t);
extern void move(obj_t, loc_t);
extern loc_t put(obj_t, long, long);
extern void carry(obj_t, loc_t);
extern void drop(obj_t, loc_t);
extern int atdwrf(loc_t);
extern long setbit(int);
extern bool tstbit(long, int);
extern void set_seed(int32_t);
extern int32_t randrange(int32_t);
extern long score(enum termination);
extern void terminate(enum termination) __attribute__((noreturn));
extern int savefile(FILE *, int32_t);
extern int suspend(void);
extern int resume(void);
extern int restore(FILE *);
extern long initialise(void);
extern int action(command_t command);
extern void state_change(obj_t, int);
void bug(enum bugtype, const char *) __attribute__((__noreturn__));
/* represent an empty command word */
static const command_word_t empty_command_word = {
.raw = "",
.id = WORD_EMPTY,
.type = NO_WORD_TYPE,
};
/* end */
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/advent.svg 0000664 0000000 0000000 00000012163 13157513121 0024665 0 ustar 00root root 0000000 0000000
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/adventure.yaml 0000664 0000000 0000000 00000446721 13157513121 0025557 0 ustar 00root root 0000000 0000000 # This YAML file gets processed into a collection of data structures and
# variable initializers describing Colossal Cave. It replaces an ad-hoc
# text database shipped with Adventure versions up to 2.5. The format
# change enabled a lot of use of symbolic names where there were previously
# inscrutable numeric literals.
#
# We define a bunch of YAML structures:
#
# motions: Motion words, grouped into synonyms. The 'oldstyle'
# attribute, if false, means that single-letter synonyms should be
# accepted in oldstyle mode; it defaults to true.
#
# actions: Action words, grouped into synonyms, and their corresponding
# default messages. The 'oldstyle' attribute is as for motions.
#
# hints: Each item contains a hint number, a hint label (used to
# generate the value macro for the hint) the number of turns he
# must be at the right loc(s) before triggering the hint, the
# points deducted for taking the hint, the message number (in
# arbitrary_messages) of the question, and the message number of
# the hint.
#
# locations: They have attributes as follows...
# long: Long description, always shown on first encounter.
# short: Short description. If none, use long description.
# conditions: A dictionary of attributes
# LIT Light
# OILY If FLUID flag is on: true for oil, false for water
# FLUID Liquid asset
# NOARRR Pirate doesn't go here unless following player
# NOBACK Cannot use "back" to move away
# HCAVE Trying to get into cave
# HBIRD Trying to catch bird
# HSNAKE Trying to deal with snake
# HMAZE Lost in maze
# HDARK Pondering dark room
# HWITT At Witt's End
# HCLIFF Cliff with urn
# HWOODS Lost in forest
# HOGRE Trying to deal with ogre
# HJADE Found all treasures except jade
# hints: A list of YAML references to hints that may be available at
# this location. (This is why locations has to follow hints.)
# sound: Label for a location sound.
# loud: If true, object sounds are drowned out at this location.
# travel: A list of movement rules. They're applied in the order
# they appear. For a rule to fire, (1) the movement command
# must be a synonym for one of its verbs, and (2) the
# condition, if present, must evaluate to true. In that case
# the action fires. The action may be a goto (move to
# a named location) a speak (utter a named message), or
# a special (branch to special case in movement code).
# The conditional may be one of the following:
# [pct, N] Roll a die, n% chance of success
# [carry, OBJ] Must be carrying named object
# [with, OBJ] Must be carrying or in room with
# [not, OBJ N] Property of named OBJ must not be N.
# N may be numeric or a state label.
# [nodwarves] Dwarves must skip this rule.
# All attributes are optional except the long description and
# travel. Order of locations is not significant.
#
# arbitrary_messages: These are arguments to rspeak(). Some spans of
# these messages need to be kept adjacent and ordered (for now),
# though there are no depenencies on actual numbers left. To see
# which, grep for rspeak() calls containing expressions with
# arithmetic. Eventually, these will be pulled out into more
# appropriate data structures. Then ordering can be dropped.
#
# classes: Each item contains a point threshold and a message
# describing a classification of player. Point thresholds must be
# in ascending order. The scoring code selects the appropriate
# message, where each message is considered to apply to players
# whose scores are higher than the previous N but not higher than
# this N. Note that these scores probably change with every
# modification (and particularly expansion) of the program.
#
# turn_thresholds: Each item contains a number and a message
# berating the player for taking so many turns. When the turn count
# matches one of the thresholds, the corresponding message is shown.
# Order doesn't matter; the logic simply tests every threshold on
# the assumption that turn counts never decrease nor skip values.
#
# objects: Objects have attributes as follows...
# inventory: A description for use in the inventory command.
# states: A list of state labels for states from 0 up. Each
# becomes a #define, and is also a state label that
# can be used in travel-rule 'not' clauses.
# descriptions: Messages describing the object in different states.
# Must correspond 1:1 with state labels if the latter exist.
# changes: State-change messages to be emitted whenever the object
# *changes* to the (0-origin) state that is the index of the
# message in this array. Must correspond 1:1 with state
# labels if the latter exist.
# words: The vocabulary word(s) referring to this object.
# treasure: A boolean "treasure" used for point-scoring and pirate
# snatches, defaulting to false.
# immovable: An object may also be flagged
# immovable, meaning it cannot be carried.
# locations: An object may have one or two start locations (the gate
# is an example of a two-location object; it can be accessed
# from above or below).
#
# obituaries: Death messages and reincarnation queries. Order is
# significant, they're used in succession as the player racks up
# deaths.
#
# Message strings may include certain special character sequences to
# denote that the program must provide parameters to insert into a
# message when the message is printed. These sequences are:
# %d = an integer
# %s = an ASCII string
# %S = The letter 's' or nothing (if a previous %d value is exactly 1)
# %V = substitute program version string
motions: !!omap
- MOT_0:
words: !!null
- HERE:
words: !!null
- MOT_2:
words: ['road', 'hill']
- ENTER:
words: ['enter']
- MOT_4:
words: ['upstr']
- MOT_5:
words: ['downs']
- MOT_6:
words: ['fores']
- FORWARD:
words: ['forwa', 'conti', 'onwar']
- BACK:
words: ['back', 'retur', 'retre']
- MOT_9:
words: ['valle']
- MOT_10:
words: ['stair']
- OUTSIDE:
words: ['out', 'outsi', 'exit', 'leave']
- MOT_12:
words: ['build', 'house']
- MOT_13:
words: ['gully']
- STREAM:
words: ['strea']
- MOT_15:
words: ['fork']
- MOT_16:
words: ['bed']
- CRAWL:
words: ['crawl']
- MOT_18:
words: ['cobbl']
- INSIDE:
words: ['inwar', 'insid', 'in']
- MOT_20:
words: ['surfa']
- NUL:
words: ['null', 'nowhe']
- MOT_22:
words: ['dark']
- MOT_23:
words: ['passa', 'tunne']
- MOT_24:
words: ['low']
- MOT_25:
words: ['canyo']
- MOT_26:
words: ['awkwa']
- MOT_27:
words: ['giant']
- MOT_28:
words: ['view']
- UP:
words: ['upwar', 'up', 'u', 'above', 'ascen']
- DOWN:
words: ['d', 'downw', 'down', 'desce']
- MOT_31:
words: ['pit']
- MOT_32:
words: ['outdo']
- MOT_33:
words: ['crack']
- MOT_34:
words: ['steps']
- MOT_35:
words: ['dome']
- LEFT:
words: ['left']
- RIGHT:
words: ['right']
- MOT_38:
words: ['hall']
- MOT_39:
words: ['jump']
- MOT_40:
words: ['barre']
- MOT_41:
words: ['over']
- MOT_42:
words: ['acros']
- EAST:
words: ['east', 'e']
- WEST:
words: ['west', 'w']
- NORTH:
words: ['north', 'n']
- SOUTH:
words: ['south', 's']
- NE:
words: ['ne']
- SE:
words: ['se']
- SW:
words: ['sw']
- NW:
words: ['nw']
- MOT_51:
words: ['debri']
- MOT_52:
words: ['hole']
- MOT_53:
words: ['wall']
- MOT_54:
words: ['broke']
- MOT_55:
words: ['y2']
- MOT_56:
words: ['climb']
- LOOK:
words: ['l', 'x', 'look', 'exami', 'touch', 'descr']
oldstyle: false
- MOT_58:
words: ['floor']
- MOT_59:
words: ['room']
- MOT_60:
words: ['slit']
- MOT_61:
words: ['slab', 'slabr']
- XYZZY:
words: ['xyzzy']
- DEPRESSION:
words: ['depre']
- ENTRANCE:
words: ['entra']
- PLUGH:
words: ['plugh']
- MOT_66:
words: ['secre']
- CAVE:
words: ['cave']
- CROSS:
words: ['cross']
- BEDQUILT:
words: ['bedqu']
- PLOVER:
words: ['plove']
- ORIENTAL:
words: ['orien']
- CAVERN:
words: ['caver']
- SHELLROOM:
words: ['shell']
- RESERVOIR:
words: ['reser']
- OFFICE:
words: ['main', 'offic']
hints:
- hint: &grate
name: CAVE
number: 1
turns: 4
penalty: 2
question: 'Are you trying to get into the cave?'
hint: |-
The grate is very solid and has a hardened steel lock. You cannot
enter without a key, and there are no keys nearby. I would recommend
looking elsewhere for the keys.
- hint: &bird
name: BIRD
number: 2
turns: 5
penalty: 2
question: 'Are you trying to catch the bird?'
hint: |-
Something about you seems to be frightening the bird. Perhaps you
might figure out what it is.
- hint: &snake
name: SNAKE
number: 3
turns: 8
penalty: 2
question: 'Are you trying to somehow deal with the snake?'
hint: |-
You can't kill the snake, or drive it away, or avoid it, or anything
like that. There is a way to get by, but you don't have the necessary
resources right now.
- hint: &maze
name: MAZE
number: 4
turns: 75
penalty: 4
question: 'Do you need help getting out of the maze?'
hint: 'You can make the passages look less alike by dropping things.'
- hint: &dark
name: DARK
number: 5
turns: 25
penalty: 5
question: 'Are you trying to explore beyond the plover room?'
hint: |-
There is a way to explore that region without having to worry about
falling into a pit. None of the objects available is immediately
useful in discovering the secret.
- hint: &witt
name: WITT
number: 6
turns: 20
penalty: 3
question: 'Do you need help getting out of here?'
hint: 'Don''t go west.\n'
- hint: &urn
name: CLIFF
number: 7
turns: 8
penalty: 2
question: 'Are you wondering what to do here?'
hint: 'This section is quite advanced. Find the cave first.\n'
- hint: &forest
name: WOODS
number: 8
turns: 25
penalty: 2
question: 'Would you like to be shown out of the forest?'
hint: |-
Go east ten times. If that doesn't get you out, then go south, then
west twice, then south.
- hint: &ogre
name: OGRE
number: 9
turns: 10
penalty: 4
question: 'Do you need help dealing with the ogre?'
hint: |-
There is nothing the presence of which will prevent you from defeating
him; thus it can't hurt to fetch everything you possibly can.
- hint: &jade
name: JADE
number: 10
turns: 1
penalty: 4
question: 'You''re missing only one other treasure. Do you need help finding it?'
hint: |-
Once you've found all the other treasures, it is no longer possible to
locate the one you're now missing.
locations: !!omap
- LOC_NOWHERE:
description:
long: !!null
short: !!null
conditions: {}
travel: [
]
- LOC_START:
description:
long: |-
You are standing at the end of a road before a small brick building.
Around you is a forest. A small stream flows out of the building and
down a gully.
short: 'You''re in front of building.'
conditions: {FLUID: true, ABOVE: true, LIT: true}
sound: STREAM_GURGLES
travel: [
{verbs: [ROAD, WEST, UPWAR], action: [goto, LOC_HILL]},
{verbs: [ENTER, BUILD, INWAR, EAST], action: [goto, LOC_BUILDING]},
{verbs: [DOWNS, GULLY, STREA, SOUTH, DOWN], action: [goto, LOC_VALLEY]},
{verbs: [FORES, NORTH], action: [goto, LOC_FOREST1]},
{verbs: [DEPRE], action: [goto, LOC_GRATE]},
]
- LOC_HILL:
description:
long: |-
You have walked up a hill, still in the forest. The road slopes back
down the other side of the hill. There is a building in the distance.
short: 'You''re at hill in road.'
conditions: {ABOVE: true, LIT: true}
travel: [
{verbs: [BUILD, EAST], action: [goto, LOC_START]},
{verbs: [WEST], action: [goto, LOC_ROADEND]},
{verbs: [NORTH], action: [goto, LOC_FOREST20]},
{verbs: [SOUTH, FORES], action: [goto, LOC_FOREST13]},
{verbs: [DOWN], action: [speak, WHICH_WAY]},
]
- LOC_BUILDING:
description:
long: 'You are inside a building, a well house for a large spring.'
short: 'You''re inside building.'
conditions: {FLUID: true, ABOVE: true, LIT: true}
sound: STREAM_GURGLES
travel: [
{verbs: [OUT, OUTDO, WEST], action: [goto, LOC_START]},
{verbs: [XYZZY], action: [goto, LOC_FOOF1]},
{verbs: [PLUGH], action: [goto, LOC_FOOF3]},
{verbs: [DOWNS, STREA], action: [goto, LOC_SEWER]},
]
- LOC_VALLEY:
description:
long: |-
You are in a valley in the forest beside a stream tumbling along a
rocky bed.
short: 'You''re in valley.'
conditions: {FLUID: true, ABOVE: true, LIT: true}
sound: STREAM_GURGLES
travel: [
{verbs: [UPSTR, BUILD, NORTH], action: [goto, LOC_START]},
{verbs: [EAST, FORES], action: [goto, LOC_FOREST6]},
{verbs: [WEST], action: [goto, LOC_FOREST12]},
{verbs: [DOWNS, SOUTH, DOWN], action: [goto, LOC_SLIT]},
{verbs: [DEPRE], action: [goto, LOC_GRATE]},
{verbs: [STREA], action: [speak, UPSTREAM_DOWNSTREAM]},
]
- LOC_ROADEND:
description:
long: 'The road, which approaches from the east, ends here amid the trees.'
short: 'You''re at end of road.'
conditions: {ABOVE: true, LIT: true}
travel: [
{verbs: [ROAD, EAST, UPWAR], action: [goto, LOC_HILL]},
{verbs: [BUILD], action: [goto, LOC_START]},
{verbs: [SOUTH, FORES], action: [goto, LOC_FOREST14]},
{verbs: [WEST], action: [goto, LOC_FOREST15]},
{verbs: [NORTH], action: [goto, LOC_FOREST21]},
]
- LOC_CLIFF:
description:
long: |-
The forest thins out here to reveal a steep cliff. There is no way
down, but a small ledge can be seen to the west across the chasm.
short: 'You''re at cliff.'
conditions: {ABOVE: true, NOBACK: true, LIT: true}
hints: [*urn]
travel: [
{verbs: [SOUTH, FORES], action: [goto, LOC_FOREST17]},
{verbs: [EAST], action: [goto, LOC_FOREST19]},
{verbs: [JUMP], action: [goto, LOC_NOMAKE]},
]
- LOC_SLIT:
description:
long: |-
At your feet all the water of the stream splashes into a 2-inch slit
in the rock. Downstream the streambed is bare rock.
short: 'You''re at slit in streambed.'
conditions: {FLUID: true, ABOVE: true, LIT: true}
sound: STREAM_GURGLES
travel: [
{verbs: [BUILD], action: [goto, LOC_START]},
{verbs: [UPSTR, NORTH], action: [goto, LOC_VALLEY]},
{verbs: [EAST, FORES], action: [goto, LOC_FOREST6]},
{verbs: [WEST], action: [goto, LOC_FOREST10]},
{verbs: [DOWNS, BED, SOUTH, DEPRE], action: [goto, LOC_GRATE]},
{verbs: [SLIT, STREA, DOWN, INWAR, ENTER], action: [speak, DONT_FIT]},
]
- LOC_GRATE:
description:
long: |-
You are in a 20-foot depression floored with bare dirt. Set into the
dirt is a strong steel grate mounted in concrete. A dry streambed
leads into the depression.
short: 'You''re outside grate.'
conditions: {ABOVE: true, LIT: true}
hints: [*grate, *jade]
travel: [
{verbs: [EAST, FORES], action: [goto, LOC_FOREST7]},
{verbs: [SOUTH], action: [goto, LOC_FOREST10]},
{verbs: [WEST], action: [goto, LOC_FOREST9]},
{verbs: [BUILD], action: [goto, LOC_START]},
{verbs: [UPSTR, GULLY, NORTH], action: [goto, LOC_SLIT]},
{verbs: [ENTER, INWAR, DOWN],
cond: [not, GRATE, GRATE_CLOSED],
action: [goto, LOC_BELOWGRATE]},
{verbs: [ENTER], action: [speak, GRATE_NOWAY]},
]
- LOC_BELOWGRATE:
description:
long: |-
You are in a small chamber beneath a 3x3 steel grate to the surface.
A low crawl over cobbles leads inward to the west.
short: 'You''re below the grate.'
conditions: {LIT: true}
travel: [
{verbs: [OUT, UPWAR], cond: [not, GRATE, GRATE_CLOSED],
action: [goto, LOC_GRATE]},
{verbs: [OUT], action: [speak, GRATE_NOWAY]},
{verbs: [CRAWL, COBBL, INWAR, WEST], action: [goto, LOC_COBBLE]},
{verbs: [PIT], action: [goto, LOC_PITTOP]},
{verbs: [DEBRI], action: [goto, LOC_DEBRIS]},
]
- LOC_COBBLE:
description:
long: |-
You are crawling over cobbles in a low passage. There is a dim light
at the east end of the passage.
short: 'You''re in cobble crawl.'
conditions: {LIT: true}
travel: [
{verbs: [OUT, SURFA, EAST], action: [goto, LOC_BELOWGRATE]},
{verbs: [INWAR, DARK, WEST, DEBRI], action: [goto, LOC_DEBRIS]},
{verbs: [PIT], action: [goto, LOC_PITTOP]},
]
- LOC_DEBRIS:
description:
long: |-
You are in a debris room filled with stuff washed in from the surface.
A low wide passage with cobbles becomes plugged with mud and debris
here, but an awkward canyon leads upward and west. In the mud someone
has scrawled, "MAGIC WORD XYZZY".
short: 'You''re in debris room.'
conditions: {}
travel: [
{verbs: [DEPRE], cond: [not, GRATE, GRATE_CLOSED],
action: [goto, LOC_GRATE]},
{verbs: [ENTRA], action: [goto, LOC_BELOWGRATE]},
{verbs: [CRAWL, COBBL, PASSA, LOW, EAST], action: [goto, LOC_COBBLE]},
{verbs: [CANYO, INWAR, UPWAR, WEST], action: [goto, LOC_AWKWARD]},
{verbs: [XYZZY], action: [goto, LOC_FOOF2]},
{verbs: [PIT], action: [goto, LOC_PITTOP]},
]
- LOC_AWKWARD:
description:
long: 'You are in an awkward sloping east/west canyon.'
short: !!null
conditions: {}
travel: [
{verbs: [DEPRE], cond: [not, GRATE, GRATE_CLOSED],
action: [goto, LOC_GRATE]},
{verbs: [ENTRA], action: [goto, LOC_BELOWGRATE]},
{verbs: [DOWN, EAST, DEBRI], action: [goto, LOC_DEBRIS]},
{verbs: [INWAR, UPWAR, WEST], action: [goto, LOC_BIRD]},
{verbs: [PIT], action: [goto, LOC_PITTOP]},
]
- LOC_BIRD:
description:
long: |-
You are in a splendid chamber thirty feet high. The walls are frozen
rivers of orange stone. An awkward canyon and a good passage exit
from east and west sides of the chamber.
short: 'You''re in bird chamber.'
conditions: {}
hints: [*bird]
travel: [
{verbs: [DEPRE], cond: [not, GRATE, GRATE_CLOSED],
action: [goto, LOC_GRATE]},
{verbs: [ENTRA], action: [goto, LOC_BELOWGRATE]},
{verbs: [DEBRI], action: [goto, LOC_DEBRIS]},
{verbs: [CANYO, EAST], action: [goto, LOC_AWKWARD]},
{verbs: [PASSA, PIT, WEST], action: [goto, LOC_PITTOP]},
]
- LOC_PITTOP:
description:
long: |-
At your feet is a small pit breathing traces of white mist. An east
passage ends here except for a small crack leading on.
short: 'You''re at top of small pit.'
conditions: {}
travel: [
{verbs: [DEPRE], cond: [not, GRATE, GRATE_CLOSED],
action: [goto, LOC_GRATE]},
{verbs: [ENTRA], action: [goto, LOC_BELOWGRATE]},
{verbs: [DEBRI], action: [goto, LOC_DEBRIS]},
{verbs: [PASSA, EAST], action: [goto, LOC_BIRD]},
{verbs: [DOWN, PIT, STEPS], cond: [carry, NUGGET],
action: [goto, LOC_NECKBROKE]},
{verbs: [DOWN], action: [goto, LOC_MISTHALL]},
{verbs: [CRACK, WEST], action: [goto, LOC_CRACK]},
]
- LOC_MISTHALL:
description:
long: |-
You are at one end of a vast hall stretching forward out of sight to
the west. There are openings to either side. Nearby, a wide stone
staircase leads downward. The hall is filled with wisps of white mist
swaying to and fro almost as if alive. A cold wind blows up the
staircase. There is a passage at the top of a dome behind you.
short: 'You''re in Hall of Mists.'
conditions: {DEEP: true}
hints: [*jade]
sound: WIND_WHISTLES
travel: [
{verbs: [LEFT, SOUTH], action: [goto, LOC_NUGGET]},
{verbs: [FORWA, HALL, WEST], action: [goto, LOC_EASTBANK]},
{verbs: [STAIR, DOWN, NORTH], action: [goto, LOC_KINGHALL]},
{verbs: [UPWAR, PIT, STEPS, DOME, PASSA, EAST],
cond: [carry, NUGGET], action: [goto, LOC_DOME]},
{verbs: [UPWAR], action: [goto, LOC_PITTOP]},
{verbs: [Y2], action: [goto, LOC_JUMBLE]},
]
- LOC_CRACK:
description:
long: |-
The crack is far too small for you to follow. At its widest it is
barely wide enough to admit your foot.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_PITTOP]},
]
- LOC_EASTBANK:
description:
long: |-
You are on the east bank of a fissure slicing clear across the hall.
The mist is quite thick here, and the fissure is too wide to jump.
short: 'You''re on east bank of fissure.'
conditions: {DEEP: true}
travel: [
{verbs: [HALL, EAST], action: [goto, LOC_MISTHALL]},
{verbs: [JUMP], cond: [not, FISSURE, UNBRIDGED],
action: [speak, CROSS_BRIDGE]},
{verbs: [FORWA], cond: [not, FISSURE, BRIDGED],
action: [goto, LOC_NOMAKE]},
{verbs: [OVER, ACROS, WEST, CROSS],
cond: [not, FISSURE, BRIDGED],
action: [speak, NO_CROSS]},
{verbs: [OVER], action: [goto, LOC_WESTBANK]},
]
- LOC_NUGGET:
description:
long: |-
This is a low room with a crude note on the wall. The note says,
"You won't get it up the steps".
short: 'You''re in nugget-of-gold room.'
conditions: {DEEP: true}
travel: [
{verbs: [HALL, OUT, NORTH], action: [goto, LOC_MISTHALL]},
]
- LOC_KINGHALL:
description:
long: |-
You are in the Hall of the Mountain King, with passages off in all
directions.
short: 'You''re in Hall of Mt King.'
conditions: {DEEP: true}
hints: [*snake]
travel: [
{verbs: [STAIR, UPWAR, EAST], action: [goto, LOC_MISTHALL]},
{verbs: [NORTH, RIGHT], cond: [not, SNAKE, SNAKE_BLOCKS],
action: [goto, LOC_FLOORHOLE]},
{verbs: [SOUTH, LEFT], cond: [not, SNAKE, SNAKE_BLOCKS],
action: [goto, LOC_SOUTHSIDE]},
{verbs: [WEST, FORWA], cond: [not, SNAKE, SNAKE_BLOCKS],
action: [goto, LOC_WESTSIDE]},
{verbs: [NORTH], action: [goto, LOC_SNAKEBLOCK]},
{verbs: [SW], cond: [pct, 35], action: [goto, LOC_SECRET3]},
{verbs: [SW], cond: ["with", SNAKE], action: [goto, LOC_SNAKEBLOCK]},
{verbs: [SECRE], action: [goto, LOC_SECRET3]},
]
- LOC_NECKBROKE:
description:
long: 'You are at the bottom of the pit with a broken neck.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_NOWHERE]},
]
- LOC_NOMAKE:
description:
long: 'You didn''t make it.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_NOWHERE]},
]
- LOC_DOME:
description:
long: 'The dome is unclimbable.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_MISTHALL]},
]
- LOC_WESTEND:
description:
long: |-
You are at the west end of the Twopit Room. There is a large hole in
the wall above the pit at this end of the room.
short: 'You''re at west end of Twopit Room.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST, ACROS], action: [goto, LOC_EASTEND]},
{verbs: [WEST, SLAB], action: [goto, LOC_SLAB]},
{verbs: [DOWN, PIT], action: [goto, LOC_WESTPIT]},
{verbs: [HOLE], action: [speak, TOO_FAR]},
]
- LOC_EASTPIT:
description:
long: |-
You are at the bottom of the eastern pit in the Twopit Room. There is
a small pool of oil in one corner of the pit.
short: 'You''re in east pit.'
conditions: {FLUID: true, DEEP: true, OILY: true}
travel: [
{verbs: [UPWAR, OUT], action: [goto, LOC_EASTEND]},
]
- LOC_WESTPIT:
description:
long: |-
You are at the bottom of the western pit in the Twopit Room. There is
a large hole in the wall about 25 feet above you.
short: 'You''re in west pit.'
conditions: {DEEP: true}
travel: [
{verbs: [UPWAR, OUT], action: [goto, LOC_WESTEND]},
{verbs: [CLIMB], cond: [not, PLANT, PLANT_GROWN],
action: [goto, LOC_BUILDING1]},
{verbs: [CLIMB], action: [goto, LOC_CLIMBSTALK]},
]
- LOC_CLIMBSTALK:
description:
long: 'You clamber up the plant and scurry through the hole at the top.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_NARROW]},
]
- LOC_WESTBANK:
description:
long: 'You are on the west side of the fissure in the Hall of Mists.'
short: 'You''re on west bank of fissure.'
conditions: {DEEP: true}
travel: [
{verbs: [JUMP], cond: [not, FISSURE, UNBRIDGED],
action: [speak, CROSS_BRIDGE]},
{verbs: [FORWA], cond: [not, FISSURE, BRIDGED],
action: [goto, LOC_NOMAKE]},
{verbs: [OVER, ACROS, EAST, CROSS],
cond: [not, FISSURE, BRIDGED],
action: [speak, NO_CROSS]},
{verbs: [OVER], action: [goto, LOC_EASTBANK]},
{verbs: [NORTH], action: [goto, LOC_PARALLEL1]},
{verbs: [WEST], action: [goto, LOC_MISTWEST]},
]
- LOC_FLOORHOLE:
description:
long: |-
You are in a low n/s passage at a hole in the floor. The hole goes
down to an e/w passage.
short: 'You''re in n/s passage above e/w passage.'
conditions: {DEEP: true}
travel: [
{verbs: [HALL, OUT, SOUTH], action: [goto, LOC_KINGHALL]},
{verbs: [NORTH, Y2], action: [goto, LOC_Y2]},
{verbs: [DOWN, HOLE], action: [goto, LOC_BROKEN]},
]
- LOC_SOUTHSIDE:
description:
long: 'You are in the south side chamber.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [HALL, OUT, NORTH], action: [goto, LOC_KINGHALL]},
]
- LOC_WESTSIDE:
description:
long: |-
You are in the west side chamber of the Hall of the Mountain King.
A passage continues west and up here.
short: 'You''re in the west side chamber.'
conditions: {DEEP: true}
travel: [
{verbs: [HALL, OUT, EAST], action: [goto, LOC_KINGHALL]},
{verbs: [WEST, UPWAR], action: [goto, LOC_CROSSOVER]},
]
- LOC_BUILDING1:
description:
long: ''
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], cond: [not, PLANT, PLANT_BELLOWING],
action: [goto, LOC_NOCLIMB]},
{verbs: [], action: [goto, LOC_PLANTTOP]},
]
- LOC_SNAKEBLOCK:
description:
long: 'You can''t get by the snake.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_KINGHALL]},
]
- LOC_Y2:
description:
long: |-
You are in a large room, with a passage to the south, a passage to the
west, and a wall of broken rock to the east. There is a large "Y2" on
a rock in the room's center.
short: 'You''re at "Y2".'
conditions: {DEEP: true}
travel: [
{verbs: [PLUGH], action: [goto, LOC_FOOF4]},
{verbs: [SOUTH], action: [goto, LOC_FLOORHOLE]},
{verbs: [EAST, WALL, BROKE], action: [goto, LOC_JUMBLE]},
{verbs: [WEST], action: [goto, LOC_WINDOW1]},
{verbs: [PLOVE], cond: [carry, EMERALD], action: ["special", 2]},
{verbs: [PLOVE], action: [goto, LOC_FOOF5]},
]
- LOC_JUMBLE:
description:
long: 'You are in a jumble of rock, with cracks everywhere.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [DOWN, Y2], action: [goto, LOC_Y2]},
{verbs: [UPWAR], action: [goto, LOC_MISTHALL]},
]
- LOC_WINDOW1:
description:
long: |-
You're at a low window overlooking a huge pit, which extends up out of
sight. A floor is indistinctly visible over 50 feet below. Traces of
white mist cover the floor of the pit, becoming thicker to the right.
Marks in the dust around the window would seem to indicate that
someone has been here recently. Directly across the pit from you and
25 feet away there is a similar window looking into a lighted room. A
shadowy figure can be seen there peering back at you.
short: 'You''re at window on pit.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST, Y2], action: [goto, LOC_Y2]},
{verbs: [JUMP], action: [goto, LOC_NECKBROKE]},
]
- LOC_BROKEN:
description:
long: |-
You are in a dirty broken passage. To the east is a crawl. To the
west is a large passage. Above you is a hole to another passage.
short: 'You''re in dirty passage.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST, CRAWL], action: [goto, LOC_SMALLPITBRINK]},
{verbs: [UPWAR, HOLE], action: [goto, LOC_FLOORHOLE]},
{verbs: [WEST], action: [goto, LOC_DUSTY]},
{verbs: [BEDQU], action: [goto, LOC_BEDQUILT]},
]
- LOC_SMALLPITBRINK:
description:
long: |-
You are on the brink of a small clean climbable pit. A crawl leads
west.
short: 'You''re at brink of small pit.'
conditions: {DEEP: true}
travel: [
{verbs: [WEST, CRAWL], action: [goto, LOC_BROKEN]},
{verbs: [DOWN, PIT, CLIMB], action: [goto, LOC_SMALLPIT]},
]
- LOC_SMALLPIT:
description:
long: |-
You are in the bottom of a small pit with a little stream, which
enters and exits through tiny slits.
short: 'You''re at bottom of pit with stream.'
conditions: {FLUID: true, DEEP: true}
sound: STREAM_GURGLES
travel: [
{verbs: [CLIMB, UPWAR, OUT], action: [goto, LOC_SMALLPITBRINK]},
{verbs: [SLIT, STREA, DOWN, UPSTR, DOWNS, ENTER, INWAR],
action: [speak, DONT_FIT]},
]
- LOC_DUSTY:
description:
long: |-
You are in a large room full of dusty rocks. There is a big hole in
the floor. There are cracks everywhere, and a passage leading east.
short: 'You''re in dusty rock room.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST, PASSA], action: [goto, LOC_BROKEN]},
{verbs: [DOWN, HOLE, FLOOR], action: [goto, LOC_COMPLEX]},
{verbs: [BEDQU], action: [goto, LOC_BEDQUILT]},
]
- LOC_PARALLEL1:
description:
long: |-
You have crawled through a very low wide passage parallel to and north
of the Hall of Mists.
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_MISTWEST]},
]
- LOC_MISTWEST:
description:
long: |-
You are at the west end of the Hall of Mists. A low wide crawl
continues west and another goes north. To the south is a little
passage 6 feet off the floor.
short: 'You''re at west end of Hall of Mists.'
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH, UPWAR, PASSA, CLIMB], action: [goto, LOC_ALIKE1]},
{verbs: [EAST], action: [goto, LOC_WESTBANK]},
{verbs: [NORTH], action: [goto, LOC_PARALLEL2]},
{verbs: [WEST, CRAWL], action: [goto, LOC_LONGEAST]},
]
- LOC_ALIKE1:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [UPWAR], action: [goto, LOC_MISTWEST]},
{verbs: [NORTH], action: [goto, LOC_ALIKE1]},
{verbs: [EAST], action: [goto, LOC_ALIKE2]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE4]},
{verbs: [WEST], action: [goto, LOC_ALIKE11]},
]
- LOC_ALIKE2:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [WEST], action: [goto, LOC_ALIKE1]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE3]},
{verbs: [EAST], action: [goto, LOC_ALIKE4]},
]
- LOC_ALIKE3:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [EAST], action: [goto, LOC_ALIKE2]},
{verbs: [DOWN], action: [goto, LOC_DEADEND3]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE6]},
{verbs: [NORTH], action: [goto, LOC_DEADEND9]},
]
- LOC_ALIKE4:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [WEST], action: [goto, LOC_ALIKE1]},
{verbs: [NORTH], action: [goto, LOC_ALIKE2]},
{verbs: [EAST], action: [goto, LOC_DEADEND1]},
{verbs: [SOUTH], action: [goto, LOC_DEADEND2]},
{verbs: [UPWAR, DOWN], action: [goto, LOC_ALIKE14]},
]
- LOC_DEADEND1:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [WEST, OUT], action: [goto, LOC_ALIKE4]},
]
- LOC_DEADEND2:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [EAST, OUT], action: [goto, LOC_ALIKE4]},
]
- LOC_DEADEND3:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [UPWAR, OUT], action: [goto, LOC_ALIKE3]},
]
- LOC_ALIKE5:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [EAST], action: [goto, LOC_ALIKE6]},
{verbs: [WEST], action: [goto, LOC_ALIKE7]},
]
- LOC_ALIKE6:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [EAST], action: [goto, LOC_ALIKE3]},
{verbs: [WEST], action: [goto, LOC_ALIKE5]},
{verbs: [DOWN], action: [goto, LOC_ALIKE7]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE8]},
]
- LOC_ALIKE7:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [WEST], action: [goto, LOC_ALIKE5]},
{verbs: [UPWAR], action: [goto, LOC_ALIKE6]},
{verbs: [EAST], action: [goto, LOC_ALIKE8]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE9]},
]
- LOC_ALIKE8:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [WEST], action: [goto, LOC_ALIKE6]},
{verbs: [EAST], action: [goto, LOC_ALIKE7]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE8]},
{verbs: [UPWAR], action: [goto, LOC_ALIKE9]},
{verbs: [NORTH], action: [goto, LOC_ALIKE10]},
{verbs: [DOWN], action: [goto, LOC_DEADEND11]},
]
- LOC_ALIKE9:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [WEST], action: [goto, LOC_ALIKE7]},
{verbs: [NORTH], action: [goto, LOC_ALIKE8]},
{verbs: [SOUTH], action: [goto, LOC_DEADEND4]},
]
- LOC_DEADEND4:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [WEST, OUT], action: [goto, LOC_ALIKE9]},
]
- LOC_ALIKE10:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [WEST], action: [goto, LOC_ALIKE8]},
{verbs: [NORTH], action: [goto, LOC_ALIKE10]},
{verbs: [DOWN], action: [goto, LOC_DEADEND5]},
{verbs: [EAST], action: [goto, LOC_PITBRINK]},
]
- LOC_DEADEND5:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [UPWAR, OUT], action: [goto, LOC_ALIKE10]},
]
- LOC_PITBRINK:
description:
long: |-
You are on the brink of a thirty foot pit with a massive orange column
down one wall. You could climb down here but you could not get back
up. The maze continues at this level.
short: 'You''re at brink of pit.'
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [DOWN, CLIMB], action: [goto, LOC_BIRD]},
{verbs: [WEST], action: [goto, LOC_ALIKE10]},
{verbs: [SOUTH], action: [goto, LOC_DEADEND6]},
{verbs: [NORTH], action: [goto, LOC_ALIKE12]},
{verbs: [EAST], action: [goto, LOC_ALIKE13]},
]
- LOC_DEADEND6:
description:
long: 'Dead end'
short: !!null
conditions: {NOARRR: true, DEEP: true}
travel: [
{verbs: [EAST, OUT], action: [goto, LOC_PITBRINK]},
]
- LOC_PARALLEL2:
description:
long: |-
You have crawled through a very low wide passage parallel to and north
of the Hall of Mists.
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_WESTBANK]},
]
- LOC_LONGEAST:
description:
long: |-
You are at the east end of a very long hall apparently without side
chambers. To the east a low wide crawl slants up. To the north a
round two foot hole slants down.
short: 'You''re at east end of long hall.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST, UPWAR, CRAWL], action: [goto, LOC_MISTWEST]},
{verbs: [WEST], action: [goto, LOC_LONGWEST]},
{verbs: [NORTH, DOWN, HOLE], action: [goto, LOC_CROSSOVER]},
]
- LOC_LONGWEST:
description:
long: |-
You are at the west end of a very long featureless hall. The hall
joins up with a narrow north/south passage.
short: 'You''re at west end of long hall.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST], action: [goto, LOC_LONGEAST]},
{verbs: [NORTH], action: [goto, LOC_CROSSOVER]},
{verbs: [SOUTH], cond: ["nodwarves"], action: [goto, LOC_DIFFERENT1]},
]
- LOC_CROSSOVER:
description:
long: 'You are at a crossover of a high n/s passage and a low e/w one.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [WEST], action: [goto, LOC_LONGEAST]},
{verbs: [NORTH], action: [goto, LOC_DEADEND7]},
{verbs: [EAST], action: [goto, LOC_WESTSIDE]},
{verbs: [SOUTH], action: [goto, LOC_LONGWEST]},
]
- LOC_DEADEND7:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH, OUT], action: [goto, LOC_CROSSOVER]},
]
- LOC_COMPLEX:
description:
long: |-
You are at a complex junction. A low hands and knees passage from the
north joins a higher crawl from the east to make a walking passage
going west. There is also a large room above. The air is damp here.
short: 'You''re at complex junction.'
conditions: {DEEP: true}
hints: [*jade]
sound: WIND_WHISTLES
travel: [
{verbs: [UPWAR, CLIMB, ROOM], action: [goto, LOC_DUSTY]},
{verbs: [WEST, BEDQU], action: [goto, LOC_BEDQUILT]},
{verbs: [NORTH, SHELL], action: [goto, LOC_SHELLROOM]},
{verbs: [EAST], action: [goto, LOC_ANTEROOM]},
]
- LOC_BEDQUILT:
description:
long: |-
You are in Bedquilt, a long east/west passage with holes everywhere.
To explore at random select north, south, up, or down.
short: 'You''re in Bedquilt.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST], action: [goto, LOC_COMPLEX]},
{verbs: [WEST], action: [goto, LOC_SWISSCHEESE]},
{verbs: [SOUTH], cond: [pct, 65], action: [speak, FUTILE_CRAWL]},
{verbs: [SLAB], action: [goto, LOC_SLAB]},
{verbs: [UPWAR], cond: [pct, 60], action: [speak, FUTILE_CRAWL]},
{verbs: [UPWAR], cond: [pct, 70], action: [goto, LOC_SECRET2]},
{verbs: [UPWAR], action: [goto, LOC_DUSTY]},
{verbs: [NORTH], cond: [pct, 50], action: [speak, FUTILE_CRAWL]},
{verbs: [NORTH], cond: [pct, 75], action: [goto, LOC_LOWROOM]},
{verbs: [NORTH], action: [goto, LOC_THREEJUNCTION]},
{verbs: [DOWN], cond: [pct, 65], action: [speak, FUTILE_CRAWL]},
{verbs: [DOWN], action: [goto, LOC_ANTEROOM]},
]
- LOC_SWISSCHEESE:
description:
long: |-
You are in a room whose walls resemble swiss cheese. Obvious passages
go west, east, ne, and nw. Part of the room is occupied by a large
bedrock block.
short: 'You''re in Swiss Cheese Room.'
conditions: {DEEP: true}
travel: [
{verbs: [NE], action: [goto, LOC_BEDQUILT]},
{verbs: [WEST], action: [goto, LOC_EASTEND]},
{verbs: [SOUTH], cond: [pct, 80], action: [speak, FUTILE_CRAWL]},
{verbs: [CANYO], action: [goto, LOC_TALL]},
{verbs: [EAST], action: [goto, LOC_SOFTROOM]},
{verbs: [NW], cond: [pct, 50], action: [speak, FUTILE_CRAWL]},
{verbs: [ORIEN], action: [goto, LOC_ORIENTAL]},
]
- LOC_EASTEND:
description:
long: |-
You are at the east end of the Twopit Room. The floor here is
littered with thin rock slabs, which make it easy to descend the pits.
There is a path here bypassing the pits to connect passages from east
and west. There are holes all over, but the only big one is on the
wall directly over the west pit where you can't get to it.
short: 'You''re at east end of Twopit Room.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST], action: [goto, LOC_SWISSCHEESE]},
{verbs: [WEST, ACROS], action: [goto, LOC_WESTEND]},
{verbs: [DOWN, PIT], action: [goto, LOC_EASTPIT]},
]
- LOC_SLAB:
description:
long: |-
You are in a large low circular chamber whose floor is an immense slab
fallen from the ceiling (Slab Room). East and west there once were
large passages, but they are now filled with boulders. Low small
passages go north and south, and the south one quickly bends west
around the boulders.
short: 'You''re in Slab Room.'
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH], action: [goto, LOC_WESTEND]},
{verbs: [UPWAR, CLIMB], action: [goto, LOC_SECRET1]},
{verbs: [NORTH], action: [goto, LOC_BEDQUILT]},
]
- LOC_SECRET1:
description:
long: 'You are in a secret n/s canyon above a large room.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [DOWN, SLAB], action: [goto, LOC_SLAB]},
{verbs: [SOUTH], cond: [not, DRAGON, DRAGON_BARS],
action: [goto, LOC_SECRET5]},
{verbs: [SOUTH], action: [goto, LOC_SECRET4]},
{verbs: [NORTH], action: [goto, LOC_MIRRORCANYON]},
{verbs: [RESER], action: [goto, LOC_RESERVOIR]},
]
- LOC_SECRET2:
description:
long: 'You are in a secret n/s canyon above a sizable passage.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_THREEJUNCTION]},
{verbs: [DOWN, PASSA], action: [goto, LOC_BEDQUILT]},
{verbs: [SOUTH], action: [goto, LOC_TOPSTALACTITE]},
]
- LOC_THREEJUNCTION:
description:
long: |-
You are in a secret canyon at a junction of three canyons, bearing
north, south, and se. The north one is as tall as the other two
combined.
short: 'You''re at junction of three secret canyons.'
conditions: {DEEP: true}
travel: [
{verbs: [SE], action: [goto, LOC_BEDQUILT]},
{verbs: [SOUTH], action: [goto, LOC_SECRET2]},
{verbs: [NORTH], action: [goto, LOC_WINDOW2]},
]
- LOC_LOWROOM:
description:
long: 'You are in a large low room. Crawls lead north, se, and sw.'
short: 'You''re in large low room.'
conditions: {DEEP: true}
travel: [
{verbs: [BEDQU], action: [goto, LOC_BEDQUILT]},
{verbs: [SW], action: [goto, LOC_WINDING]},
{verbs: [NORTH], action: [goto, LOC_DEADCRAWL]},
{verbs: [SE, ORIEN], action: [goto, LOC_ORIENTAL]},
]
- LOC_DEADCRAWL:
description:
long: 'Dead end crawl.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH, CRAWL, OUT], action: [goto, LOC_LOWROOM]},
]
- LOC_SECRET3:
description:
long: |-
You are in a secret canyon which here runs e/w. It crosses over a
very tight canyon 15 feet below. If you go down you may not be able
to get back up.
short: 'You''re in secret e/w canyon above tight canyon.'
conditions: {DEEP: true}
travel: [
{verbs: [EAST], action: [goto, LOC_KINGHALL]},
{verbs: [WEST], cond: [not, DRAGON, DRAGON_BARS], action: [goto, LOC_SECRET5]},
{verbs: [WEST], action: [goto, LOC_SECRET6]},
{verbs: [DOWN], action: [goto, LOC_WIDEPLACE]},
]
- LOC_WIDEPLACE:
description:
long: 'You are at a wide place in a very tight n/s canyon.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH], action: [goto, LOC_TIGHTPLACE]},
{verbs: [NORTH], action: [goto, LOC_TALL]},
]
- LOC_TIGHTPLACE:
description:
long: 'The canyon here becomes too tight to go further south.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_WIDEPLACE]},
]
- LOC_TALL:
description:
long: |-
You are in a tall e/w canyon. A low tight crawl goes 3 feet north and
seems to open up.
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [EAST], action: [goto, LOC_WIDEPLACE]},
{verbs: [WEST], action: [goto, LOC_BOULDERS1]},
{verbs: [NORTH, CRAWL], action: [goto, LOC_SWISSCHEESE]},
]
- LOC_BOULDERS1:
description:
long: 'The canyon runs into a mass of boulders -- dead end.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH], action: [goto, LOC_TALL]},
]
- LOC_SEWER:
description:
long: |-
The stream flows out through a pair of 1 foot diameter sewer pipes.
It would be advisable to use the exit.
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_BUILDING]},
]
- LOC_ALIKE11:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [NORTH], action: [goto, LOC_ALIKE1]},
{verbs: [WEST], action: [goto, LOC_ALIKE11]},
{verbs: [SOUTH], action: [goto, LOC_ALIKE11]},
{verbs: [EAST], action: [goto, LOC_DEADEND8]},
]
- LOC_DEADEND8:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true}
hints: [*maze]
travel: [
{verbs: [WEST, OUT], action: [goto, LOC_ALIKE11]},
]
- LOC_DEADEND9:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [SOUTH, OUT], action: [goto, LOC_ALIKE3]},
]
- LOC_ALIKE12:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [SOUTH], action: [goto, LOC_PITBRINK]},
{verbs: [EAST], action: [goto, LOC_ALIKE13]},
{verbs: [WEST], action: [goto, LOC_DEADEND10]},
]
- LOC_ALIKE13:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_PITBRINK]},
{verbs: [WEST], action: [goto, LOC_ALIKE12]},
{verbs: [NW], action: [goto, LOC_DEADEND12]},
]
- LOC_DEADEND10:
description:
long: 'Dead end'
short: !!null
conditions: {NOARRR: true, DEEP: true}
travel: [
{verbs: [EAST, OUT], action: [goto, LOC_ALIKE12]},
]
- LOC_DEADEND11:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true, NOARRR: true}
hints: [*maze]
travel: [
{verbs: [UPWAR, OUT], action: [goto, LOC_ALIKE8]},
]
- LOC_ALIKE14:
description:
long: 'You are in a maze of twisty little passages, all alike.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
hints: [*maze]
travel: [
{verbs: [UPWAR, DOWN], action: [goto, LOC_ALIKE4]},
]
- LOC_NARROW:
description:
long: |-
You are in a long, narrow corridor stretching out of sight to the
west. At the eastern end is a hole through which you can see a
profusion of leaves.
short: 'You''re in narrow corridor.'
conditions: {DEEP: true}
travel: [
{verbs: [DOWN, CLIMB, EAST], action: [goto, LOC_WESTPIT]},
{verbs: [JUMP], action: [goto, LOC_NECKBROKE]},
{verbs: [WEST, GIANT], action: [goto, LOC_GIANTROOM]},
]
- LOC_NOCLIMB:
description:
long: 'There is nothing here to climb. Use "up" or "out" to leave the pit.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_WESTPIT]},
]
- LOC_PLANTTOP:
description:
long: 'You have climbed up the plant and out of the pit.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_WESTEND]},
]
- LOC_INCLINE:
description:
long: |-
You are at the top of a steep incline above a large room. You could
climb down here, but you would not be able to climb up. There is a
passage leading back to the north.
short: 'You''re at steep incline above large room.'
conditions: {DEEP: true}
travel: [
{verbs: [NORTH, CAVER, PASSA], action: [goto, LOC_WATERFALL]},
{verbs: [DOWN, CLIMB], action: [goto, LOC_LOWROOM]},
]
- LOC_GIANTROOM:
description:
long: |-
You are in the Giant Room. The ceiling here is too high up for your
lamp to show it. Cavernous passages lead east, north, and south. On
the west wall is scrawled the inscription, "FEE FIE FOE FOO" [sic].
short: 'You''re in Giant Room.'
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH], action: [goto, LOC_NARROW]},
{verbs: [EAST], action: [goto, LOC_CAVEIN]},
{verbs: [NORTH], action: [goto, LOC_IMMENSE]},
]
- LOC_CAVEIN:
description:
long: 'The passage here is blocked by a recent cave-in.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH, GIANT, OUT], action: [goto, LOC_GIANTROOM]},
]
- LOC_IMMENSE:
description:
long: 'You are at one end of an immense north/south passage.'
short: !!null
conditions: {DEEP: true}
sound: WIND_WHISTLES
travel: [
{verbs: [SOUTH, GIANT, PASSA], action: [goto, LOC_GIANTROOM]},
{verbs: [NORTH, ENTER, CAVER], cond: [not, DOOR, DOOR_RUSTED],
action: [goto, LOC_WATERFALL]},
{verbs: [NORTH], action: [speak, RUSTY_DOOR]},
]
- LOC_WATERFALL:
description:
long: |-
You are in a magnificent cavern with a rushing stream, which cascades
over a sparkling waterfall into a roaring whirlpool which disappears
through a hole in the floor. Passages exit to the south and west.
short: 'You''re in cavern with waterfall.'
conditions: {FLUID: true, DEEP: true}
sound: STREAM_SPLASHES
travel: [
{verbs: [SOUTH, OUT], action: [goto, LOC_IMMENSE]},
{verbs: [GIANT], action: [goto, LOC_GIANTROOM]},
{verbs: [WEST], action: [goto, LOC_INCLINE]},
]
- LOC_SOFTROOM:
description:
long: |-
You are in the Soft Room. The walls are covered with heavy curtains,
the floor with a thick pile carpet. Moss covers the ceiling.
short: 'You''re in Soft Room.'
conditions: {DEEP: true}
travel: [
{verbs: [WEST, OUT], action: [goto, LOC_SWISSCHEESE]},
]
- LOC_ORIENTAL:
description:
long: |-
This is the Oriental Room. Ancient oriental cave drawings cover the
walls. A gently sloping passage leads upward to the north, another
passage leads se, and a hands and knees crawl leads west.
short: 'You''re in Oriental Room.'
conditions: {DEEP: true}
travel: [
{verbs: [SE], action: [goto, LOC_SWISSCHEESE]},
{verbs: [WEST, CRAWL], action: [goto, LOC_LOWROOM]},
{verbs: [UPWAR, NORTH, CAVER], action: [goto, LOC_MISTY]},
]
- LOC_MISTY:
description:
long: |-
You are following a wide path around the outer edge of a large cavern.
Far below, through a heavy white mist, strange splashing noises can be
heard. The mist rises up through a fissure in the ceiling. The path
exits to the south and west.
short: 'You''re in misty cavern.'
conditions: {DEEP: true}
sound: NO_MEANING
travel: [
{verbs: [SOUTH, ORIEN], action: [goto, LOC_ORIENTAL]},
{verbs: [WEST], action: [goto, LOC_ALCOVE]},
]
- LOC_ALCOVE:
description:
long: |-
You are in an alcove. A small nw path seems to widen after a short
distance. An extremely tight tunnel leads east. It looks like a very
tight squeeze. An eerie light can be seen at the other end.
short: 'You''re in alcove.'
conditions: {DEEP: true}
hints: [*dark]
travel: [
{verbs: [NW, CAVER], action: [goto, LOC_MISTY]},
{verbs: [EAST, PASSA], action: ["special", 1]},
{verbs: [EAST], action: [goto, LOC_PLOVER]},
]
- LOC_PLOVER:
description:
long: |-
You're in a small chamber lit by an eerie green light. An extremely
narrow tunnel exits to the west. A dark corridor leads ne.
short: 'You''re in Plover Room.'
conditions: {DEEP: true, LIT: true}
hints: [*dark]
travel: [
{verbs: [WEST, PASSA, OUT], action: ["special", 1]},
{verbs: [WEST], action: [goto, LOC_ALCOVE]},
{verbs: [PLOVE], cond: [carry, EMERALD], action: ["special", 2]},
{verbs: [PLOVE], action: [goto, LOC_FOOF6]},
{verbs: [NE, DARK], action: [goto, LOC_DARKROOM]},
]
- LOC_DARKROOM:
description:
long: 'You''re in the dark-room. A corridor leading south is the only exit.'
short: 'You''re in dark-room.'
conditions: {DEEP: true}
hints: [*dark]
travel: [
{verbs: [SOUTH, PLOVE, OUT], action: [goto, LOC_PLOVER]},
]
- LOC_ARCHED:
description:
long: |-
You are in an arched hall. A coral passage once continued up and east
from here, but is now blocked by debris. The air smells of sea water.
short: 'You''re in arched hall.'
conditions: {DEEP: true}
travel: [
{verbs: [DOWN, SHELL, OUT], action: [goto, LOC_SHELLROOM]},
]
- LOC_SHELLROOM:
description:
long: |-
You're in a large room carved out of sedimentary rock. The floor and
walls are littered with bits of shells imbedded in the stone. A
shallow passage proceeds downward, and a somewhat steeper one leads
up. A low hands and knees passage enters from the south.
short: 'You''re in Shell Room.'
conditions: {DEEP: true}
travel: [
{verbs: [UPWAR, HALL], action: [goto, LOC_ARCHED]},
{verbs: [DOWN], action: [goto, LOC_SLOPING1]},
{verbs: [SOUTH], cond: [carry, CLAM],
action: [speak, CLAM_BLOCKER]},
{verbs: [SOUTH], cond: [carry, OYSTER],
action: [speak, OYSTER_BLOCKER]},
{verbs: [SOUTH], action: [goto, LOC_COMPLEX]},
]
- LOC_SLOPING1:
description:
long: 'You are in a long sloping corridor with ragged sharp walls.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [UPWAR, SHELL], action: [goto, LOC_SHELLROOM]},
{verbs: [DOWN], action: [goto, LOC_CULDESAC]},
]
- LOC_CULDESAC:
description:
long: 'You are in a cul-de-sac about eight feet across.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [UPWAR, OUT], action: [goto, LOC_SLOPING1]},
{verbs: [SHELL], action: [goto, LOC_SHELLROOM]},
]
- LOC_ANTEROOM:
description:
long: |-
You are in an anteroom leading to a large passage to the east. Small
passages go west and up. The remnants of recent digging are evident.
A sign in midair here says "Cave under construction beyond this point.
Proceed at own risk. [Witt Construction Company]"
short: 'You''re in anteroom.'
conditions: {DEEP: true}
travel: [
{verbs: [UPWAR], action: [goto, LOC_COMPLEX]},
{verbs: [WEST], action: [goto, LOC_BEDQUILT]},
{verbs: [EAST], action: [goto, LOC_WITTSEND]},
]
- LOC_DIFFERENT1:
description:
long: 'You are in a maze of twisty little passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT3]},
{verbs: [SW], action: [goto, LOC_DIFFERENT4]},
{verbs: [NE], action: [goto, LOC_DIFFERENT5]},
{verbs: [SE], action: [goto, LOC_DIFFERENT6]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT7]},
{verbs: [NW], action: [goto, LOC_DIFFERENT8]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT9]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT10]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT11]},
{verbs: [DOWN], action: [goto, LOC_LONGWEST]},
]
- LOC_WITTSEND:
description:
long: 'You are at Witt''s End. Passages lead off in *ALL* directions.'
short: 'You''re at Witt''s End.'
conditions: {DEEP: true, NOBACK: true}
hints: [*witt]
travel: [
{verbs: [EAST, NORTH, SOUTH, NE, SE, SW, NW, UPWAR, DOWN],
cond: [pct, 95], action: [speak, FUTILE_CRAWL]},
{verbs: [EAST], action: [goto, LOC_ANTEROOM]},
{verbs: [WEST], action: [speak, WAY_BLOCKED]},
]
- LOC_MIRRORCANYON:
description:
long: |-
You are in a north/south canyon about 25 feet across. The floor is
covered by white mist seeping in from the north. The walls extend
upward for well over 100 feet. Suspended from some unseen point far
above you, an enormous two-sided mirror is hanging parallel to and
midway between the canyon walls. (The mirror is obviously provided
for the use of the dwarves who, as you know, are extremely vain.) A
small window can be seen in either wall, some fifty feet up.
short: 'You''re in Mirror Canyon.'
conditions: {DEEP: true}
hints: [*jade]
sound: WIND_WHISTLES
travel: [
{verbs: [SOUTH], action: [goto, LOC_SECRET1]},
{verbs: [NORTH, RESER], action: [goto, LOC_RESERVOIR]},
]
- LOC_WINDOW2:
description:
long: |-
You're at a low window overlooking a huge pit, which extends up out of
sight. A floor is indistinctly visible over 50 feet below. Traces of
white mist cover the floor of the pit, becoming thicker to the left.
Marks in the dust around the window would seem to indicate that
someone has been here recently. Directly across the pit from you and
25 feet away there is a similar window looking into a lighted room. A
shadowy figure can be seen there peering back at you.
short: 'You''re at window on pit.'
conditions: {DEEP: true}
travel: [
{verbs: [WEST], action: [goto, LOC_THREEJUNCTION]},
{verbs: [JUMP], action: [goto, LOC_NECKBROKE]},
]
- LOC_TOPSTALACTITE:
description:
long: |-
A large stalactite extends from the roof and almost reaches the floor
below. You could climb down it, and jump from it to the floor, but
having done so you would be unable to reach it to climb back up.
short: 'You''re at top of stalactite.'
conditions: {DEEP: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_SECRET2]},
{verbs: [DOWN, JUMP, CLIMB], cond: [pct, 40],
action: [goto, LOC_ALIKE6]},
{verbs: [DOWN], cond: [pct, 50], action: [goto, LOC_ALIKE9]},
{verbs: [DOWN], action: [goto, LOC_ALIKE4]},
]
- LOC_DIFFERENT2:
description:
long: 'You are in a little maze of twisting passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [SW], action: [goto, LOC_DIFFERENT3]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT4]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT5]},
{verbs: [NW], action: [goto, LOC_DIFFERENT6]},
{verbs: [SE], action: [goto, LOC_DIFFERENT7]},
{verbs: [NE], action: [goto, LOC_DIFFERENT8]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT9]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT10]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT11]},
{verbs: [SOUTH], action: [goto, LOC_DEADEND13]},
]
- LOC_RESERVOIR:
description:
long: |-
You are at the edge of a large underground reservoir. An opaque cloud
of white mist fills the room and rises rapidly upward. The lake is
fed by a stream, which tumbles out of a hole in the wall about 10 feet
overhead and splashes noisily into the water somewhere within the
mist. There is a passage going back toward the south.
short: 'You''re at reservoir.'
conditions: {FLUID: true, DEEP: true}
sound: STREAM_SPLASHES
travel: [
{verbs: [SOUTH, OUT], action: [goto, LOC_MIRRORCANYON]},
{verbs: [NORTH, ACROS, CROSS], cond: [not, RESER, WATERS_PARTED], action: [speak, BAD_DIRECTION]},
{verbs: [NORTH], action: [goto, LOC_RESBOTTOM]},
]
- LOC_DEADEND12:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SE], action: [goto, LOC_ALIKE13]},
]
- LOC_NE:
description:
long: |-
You are at the northeast end of an immense room, even larger than the
Giant Room. It appears to be a repository for the "Adventure"
program. Massive torches far overhead bathe the room with smoky
yellow light. Scattered about you can be seen a pile of bottles (all
of them empty), a nursery of young beanstalks murmuring quietly, a bed
of oysters, a bundle of black rods with rusty stars on their ends, and
a collection of brass lanterns. Off to one side a great many dwarves
are sleeping on the floor, snoring loudly. A notice nearby reads: "Do
not disturb the dwarves!" An immense mirror is hanging against one
wall, and stretches to the other end of the room, where various other
sundry objects can be glimpsed dimly in the distance.
short: 'You''re at ne end.'
conditions: {DEEP: true, LIT: true}
sound: MURMURING_SNORING
travel: [
{verbs: [SW], action: [goto, LOC_SW]},
]
- LOC_SW:
description:
long: |-
You are at the southwest end of the repository. To one side is a pit
full of fierce green snakes. On the other side is a row of small
wicker cages, each of which contains a little sulking bird. In one
corner is a bundle of black rods with rusty marks on their ends. A
large number of velvet pillows are scattered about on the floor. A
vast mirror stretches off to the northeast. At your feet is a large
steel grate, next to which is a sign that reads, "Treasure Vault.
Keys in main office."
short: 'You''re at sw end.'
conditions: {DEEP: true, LIT: true}
sound: SNAKES_HISSING
travel: [
{verbs: [NE], action: [goto, LOC_NE]},
{verbs: [DOWN], action: [speak, GRATE_NOWAY]},
]
- LOC_SWCHASM:
description:
long: |-
You are on one side of a large, deep chasm. A heavy white mist rising
up from below obscures all view of the far side. A sw path leads away
from the chasm into a winding corridor.
short: 'You''re on sw side of chasm.'
conditions: {DEEP: true}
travel: [
{verbs: [SW], action: [goto, LOC_WINDING]},
{verbs: [OVER, ACROS, CROSS, NE], cond: [with, TROLL],
action: [speak, TROLL_BLOCKS]},
{verbs: [OVER], cond: [not, CHASM, TROLL_BRIDGE],
action: [speak, BRIDGE_GONE]},
{verbs: [OVER], action: ["special", 3]},
{verbs: [JUMP], cond: [not, CHASM, TROLL_BRIDGE],
action: [goto, LOC_NOMAKE]},
{verbs: [JUMP], action: [speak, CROSS_BRIDGE]},
]
- LOC_WINDING:
description:
long: |-
You are in a long winding corridor sloping out of sight in both
directions.
short: 'You''re in sloping corridor.'
conditions: {DEEP: true}
travel: [
{verbs: [DOWN], action: [goto, LOC_LOWROOM]},
{verbs: [UPWAR], action: [goto, LOC_SWCHASM]},
]
# Following three rooms are where the dragon lives. The code has a
# wired-in assumption that the dragon corpse goes to LOC_SECRET5,
- LOC_SECRET4:
description:
long: 'You are in a secret canyon which exits to the north and east.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [NORTH, OUT], action: [goto, LOC_SECRET1]},
{verbs: [EAST, FORWA], action: [speak, NASTY_DRAGON]},
]
- LOC_SECRET5:
description:
long: 'You are in a secret canyon which exits to the north and east.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_SECRET1]},
{verbs: [EAST], action: [goto, LOC_SECRET3]},
]
- LOC_SECRET6:
description:
long: 'You are in a secret canyon which exits to the north and east.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [EAST, OUT], action: [goto, LOC_SECRET3]},
{verbs: [NORTH, FORWA], action: [speak, NASTY_DRAGON]},
]
- LOC_NECHASM:
description:
long: |-
You are on the far side of the chasm. A ne path leads away from the
chasm on this side.
short: 'You''re on ne side of chasm.'
conditions: {NOARRR: true, DEEP: true}
travel: [
{verbs: [NE], action: [goto, LOC_CORRIDOR]},
{verbs: [OVER, ACROS, CROSS, SW], cond: [with, TROLL], action: [speak, TROLL_BLOCKS]},
{verbs: [OVER], action: ["special", 3]},
{verbs: [JUMP], action: [speak, CROSS_BRIDGE]},
{verbs: [FORK], action: [goto, LOC_FORK]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
{verbs: [BARRE], action: [goto, LOC_BARRENFRONT]},
]
- LOC_CORRIDOR:
description:
long: |-
You're in a long east/west corridor. A faint rumbling noise can be
heard in the distance.
short: 'You''re in corridor.'
conditions: {NOARRR: true, DEEP: true}
sound: DULL_RUMBLING
travel: [
{verbs: [WEST], action: [goto, LOC_NECHASM]},
{verbs: [EAST, FORK], action: [goto, LOC_FORK]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
{verbs: [BARRE], action: [goto, LOC_BARRENFRONT]},
]
- LOC_FORK:
description:
long: |-
The path forks here. The left fork leads northeast. A dull rumbling
seems to get louder in that direction. The right fork leads southeast
down a gentle slope. The main corridor enters from the west.
short: 'You''re at fork in path.'
conditions: {NOARRR: true, DEEP: true}
sound: DULL_RUMBLING
travel: [
{verbs: [WEST], action: [goto, LOC_CORRIDOR]},
{verbs: [NE, LEFT], action: [goto, LOC_WARMWALLS]},
{verbs: [SE, RIGHT, DOWN], action: [goto, LOC_LIMESTONE]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
{verbs: [BARRE], action: [goto, LOC_BARRENFRONT]},
]
- LOC_WARMWALLS:
description:
long: |-
The walls are quite warm here. From the north can be heard a steady
roar, so loud that the entire cave seems to be trembling. Another
passage leads south, and a low crawl goes east.
short: 'You''re at junction with warm walls.'
conditions: {NOARRR: true, DEEP: true}
sound: LOUD_ROAR
travel: [
{verbs: [SOUTH, FORK], action: [goto, LOC_FORK]},
{verbs: [NORTH, VIEW], action: [goto, LOC_BREATHTAKING]},
{verbs: [EAST, CRAWL], action: [goto, LOC_BOULDERS2]},
]
- LOC_BREATHTAKING:
description:
long: |-
You are on the edge of a breath-taking view. Far below you is an
active volcano, from which great gouts of molten lava come surging
out, cascading back down into the depths. The glowing rock fills the
farthest reaches of the cavern with a blood-red glare, giving every-
thing an eerie, macabre appearance. The air is filled with flickering
sparks of ash and a heavy smell of brimstone. The walls are hot to
the touch, and the thundering of the volcano drowns out all other
sounds. Embedded in the jagged roof far overhead are myriad twisted
formations composed of pure white alabaster, which scatter the murky
light into sinister apparitions upon the walls. To one side is a deep
gorge, filled with a bizarre chaos of tortured rock which seems to
have been crafted by the devil himself. An immense river of fire
crashes out from the depths of the volcano, burns its way through the
gorge, and plummets into a bottomless pit far off to your left. To
the right, an immense geyser of blistering steam erupts continuously
from a barren island in the center of a sulfurous lake, which bubbles
ominously. The far right wall is aflame with an incandescence of its
own, which lends an additional infernal splendor to the already
hellish scene. A dark, foreboding passage exits to the south.
short: 'You''re at breath-taking view.'
conditions: {NOARRR: true, LIT: true, DEEP: true}
hints: [*jade]
sound: TOTAL_ROAR
loud: true
travel: [
{verbs: [SOUTH, PASSA, OUT], action: [goto, LOC_WARMWALLS]},
{verbs: [FORK], action: [goto, LOC_FORK]},
{verbs: [DOWN], action: [speak, RIDICULOUS_ATTEMPT]},
{verbs: [JUMP], action: [goto, LOC_GRUESOME]},
]
- LOC_BOULDERS2:
description:
long: |-
You are in a small chamber filled with large boulders. The walls are
very warm, causing the air in the room to be almost stifling from the
heat. The only exit is a crawl heading west, through which is coming
a low rumbling.
short: 'You''re in Chamber of Boulders.'
conditions: {NOARRR: true, DEEP: true}
sound: DULL_RUMBLING
travel: [
{verbs: [WEST, OUT, CRAWL], action: [goto, LOC_WARMWALLS]},
{verbs: [FORK], action: [goto, LOC_FORK]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
]
- LOC_LIMESTONE:
description:
long:
You are walking along a gently sloping north/south passage lined with
oddly shaped limestone formations.
short: 'You''re in limestone passage.'
conditions: {NOARRR: true, DEEP: true}
travel: [
{verbs: [NORTH, UPWAR, FORK], action: [goto, LOC_FORK]},
{verbs: [SOUTH, DOWN, BARRE], action: [goto, LOC_BARRENFRONT]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
]
- LOC_BARRENFRONT:
description:
long: |-
You are standing at the entrance to a large, barren room. A notice
above the entrance reads: "Caution! Bear in room!"
short: 'You''re in front of Barren Room.'
conditions: {NOARRR: true, DEEP: true}
travel: [
{verbs: [WEST, UPWAR], action: [goto, LOC_LIMESTONE]},
{verbs: [FORK], action: [goto, LOC_FORK]},
{verbs: [EAST, INWAR, BARRE, ENTER], action: [goto, LOC_BARRENROOM]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
]
- LOC_BARRENROOM:
description:
long: |-
You are inside a barren room. The center of the room is completely
empty except for some dust. Marks in the dust lead away toward the
far end of the room. The only exit is the way you came in.
short: 'You''re in Barren Room.'
conditions: {NOARRR: true, DEEP: true}
travel: [
{verbs: [WEST, OUT], action: [goto, LOC_BARRENFRONT]},
{verbs: [FORK], action: [goto, LOC_FORK]},
{verbs: [VIEW], action: [goto, LOC_BREATHTAKING]},
]
- LOC_DIFFERENT3:
description:
long: 'You are in a maze of twisting little passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [WEST], action: [goto, LOC_DIFFERENT1]},
{verbs: [SE], action: [goto, LOC_DIFFERENT4]},
{verbs: [NW], action: [goto, LOC_DIFFERENT5]},
{verbs: [SW], action: [goto, LOC_DIFFERENT6]},
{verbs: [NE], action: [goto, LOC_DIFFERENT7]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT8]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT9]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT10]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT11]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT4:
description:
long: 'You are in a little maze of twisty passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [NW], action: [goto, LOC_DIFFERENT1]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT3]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT5]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT6]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT7]},
{verbs: [SW], action: [goto, LOC_DIFFERENT8]},
{verbs: [NE], action: [goto, LOC_DIFFERENT9]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT10]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT11]},
{verbs: [SE], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT5:
description:
long: 'You are in a twisting maze of little passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT1]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT3]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT4]},
{verbs: [NE], action: [goto, LOC_DIFFERENT6]},
{verbs: [SW], action: [goto, LOC_DIFFERENT7]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT8]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT9]},
{verbs: [NW], action: [goto, LOC_DIFFERENT10]},
{verbs: [SE], action: [goto, LOC_DIFFERENT11]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT6:
description:
long: 'You are in a twisting little maze of passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [NE], action: [goto, LOC_DIFFERENT1]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT3]},
{verbs: [NW], action: [goto, LOC_DIFFERENT4]},
{verbs: [SE], action: [goto, LOC_DIFFERENT5]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT7]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT8]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT9]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT10]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT11]},
{verbs: [SW], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT7:
description:
long: 'You are in a twisty little maze of passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_DIFFERENT1]},
{verbs: [SE], action: [goto, LOC_DIFFERENT3]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT4]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT5]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT6]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT8]},
{verbs: [SW], action: [goto, LOC_DIFFERENT9]},
{verbs: [NE], action: [goto, LOC_DIFFERENT10]},
{verbs: [NW], action: [goto, LOC_DIFFERENT11]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT8:
description:
long: 'You are in a twisty maze of little passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [EAST], action: [goto, LOC_DIFFERENT1]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT3]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT4]},
{verbs: [SW], action: [goto, LOC_DIFFERENT5]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT6]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT7]},
{verbs: [NW], action: [goto, LOC_DIFFERENT9]},
{verbs: [SE], action: [goto, LOC_DIFFERENT10]},
{verbs: [NE], action: [goto, LOC_DIFFERENT11]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT9:
description:
long: 'You are in a little twisty maze of passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [SE], action: [goto, LOC_DIFFERENT1]},
{verbs: [NE], action: [goto, LOC_DIFFERENT3]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT4]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT5]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT6]},
{verbs: [NW], action: [goto, LOC_DIFFERENT7]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT8]},
{verbs: [SW], action: [goto, LOC_DIFFERENT10]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT11]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT10:
description:
long: 'You are in a maze of little twisting passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [DOWN], action: [goto, LOC_DIFFERENT1]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT3]},
{verbs: [NE], action: [goto, LOC_DIFFERENT4]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT5]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT6]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT7]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT8]},
{verbs: [SE], action: [goto, LOC_DIFFERENT9]},
{verbs: [SW], action: [goto, LOC_DIFFERENT11]},
{verbs: [NW], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DIFFERENT11:
description:
long: 'You are in a maze of little twisty passages, all different.'
short: !!null
conditions: {DEEP: true, NOBACK: true}
travel: [
{verbs: [SW], action: [goto, LOC_DIFFERENT1]},
{verbs: [NW], action: [goto, LOC_DIFFERENT3]},
{verbs: [EAST], action: [goto, LOC_DIFFERENT4]},
{verbs: [WEST], action: [goto, LOC_DIFFERENT5]},
{verbs: [NORTH], action: [goto, LOC_DIFFERENT6]},
{verbs: [DOWN], action: [goto, LOC_DIFFERENT7]},
{verbs: [SE], action: [goto, LOC_DIFFERENT8]},
{verbs: [UPWAR], action: [goto, LOC_DIFFERENT9]},
{verbs: [SOUTH], action: [goto, LOC_DIFFERENT10]},
{verbs: [NE], action: [goto, LOC_DIFFERENT2]},
]
- LOC_DEADEND13:
description:
long: 'Dead end'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [NORTH, OUT], action: [goto, LOC_DIFFERENT2]},
{verbs: [SOUTH], cond: [not, VEND, VEND_BLOCKS], action: [goto, LOC_ROUGHHEWN]},
{verbs: [SOUTH], action: [goto, LOC_BADDIRECTION]},
]
- LOC_ROUGHHEWN:
description:
long: 'You are in a long, rough-hewn, north/south corridor.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [NORTH], action: [goto, LOC_DEADEND13]},
{verbs: [SOUTH], action: [goto, LOC_LARGE]},
]
- LOC_BADDIRECTION:
description:
long: 'There is no way to go that direction.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_DEADEND13]},
]
- LOC_LARGE:
description:
long: 'You are in a large chamber with passages to the west and north.'
short: !!null
conditions: {DEEP: true}
hints: [*ogre]
travel: [
{verbs: [WEST], action: [goto, LOC_ROUGHHEWN]},
{verbs: [NORTH], cond: [with, OGRE], action: [speak, OGRE_SNARL]},
{verbs: [NORTH], action: [goto, LOC_STOREROOM]},
]
- LOC_STOREROOM:
description:
long: 'You are in the ogre''s storeroom. The only exit is to the south.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SOUTH, OUT], action: [goto, LOC_LARGE]},
]
- LOC_FOREST1:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_START]},
{verbs: [WEST], action: [goto, LOC_FOREST13]},
{verbs: [NORTH], action: [goto, LOC_FOREST2]},
{verbs: [SOUTH], action: [goto, LOC_FOREST3]},
]
- LOC_FOREST2:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST1]},
{verbs: [WEST], action: [goto, LOC_FOREST19]},
{verbs: [NORTH], action: [goto, LOC_FOREST3]},
{verbs: [SOUTH], action: [goto, LOC_FOREST18]},
]
- LOC_FOREST3:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST, WEST], action: [goto, LOC_FOREST4]},
{verbs: [NORTH], action: [goto, LOC_FOREST2]},
{verbs: [SOUTH], action: [goto, LOC_FOREST1]},
]
- LOC_FOREST4:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST, NORTH], action: [goto, LOC_FOREST3]},
{verbs: [WEST, SOUTH], action: [goto, LOC_FOREST5]},
]
- LOC_FOREST5:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST, NORTH], action: [goto, LOC_FOREST4]},
{verbs: [WEST], action: [goto, LOC_FOREST7]},
{verbs: [SOUTH], action: [goto, LOC_FOREST6]},
]
- LOC_FOREST6:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST5]},
{verbs: [WEST], action: [goto, LOC_FOREST7]},
{verbs: [NORTH], action: [goto, LOC_VALLEY]},
{verbs: [SOUTH], action: [goto, LOC_SLIT]},
]
- LOC_FOREST7:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST5]},
{verbs: [WEST], action: [goto, LOC_FOREST6]},
{verbs: [NORTH], action: [goto, LOC_GRATE]},
{verbs: [SOUTH], action: [goto, LOC_FOREST8]},
]
- LOC_FOREST8:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST9]},
{verbs: [WEST], action: [goto, LOC_FOREST11]},
{verbs: [NORTH], action: [goto, LOC_FOREST22]},
{verbs: [SOUTH], action: [goto, LOC_FOREST7]},
]
- LOC_FOREST9:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST11]},
{verbs: [WEST], action: [goto, LOC_FOREST8]},
{verbs: [NORTH], action: [goto, LOC_FOREST10]},
{verbs: [SOUTH], action: [goto, LOC_GRATE]},
]
- LOC_FOREST10:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_SLIT]},
{verbs: [WEST], action: [goto, LOC_FOREST11]},
{verbs: [NORTH], action: [goto, LOC_FOREST9]},
{verbs: [SOUTH], action: [goto, LOC_GRATE]},
]
- LOC_FOREST11:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST10]},
{verbs: [WEST], action: [goto, LOC_FOREST8]},
{verbs: [NORTH], action: [goto, LOC_FOREST22]},
{verbs: [SOUTH], action: [goto, LOC_FOREST9]},
]
- LOC_FOREST12:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST13]},
{verbs: [WEST], action: [goto, LOC_FOREST14]},
{verbs: [NORTH], action: [goto, LOC_FOREST22]},
{verbs: [SOUTH], action: [goto, LOC_VALLEY]},
]
- LOC_FOREST13:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST1]},
{verbs: [WEST], action: [goto, LOC_FOREST12]},
{verbs: [NORTH], action: [goto, LOC_FOREST20]},
{verbs: [SOUTH], action: [goto, LOC_HILL]},
]
- LOC_FOREST14:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_ROADEND]},
{verbs: [WEST], action: [goto, LOC_FOREST16]},
{verbs: [NORTH], action: [goto, LOC_FOREST15]},
{verbs: [SOUTH], action: [goto, LOC_FOREST12]},
]
- LOC_FOREST15:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST16]},
{verbs: [WEST], action: [goto, LOC_FOREST22]},
{verbs: [NORTH], action: [goto, LOC_ROADEND]},
{verbs: [SOUTH], action: [goto, LOC_FOREST14]},
]
- LOC_FOREST16:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST, NORTH], action: [goto, LOC_FOREST17]},
{verbs: [WEST], action: [goto, LOC_FOREST14]},
{verbs: [SOUTH], action: [goto, LOC_FOREST15]},
]
- LOC_FOREST17:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST18]},
{verbs: [WEST, SOUTH], action: [goto, LOC_FOREST16]},
{verbs: [NORTH], action: [goto, LOC_CLIFF]},
]
- LOC_FOREST18:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST19]},
{verbs: [WEST], action: [goto, LOC_FOREST17]},
{verbs: [NORTH], action: [goto, LOC_FOREST2]},
{verbs: [SOUTH], action: [goto, LOC_FOREST21]},
]
- LOC_FOREST19:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST2]},
{verbs: [WEST], action: [goto, LOC_FOREST18]},
{verbs: [NORTH], action: [goto, LOC_CLIFF]},
{verbs: [SOUTH], action: [goto, LOC_FOREST20]},
]
- LOC_FOREST20:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_HILL]},
{verbs: [WEST], action: [goto, LOC_FOREST21]},
{verbs: [NORTH], action: [goto, LOC_FOREST19]},
{verbs: [SOUTH], action: [goto, LOC_FOREST13]},
]
- LOC_FOREST21:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST20]},
{verbs: [WEST], action: [goto, LOC_ROADEND]},
{verbs: [NORTH], action: [goto, LOC_FOREST18]},
{verbs: [SOUTH], action: [goto, LOC_FOREST21]},
]
- LOC_FOREST22:
description:
long: 'You are wandering aimlessly through the forest.'
short: !!null
conditions: {FOREST: true, NOBACK: true, LIT: true}
hints: [*forest]
travel: [
{verbs: [EAST], action: [goto, LOC_FOREST8]},
{verbs: [WEST], action: [goto, LOC_FOREST11]},
{verbs: [NORTH], action: [goto, LOC_FOREST15]},
{verbs: [SOUTH], action: [goto, LOC_FOREST12]},
]
- LOC_LEDGE:
description:
long: |-
You are on a small ledge on one face of a sheer cliff. There are no
paths away from the ledge. Across the chasm is a small clearing
surrounded by forest.
short: 'You''re on ledge.'
conditions: {ABOVE: true, LIT: true}
travel: [
{verbs: [JUMP], action: [goto, LOC_NOMAKE]},
]
- LOC_RESBOTTOM:
description:
long: |-
You are walking across the bottom of the reservoir. Walls of water
rear up on either side. The roar of the water cascading past is
nearly deafening, and the mist is so thick you can barely see.
short: 'You''re at bottom of reservoir.'
conditions: {FLUID: true, DEEP: true}
sound: TOTAL_ROAR
loud: true
travel: [
{verbs: [NORTH], action: [goto, LOC_RESNORTH]},
{verbs: [SOUTH], action: [goto, LOC_RESERVOIR]},
]
- LOC_RESNORTH:
description:
long: |-
You are at the northern edge of the reservoir. A northwest passage
leads sharply up from here.
short: 'You''re north of reservoir.'
conditions: {FLUID: true, DEEP: true}
sound: WATERS_CRASHING
travel: [
{verbs: [SOUTH, ACROS, CROSS],
cond: [not, RESER, WATERS_PARTED], action: [speak, BAD_DIRECTION]},
{verbs: [SOUTH], action: [goto, LOC_RESBOTTOM]},
{verbs: [NW, UPWAR, OUT], action: [goto, LOC_TREACHEROUS]},
]
- LOC_TREACHEROUS:
description:
long: 'You are scrambling along a treacherously steep, rocky passage.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [UPWAR, NW], action: [goto, LOC_STEEP]},
{verbs: [DOWN, SE], action: [goto, LOC_RESNORTH]},
]
- LOC_STEEP:
description:
long: 'You are on a very steep incline, which widens at it goes upward.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [DOWN, SE], action: [goto, LOC_TREACHEROUS]},
{verbs: [UPWAR, NW], action: [goto, LOC_CLIFFBASE]},
]
- LOC_CLIFFBASE:
description:
long: |-
You are at the base of a nearly vertical cliff. There are some
slim footholds which would enable you to climb up, but it looks
extremely dangerous. Here at the base of the cliff lie the remains
of several earlier adventurers who apparently failed to make it.
short: 'You''re at base of cliff.'
conditions: {DEEP: true}
travel: [
{verbs: [DOWN, SE], action: [goto, LOC_STEEP]},
{verbs: [UPWAR, CLIMB], action: [goto, LOC_CLIFFACE]},
]
- LOC_CLIFFACE:
description:
long: 'You are climbing along a nearly vertical cliff.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [DOWN], action: [goto, LOC_CLIFFBASE]},
{verbs: [UPWAR], cond: [carry, OBJ_46], action: [goto, LOC_CLIFFTOP]},
{verbs: [UPWAR], action: [goto, LOC_FOOTSLIP]},
]
- LOC_FOOTSLIP:
description:
long: |-
Just as you reach the top, your foot slips on a loose rock and you
tumble several hundred feet to join the other unlucky adventurers.
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_NOWHERE]},
]
- LOC_CLIFFTOP:
description:
long: |-
Just as you reach the top, your foot slips on a loose rock and you
make one last desperate grab. Your luck holds, as does your grip.
With an enormous heave, you lift yourself to the ledge above.
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_CLIFFLEDGE]},
]
- LOC_CLIFFLEDGE:
description:
long: |-
You are on a small ledge at the top of a nearly vertical cliff.
There is a low crawl leading off to the northeast.
short: 'You''re at top of cliff.'
conditions: {DEEP: true}
travel: [
{verbs: [CLIMB, DOWN], action: [goto, LOC_CLIFFACE]},
{verbs: [NE, CRAWL], action: [goto, LOC_REACHDEAD]},
]
- LOC_REACHDEAD:
description:
long: 'You have reached a dead end.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [SW, OUT, CRAWL], action: [goto, LOC_CLIFFLEDGE]},
]
- LOC_GRUESOME:
description:
long: 'There is now one more gruesome aspect to the spectacular vista.'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_NOWHERE]},
]
- LOC_FOOF1:
description:
long: '>>Foof!<<'
short: !!null
conditions: {}
travel: [
{verbs: [], action: [goto, LOC_DEBRIS]},
]
- LOC_FOOF2:
description:
long: '>>Foof!<<'
short: !!null
conditions: {ABOVE: true}
travel: [
{verbs: [], action: [goto, LOC_BUILDING]},
]
- LOC_FOOF3:
description:
long: '>>Foof!<<'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_Y2]},
]
- LOC_FOOF4:
description:
long: '>>Foof!<<'
short: !!null
conditions: {ABOVE: true}
travel: [
{verbs: [], action: [goto, LOC_BUILDING]},
]
- LOC_FOOF5:
description:
long: '>>Foof!<<'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_PLOVER]},
]
- LOC_FOOF6:
description:
long: '>>Foof!<<'
short: !!null
conditions: {DEEP: true}
travel: [
{verbs: [], action: [goto, LOC_Y2]},
]
arbitrary_messages: !!omap
- NO_MESSAGE: !!null
- CAVE_NEARBY: |-
Somewhere nearby is Colossal Cave, where others have found fortunes in
treasure and gold, though it is rumored that some who enter are never
seen again. Magic is said to work in the cave. I will be your eyes
and hands. Direct me with commands of 1 or 2 words. I should warn
you that I look at only the first five letters of each word, so you'll
have to enter "northeast" as "ne" to distinguish it from "north".
You can type "help" for some general hints. For information on how
to end your adventure, scoring, etc., type "info".
\t\t\t - - -
This program was originally developed by Willie Crowther. Most of the
features of the current program were added by Don Woods.
- DWARF_BLOCK: 'A little dwarf with a big knife blocks your way.'
- DWARF_RAN: |-
A little dwarf just walked around a corner, saw you, threw a little
axe at you which missed, cursed, and ran away.
- DWARF_PACK: 'There are %d threatening little dwarves in the room with you.'
- DWARF_SINGLE: 'There is a threatening little dwarf in the room with you!'
- KNIFE_THROWN: 'One sharp nasty knife is thrown at you!'
- SAYS_PLUGH: 'A hollow voice says "PLUGH".'
- GETS_YOU: 'It gets you!'
- MISSES_YOU: 'It misses!'
- UNSURE_FACING: 'I am unsure how you are facing. Use compass points or nearby objects.'
- NO_INOUT_HERE: |-
I don't know in from out here. Use compass points or name something
in the general direction you want to go.
- CANT_APPLY: 'I don''t know how to apply that word here.'
- AM_GAME: &am_game 'I''m game. Would you care to explain how?'
- NO_MORE_DETAIL: |-
Sorry, but I am not allowed to give more detail. I will repeat the
long description of your location.
- PITCH_DARK: 'It is now pitch dark. If you proceed you will likely fall into a pit.'
- W_IS_WEST: 'If you prefer, simply type w rather than west.'
- REALLY_QUIT: 'Do you really want to quit now?'
- PIT_FALL: 'You fell into a pit and broke every bone in your body!'
- ALREADY_CARRYING: &already_carrying 'You are already carrying it!'
- YOU_JOKING: 'You can''t be serious!'
- BIRD_EVADES: |-
The bird seemed unafraid at first, but as you approach it becomes
disturbed and you cannot catch it.
- CANNOT_CARRY: 'You can catch the bird, but you cannot carry it.'
- NOTHING_LOCKED: 'There is nothing here with a lock!'
- ARENT_CARRYING: &arent_carrying 'You aren''t carrying it!'
- BIRD_ATTACKS: |-
The little bird attacks the green snake, and in an astounding flurry
drives the snake away.
- NO_KEYS: 'You have no keys!'
- NO_LOCK: 'It has no lock.'
- NOT_LOCKABLE: ¬_lockable 'I don''t know how to lock or unlock such a thing.'
- ALREADY_LOCKED: 'It was already locked.'
- ALREADY_UNLOCKED: 'It was already unlocked.'
- BEAR_BLOCKS: |-
There is no way to get past the bear to unlock the chain, which is
probably just as well.
- NOTHING_HAPPENS: ¬hing_happens 'Nothing happens.'
- WHERE_QUERY: &where_query 'Where?'
- NO_TARGET: 'There is nothing here to attack.'
- BIRD_DEAD: 'The little bird is now dead. Its body disappears.'
- SNAKE_WARNING: 'Attacking the snake both doesn''t work and is very dangerous.'
- KILLED_DWARF: 'You killed a little dwarf.'
- DWARF_DODGES: 'You attack a little dwarf, but he dodges out of the way.'
- BARE_HANDS_QUERY: 'With what? Your bare hands?'
- BAD_DIRECTION: 'There is no way to go that direction.'
- TWO_WORDS: 'Please stick to 1- and 2-word commands.'
- OK_MAN: &ok_man 'OK'
- CANNOT_UNLOCK: 'You can''t unlock the keys.'
- FUTILE_CRAWL: |-
You have crawled around in some little holes and wound up back in the
main passage.
- FOLLOW_STREAM: |-
I don't know where the cave is, but hereabouts no stream can run on
the surface for long. I would try the stream.
- NEED_DETAIL: 'I need more detailed instructions to do that.'
- NEARBY: &nearby |-
I can only tell you what you see as you move about and manipulate
things. I cannot tell you where remote things are.
- OGRE_SNARL: 'The ogre snarls and shoves you back.'
- HUH_MAN: &huh_man 'Huh?'
- WELCOME_YOU: 'Welcome to Adventure!! Would you like instructions?'
- REQUIRES_DYNAMITE: &requires_dynamite 'Blasting requires dynamite.'
- FEET_WET: 'Your feet are now wet.'
- LOST_APPETITE: 'I think I just lost my appetite.'
- THANKS_DELICIOUS: 'Thank you, it was delicious!'
- PECULIAR_NOTHING: 'Peculiar. Nothing unexpected happens.'
- GROUND_WET: 'Your bottle is empty and the ground is wet.'
- CANT_POUR: 'You can''t pour that.'
- WHICH_WAY: 'Which way?'
- FORGOT_PATH: 'Sorry, but I no longer seem to remember how it was you got here.'
- CARRY_LIMIT: 'You can''t carry anything more. You''ll have to drop something first.'
- GRATE_NOWAY: 'You can''t go through a locked steel grate!'
- YOU_HAVEIT: 'I believe what you want is right here with you.'
- DONT_FIT: 'You don''t fit through a two-inch slit!'
- CROSS_BRIDGE: 'I respectfully suggest you go across the bridge instead of jumping.'
- NO_CROSS: 'There is no way across the fissure.'
- NO_CARRY: 'You''re not carrying anything.'
- NOW_HOLDING: 'You are currently holding the following:'
- BIRD_PINING: |-
It's not hungry (it's merely pinin' for the fjords). Besides, you
have no bird seed.
- BIRD_DEVOURED: 'The snake has now devoured your bird.'
- NOTHING_EDIBLE: 'There''s nothing here it wants to eat (except perhaps you).'
- REALLY_MAD: 'You fool, dwarves eat only coal! Now you''ve made him *REALLY* mad!!'
- NO_CONTAINER: 'You have nothing in which to carry it.'
- BOTTLE_FULL: 'Your bottle is already full.'
- NO_LIQUID: 'There is nothing here with which to fill the bottle.'
- RIDICULOUS_ATTEMPT: &ridiculous_attempt 'Don''t be ridiculous!'
- RUSTY_DOOR: 'The door is extremely rusty and refuses to open.'
- SHAKING_LEAVES: 'The plant indignantly shakes the oil off its leaves and asks, "Water?"'
- DEEP_ROOTS: 'The plant has exceptionally deep roots and cannot be pulled free.'
- KNIVES_VANISH: 'The dwarves'' knives vanish as they strike the walls of the cave.'
- MUST_DROP: |-
Something you're carrying won't fit through the tunnel with you.
You'd best take inventory and drop something.
- CLAM_BLOCKER: 'You can''t fit this five-foot clam through that little passage!'
- OYSTER_BLOCKER: 'You can''t fit this five-foot oyster through that little passage!'
#- DROP_CLAM: 'I advise you to put down the clam before opening it. >STRAIN!<'
- DROP_OYSTER: 'I advise you to put down the oyster before opening it. >WRENCH!<'
- CLAM_OPENER: 'You don''t have anything strong enough to open the clam.'
- OYSTER_OPENER: 'You don''t have anything strong enough to open the oyster.'
- PEARL_FALLS: |-
A glistening pearl falls out of the clam and rolls away. Goodness,
this must really be an oyster. (I never was very good at identifying
bivalves.) Whatever it is, it has now snapped shut again.
- OYSTER_OPENS: |-
The oyster creaks open, revealing nothing but oyster inside. It
promptly snaps shut again.
- WAY_BLOCKED: |-
You have crawled around in some little holes and found your way
blocked by a recent cave-in. You are now back in the main passage.
- PIRATE_RUSTLES: 'There are faint rustling noises from the darkness behind you.'
- PIRATE_POUNCES: |-
Out from the shadows behind you pounces a bearded pirate! "Har, har,"
he chortles, "I'll just take all this booty and hide it away with me
chest deep in the maze!" He snatches your treasure and vanishes into
the gloom.
- CAVE_CLOSING: |-
A sepulchral voice reverberating through the cave, says, "Cave closing
soon. All adventurers exit immediately through main office."
- EXIT_CLOSED: |-
A mysterious recorded voice groans into life and announces:
"This exit is closed. Please leave via main office."
- DEATH_CLOSING: |-
It looks as though you're dead. Well, seeing as how it's so close to
closing time anyway, I think we'll just call it a day.
- CAVE_CLOSED: |-
The sepulchral voice intones, "The cave is now closed." As the echoes
fade, there is a blinding flash of light (and a small puff of orange
smoke). . . . As your eyes refocus, you look around and find...
- VICTORY_MESSAGE: |-
There is a loud explosion, and a twenty-foot hole appears in the far
wall, burying the dwarves in the rubble. You march through the hole
and find yourself in the main office, where a cheering band of
friendly elves carry the conquering adventurer off into the sunset.
- DEFEAT_MESSAGE: |-
There is a loud explosion, and a twenty-foot hole appears in the far
wall, burying the snakes in the rubble. A river of molten lava pours
in through the hole, destroying everything in its path, including you!
- SPLATTER_MESSAGE: |-
There is a loud explosion, and you are suddenly splashed across the
walls of the room.
- DWARVES_AWAKEN: |-
The resulting ruckus has awakened the dwarves. There are now several
threatening little dwarves in the room with you! Most of them throw
knives at you! All of them get you!
- UNHAPPY_BIRD: 'Oh, leave the poor unhappy bird alone.'
- NEEDED_NEARBY: 'I daresay whatever you want is around here somewhere.'
- NOT_CONNECTED: 'You can''t get there from here.'
- TAME_BEAR: 'You are being followed by a very large, tame bear.'
- WITHOUT_SUSPENDS: 'Now let''s see you do it without suspending in mid-Adventure.'
- FILL_INVALID: 'There is nothing here with which to fill it.'
- SHATTER_VASE: 'The sudden change in temperature has delicately shattered the vase.'
- BEYOND_POWER: &beyond_power 'It is beyond your power to do that.'
- NOT_KNOWHOW: ¬_knowhow 'I don''t know how.'
- TOO_FAR: 'It is too far up for you to reach.'
- DWARF_SMOKE: |-
You killed a little dwarf. The body vanishes in a cloud of greasy
black smoke.
- SHELL_IMPERVIOUS: 'The shell is very strong and is impervious to attack.'
- START_OVER: 'What''s the matter, can''t you read? Now you''d best start over.'
- WELL_POINTLESS: 'Well, that was remarkably pointless.'
- DRAGON_SCALES: 'The axe bounces harmlessly off the dragon''s thick scales.'
- NASTY_DRAGON: 'The dragon looks rather nasty. You''d best not try to get by.'
- BIRD_BURNT: |-
The little bird attacks the green dragon, and in an astounding flurry
gets burnt to a cinder. The ashes blow away.
- BRIEF_CONFIRM: |-
Okay, from now on I'll only describe a place in full the first time
you come to it. To get the full description, say "look".
- ROCKY_TROLL: |-
Trolls are close relatives with the rocks and have skin as tough as
that of a rhinoceros. The troll fends off your blows effortlessly.
- TROLL_RETURNS: |-
The troll deftly catches the axe, examines it carefully, and tosses it
back, declaring, "Good workmanship, but it's not valuable enough."
- TROLL_SATISFIED: 'The troll catches your treasure and scurries away out of sight.'
- TROLL_BLOCKS: 'The troll refuses to let you cross.'
- BRIDGE_GONE: 'There is no longer any way across the chasm.'
- BEAR_HANDS: 'With what? Your bare hands? Against *HIS* bear hands??'
- BEAR_CONFUSED: 'The bear is confused; he only wants to be your friend.'
- ALREADY_DEAD: 'For crying out loud, the poor thing is already dead!'
- BEAR_CHAINED: 'The bear is still chained to the wall.'
- STILL_LOCKED: 'The chain is still locked.'
- CHAIN_UNLOCKED: 'The chain is now unlocked.'
- CHAIN_LOCKED: 'The chain is now locked.'
- NO_LOCKSITE: 'There is nothing here to which the chain can be locked.'
- WANT_HINT: 'Do you want the hint?'
- TROLL_VICES: 'Gluttony is not one of the troll''s vices. Avarice, however, is.'
- LAMP_DIM: |-
Your lamp is getting dim. You'd best start wrapping this up, unless
you can find some fresh batteries. I seem to recall there's a vending
machine in the maze. Bring some coins with you.
- LAMP_OUT: 'Your lamp has run out of power.'
- PLEASE_ANSWER: 'Please answer the question.'
- PIRATE_SPOTTED: |-
There are faint rustling noises from the darkness behind you. As you
turn toward them, the beam of your lamp falls across a bearded pirate.
He is carrying a large chest. "Shiver me timbers!" he cries, "I've
been spotted! I'd best hie meself off to the maze to hide me chest!"
With that, he vanishes into the gloom.
- GET_BATTERIES: 'Your lamp is getting dim. You''d best go back for those batteries.'
- REPLACE_BATTERIES: |-
Your lamp is getting dim. I'm taking the liberty of replacing the
batteries.
- MISSING_BATTERIES: |-
Your lamp is getting dim, and you're out of spare batteries. You'd
best start wrapping this up.
- REMOVE_MESSAGE: |-
You sift your fingers through the dust, but succeed only in
obliterating the cryptic message.
- CLUE_QUERY: |-
Hmmm, this looks like a clue, which means it'll cost you 10 points to
read it. Should I go ahead and read it anyway?
- WAYOUT_CLUE: |-
It says, "There is a way out of this place. Do you need any more
information to escape? Sorry, but this initial hint is all you get."
- DONT_UNDERSTAND: &dont_understand 'I''m afraid I don''t understand.'
- HAND_PASSTHROUGH: 'Your hand passes through it as though it weren''t there.'
- PROD_DWARF: |-
You prod the nearest dwarf, who wakes up grumpily, takes one look at
you, curses, and grabs for his axe.
- THIS_ACCEPTABLE: 'Is this acceptable?'
# This message is not currently used
#- ALREADY_OVER: |-
# This adventure is already over. To start a new adventure, or to
# resume an earlier adventure, please run a fresh copy of the program.
- OGRE_FULL: 'The ogre doesn''t appear to be hungry.'
- OGRE_DODGE: |-
The ogre, who despite his bulk is quite agile, easily dodges your
attack. He seems almost amused by your puny effort.
- OGRE_PANIC1: |-
The ogre, distracted by your rush, is struck by the knife. With a
blood-curdling yell he turns and bounds after the dwarves, who flee
in panic. You are left alone in the room.
- OGRE_PANIC2: |-
The ogre, distracted by your rush, is struck by the knife. With a
blood-curdling yell he turns and bounds after the dwarf, who flees
in panic. You are left alone in the room.
- FREE_FLY: 'The bird flies about agitatedly for a moment.'
- CAGE_FLY: 'The bird flies agitatedly about the cage.'
- NECKLACE_FLY: |-
The bird flies about agitatedly for a moment, then disappears through
the crack. It reappears shortly, carrying in its beak a jade
necklace, which it drops at your feet.
- WATER_URN: |-
You empty the bottle into the urn, which promptly ejects the water
with uncanny accuracy, squirting you directly between the eyes.
- OIL_URN: 'Your bottle is now empty and the urn is full of oil.'
- FULL_URN: 'The urn is already full of oil.'
- URN_NOPOUR: 'There''s no way to get the oil out of the urn.'
- URN_NOBUDGE: 'The urn is far too firmly embedded for your puny strength to budge it.'
- URN_GENIES: |-
As you rub the urn, there is a flash of light and a genie appears.
His aspect is stern as he advises: "One who wouldst traffic in
precious stones must first learn to recognize the signals thereof."
He wrests the urn from the stone, leaving a small cavity. Turning to
face you again, he fixes you with a steely eye and intones: "Caution!"
Genie and urn vanish in a cloud of amber smoke. The smoke condenses
to form a rare amber gemstone, resting in the cavity in the rock.
- DOUGHNUT_HOLES: 'I suppose you collect doughnut holes, too?'
- GEM_FITS: 'The gem fits easily into the cavity.'
- RUG_RISES: 'The persian rug stiffens and rises a foot or so off the ground.'
- RUG_WIGGLES: |-
The persian rug draped over your shoulder seems to wriggle for a
moment, but then subsides.
- RUG_SETTLES: 'The persian rug settles gently to the ground.'
- RUG_HOVERS: 'The rug hovers stubbornly where it is.'
- RUG_NOTHING1: 'The rug does not appear inclined to cooperate.'
- RUG_NOTHING2: |-
If you mean to use the persian rug, it does not appear inclined to
cooperate.
- FLAP_ARMS: 'Though you flap your arms furiously, it is to no avail.'
- RUG_GOES: |-
You board the persian rug, which promptly whisks you across the chasm.
You have time for a fleeting glimpse of a two thousand foot drop to a
mighty river; then you find yourself on the other side.
- RUG_RETURNS: 'The rug ferries you back across the chasm.'
- ALL_SILENT: 'All is silent.'
- STREAM_GURGLES: 'The stream is gurgling placidly.'
- WIND_WHISTLES: 'The wind whistles coldly past your ears.'
- STREAM_SPLASHES: 'The stream splashes loudly into the pool.'
- NO_MEANING: 'You are unable to make anything of the splashing noise.'
- MURMURING_SNORING: |-
You can hear the murmuring of the beanstalks and the snoring of the
dwarves.
- SNAKES_HISSING: 'A loud hissing emanates from the snake pit.'
- DULL_RUMBLING: 'The air is filled with a dull rumbling sound.'
- LOUD_ROAR: 'The roar is quite loud here.'
- TOTAL_ROAR: 'The roaring is so loud that it drowns out all other sound.'
- BIRD_CRAP: |-
The bird eyes you suspiciously and flutters away. A moment later you
feel something wet land on your head, but upon looking up you can see
no sign of the culprit.
- FEW_DROPS: 'There are only a few drops--not enough to carry.'
- NOT_BRIGHT: '(Uh, y''know, that wasn''t very bright.)'
- TOOK_LONG: 'It''s a pity you took so long about it.'
- UPSTREAM_DOWNSTREAM: 'Upstream or downstream?'
- FOREST_QUERY: !!null
- WATERS_CRASHING: 'The waters are crashing loudly against the shore.'
- THROWN_KNIVES: '%d of them throw knives at you!'
- MULTIPLE_HITS: '%d of them get you!'
- ONE_HIT: 'One of them gets you!'
- NONE_HIT: 'None of them hits you!'
- DONT_KNOW: 'Sorry, I don''t know the word "%s".'
- WHAT_DO: 'What do you want to do with the %s?'
- NO_SEE: 'I see no %s here.'
- DO_WHAT: '%s what?'
- OKEY_DOKEY: 'Okay, "%s".'
- GARNERED_POINTS: 'You have garnered %d out of a possible %d points, using %d turn%S.'
- SUSPEND_WARNING: |-
I can suspend your Adventure for you so that you can resume later, but
it will cost you 5 points.
- HINT_COST: 'I am prepared to give you a hint, but it will cost you %d point%S.'
- TOTAL_SCORE: 'You scored %d out of a possible %d, using %d turn%S.'
- NEXT_HIGHER: 'To achieve the next higher rating, you need %d more point%S.'
- NO_HIGHER: |-
To achieve the next higher rating would be a neat trick!
Congratulations!!
- OFF_SCALE: 'You just went off my scale!!'
- RESUME_HELP: 'To resume your Adventure, start a new game and then say "RESUME".'
# This message is not currently used
#- TABLE_SPACE: |-
# Table space used:
# %d of %d words of messages %d of %d travel options
# %d of %d vocabulary words %d of %d locations
# %d of %d objects %d of %d action verbs
# %d of %d "random" messages %d of %d "class" messages
# %d of %d hints %d of %d turn threshholds'
- RESUME_ABANDON: 'To resume an earlier Adventure, you must abandon the current one.'
- VERSION_SKEW: |-
I'm sorry, but that Adventure was begun using Version %d.%d of the
save file format, and this program uses Version %d.%d. You must find an instance
using that other version in order to resume that Adventure.
# This message is not currently used
#- SAVE_TAMPERING: |-
# A dark fog creeps in to surround you. From somewhere in the fog you
# hear a stern voice. "This Adventure has been tampered with! You have
# been dabbling in magic, knowing not the havoc you might cause thereby.
# Leave at once, before you do irrevocable harm!" The fog thickens,
# until at last you can see nothing at all. Your vision then clears,
# and you find yourself back in The Real World.
- TWIST_TURN: |-
Sorry, but the path twisted and turned so much that I can't figure
out which way to go to get back.
- GO_UNNEEDED: |-
You don't have to say "go" every time; just specify a direction or, if
it's nearby, name the place to which you wish to move.
- NUMERIC_REQUIRED:
This command requires a numeric argument.
classes:
- threshold: 0
message: !!null
- threshold: 45
message: 'You are obviously a rank amateur. Better luck next time.'
- threshold: 120
message: 'Your score qualifies you as a novice class adventurer.'
- threshold: 170
message: 'You have achieved the rating: "Experienced Adventurer".'
- threshold: 250
message: 'You may now consider yourself a "Seasoned Adventurer".'
- threshold: 320
message: 'You have reached "Junior Master" status.'
- threshold: 375
message: 'Your score puts you in Master Adventurer Class C.'
- threshold: 410
message: 'Your score puts you in Master Adventurer Class B.'
- threshold: 426
message: 'Your score puts you in Master Adventurer Class A.'
- threshold: 429
message: 'All of Adventuredom gives tribute to you, Adventurer Grandmaster!'
- threshold: 9999
message: |-
'Adventuredom stands in awe -- you have now joined the ranks of the
W O R L D C H A M P I O N A D V E N T U R E R S !
It may interest you to know that the Dungeon-Master himself has, to
my knowledge, never achieved this threshhold in fewer than 330 turns.'
turn_thresholds:
- threshold: 350
point_loss: 2
message: |-
Tsk! A wizard wouldn't have to take 350 turns. This is going to cost
you a couple of points.
- threshold: 500
point_loss: 3
message: '500 turns? That''s another few points you''ve lost.'
- threshold: 1000
point_loss: 5
message: 'Are you still at it? Five points off for exceeding 1000 turns!'
- threshold: 2500
point_loss: 10
message: |-
Good grief, don't you *EVER* give up? Do you realize you've spent
over 2500 turns at this? That's another ten points off, a total of
twenty points lost for taking so long.
objects: !!omap
- NO_OBJECT:
inventory: !!null
descriptions: !!null
- KEYS:
words: ['keys', 'key']
inventory: 'Set of keys'
locations: LOC_BUILDING
descriptions:
- 'There are some keys on the ground here.'
- LAMP:
words: ['lamp', 'lante']
inventory: 'Brass lantern'
locations: LOC_BUILDING
states: [LAMP_DARK, LAMP_BRIGHT]
descriptions:
- 'There is a shiny brass lamp nearby.'
- 'There is a lamp shining nearby.'
changes:
- 'Your lamp is now off.'
- 'Your lamp is now on.'
- GRATE:
words: ['grate']
inventory: '*grate'
locations: [LOC_GRATE, LOC_BELOWGRATE]
immovable: true
states: [GRATE_CLOSED, GRATE_OPEN]
descriptions:
- 'The grate is locked.'
- 'The grate is open.'
changes:
- 'The grate is now locked.'
- 'The grate is now unlocked.'
- CAGE:
words: ['cage']
inventory: 'Wicker cage'
locations: LOC_COBBLE
descriptions:
- 'There is a small wicker cage discarded nearby.'
- ROD:
words: ['rod']
inventory: 'Black rod'
locations: LOC_DEBRIS
descriptions:
- 'A three foot black rod with a rusty star on an end lies nearby.'
- ROD2:
words: ['rod']
inventory: 'Black rod'
locations: LOC_NOWHERE
descriptions:
- 'A three foot black rod with a rusty mark on an end lies nearby.'
- STEPS:
words: ['steps']
inventory: '*steps'
locations: [LOC_PITTOP, LOC_MISTHALL]
immovable: true
states: [STEPS_DOWN, STEPS_UP]
descriptions:
- 'Rough stone steps lead down the pit.'
- 'Rough stone steps lead up the dome.'
- BIRD:
words: ['bird']
inventory: 'Little bird in cage'
locations: LOC_BIRD
states: [BIRD_UNCAGED, BIRD_CAGED, BIRD_FOREST_UNCAGED]
descriptions:
- 'A cheerful little bird is sitting here singing.'
- 'There is a little bird in the cage.'
- 'A cheerful little bird is sitting here singing.'
sounds:
- 'The bird''s singing is quite melodious.'
- 'The bird does not seem inclined to sing while in the cage.'
- 'It almost seems as though the bird is trying to tell you something.'
- |-
To your surprise, you can understand the bird''s chirping; it is
singing about the joys of its forest home.
- 'The bird does not seem inclined to sing while in the cage.'
- |-
The bird is singing to you in gratitude for your having returned it to
its home. In return, it informs you of a magic word which it thinks
you may find useful somewhere near the Hall of Mists. The magic word
changes frequently, but for now the bird believes it is "%s". You
thank the bird for this information, and it flies off into the forest.
- DOOR:
words: ['door']
inventory: '*rusty door'
locations: LOC_IMMENSE
immovable: true
states: [DOOR_RUSTED, DOOR_UNRUSTED]
descriptions:
- 'The way north is barred by a massive, rusty, iron door.'
- 'The way north leads through a massive, rusty, iron door.'
changes:
- 'The hinges are quite thoroughly rusted now and won''t budge.'
- |-
The oil has freed up the hinges so that the door will now move,
although it requires some effort.
- PILLOW:
words: ['pillo', 'velve']
inventory: 'Velvet pillow'
locations: LOC_SOFTROOM
descriptions:
- 'A small velvet pillow lies on the floor.'
- SNAKE:
words: ['snake']
inventory: '*snake'
locations: LOC_KINGHALL
immovable: true
states: [SNAKE_BLOCKS, SNAKE_CHASED]
descriptions:
- 'A huge green fierce snake bars the way!'
- '' # chased away
sounds:
- 'The snake is hissing venomously.'
- ''
- FISSURE:
words: ['fissu']
inventory: '*fissure'
locations: [LOC_EASTBANK, LOC_WESTBANK]
immovable: true
states: [UNBRIDGED, BRIDGED]
descriptions:
- ''
- 'A crystal bridge spans the fissure.'
changes:
- 'The crystal bridge has vanished!'
- 'A crystal bridge now spans the fissure.'
- OBJ_13:
words: ['table']
inventory: '*stone tablet'
locations: LOC_DARKROOM
immovable: true
descriptions:
- |-
A massive stone tablet imbedded in the wall reads:
"Congratulations on bringing light into the dark-room!"
texts:
- '"Congratulations on bringing light into the dark-room!"'
- CLAM:
words: ['clam']
inventory: 'Giant clam >GRUNT!<'
locations: LOC_SHELLROOM
descriptions:
- 'There is an enormous clam here with its shell tightly closed.'
sounds:
- 'The clam is as tight-mouthed as a, er, clam.'
- OYSTER:
words: ['oyste']
inventory: 'Giant oyster >GROAN!<'
locations: LOC_NOWHERE
descriptions:
- 'There is an enormous oyster here with its shell tightly closed.'
- 'Interesting. There seems to be something written on the underside of\nthe oyster.'
sounds:
- 'Even though it''s an oyster, the critter''s as tight-mouthed as a clam.'
- 'It says the same thing it did before. Hm, maybe it''s a pun?'
- MAGAZINE:
words: ['magaz', 'issue', 'spelu', '"spel']
inventory: '"Spelunker Today"'
locations: LOC_ANTEROOM
descriptions:
- 'There are a few recent issues of "Spelunker Today" magazine here.'
texts:
- |-
I'm afraid the magazine is written in dwarvish. But pencilled on one
cover you see, "Please leave the magazines at the construction site."
- DWARF:
words: ['dwarf', 'dwarv']
inventory: !!null
locations: LOC_NOWHERE
immovable: true
descriptions: !!null
- KNIFE:
words: ['knife', 'knive']
inventory: !!null
locations: LOC_NOWHERE
descriptions: !!null
- FOOD:
words: ['food', 'ratio']
inventory: 'Tasty food'
locations: LOC_BUILDING
descriptions:
- 'There is food here.'
- BOTTLE:
words: ['bottl', 'jar']
inventory: 'Small bottle'
locations: LOC_BUILDING
states: [WATER_BOTTLE, EMPTY_BOTTLE, OIL_BOTTLE]
descriptions:
- 'There is a bottle of water here.'
- 'There is an empty bottle here.'
- 'There is a bottle of oil here.'
changes:
- 'Your bottle is now full of water.'
- 'The bottle of water is now empty.'
- 'Your bottle is now full of oil.'
- WATER:
words: ['water', 'h2o']
inventory: 'Water in the bottle'
locations: LOC_NOWHERE
descriptions: !!null
- OIL:
words: ['oil']
inventory: 'Oil in the bottle'
locations: LOC_NOWHERE
descriptions: !!null
- MIRROR:
words: ['mirro']
inventory: '*mirror'
locations: LOC_MIRRORCANYON
immovable: true
states: [MIRROR_UNBROKEN, MIRROR_BROKEN]
descriptions:
- ''
- ''
changes:
- ''
- |-
You strike the mirror a resounding blow, whereupon it shatters into a
myriad tiny fragments.
- PLANT:
words: ['plant', 'beans']
inventory: '*plant'
locations: LOC_WESTPIT
immovable: true
states: [PLANT_THIRSTY, PLANT_BELLOWING, PLANT_GROWN]
descriptions:
- 'There is a tiny little plant in the pit, murmuring "water, water, ..."'
- 'There is a 12-foot-tall beanstalk stretching up out of the pit,\nbellowing "WATER!! WATER!!"'
- 'There is a gigantic beanstalk stretching all the way up to the hole.'
changes:
- 'You''ve over-watered the plant! It''s shriveling up! And now . . .'
- 'The plant spurts into furious growth for a few seconds.'
- 'The plant grows explosively, almost filling the bottom of the pit.'
sounds:
- 'The plant continues to ask plaintively for water.'
- 'The plant continues to demand water.'
- 'The plant now maintains a contented silence.'
- PLANT2:
words: ['plant']
inventory: '*phony plant' # seen in Twopit Room only when tall enough
locations: [LOC_WESTEND, LOC_EASTEND]
immovable: true
descriptions:
- ''
- 'The top of a 12-foot-tall beanstalk is poking out of the west pit.'
- 'There is a huge beanstalk growing out of the west pit up to the hole.'
- OBJ_26:
words: ['stala']
inventory: '*stalactite'
locations: LOC_TOPSTALACTITE
immovable: true
descriptions:
- ''
- OBJ_27:
words: ['shado', 'figur', 'windo']
inventory: '*shadowy figure and/or window'
locations: [LOC_WINDOW1, LOC_WINDOW2]
immovable: true
descriptions:
- 'The shadowy figure seems to be trying to attract your attention.'
- AXE:
words: ['axe']
inventory: 'Dwarf''s axe'
locations: LOC_NOWHERE
states: [AXE_HERE, AXE_LOST]
descriptions:
- 'There is a little axe here.'
- 'There is a little axe lying beside the bear.'
changes:
- ''
- 'The axe misses and lands near the bear where you can''t get at it.'
- OBJ_29:
words: ['drawi']
inventory: '*cave drawings'
locations: LOC_ORIENTAL
immovable: true
descriptions: !!null
- OBJ_30:
words: ['pirat', 'genie', 'djinn']
inventory: '*pirate/genie'
locations: LOC_NOWHERE
immovable: true
descriptions: !!null # never present
- DRAGON:
words: ['drago']
inventory: '*dragon'
locations: [LOC_SECRET4, LOC_SECRET6]
immovable: true
states: [DRAGON_BARS, DRAGON_DEAD, DRAGON_BLOODLESS]
descriptions:
- 'A huge green fierce dragon bars the way!'
- 'The blood-specked body of a huge green dead dragon lies to one side.'
- 'The body of a huge green dead dragon is lying off to one side.'
changes:
- ''
- |-
Congratulations! You have just vanquished a dragon with your bare
hands! (Unbelievable, isn't it?)
- 'Your head buzzes strangely for a moment.'
sounds:
- 'The dragon''s ominous hissing does not bode well for you.'
- 'The dragon is, not surprisingly, silent.'
- 'The dragon is, not surprisingly, silent.'
- CHASM:
words: ['chasm']
inventory: '*chasm'
locations: [LOC_SWCHASM, LOC_NECHASM]
immovable: true
states: [TROLL_BRIDGE, BRIDGE_WRECKED]
descriptions:
- 'A rickety wooden bridge extends across the chasm, vanishing into the\nmist. A notice posted on the bridge reads, "Stop! Pay troll!"'
- 'The wreckage of a bridge (and a dead bear) can be seen at the bottom\nof the chasm.'
changes:
- ''
- |-
Just as you reach the other side, the bridge buckles beneath the
weight of the bear, which was still following you around. You
scrabble desperately for support, but as the bridge collapses you
stumble back and fall into the chasm.
- TROLL:
words: ['troll']
inventory: '*troll'
locations: [LOC_SWCHASM, LOC_NECHASM]
immovable: true
states: [TROLL_UNPAID, TROLL_PAIDONCE, TROLL_GONE]
descriptions:
- 'A burly troll stands by the bridge and insists you throw him a\ntreasure before you may cross.'
- 'The troll steps out from beneath the bridge and blocks your way.'
- '' # chased away
changes:
- ''
- ''
- |-
The bear lumbers toward the troll, who lets out a startled shriek and
scurries away. The bear soon gives up the pursuit and wanders back.
sounds:
- 'The troll sounds quite adamant in his demand for a treasure.'
- 'The troll sounds quite adamant in his demand for a treasure.'
- ''
- TROLL2:
words: ['troll']
inventory: '*phony troll'
locations: [LOC_NOWHERE, LOC_NOWHERE]
immovable: true
descriptions:
- 'The troll is nowhere to be seen.'
- BEAR:
words: ['bear']
inventory: !!null
locations: LOC_BARRENROOM
immovable: true
states: [UNTAMED_BEAR, SITTING_BEAR, CONTENTED_BEAR, BEAR_DEAD]
descriptions:
- 'There is a ferocious cave bear eying you from the far end of the room!'
- 'There is a gentle cave bear sitting placidly in one corner.'
- 'There is a contented-looking bear wandering about nearby.'
- ''
changes:
- ''
- 'The bear eagerly wolfs down your food, after which he seems to calm\ndown considerably and even becomes rather friendly.'
- ''
- ''
- MESSAG:
words: ['messa']
inventory: '*message in second maze'
locations: LOC_NOWHERE
immovable: true
descriptions:
- |-
There is a message scrawled in the dust in a flowery script, reading:
"This is not the maze where the pirate leaves his treasure chest."
texts:
- '"This is not the maze where the pirate leaves his treasure chest."'
- VOLCANO:
words: ['volca', 'geyse']
inventory: '*volcano and/or geyser'
locations: LOC_BREATHTAKING
immovable: true
descriptions: !!null
- VEND:
words: ['machi', 'vendi']
inventory: '*vending machine'
locations: LOC_DEADEND13
immovable: true
states: [VEND_BLOCKS, VEND_UNBLOCKS]
descriptions:
- |-
There is a massive and somewhat battered vending machine here. The
instructions on it read: "Drop coins here to receive fresh batteries."
- |-
There is a massive vending machine here, swung back to reveal a
southward passage.
changes:
- 'The vending machine swings back to block the passage.'
- 'As you strike the vending machine, it pivots backward along with a\nsection of wall, revealing a dark passage leading south.'
texts:
- '"Drop coins here to receive fresh batteries."'
- '"Drop coins here to receive fresh batteries."'
- BATTERY:
words: ['batte']
inventory: 'Batteries'
locations: LOC_NOWHERE
states: [FRESH_BATTERIES, DEAD_BATTERIES]
descriptions:
- 'There are fresh batteries here.'
- 'Some worn-out batteries have been discarded nearby.'
- OBJ_40:
words: ['carpe', 'moss']
inventory: '*carpet and/or moss and/or curtains'
locations: LOC_SOFTROOM
immovable: true
descriptions: !!null
- OGRE:
words: ['ogre']
inventory: '*ogre'
locations: LOC_LARGE
immovable: true
descriptions:
- 'A formidable ogre bars the northern exit.'
sounds:
- 'The ogre is apparently the strong, silent type.'
- URN:
words: ['urn']
inventory: '*urn'
locations: LOC_CLIFF
immovable: true
states: [URN_EMPTY, URN_DARK, URN_LIT]
descriptions:
- 'A small urn is embedded in the rock.'
- 'A small urn full of oil is embedded in the rock.'
- 'A small oil flame extrudes from an urn embedded in the rock.'
changes:
- 'The urn is empty and will not light.'
- 'The urn is now dark.'
- 'The urn is now lit.'
- CAVITY:
words: ['cavit']
inventory: '*cavity'
locations: LOC_NOWHERE
immovable: true
states: [CAVITY_FULL, CAVITY_EMPTY]
descriptions:
- '' # something in it
- 'There is a small urn-shaped cavity in the rock.'
- BLOOD:
words: ['blood']
inventory: '*blood'
locations: LOC_NOWHERE
immovable: true
descriptions:
- '' # described with dragon
- RESER:
words: ['reser']
inventory: '*reservoir'
locations: [LOC_RESERVOIR, LOC_RESNORTH]
immovable: true
states: [WATERS_UNPARTED, WATERS_PARTED]
descriptions:
- ''
- 'The waters have parted to form a narrow path across the reservoir.'
changes:
- 'The waters crash together again.'
- 'The waters have parted to form a narrow path across the reservoir.'
- OBJ_46:
words: ['appen', 'lepor']
inventory: 'Leporine appendage'
locations: LOC_FOREST22
descriptions:
- 'Your keen eye spots a severed leporine appendage lying on the ground.'
- OBJ_47:
words: ['mud']
inventory: '*mud'
locations: LOC_DEBRIS
immovable: true
descriptions:
- ''
texts:
- '"MAGIC WORD XYZZY"'
- OBJ_48:
words: ['note']
inventory: '*note'
locations: LOC_NUGGET
immovable: true
descriptions:
- ''
texts:
- '"You won''t get it up the steps"'
- SIGN:
words: ['sign']
inventory: '*sign'
locations: LOC_ANTEROOM
immovable: true
states: [INGAME_SIGN, ENDGAME_SIGN]
descriptions:
- ''
- ''
texts:
- |-
Cave under construction beyond this point.
Proceed at own risk.
[Witt Construction Company]
- '"Treasure Vault. Keys in main office."'
- NUGGET:
words: ['gold', 'nugge']
inventory: 'Large gold nugget'
locations: LOC_NUGGET
treasure: true
descriptions:
- 'There is a large sparkling nugget of gold here!'
- OBJ_51:
words: ['diamo']
inventory: 'Several diamonds'
locations: LOC_WESTBANK
treasure: true
descriptions:
- 'There are diamonds here!'
- OBJ_52:
words: ['silve', 'bars']
inventory: 'Bars of silver'
locations: LOC_FLOORHOLE
treasure: true
descriptions:
- 'There are bars of silver here!'
- OBJ_53:
words: ['jewel']
inventory: 'Precious jewelry'
locations: LOC_SOUTHSIDE
treasure: true
descriptions:
- 'There is precious jewelry here!'
- COINS:
words: ['coins']
inventory: 'Rare coins'
locations: LOC_WESTSIDE
treasure: true
descriptions:
- 'There are many coins here!'
- CHEST:
words: ['chest', 'box', 'treas']
inventory: 'Treasure chest'
locations: LOC_NOWHERE
treasure: true
descriptions:
- 'The pirate''s treasure chest is here!'
- EGGS:
words: ['eggs', 'egg', 'nest']
inventory: 'Golden eggs'
locations: LOC_GIANTROOM
treasure: true
states: [EGGS_HERE, EGGS_VANISHED, EGGS_DONE]
descriptions:
- 'There is a large nest here, full of golden eggs!'
- 'The nest of golden eggs has vanished!'
- 'Done!'
- TRIDENT:
words: ['tride']
inventory: 'Jeweled trident'
locations: LOC_WATERFALL
treasure: true
descriptions:
- 'There is a jewel-encrusted trident here!'
- VASE:
words: ['vase', 'ming', 'shard', 'potte']
inventory: 'Ming vase'
locations: LOC_ORIENTAL
treasure: true
states: [VASE_WHOLE, VASE_DROPPED, VASE_BROKEN]
descriptions:
- 'There is a delicate, precious, ming vase here!'
- 'The floor is littered with worthless shards of pottery.'
- 'The floor is littered with worthless shards of pottery.'
changes:
- 'The vase is now resting, delicately, on a velvet pillow.'
- 'The ming vase drops with a delicate crash.'
- 'You have taken the vase and hurled it delicately to the ground.'
- EMERALD:
words: ['emera']
inventory: 'Egg-sized emerald'
locations: LOC_PLOVER
treasure: true
descriptions:
- 'There is an emerald here the size of a plover''s egg!'
- 'There is an emerald resting in a small cavity in the rock!'
- PYRAMID:
words: ['plati', 'pyram']
inventory: 'Platinum pyramid'
locations: LOC_DARKROOM
treasure: true
descriptions:
- 'There is a platinum pyramid here, 8 inches on a side!'
- PEARL:
words: ['pearl']
inventory: 'Glistening pearl'
locations: LOC_NOWHERE
treasure: true
descriptions:
- 'Off to one side lies a glistening pearl!'
- RUG:
words: ['rug', 'persi']
inventory: 'Persian rug'
locations: [LOC_SECRET4, LOC_SECRET6]
immovable: true
treasure: true
states: [RUG_FLOOR, RUG_DRAGON, RUG_HOVER]
descriptions:
- 'There is a persian rug spread out on the floor!'
- 'The dragon is sprawled out on a persian rug!!'
- 'There is a persian rug here, hovering in mid-air!'
- OBJ_63:
words: ['spice']
inventory: 'Rare spices'
locations: LOC_BOULDERS2
treasure: true
descriptions:
- 'There are rare spices here!'
- CHAIN:
words: ['chain']
inventory: 'Golden chain'
locations: LOC_BARRENROOM
immovable: true
treasure: true
states: [CHAIN_HEAP, CHAINING_BEAR, CHAIN_FIXED]
descriptions:
- 'There is a golden chain lying in a heap on the floor!'
- 'The bear is locked to the wall with a golden chain!'
- 'There is a golden chain locked to the wall!'
- RUBY:
words: ['ruby']
inventory: 'Giant ruby'
locations: LOC_STOREROOM
treasure: true
descriptions:
- 'There is an enormous ruby here!'
- 'There is a ruby resting in a small cavity in the rock!'
- JADE:
words: ['jade', 'neckl']
inventory: 'Jade necklace'
locations: LOC_NOWHERE
treasure: true
descriptions:
- 'A precious jade necklace has been dropped here!'
- AMBER:
words: ['amber', 'gemst']
inventory: 'Amber gemstone'
locations: LOC_NOWHERE
treasure: true
states: [AMBER_IN_URN, AMBER_IN_ROCK]
descriptions:
- 'There is a rare amber gemstone here!'
- 'There is an amber gemstone resting in a small cavity in the rock!'
- SAPPH:
words: ['sapph']
inventory: 'Star sapphire'
locations: LOC_LEDGE
treasure: true
descriptions:
- 'A brilliant blue star sapphire is here!'
- 'There is a star sapphire resting in a small cavity in the rock!'
- OBJ_69:
words: ['ebony', 'statu']
inventory: 'Ebony statuette'
locations: LOC_REACHDEAD
treasure: true
descriptions:
- 'There is a richly-carved ebony statuette here!'
obituaries:
- query: |-
Oh dear, you seem to have gotten yourself killed. I might be able to
help you out, but I've never really done this before. Do you want me
to try to reincarnate you?
yes_response: |-
All right. But don't blame me if something goes wr......
--- POOF!! ---
You are engulfed in a cloud of orange smoke. Coughing and gasping,
you emerge from the smoke and find....
- query: |-
You clumsy oaf, you've done it again! I don't know how long I can
keep this up. Do you want me to try reincarnating you again?
yes_response: |-
Okay, now where did I put my orange smoke?.... >POOF!<
Everything disappears in a dense cloud of orange smoke.
- query: |-
Now you've really done it! I'm out of orange smoke! You don't expect
me to do a decent reincarnation without any orange smoke, do you?
yes_response: 'Okay, if you''re so smart, do it yourself! I''m leaving!'
actions: !!omap
- ACT_NULL:
message: !!null
words: !!null
- CARRY:
message: *already_carrying
words: ['g', 'carry', 'take', 'keep', 'catch',
'steal', 'captu', 'get', 'tote', 'snarf']
oldstyle: false
- DROP:
message: *arent_carrying
words: ['drop', 'relea', 'free', 'disca', 'dump']
- SAY:
message: NO_MESSAGE
words: ['say', 'chant', 'sing', 'utter', 'mumbl']
- UNLOCK:
message: *not_lockable
words: ['unloc', 'open']
- NOTHING:
message: NO_MESSAGE
words: ['z', 'nothi']
oldstyle: false
- LOCK:
message: *not_lockable
words: ['lock', 'close']
- LIGHT:
message: *dont_understand
words: ['light', 'on']
- EXTINGUISH:
message: *dont_understand
words: ['extin', 'off']
- WAVE:
message: *nothing_happens
words: ['wave', 'shake', 'swing']
- TAME:
message: *am_game
words: ['calm', 'placa', 'tame']
- GO:
message: *where_query
words: ['walk', 'run', 'trave', 'go', 'proce',
'conti', 'explo', 'follo', 'turn']
- ATTACK:
message: *ridiculous_attempt
words: ['attac', 'kill', 'fight', 'hit', 'strik', 'slay']
- POUR:
message: *arent_carrying
words: ['pour']
- EAT:
message: *ridiculous_attempt
words: ['eat', 'devou']
- DRINK:
message: |-
You have taken a drink from the stream. The water tastes strongly of
minerals, but is not unpleasant. It is extremely cold.
words: ['drink']
- RUB:
message: |-
Rubbing the electric lamp is not particularly rewarding. Anyway,
nothing exciting happens.
words: ['rub']
- THROW:
message: *arent_carrying
words: ['throw', 'toss']
- QUIT:
message: *huh_man
words: ['quit']
- FIND:
message: *nearby
words: ['find', 'where']
- INVENTORY:
message: *nearby
words: ['i', 'inven']
oldstyle: false
- FEED:
message: 'There is nothing here to eat.'
words: ['feed']
- FILL:
message: 'You can''t fill that.'
words: ['fill']
- BLAST:
message: *requires_dynamite
words: ['blast', 'deton', 'ignit', 'blowu']
- SCORE:
message: *huh_man
words: ['score']
- FEE:
message: *not_knowhow
words: ['fee']
- FIE:
message: *not_knowhow
words: ['fie']
- FOE:
message: *not_knowhow
words: ['foe']
- FOO:
message: *not_knowhow
words: ['foo']
- FUM:
message: *not_knowhow
words: ['fum']
- BRIEF:
message: 'On what?'
words: ['brief']
- READ:
message: *dont_understand
words: ['read', 'perus']
- BREAK:
message: *beyond_power
words: ['break', 'shatt', 'smash']
- WAKE:
message: *ridiculous_attempt
words: ['wake', 'distu']
- SAVE:
message: *huh_man
words: ['suspe', 'pause', 'save']
- RESUME:
message: *huh_man
words: ['resum', 'resta']
- FLY:
message: *am_game
words: ['fly']
- LISTEN:
message: *dont_understand
words: ['liste']
- PART:
message: *nothing_happens
words: ['z''zzz']
- SEED:
message: 'Seed set to %d'
words: ['seed']
- WASTE:
message: 'Game limit is now %d'
words: ['waste']
- ACT_UNKNOWN:
message: *huh_man
words: !!null
- THANKYOU:
message: 'You''re quite welcome.'
words: ['thank']
noaction: true
- INVALIDMAGIC:
message: 'Good try, but that is an old worn-out magic word.'
words: ['sesam', 'opens', 'abra', 'abrac', 'shaza', 'hocus', 'pocus']
noaction: true
- HELP:
message: |-
I know of places, actions, and things. Most of my vocabulary
describes places and is used to move you there. To move, try words
like forest, building, downstream, enter, east, west, north, south,
up, or down. I know about a few special objects, like a black rod
hidden in the cave. These objects can be manipulated using some of
the action words that I know. Usually you will need to give both the
object and action words (in either order), but sometimes I can infer
the object from the verb alone. Some objects also imply verbs; in
particular, "inventory" implies "take inventory", which causes me to
give you a list of what you're carrying. Some objects have unexpected
effects; the effects are not always desirable! Usually people having
trouble moving just need to try a few more words. Usually people
trying unsuccessfully to manipulate an object are attempting something
beyond their (or my!) capabilities and should try a completely
different tack. One point often confusing to beginners is that, when
there are several ways to go in a certain direction (e.g., if there
are several holes in a wall), choosing that direction in effect
chooses one of the ways at random; often, though, by specifying the
place you want to reach you can guarantee choosing the right path.
Also, to speed the game you can sometimes move long distances with a
single word. For example, "building" usually gets you to the building
from anywhere above ground except when lost in the forest. Also, note
that cave passages and forest paths turn a lot, so leaving one place
heading north doesn't guarantee entering the next from the south.
However (another important point), except when you've used a "long
distance" word such as "building", there is always a way to go back
where you just came from unless I warn you to the contrary, even
though the direction that takes you back might not be the reverse of
what got you here. Good luck, and have fun!
words: ['help', '?']
noaction: true
- NO:
message: *ok_man
words: ['no']
noaction: true
- TREE:
message: |-
The trees of the forest are large hardwood oak and maple, with an
occasional grove of pine or spruce. There is quite a bit of under-
growth, largely birch and ash saplings plus nondescript bushes of
various sorts. This time of year visibility is quite restricted by
all the leaves, but travel is quite easy if you detour around the
spruce and berry bushes.
words: ['tree', 'trees']
noaction: true
- DIG:
message: |-
Digging without a shovel is quite impractical. Even with a shovel
progress is unlikely.
words: ['dig', 'excav']
noaction: true
- LOST:
message: 'I''m as confused as you are.'
words: ['lost']
noaction: true
- MIST:
message: |-
Mist is a white vapor, usually water, seen from time to time in
caverns. It can be found anywhere but is frequently a sign of a deep
pit leading down to water.'
words: ['mist']
noaction: true
- FBOMB:
message: 'Watch it!'
words: ['fuck']
noaction: true
- STOP:
message: 'I don''t know the word "stop". Use "quit" if you want to give up.'
words: ['stop']
noaction: true
- INFO:
message: |-
For a summary of the most recent changes to the game, say "news".
If you want to end your adventure early, say "quit". To suspend your
adventure such that you can continue later, say "suspend" (or "pause"
or "save"). To see how well you're doing, say "score". To get full
credit for a treasure, you must have left it safely in the building,
though you get partial credit just for locating it. You lose points
for getting killed, or for quitting, though the former costs you more.
There are also points based on how much (if any) of the cave you've
managed to explore; in particular, there is a large bonus just for
getting in (to distinguish the beginners from the rest of the pack),
and there are other ways to determine whether you've been through some
of the more harrowing sections. If you think you've found all the
treasures, just keep exploring for a while. If nothing interesting
happens, you haven't found them all yet. If something interesting
*DOES* happen (incidentally, there *ARE* ways to hasten things along),
it means you're getting a bonus and have an opportunity to garner many
more points in the Master's section. I may occasionally offer hints
if you seem to be having trouble. If I do, I'll warn you in advance
how much it will affect your score to accept the hints. Finally, to
save time, you may specify "brief", which tells me never to repeat the
full description of a place unless you explicitly ask me to.
words: ['info', 'infor']
noaction: true
- SWIM:
message: *not_knowhow
words: ['swim']
noaction: true
- WIZARD:
message: 'Wizards are not to be disturbed by such as you.'
words: ['wizar']
noaction: true
- "YES":
message: 'Guess again.'
words: ['yes']
noaction: true
- NEWS:
message: |-
Open Adventure is an author-approved open-source release of
Version 2.5 with, as yet, no gameplay changes.
Version 2.5 was essentially the same as Version II; the cave and the
hazards therein are unchanged, and top score is still 430 points.
There are a few more hints, especially for some of the more obscure
puzzles. There are a few minor bugfixes and cosmetic changes. You
can now save a game and resume it at once (formerly you had to wait a
while first), but it now costs you a few points each time you save the
game. Saved games are now stored in much smaller files than before.
words: ['news']
noaction: true
- ACT_VERSION:
message: |-
There is a puff of orange smoke; within it, fiery runes spell out:
\tOpen Adventure %V - http://www.catb.org/esr/open-adventure/
words: ['versi']
noaction: true
# end
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/cheat.c 0000664 0000000 0000000 00000005453 13157513121 0024117 0 ustar 00root root 0000000 0000000 /*
* 'cheat' is a tool for generating save game files to test states that ought
* not happen. It leverages chunks of advent, mostly initialize() and
* savefile(), so we know we're always outputing save files that advent
* can import.
*/
#include
#include
#include
#include
#include "advent.h"
int main(int argc, char *argv[])
{
int ch;
char *savefilename = NULL;
int version = 0;
FILE *fp = NULL;
// Initialize game variables
initialise();
/* we're generating a saved game, so saved once by default,
* unless overridden with command-line options below.
*/
game.saved = 1;
/* Options. */
const char* opts = "d:l:s:t:v:o:";
const char* usage = "Usage: %s [-d numdie] [-s numsaves] [-v version] -o savefilename \n"
" -d number of deaths. Signed integer.\n"
" -l lifetime of lamp in turns. Signed integer.\n"
" -s number of saves. Signed integer.\n"
" -t number of turns. Signed integer.\n"
" -v version number of save format.\n"
" -o required. File name of save game to write.\n";
while ((ch = getopt(argc, argv, opts)) != EOF) {
switch (ch) {
case 'd':
game.numdie = (turn_t)atoi(optarg);
printf("cheat: game.numdie = %ld\n", game.numdie);
break;
case 'l':
game.limit = (turn_t)atoi(optarg);
printf("cheat: game.limit = %ld\n", game.limit);
break;
case 's':
game.saved = (long)atoi(optarg);
printf("cheat: game.saved = %ld\n", game.saved);
break;
case 't':
game.turns = (turn_t)atoi(optarg);
printf("cheat: game.turns = %ld\n", game.turns);
break;
case 'v':
version = atoi(optarg);
printf("cheat: version = %d\n", version);
break;
case 'o':
savefilename = optarg;
break;
default:
fprintf(stderr,
usage, argv[0]);
exit(EXIT_FAILURE);
break;
}
}
// Save filename required; the point of cheat is to generate save file
if (savefilename == NULL) {
fprintf(stderr,
usage, argv[0]);
fprintf(stderr,
"ERROR: filename required\n");
exit(EXIT_FAILURE);
}
fp = fopen(savefilename, WRITE_MODE);
if (fp == NULL) {
fprintf(stderr,
"Can't open file %s. Exiting.\n", savefilename);
exit(EXIT_FAILURE);
}
savefile(fp, version);
fclose(fp);
printf("cheat: %s created.\n", savefilename);
return EXIT_SUCCESS;
}
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/control 0000664 0000000 0000000 00000001456 13157513121 0024271 0 ustar 00root root 0000000 0000000 # This is not a real Debian control file
# It's project metadata for the shipper tool
Package: open-adventure
Description: Colossal Cave Adventure, the 1995 430-point version.
This is the last descendent of the original 1976 Colossal Cave Adventure
worked on by the original authors - Crowther & Woods. It has sometimes
been known as Adventure 2.5. The original PDP-10 name 'advent' is used
for the built program to avoid collision with the BSD Games version.
#XBS-Destinations: freshcode
Homepage: http://www.catb.org/~esr/open-adventure
XBS-HTML-Target: index.html
XBS-Repository-URL: https://gitlab.com/esr/open-adventure
XBS-IRC-Channel: irc://chat.freenode.net/#open-adventure
XBS-Project-Tags: Games/Entertainment
XBS-VC-Tag-Template: %(version)s
XBS-Logo: lamp.png
XBS-Validate: make check
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/hints.adoc 0000664 0000000 0000000 00000001174 13157513121 0024640 0 ustar 00root root 0000000 0000000 = Non-spoiler hints =
Say the words you see. They can have interesting effects.
Reading is fundamental.
Yes, the fissure in the Hall of Mists can be bridged. By magic.
"Free bird": It's more than an epic guitar solo. Do it twice!
There is a legend that if you drink the blood of a dragon, you will
be able to understand the speech of birds.
That vending machine? It would be better off dead.
Ogres laugh at humans, but for some reason dwarves frighten them badly.
When rust is a problem, oil can be helpful.
A lucky rabbit's foot might help you keep your footing.
The troll might go away when you are no longer unbearable.
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/history.adoc 0000664 0000000 0000000 00000016676 13157513121 0025231 0 ustar 00root root 0000000 0000000 = A brief history of Colossal Cave Adventure =
by Eric S. Raymond
Adventure is the fons et origo of all later dungeon-crawling computer
games, the grandaddy of interactive fiction, and one of the hallowed
artifacts of hacker folklore.
The very first version was released by Crowther in 1976, in FORTRAN on
the PDP-10 at Bolt, Beranek, and Newman. (Crowther was at the time
writing what we could now call firmware for the earliest ARPANET
routers.) It was a maze game based on the Colossal Cave complex in
Kentucky, including fewer of the D&D-like elements now associated with
the game.
Adventure as we now know it, the ancestor of all later versions, was
released on a PDP-10 at the Stanford AI Lab by Don Woods in 1977
(some sources, apparently erroneously, say 1976). That version is
sometimes known as 350-point Adventure.
Between 1977 and 1995 Crowther and Woods themselves continued to work
intermittently on the game. This main line of development culminated
in the 1995 release of Adventure 2.5, also known as 430-point Adventure
The earliest port to C was by Jim Gillogly under an early Unix running
at the Rand Corporation in 1977; this version was later, and still is,
included in the BSD Games collection. I have it from Don Woods directly
that "[Jim Gillogly] was one of the first to request and receive a copy
of the source" but that Woods did not actually know of the BSD port
until I briefed him on it in 2017. (This contradicts some implications
in third-party histories.)
Many other people ported and extended the game in various directions.
A notable version was the first game shipped for the IBM Personal
Computer in 1981; neither Crowther nor Woods nor Gillogly were paid
royalties.
The history of these non-mainline versions is complex and
murky. Functional differences were generally marked by changes in the
maximum score as people added puzzles and rooms; however, multiple
ports of some versions existed - some in FORTRAN, some in C,
some in other languages - so the maximum point score is not
completely disambiguating.
Same articles at <> are a narrative of the history of the game.
There is an in-depth study of its origins at <>. Many versions
are collected at The Interactive Fiction Archive <>; note however
that IFA's historical claims are thinly sourced and its dates for the
earliest releases don't match either comments in the code or the
careful reconstruction in <>.
An attempt to untangle and document a lot of the non-mainline history
has been made by Arthur O'Dwyer at <>. For our purposes, it
will suffice to explain the chain of provenance that led from the
original Adventure to the Open Adventure distributed with this
document.
The original 350-point ADVENT on the PDP-10 had been one of my
formative experiences as a fledgling hacker in 1976-77. Forty years
later, in February 2017, while doing some casual research into the
history of text adventure games, I looked through some source code at
<> and was delighted to learn of Adventure 2.5, a version of the
Crowther-Woods mainline later than I had ever played.
Adventure 2.5 had been shipped long enough ago that today's conventions of
open-source licensing were not yet fully established. The Makefile
contained a rights reservation by Don Woods and that was it.
I wrote to Don asking permission to release 2.5 under 2-clause BSD;
he replied on 15 May 2017 giving both permission and encouragement.
Here is what Don said about differences between the original Adventure
and 2.5:
............................................................................
> The bulk of the points come from five new 16-point treasures. (I say "bulk"
> because I think at least one of the scores included some padding and I may
> have tweaked those.) Each of the new treasures requires solving a puzzle
> that's definitely at the tricky end of the scale for Adventure. Much of the
> new stuff involves trying new directions and/or finding new uses for stuff
> that already existed; e.g. the forest outside is no longer a small number of
> locations with partially random movement, but is a full-fledged maze, one
> that I hope has a character different from either of the previous two.
>
> As the text itself says, V2.5 is essentially the same as V2, with a few more
> hints. (I think I came up with a better one for the endgame, too.) I don't
> seem to have a copy of the similar text from V2, so I don't know whether/how
> it described itself to new and seasoned players.
>
> The other big change, as I mentioned above, was I added a way of docking
> points at a certain number of turns. This was my second attempt to do what
> the batteries had been for: require being efficient to achieve top score.
> Alas, the batteries led to players deliberately turning the lamp off/on
> whenever they weren't moving or were in a lit area, making the game take
> even longer! I set the requirement at what felt like a hard but fair
> number of turns, then applied several sneaky tricks to shave off another
> twenty.
>
> I hacked up a wrapper around the game (still in Fortran, most likely, but
> I forget) that would try each initializing the RNG using each second of a
> given day, while feeding in a script that either worked or aborted early
> if anything went wrong (such as a dwarf blocking my path). As I recall,
> it took less than a day's worth of RNG seeds to find one that worked.
>
> I verified my script could work given a favorable RNG, and stuck
> that number in the message.
>
> I like how that final puzzle, unlike the game itself, does not readily
> succumb even given access to the game source. You really need to fit
> together not only the goals and the map and use of inventory space, but
> also details like just what _can_ you do in the dark...?
............................................................................
== Earlier non-influences ==
There is record of one earlier dungeon-crawling game called "dnd",
written in 1974-75 on the PLATO system at University of Illinois
<>. This was in some ways similar to later roguelike games but
not to Adventure. The designers of later roguelikes frequently site
Adventure as an influence, but not dnd; like PLATO itself, dnd seems
not to have become known outside of its own user community until
rediscovered by computer historians many years after Adventure
shipped.
There was also Hunt The Wumpus <>, written by Gregory Yob in
1972. There is no evidence that Yob's original (circulated
in BASIC among microcomputer enthusiasts) was known to the ARPANET-
and minicomputer-centered culture Crowther and Woods were part of
until well after Adventure was written.
(I was a developer of the Nethack roguelike early in that game's
history, in the late 1980s; we knew nothing of PLATO dnd. We did know
of Hunt The Wumpus then from its early Unix port, but it didn't
influence us either, nor in any apparent way the designers of other
early roguelikes. After my time the wumpus was included as a monster
in Nethack, but this was done in a spirit of conscious museumization
after historians rediscovered Yob's game.)
Neither of these games used an attempt at a natural-language parser
even as primitive as Adventure's.
== Sources ==
[bibliography]
- [[[IFA]]] http://rickadams.org/adventure/
- [[[DA]]] http://www.filfre.net/sitemap/
- [[[SN]]] http://www.digitalhumanities.org/dhq/vol/1/2/000009/000009.html
- [[[DND]]] https://en.wikipedia.org/wiki/Dnd_(video_game)
- [[[WUMPUS]]] https://en.wikipedia.org/wiki/Hunt_the_Wumpus
- [[[QUUX]]] https://github.com/Quuxplusone/Advent
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/init.c 0000664 0000000 0000000 00000005272 13157513121 0023775 0 ustar 00root root 0000000 0000000 #include
#include
#include
#include
#include
#include "advent.h"
/*
* Initialisation
*/
struct settings_t settings = {
.logfp = NULL,
.oldstyle = false,
.prompt = true
};
struct game_t game = {
.dloc[1] = LOC_KINGHALL,
.dloc[2] = LOC_WESTBANK,
.dloc[3] = LOC_Y2,
.dloc[4] = LOC_ALIKE3,
.dloc[5] = LOC_COMPLEX,
/* Sixth dwarf is special (the pirate). He always starts at his
* chest's eventual location inside the maze. This loc is saved
* in chloc for ref. The dead end in the other maze has its
* loc stored in chloc2. */
.dloc[6] = LOC_DEADEND12,
.chloc = LOC_DEADEND12,
.chloc2 = LOC_DEADEND13,
.abbnum = 5,
.clock1 = WARNTIME,
.clock2 = FLASHTIME,
.newloc = LOC_START,
.loc = LOC_START,
.limit = GAMELIMIT,
.foobar = WORD_EMPTY,
};
long initialise(void)
{
if (settings.oldstyle)
printf("Initialising...\n");
srand(time(NULL));
long seedval = (long)rand();
set_seed(seedval);
for (int i = 1; i <= NOBJECTS; i++) {
game.place[i] = LOC_NOWHERE;
}
for (int i = 1; i <= NLOCATIONS; i++) {
if (!(locations[i].description.big == 0 ||
tkey[i] == 0)) {
int k = tkey[i];
if (T_TERMINATE(travel[k]))
conditions[i] |= (1 << COND_FORCED);
}
}
/* Set up the game.atloc and game.link arrays.
* We'll use the DROP subroutine, which prefaces new objects on the
* lists. Since we want things in the other order, we'll run the
* loop backwards. If the object is in two locs, we drop it twice.
* Also, since two-placed objects are typically best described
* last, we'll drop them first. */
for (int i = NOBJECTS; i >= 1; i--) {
if (objects[i].fixd > 0) {
drop(i + NOBJECTS, objects[i].fixd);
drop(i, objects[i].plac);
}
}
for (int i = 1; i <= NOBJECTS; i++) {
int k = NOBJECTS + 1 - i;
game.fixed[k] = objects[k].fixd;
if (objects[k].plac != 0 && objects[k].fixd <= 0)
drop(k, objects[k].plac);
}
/* Treasure props are initially -1, and are set to 0 the first time
* they are described. game.tally keeps track of how many are
* not yet found, so we know when to close the cave. */
for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
if (objects[treasure].is_treasure) {
if (objects[treasure].inventory != 0)
game.prop[treasure] = STATE_NOTFOUND;
game.tally = game.tally - game.prop[treasure];
}
}
game.conds = setbit(11);
return seedval;
}
open-adventure-master-d51238481a6a752adc8ad4d8893209d13bb7ea91/lamp.png 0000664 0000000 0000000 00000011677 13157513121 0024333 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR # < ìY bKGD ÿ ÿ ÿ ½§“ pHYs šœ tIMEá
»Š"ª LIDAThÞÍ™kŒ]×yžŸuÙ—ssfÎ\9¤†¤H]¨È¶(G‘åĤ׵á…S2qÚ¸I/j‹ºIã^Ò?HôWŠ´Q¤BÕ4uâ *HØpÃn¥¸¢äÈVdJ–m‘‚Mr(ÉáÜçÜϾõõDz\ÉŠŠæG°±½6öz÷÷½ïZßz—þivç¦Ôq…^<ŒØ|SÌ£¦§QgÏÊð/úˆRJÉ_Â_Ý#rJp€SJ™éiÂZL™ü…`æç‰Ñ_˜ï7qÀàæõ¦ö¡U?Ù6‹!ÕBcúCìt™—ßfþ]jþÚ·äÚÿmäì;AüÑSuߥÒï£JŸøö6»¼dŽj%¯éÏ+¥,Þ„lMÔøpí
?øŽR¨ÞÉ{?ŸzðÜ2ÿ²=ä¯ZÍh,aÛ
=åè+@ Ô†@4v…q ~wYöþŸì‚>à;ŠL]óžV‰—Ò„åNÊÏ
è ²ØÐi8.jKœ:æ3˜qBºKñÇKôf¢¿”w&ñܳÐâÅ,áòÚˆ¿»’Ó»,¸²f2 iö9C±ôî)žz5á=oÁGy;½mšNUÕæ8ïíÜ{aôéüÕM~,% Dçg4Åšºƒ0íùÄ_çO%ž{æ%yöªI¿]g6N-‡ûö޳¸1ÀFŽ#Šˆ0нY+£’’P3°ŠT ²±Å·º<0Óû’6À䤚ý÷óÞqÍØ·V)}n^ÚàÞQB …AÁ«ÄT"¶k!}£LSTS†„fÀ!²÷S©xT0ak”cžöåmi¿#0³êî(ãW®Ñv_Øò¡^J”™@ä
’ªMJ‘f¬±Ô0â©Ã†W{9µ-T«šÊ¥v›£WÜo"{¦ùãÝ5^>{Û€gÞ˜RÆ!I8öê%&¬elLøzžSÌÁŒ"K(̼ãÕ1áJÜÀ7*\kpõ |mÃñP .l³Ò˜ýcü»ñåÿ5½)2¦JÐòŒ#îõ†pLãÆ¡2Ò¨=5ýFÂÜÕ6Ÿ®F‰Â努ß÷ÌhÅÐy†©°Ç)öÇš±L‘”#^]†)å#!ß¾žó…œ¸cÙ²!ÛoòjÊrl5„’a;Ô´ê–|®ÌµûgùÜßÏ˪ÄtÝÀDA{ŠºGÆ /{¢('
"[`MFùF• ›÷íç³û0Ÿî+ö-;ÍôÇ-sKgÊbÞ–3VãË–eçpµˆ-ØÏÅ/¬ñþ¤à¯OiÎÞž—n,™Ñ|I3,k–#a)¢A†îçRú†Ð¤¶ü•‹Åo|`ÿ¶T極!÷ßñçIHyXc¸ù|}ýsØÎˆ’€)9FÚ£†–ꪦ>Õäz-æ)<¸†oõ„µLÑÍ(Sä£5ÈŽÛ|Á¸Gjã1"žP`BeUXÐ!ªQe»)o.M^“±BrˆB‡Ï…šqýVÄêÞq¾øõüì*)éˆ ¶ @v3ñJ ÆwZ.‘P+‡¬äÑxP”C2—¿yíz3•Œ 0¸Ô1-"XõŽZ#!¶Qu¡3ˆ¸6ÁP`q²B
*ñŠ®@!Ú$^h¹|Ï,¯L×éFuq¸²aJµ½
gúÕ’Çš°ˆÈêš9¹º4Æv9¤rà5û2†¾í O[娖Å3ã4ÎÆ¹qÐ.eòò"{îžfqPåp{»=ÀÿȱÛ®Íãh
¼Ú£Rå"!ˆ5ƒèâËä¶9è„F%`¹¡X¬y–f.… ùPÑÌ⾦524†Žé‘fïµ>šêñ߬eX %K¿3"Ì5{Ë4¥CÌVŸx˜³ ai¬ÙŨQak#ãN T±¬Ö-“ÍÙ»ª¸©3³5š“1Í©˜ ÔC®YM:t¼ÛfغeE„<ðB>ÞÞ"yKΜ<‰zpüÀkJ
hFg©A?e·õä¡BiÍ(1ÔÚ†™‘¦å
ebxM[¢’f[õn—êL•%åéä‚*‚Ð2›v™zK0wŸC
#âB‹€jÆŠ$TZ0Z\§š:æ#ÅÈz"çq8è%4Ê4Û5aÝÂOf
¦lij÷X¸{œ@;…Zß÷zhq¬¼%˜ó‡P‰¦ÜI¨æŠ‘U¤ZUj,_]cÁà—Öé²ÅX©Š´BJ^Af)fèC¨ïb°zˆô.!¿³$%jƒ!ƒòyìÕ4ñªc®²ô)Š^
zS«”9‹WˆœW’ª‡¤¯ÙÙ÷ ^”Ƈ0Š«IÓsTDÑ4;“€ôþ.íY¡W·äaBÙôiFvÎÓ¿£C¿iX/EäV“{˜¸Ñc¾Yb[k(º%C6„Ú¯ÿ:ÇÑìŒF)…BhCÕ@²H˜~y™S&/ú%¡ïx‹*iÂÙ=}Ê¡%QGhÕüËÕ™—cȇs³M¶”ÅW4iUÓöŽèÅâãú8hN×DÜÙ˜H‘1+ÂØ“ç˜^±J9Ôì
5*TŒî—°…ƆxX¢Z®¦–JuFå\1ÔE‘U4Ûiή…=ôo,±ÝuìN<õÕ_þsÊröá6
¥ŽBŸäŒ¾ê„x˜4à#PG 5qŽ@•C¶UEwFìÊIƒïÏÒ©ÝÏåý6nwtw Ý2äÔ‡ŠuWИÞEÇà s(ÊNhŒJ?°6=¼jI£ð%/@u™Ë£ «Ò0ÔÎДœR]A H‘$OÑíQŽrÊÕˆÚ²T“kEêržgv-‡B1pŽÚLÄ¥®¦]òØ“ê¨]æ
.,7Ésÿ~jÀn«qZA I¤AfPÓÂZƒà BOÇD±¦?Sa)U¬o ®*bU&©…”®¦´ºN[^«i®t<þrˆ‹5—RÇàÂ¥MjOð´x´8Á6õP¨Šm%¨Á‰B5•0èØÓݽj…ÕÚn^k¾ŸëæÇiw®P«¤ì¹>¤ñªM¾åX¨8lÕre³‹òB(‚DB®)„ˆR¨-ŠV'àÐ1ÜÁ„é1C³“ä–ú“0è}…Q¬GAÏ Ã„Q©D8QÅ×cºwìe=mqÉþÁìSê=òÜü<ß’]÷K“®Ž[6¤ç,³Ê2½p'E»J:Hhv½Šã¶iÑTH¨NˆÂkÎíÈzà© Z@e9ˆ¢øðOÑÅ’—
åFÆ£‡›}ª”hÊnÌËgÕœh&Ïh°R‰ð
ºG¸6÷;ú£ŒþºÅ:°±¦W