From aa8028551cc7fb55492787685c825d8a2431ce72 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Sat, 5 May 2018 23:09:38 -0700 Subject: [PATCH] Added 350-point adventure, 448-point adventure, and star trek games. --- build/misc.tcl | 52 + doc/programs.md | 3 + src/games/adv3db.1 | 1809 ++++++++++++++++++++++++++++++ src/games/adv3sb.2 | 854 ++++++++++++++ src/games/adv3sr.1 | 2086 +++++++++++++++++++++++++++++++++++ src/games/adv4db.2 | 2212 +++++++++++++++++++++++++++++++++++++ src/games/adv4ma.3 | 2576 +++++++++++++++++++++++++++++++++++++++++++ src/games/adv4su.16 | 970 ++++++++++++++++ src/games/trek.2 | 1760 +++++++++++++++++++++++++++++ 9 files changed, 12322 insertions(+) create mode 100644 src/games/adv3db.1 create mode 100644 src/games/adv3sb.2 create mode 100644 src/games/adv3sr.1 create mode 100644 src/games/adv4db.2 create mode 100644 src/games/adv4ma.3 create mode 100644 src/games/adv4su.16 create mode 100644 src/games/trek.2 diff --git a/build/misc.tcl b/build/misc.tcl index ce866496..63b90af6 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -312,6 +312,58 @@ respond "Command:" "d" respond "*" ":pdump sys3; ts advent\r" respond "*" ":kill\r" +# 350-point ADVENT +respond "*" ":cwd games\r" +respond "*" ":dec sys:f40\r" +respond "*" "adv3sr=adv3sr\r" +respond "*" "adv3sb=adv3sb\r" +respond "CORE USED" "\032" +type ":kill\r" +respond "*" ":dec sys:loader\r" +respond "*" "adv3sb\r" +respond "*" "adv3sr\r" +respond "*" "/go\r" +respond "EXIT" ":start\r" +respond "*" "adv3db.1" +respond "*" "\032" +type ":start 45\r" +respond "Command:" "d" +respond "*" ":pdump games; ts adv350\r" +respond "*" ":kill\r" + +# 448-point ADVENT +respond "*" ":cwd games\r" +respond "*" ":dec sys:f40\r" +respond "*" "adv4ma=adv4ma\r" +respond "*" "adv4su=adv4su\r" +respond "CORE USED" "\032" +type ":kill\r" +respond "*" ":dec sys:loader\r" +respond "*" "adv4ma\r" +respond "*" "adv4su\r" +respond "*" "/go\r" +respond "EXIT" ":start\r" +respond "*" "adv4db.2" +respond "Are you a wizard?" "\032" +type ":start 45\r" +respond "Command:" "d" +respond "*" ":pdump games; ts adv448\r" +respond "*" ":kill\r" + +# TREK +respond "*" ":cwd games\r" +respond "*" ":dec sys:f40\r" +respond "*" "trek=trek\r" +respond "CORE USED" "\032" +type ":kill\r" +respond "*" ":dec sys:loader\r" +respond "*" "trek\r" +respond "*" "/go\r" +respond "EXIT" ":start 45\r" +respond "Command:" "d" +respond "*" ":pdump games; ts trek\r" +respond "*" ":kill\r" + # Chess: timesharing, no TV display respond "*" ":midas /t games;ts chess2_rg;chess2\r" respond "with ^C" "TV==0\r\003" diff --git a/doc/programs.md b/doc/programs.md index 28152ace..46123ba7 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -4,6 +4,8 @@ - ACCLNK, sets com-link accept bit for specified TTY. - ACOUNT, dummy account program used for users from safe sites. - ADVENT, (Colossal Cave) Adventure by Will Crowther. +- ADV350, 350-point Adventure. +- ADV448, 448-point Adventure. - ARCCPY, copies and old-format archive, converting to new format. - ARCDEV, transparent file system access to archive files. - ARCSAL, archive salvager. @@ -180,6 +182,7 @@ - TIMOON, displays the time and phase of the moon. - TIMSRV, RFC 868 network time protocol. - TMPKIL, clean out old files in .TEMP.;. +- TREK, Star Trek game. - TTLOC, Advertises physical location of logged in users. - TTY, displays TTYs with UNAME/JNAME/CORE and other info. - TTYSWP, swap TTYs. diff --git a/src/games/adv3db.1 b/src/games/adv3db.1 new file mode 100644 index 00000000..dce80f4c --- /dev/null +++ b/src/games/adv3db.1 @@ -0,0 +1,1809 @@ +1 +1 YOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING. +1 AROUND YOU IS A FOREST. A SMALL STREAM FLOWS OUT OF THE BUILDING AND +1 DOWN A GULLY. +2 YOU HAVE WALKED UP A HILL, STILL IN THE FOREST. THE ROAD SLOPES BACK +2 DOWN THE OTHER SIDE OF THE HILL. THERE IS A BUILDING IN THE DISTANCE. +3 YOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING. +4 YOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A +4 ROCKY BED. +5 YOU ARE IN OPEN FOREST, WITH A DEEP VALLEY TO ONE SIDE. +6 YOU ARE IN OPEN FOREST NEAR BOTH A VALLEY AND A ROAD. +7 AT YOUR FEET ALL THE WATER OF THE STREAM SPLASHES INTO A 2-INCH SLIT +7 IN THE ROCK. DOWNSTREAM THE STREAMBED IS BARE ROCK. +8 YOU ARE IN A 20-FOOT DEPRESSION FLOORED WITH BARE DIRT. SET INTO THE +8 DIRT IS A STRONG STEEL GRATE MOUNTED IN CONCRETE. A DRY STREAMBED +8 LEADS INTO THE DEPRESSION. +9 YOU ARE IN A SMALL CHAMBER BENEATH A 3X3 STEEL GRATE TO THE SURFACE. +9 A LOW CRAWL OVER COBBLES LEADS INWARD TO THE WEST. +10 YOU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE. THERE IS A DIM LIGHT +10 AT THE EAST END OF THE PASSAGE. +11 YOU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE. +11 A LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS +11 HERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST. A NOTE ON THE WALL +11 SAYS "MAGIC WORD XYZZY". +12 YOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON. +13 YOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH. THE WALLS ARE FROZEN +13 RIVERS OF ORANGE STONE. AN AWKWARD CANYON AND A GOOD PASSAGE EXIT +13 FROM EAST AND WEST SIDES OF THE CHAMBER. +14 AT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST. AN EAST +14 PASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON. +15 YOU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO +15 THE WEST. THERE ARE OPENINGS TO EITHER SIDE. NEARBY, A WIDE STONE +15 STAIRCASE LEADS DOWNWARD. THE HALL IS FILLED WITH WISPS OF WHITE MIST +15 SWAYING TO AND FRO ALMOST AS IF ALIVE. A COLD WIND BLOWS UP THE +15 STAIRCASE. THERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU. +16 THE CRACK IS FAR TOO SMALL FOR YOU TO FOLLOW. +17 YOU ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL. +17 THE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JUMP. +18 THIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL. THE NOTE SAYS, +18 "YOU WON'T GET IT UP THE STEPS". +19 YOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL +19 DIRECTIONS. +20 YOU ARE AT THE BOTTOM OF THE PIT WITH A BROKEN NECK. +21 YOU DIDN'T MAKE IT. +22 THE DOME IS UNCLIMBABLE. +23 YOU ARE AT THE WEST END OF THE TWOPIT ROOM. THERE IS A LARGE HOLE IN +23 THE WALL ABOVE THE PIT AT THIS END OF THE ROOM. +24 YOU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE TWOPIT ROOM. THERE IS +24 A SMALL POOL OF OIL IN ONE CORNER OF THE PIT. +25 YOU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE TWOPIT ROOM. THERE IS +25 A LARGE HOLE IN THE WALL ABOUT 25 FEET ABOVE YOU. +26 YOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP. +27 YOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS. +28 YOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR. THE HOLE GOES +28 DOWN TO AN E/W PASSAGE. +29 YOU ARE IN THE SOUTH SIDE CHAMBER. +30 YOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE MOUNTAIN KING. +30 A PASSAGE CONTINUES WEST AND UP HERE. +31 >$< +32 YOU CAN'T GET BY THE SNAKE. +33 YOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE +33 WEST, AND A WALL OF BROKEN ROCK TO THE EAST. THERE IS A LARGE "Y2" ON +33 A ROCK IN THE ROOM'S CENTER. +34 YOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE. +35 YOU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF +35 SIGHT. A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. TRACES OF +35 WHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE RIGHT. +35 MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT +35 SOMEONE HAS BEEN HERE RECENTLY. DIRECTLY ACROSS THE PIT FROM YOU AND +35 25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. A +35 SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. +36 YOU ARE IN A DIRTY BROKEN PASSAGE. TO THE EAST IS A CRAWL. TO THE +36 WEST IS A LARGE PASSAGE. ABOVE YOU IS A HOLE TO ANOTHER PASSAGE. +37 YOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT. A CRAWL LEADS +37 WEST. +38 YOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH +38 ENTERS AND EXITS THROUGH TINY SLITS. +39 YOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS. THERE IS A BIG HOLE IN +39 THE FLOOR. THERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST. +40 YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH +40 OF THE HALL OF MISTS. +41 YOU ARE AT THE WEST END OF HALL OF MISTS. A LOW WIDE CRAWL CONTINUES +41 WEST AND ANOTHER GOES NORTH. TO THE SOUTH IS A LITTLE PASSAGE 6 FEET +41 OFF THE FLOOR. +42 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +43 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +44 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +45 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +46 DEAD END +47 DEAD END +48 DEAD END +49 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +50 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +51 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +52 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +53 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +54 DEAD END +55 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +56 DEAD END +57 YOU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN +57 DOWN ONE WALL. YOU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK +57 UP. THE MAZE CONTINUES AT THIS LEVEL. +58 DEAD END +59 YOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH +59 OF THE HALL OF MISTS. +60 YOU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE +60 CHAMBERS. TO THE EAST A LOW WIDE CRAWL SLANTS UP. TO THE NORTH A +60 ROUND TWO FOOT HOLE SLANTS DOWN. +61 YOU ARE AT THE WEST END OF A VERY LONG FEATURELESS HALL. THE HALL +61 JOINS UP WITH A NARROW NORTH/SOUTH PASSAGE. +62 YOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE. +63 DEAD END +64 YOU ARE AT A COMPLEX JUNCTION. A LOW HANDS AND KNEES PASSAGE FROM THE +64 NORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING PASSAGE +64 GOING WEST. THERE IS ALSO A LARGE ROOM ABOVE. THE AIR IS DAMP HERE. +65 YOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE. +65 TO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN. +66 YOU ARE IN A ROOM WHOSE WALLS RESEMBLE SWISS CHEESE. OBVIOUS PASSAGES +66 GO WEST, EAST, NE, AND NW. PART OF THE ROOM IS OCCUPIED BY A LARGE +66 BEDROCK BLOCK. +67 YOU ARE AT THE EAST END OF THE TWOPIT ROOM. THE FLOOR HERE IS +67 LITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS. +67 THERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST +67 AND WEST. THERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE +67 WALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT. +68 YOU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOOR IS AN IMMENSE SLAB +68 FALLEN FROM THE CEILING (SLAB ROOM). EAST AND WEST THERE ONCE WERE +68 LARGE PASSAGES, BUT THEY ARE NOW FILLED WITH BOULDERS. LOW SMALL +68 PASSAGES GO NORTH AND SOUTH, AND THE SOUTH ONE QUICKLY BENDS WEST +68 AROUND THE BOULDERS. +69 YOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM. +70 YOU ARE IN A SECRET N/S CANYON ABOVE A SIZABLE PASSAGE. +71 YOU ARE IN A SECRET CANYON AT A JUNCTION OF THREE CANYONS, BEARING +71 NORTH, SOUTH, AND SE. THE NORTH ONE IS AS TALL AS THE OTHER TWO +71 COMBINED. +72 YOU ARE IN A LARGE LOW ROOM. CRAWLS LEAD NORTH, SE, AND SW. +73 DEAD END CRAWL. +74 YOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W. IT CROSSES OVER A +74 VERY TIGHT CANYON 15 FEET BELOW. IF YOU GO DOWN YOU MAY NOT BE ABLE +74 TO GET BACK UP. +75 YOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYON. +76 THE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER SOUTH. +77 YOU ARE IN A TALL E/W CANYON. A LOW TIGHT CRAWL GOES 3 FEET NORTH AND +77 SEEMS TO OPEN UP. +78 THE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD END. +79 THE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAMETER SEWER PIPES. +79 IT WOULD BE ADVISABLE TO USE THE EXIT. +80 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +81 DEAD END +82 DEAD END +83 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +84 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +85 DEAD END +86 DEAD END +87 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. +88 YOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE +88 WEST. AT THE EASTERN END IS A HOLE THROUGH WHICH YOU CAN SEE A +88 PROFUSION OF LEAVES. +89 THERE IS NOTHING HERE TO CLIMB. USE "UP" OR "OUT" TO LEAVE THE PIT. +90 YOU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT. +91 YOU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM. YOU COULD +91 CLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP. THERE IS A +91 PASSAGE LEADING BACK TO THE NORTH. +92 YOU ARE IN THE GIANT ROOM. THE CEILING HERE IS TOO HIGH UP FOR YOUR +92 LAMP TO SHOW IT. CAVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH. ON +92 THE WEST WALL IS SCRAWLED THE INSCRIPTION, "FEE FIE FOE FOO" [SIC]. +93 THE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN. +94 YOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE. +95 YOU ARE IN A MAGNIFICENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES +95 OVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPPEARS +95 THROUGH A HOLE IN THE FLOOR. PASSAGES EXIT TO THE SOUTH AND WEST. +96 YOU ARE IN THE SOFT ROOM. THE WALLS ARE COVERED WITH HEAVY CURTAINS, +96 THE FLOOR WITH A THICK PILE CARPET. MOSS COVERS THE CEILING. +97 THIS IS THE ORIENTAL ROOM. ANCIENT ORIENTAL CAVE DRAWINGS COVER THE +97 WALLS. A GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER +97 PASSAGE LEADS SE, AND A HANDS AND KNEES CRAWL LEADS WEST. +98 YOU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN. +98 FAR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE +98 HEARD. THE MIST RISES UP THROUGH A FISSURE IN THE CEILING. THE PATH +98 EXITS TO THE SOUTH AND WEST. +99 YOU ARE IN AN ALCOVE. A SMALL NW PATH SEEMS TO WIDEN AFTER A SHORT +99 DISTANCE. AN EXTREMELY TIGHT TUNNEL LEADS EAST. IT LOOKS LIKE A VERY +99 TIGHT SQUEEZE. AN EERIE LIGHT CAN BE SEEN AT THE OTHER END. +100 YOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT. AN EXTREMELY +100 NARROW TUNNEL EXITS TO THE WEST. A DARK CORRIDOR LEADS NE. +101 YOU'RE IN THE DARK-ROOM. A CORRIDOR LEADING SOUTH IS THE ONLY EXIT. +102 YOU ARE IN AN ARCHED HALL. A CORAL PASSAGE ONCE CONTINUED UP AND EAST +102 FROM HERE, BUT IS NOW BLOCKED BY DEBRIS. THE AIR SMELLS OF SEA WATER. +103 YOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK. THE FLOOR AND +103 WALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE. A +103 SHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS +103 UP. A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUTH. +104 YOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS. +105 YOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS. +106 YOU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST. SMALL +106 PASSAGES GO WEST AND UP. THE REMNANTS OF RECENT DIGGING ARE EVIDENT. +106 A SIGN IN MIDAIR HERE SAYS "CAVE UNDER CONSTRUCTION BEYOND THIS POINT. +106 PROCEED AT OWN RISK. [WITT CONSTRUCTION COMPANY]" +107 YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL DIFFERENT. +108 YOU ARE AT WITT'S END. PASSAGES LEAD OFF IN *ALL* DIRECTIONS. +109 YOU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS. THE FLOOR IS +109 COVERED BY WHITE MIST SEEPING IN FROM THE NORTH. THE WALLS EXTEND +109 UPWARD FOR WELL OVER 100 FEET. SUSPENDED FROM SOME UNSEEN POINT FAR +109 ABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND +109 MIDWAY BETWEEN THE CANYON WALLS. (THE MIRROR IS OBVIOUSLY PROVIDED +109 FOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.) A +109 SMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FEET UP. +110 YOU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF +110 SIGHT. A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. TRACES OF +110 WHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE LEFT. +110 MARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT +110 SOMEONE HAS BEEN HERE RECENTLY. DIRECTLY ACROSS THE PIT FROM YOU AND +110 25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. A +110 SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. +111 A LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOST REACHES THE FLOOR +111 BELOW. YOU COULD CLIMB DOWN IT, AND JUMP FROM IT TO THE FLOOR, BUT +111 HAVING DONE SO YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK UP. +112 YOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT. +113 YOU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR. AN OPAQUE CLOUD +113 OF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD. THE LAKE IS +113 FED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT 10 FEET +113 OVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN THE +113 MIST. THE ONLY PASSAGE GOES BACK TOWARD THE SOUTH. +114 DEAD END +115 YOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE +115 GIANT ROOM. IT APPEARS TO BE A REPOSITORY FOR THE "ADVENTURE" +115 PROGRAM. MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY +115 YELLOW LIGHT. SCATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL +115 OF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED +115 OF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND +115 A COLLECTION OF BRASS LANTERNS. OFF TO ONE SIDE A GREAT MANY DWARVES +115 ARE SLEEPING ON THE FLOOR, SNORING LOUDLY. A SIGN NEARBY READS: "DO +115 NOT DISTURB THE DWARVES!" AN IMMENSE MIRROR IS HANGING AGAINST ONE +115 WALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER +115 SUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE. +116 YOU ARE AT THE SOUTHWEST END OF THE REPOSITORY. TO ONE SIDE IS A PIT +116 FULL OF FIERCE GREEN SNAKES. ON THE OTHER SIDE IS A ROW OF SMALL +116 WICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD. IN ONE +116 CORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS. A +116 LARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR. A +116 VAST MIRROR STRETCHES OFF TO THE NORTHEAST. AT YOUR FEET IS A LARGE +116 STEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, "TREASURE VAULT. +116 KEYS IN MAIN OFFICE." +117 YOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM. A HEAVY WHITE MIST RISING +117 UP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE. A SW PATH LEADS AWAY +117 FROM THE CHASM INTO A WINDING CORRIDOR. +118 YOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH +118 DIRECTIONS. +119 YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. +120 YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. +121 YOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. +122 YOU ARE ON THE FAR SIDE OF THE CHASM. A NE PATH LEADS AWAY FROM THE +122 CHASM ON THIS SIDE. +123 YOU'RE IN A LONG EAST/WEST CORRIDOR. A FAINT RUMBLING NOISE CAN BE +123 HEARD IN THE DISTANCE. +124 THE PATH FORKS HERE. THE LEFT FORK LEADS NORTHEAST. A DULL RUMBLING +124 SEEMS TO GET LOUDER IN THAT DIRECTION. THE RIGHT FORK LEADS SOUTHEAST +124 DOWN A GENTLE SLOPE. THE MAIN CORRIDOR ENTERS FROM THE WEST. +125 THE WALLS ARE QUITE WARM HERE. FROM THE NORTH CAN BE HEARD A STEADY +125 ROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING. ANOTHER +125 PASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAST. +126 YOU ARE ON THE EDGE OF A BREATH-TAKING VIEW. FAR BELOW YOU IS AN +126 ACTIVE VOLCANO, FROM WHICH GREAT GOUTS OF MOLTEN LAVA COME SURGING +126 OUT, CASCADING BACK DOWN INTO THE DEPTHS. THE GLOWING ROCK FILLS THE +126 FARTHEST REACHES OF THE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERY- +126 THING AN EERIE, MACABRE APPEARANCE. THE AIR IS FILLED WITH FLICKERING +126 SPARKS OF ASH AND A HEAVY SMELL OF BRIMSTONE. THE WALLS ARE HOT TO +126 THE TOUCH, AND THE THUNDERING OF THE VOLCANO DROWNS OUT ALL OTHER +126 SOUNDS. EMBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYRIAD TWISTED +126 FORMATIONS COMPOSED OF PURE WHITE ALABASTER, WHICH SCATTER THE MURKY +126 LIGHT INTO SINISTER APPARITIONS UPON THE WALLS. TO ONE SIDE IS A DEEP +126 GORGE, FILLED WITH A BIZARRE CHAOS OF TORTURED ROCK WHICH SEEMS TO +126 HAVE BEEN CRAFTED BY THE DEVIL HIMSELF. AN IMMENSE RIVER OF FIRE +126 CRASHES OUT FROM THE DEPTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE +126 GORGE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO YOUR LEFT. TO +126 THE RIGHT, AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONTINUOUSLY +126 FROM A BARREN ISLAND IN THE CENTER OF A SULFUROUS LAKE, WHICH BUBBLES +126 OMINOUSLY. THE FAR RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS +126 OWN, WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO THE ALREADY +126 HELLISH SCENE. A DARK, FOREBODING PASSAGE EXITS TO THE SOUTH. +127 YOU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS. THE WALLS ARE +127 VERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE +127 HEAT. THE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING +127 A LOW RUMBLING. +128 YOU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH +128 ODDLY SHAPED LIMESTONE FORMATIONS. +129 YOU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM. A SIGN +129 POSTED ABOVE THE ENTRANCE READS: "CAUTION! BEAR IN ROOM!" +130 YOU ARE INSIDE A BARREN ROOM. THE CENTER OF THE ROOM IS COMPLETELY +130 EMPTY EXCEPT FOR SOME DUST. MARKS IN THE DUST LEAD AWAY TOWARD THE +130 FAR END OF THE ROOM. THE ONLY EXIT IS THE WAY YOU CAME IN. +131 YOU ARE IN A MAZE OF TWISTING LITTLE PASSAGES, ALL DIFFERENT. +132 YOU ARE IN A LITTLE MAZE OF TWISTY PASSAGES, ALL DIFFERENT. +133 YOU ARE IN A TWISTING MAZE OF LITTLE PASSAGES, ALL DIFFERENT. +134 YOU ARE IN A TWISTING LITTLE MAZE OF PASSAGES, ALL DIFFERENT. +135 YOU ARE IN A TWISTY LITTLE MAZE OF PASSAGES, ALL DIFFERENT. +136 YOU ARE IN A TWISTY MAZE OF LITTLE PASSAGES, ALL DIFFERENT. +137 YOU ARE IN A LITTLE TWISTY MAZE OF PASSAGES, ALL DIFFERENT. +138 YOU ARE IN A MAZE OF LITTLE TWISTING PASSAGES, ALL DIFFERENT. +139 YOU ARE IN A MAZE OF LITTLE TWISTY PASSAGES, ALL DIFFERENT. +140 DEAD END +-1 END +2 +1 YOU'RE AT END OF ROAD AGAIN. +2 YOU'RE AT HILL IN ROAD. +3 YOU'RE INSIDE BUILDING. +4 YOU'RE IN VALLEY. +5 YOU'RE IN FOREST. +6 YOU'RE IN FOREST. +7 YOU'RE AT SLIT IN STREAMBED. +8 YOU'RE OUTSIDE GRATE. +9 YOU'RE BELOW THE GRATE. +10 YOU'RE IN COBBLE CRAWL. +11 YOU'RE IN DEBRIS ROOM. +13 YOU'RE IN BIRD CHAMBER. +14 YOU'RE AT TOP OF SMALL PIT. +15 YOU'RE IN HALL OF MISTS. +17 YOU'RE ON EAST BANK OF FISSURE. +18 YOU'RE IN NUGGET OF GOLD ROOM. +19 YOU'RE IN HALL OF MT KING. +23 YOU'RE AT WEST END OF TWOPIT ROOM. +24 YOU'RE IN EAST PIT. +25 YOU'RE IN WEST PIT. +33 YOU'RE AT "Y2". +35 YOU'RE AT WINDOW ON PIT. +36 YOU'RE IN DIRTY PASSAGE. +39 YOU'RE IN DUSTY ROCK ROOM. +41 YOU'RE AT WEST END OF HALL OF MISTS. +57 YOU'RE AT BRINK OF PIT. +60 YOU'RE AT EAST END OF LONG HALL. +61 YOU'RE AT WEST END OF LONG HALL. +64 YOU'RE AT COMPLEX JUNCTION. +66 YOU'RE IN SWISS CHEESE ROOM. +67 YOU'RE AT EAST END OF TWOPIT ROOM. +68 YOU'RE IN SLAB ROOM. +71 YOU'RE AT JUNCTION OF THREE SECRET CANYONS. +74 YOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON. +88 YOU'RE IN NARROW CORRIDOR. +91 YOU'RE AT STEEP INCLINE ABOVE LARGE ROOM. +92 YOU'RE IN GIANT ROOM. +95 YOU'RE IN CAVERN WITH WATERFALL. +96 YOU'RE IN SOFT ROOM. +97 YOU'RE IN ORIENTAL ROOM. +98 YOU'RE IN MISTY CAVERN. +99 YOU'RE IN ALCOVE. +100 YOU'RE IN PLOVER ROOM. +101 YOU'RE IN DARK-ROOM. +102 YOU'RE IN ARCHED HALL. +103 YOU'RE IN SHELL ROOM. +106 YOU'RE IN ANTEROOM. +108 YOU'RE AT WITT'S END. +109 YOU'RE IN MIRROR CANYON. +110 YOU'RE AT WINDOW ON PIT. +111 YOU'RE AT TOP OF STALACTITE. +113 YOU'RE AT RESERVOIR. +115 YOU'RE AT NE END. +116 YOU'RE AT SW END. +117 YOU'RE ON SW SIDE OF CHASM. +118 YOU'RE IN SLOPING CORRIDOR. +122 YOU'RE ON NE SIDE OF CHASM. +123 YOU'RE IN CORRIDOR. +124 YOU'RE AT FORK IN PATH. +125 YOU'RE AT JUNCTION WITH WARM WALLS. +126 YOU'RE AT BREATH-TAKING VIEW. +127 YOU'RE IN CHAMBER OF BOULDERS. +128 YOU'RE IN LIMESTONE PASSAGE. +129 YOU'RE IN FRONT OF BARREN ROOM. +130 YOU'RE IN BARREN ROOM. +-1 +3 +1 2 2 44 29 +1 3 3 12 19 43 +1 4 5 13 14 46 30 +1 5 6 45 43 +1 8 63 +2 1 2 12 7 43 45 30 +2 5 6 45 46 +3 1 3 11 32 44 +3 11 62 +3 33 65 +3 79 5 14 +4 1 4 12 45 +4 5 6 43 44 29 +4 7 5 46 30 +4 8 63 +5 4 9 43 30 +5 50005 6 7 45 +5 6 6 +5 5 44 46 +6 1 2 45 +6 4 9 43 44 30 +6 5 6 46 +7 1 12 +7 4 4 45 +7 5 6 43 44 +7 8 5 15 16 46 +7 595 60 14 30 +8 5 6 43 44 46 +8 1 12 +8 7 4 13 45 +8 303009 3 19 30 +8 593 3 +9 303008 11 29 +9 593 11 +9 10 17 18 19 44 +9 14 31 +9 11 51 +10 9 11 20 21 43 +10 11 19 22 44 51 +10 14 31 +11 303008 63 +11 9 64 +11 10 17 18 23 24 43 +11 12 25 19 29 44 +11 3 62 +11 14 31 +12 303008 63 +12 9 64 +12 11 30 43 51 +12 13 19 29 44 +12 14 31 +13 303008 63 +13 9 64 +13 11 51 +13 12 25 43 +13 14 23 31 44 +14 303008 63 +14 9 64 +14 11 51 +14 13 23 43 +14 150020 30 31 34 +14 15 30 +14 16 33 44 +15 18 36 46 +15 17 7 38 44 +15 19 10 30 45 +15 150022 29 31 34 35 23 43 +15 14 29 +15 34 55 +16 14 1 +17 15 38 43 +17 312596 39 +17 412021 7 +17 412597 41 42 44 69 +17 27 41 +18 15 38 11 45 +19 15 10 29 43 +19 311028 45 36 +19 311029 46 37 +19 311030 44 7 +19 32 45 +19 35074 49 +19 211032 49 +19 74 66 +20 0 1 +21 0 1 +22 15 1 +23 67 43 42 +23 68 44 61 +23 25 30 31 +23 648 52 +24 67 29 11 +25 23 29 11 +25 724031 56 +25 26 56 +26 88 1 +27 312596 39 +27 412021 7 +27 412597 41 42 43 69 +27 17 41 +27 40 45 +27 41 44 +28 19 38 11 46 +28 33 45 55 +28 36 30 52 +29 19 38 11 45 +30 19 38 11 43 +30 62 44 29 +31 524089 1 +31 90 1 +32 19 1 +33 3 65 +33 28 46 +33 34 43 53 54 +33 35 44 +33 159302 71 +33 100 71 +34 33 30 55 +34 15 29 +35 33 43 55 +35 20 39 +36 37 43 17 +36 28 29 52 +36 39 44 +36 65 70 +37 36 44 17 +37 38 30 31 56 +38 37 56 29 11 +38 595 60 14 30 4 5 +39 36 43 23 +39 64 30 52 58 +39 65 70 +40 41 1 +41 42 46 29 23 56 +41 27 43 +41 59 45 +41 60 44 17 +42 41 29 +42 42 45 +42 43 43 +42 45 46 +42 80 44 +43 42 44 +43 44 46 +43 45 43 +44 43 43 +44 48 30 +44 50 46 +44 82 45 +45 42 44 +45 43 45 +45 46 43 +45 47 46 +45 87 29 30 +46 45 44 11 +47 45 43 11 +48 44 29 11 +49 50 43 +49 51 44 +50 44 43 +50 49 44 +50 51 30 +50 52 46 +51 49 44 +51 50 29 +51 52 43 +51 53 46 +52 50 44 +52 51 43 +52 52 46 +52 53 29 +52 55 45 +52 86 30 +53 51 44 +53 52 45 +53 54 46 +54 53 44 11 +55 52 44 +55 55 45 +55 56 30 +55 57 43 +56 55 29 11 +57 13 30 56 +57 55 44 +57 58 46 +57 83 45 +57 84 43 +58 57 43 11 +59 27 1 +60 41 43 29 17 +60 61 44 +60 62 45 30 52 +61 60 43 +61 62 45 +61 100107 46 +62 60 44 +62 63 45 +62 30 43 +62 61 46 +63 62 46 11 +64 39 29 56 59 +64 65 44 70 +64 103 45 74 +64 106 43 +65 64 43 +65 66 44 +65 80556 46 +65 68 61 +65 80556 29 +65 50070 29 +65 39 29 +65 60556 45 +65 75072 45 +65 71 45 +65 80556 30 +65 106 30 +66 65 47 +66 67 44 +66 80556 46 +66 77 25 +66 96 43 +66 50556 50 +66 97 72 +67 66 43 +67 23 44 42 +67 24 30 31 +68 23 46 +68 69 29 56 +68 65 45 +69 68 30 61 +69 331120 46 +69 119 46 +69 109 45 +69 113 75 +70 71 45 +70 65 30 23 +70 111 46 +71 65 48 +71 70 46 +71 110 45 +72 65 70 +72 118 49 +72 73 45 +72 97 48 72 +73 72 46 17 11 +74 19 43 +74 331120 44 +74 121 44 +74 75 30 +75 76 46 +75 77 45 +76 75 45 +77 75 43 +77 78 44 +77 66 45 17 +78 77 46 +79 3 1 +80 42 45 +80 80 44 +80 80 46 +80 81 43 +81 80 44 11 +82 44 46 11 +83 57 46 +83 84 43 +83 85 44 +84 57 45 +84 83 44 +84 114 50 +85 83 43 11 +86 52 29 11 +87 45 29 30 +88 25 30 56 43 +88 20 39 +88 92 44 27 +89 25 1 +90 23 1 +91 95 45 73 23 +91 72 30 56 +92 88 46 +92 93 43 +92 94 45 +93 92 46 27 11 +94 92 46 27 23 +94 309095 45 3 73 +94 611 45 +95 94 46 11 +95 92 27 +95 91 44 +96 66 44 11 +97 66 48 +97 72 44 17 +97 98 29 45 73 +98 97 46 72 +98 99 44 +99 98 50 73 +99 301 43 23 +99 100 43 +100 301 44 23 11 +100 99 44 +100 159302 71 +100 33 71 +100 101 47 22 +101 100 46 71 11 +102 103 30 74 11 +103 102 29 38 +103 104 30 +103 114618 46 +103 115619 46 +103 64 46 +104 103 29 74 +104 105 30 +105 104 29 11 +105 103 74 +106 64 29 +106 65 44 +106 108 43 +107 131 46 +107 132 49 +107 133 47 +107 134 48 +107 135 29 +107 136 50 +107 137 43 +107 138 44 +107 139 45 +107 61 30 +108 95556 43 45 46 47 48 49 50 29 30 +108 106 43 +108 626 44 +109 69 46 +109 113 45 75 +110 71 44 +110 20 39 +111 70 45 +111 40050 30 39 56 +111 50053 30 +111 45 30 +112 131 49 +112 132 45 +112 133 43 +112 134 50 +112 135 48 +112 136 47 +112 137 44 +112 138 30 +112 139 29 +112 140 46 +113 109 46 11 109 +114 84 48 +115 116 49 +116 115 47 +116 593 30 +117 118 49 +117 233660 41 42 69 47 +117 332661 41 +117 303 41 +117 332021 39 +117 596 39 +118 72 30 +118 117 29 +119 69 45 11 +119 653 43 7 +120 69 45 +120 74 43 +121 74 43 11 +121 653 45 7 +122 123 47 +122 233660 41 42 69 49 +122 303 41 +122 596 39 +122 124 77 +122 126 28 +122 129 40 +123 122 44 +123 124 43 77 +123 126 28 +123 129 40 +124 123 44 +124 125 47 36 +124 128 48 37 30 +124 126 28 +124 129 40 +125 124 46 77 +125 126 45 28 +125 127 43 17 +126 125 46 23 11 +126 124 77 +126 610 30 39 +127 125 44 11 17 +127 124 77 +127 126 28 +128 124 45 29 77 +128 129 46 30 40 +128 126 28 +129 128 44 29 +129 124 77 +129 130 43 19 40 3 +129 126 28 +130 129 44 11 +130 124 77 +130 126 28 +131 107 44 +131 132 48 +131 133 50 +131 134 49 +131 135 47 +131 136 29 +131 137 30 +131 138 45 +131 139 46 +131 112 43 +132 107 50 +132 131 29 +132 133 45 +132 134 46 +132 135 44 +132 136 49 +132 137 47 +132 138 43 +132 139 30 +132 112 48 +133 107 29 +133 131 30 +133 132 44 +133 134 47 +133 135 49 +133 136 43 +133 137 45 +133 138 50 +133 139 48 +133 112 46 +134 107 47 +134 131 45 +134 132 50 +134 133 48 +134 135 43 +134 136 30 +134 137 46 +134 138 29 +134 139 44 +134 112 49 +135 107 45 +135 131 48 +135 132 30 +135 133 46 +135 134 43 +135 136 44 +135 137 49 +135 138 47 +135 139 50 +135 112 29 +136 107 43 +136 131 44 +136 132 29 +136 133 49 +136 134 30 +136 135 46 +136 137 50 +136 138 48 +136 139 47 +136 112 45 +137 107 48 +137 131 47 +137 132 46 +137 133 30 +137 134 29 +137 135 50 +137 136 45 +137 138 49 +137 139 43 +137 112 44 +138 107 30 +138 131 43 +138 132 47 +138 133 29 +138 134 44 +138 135 45 +138 136 46 +138 137 48 +138 139 49 +138 112 50 +139 107 49 +139 131 50 +139 132 43 +139 133 44 +139 134 45 +139 135 30 +139 136 48 +139 137 29 +139 138 46 +139 112 47 +140 112 45 11 +-1 +4 +2 ROAD +2 HILL +3 ENTER +4 UPSTR +5 DOWNS +6 FORES +7 FORWA +7 CONTI +7 ONWAR +8 BACK +8 RETUR +8 RETRE +9 VALLE +10 STAIR +11 OUT +11 OUTSI +11 EXIT +11 LEAVE +12 BUILD +12 HOUSE +13 GULLY +14 STREA +15 ROCK +16 BED +17 CRAWL +18 COBBL +19 INWAR +19 INSID +19 IN +20 SURFA +21 NULL +21 NOWHE +22 DARK +23 PASSA +23 TUNNE +24 LOW +25 CANYO +26 AWKWA +27 GIANT +28 VIEW +29 UPWAR +29 UP +29 U +29 ABOVE +29 ASCEN +30 D +30 DOWNW +30 DOWN +30 DESCE +31 PIT +32 OUTDO +33 CRACK +34 STEPS +35 DOME +36 LEFT +37 RIGHT +38 HALL +39 JUMP +40 BARRE +41 OVER +42 ACROS +43 EAST +43 E +44 WEST +44 W +45 NORTH +45 N +46 SOUTH +46 S +47 NE +48 SE +49 SW +50 NW +51 DEBRI +52 HOLE +53 WALL +54 BROKE +55 Y2 +56 CLIMB +57 LOOK +57 EXAMI +57 TOUCH +57 DESCR +58 FLOOR +59 ROOM +60 SLIT +61 SLAB +61 SLABR +62 XYZZY +63 DEPRE +64 ENTRA +65 PLUGH +66 SECRE +67 CAVE +69 CROSS +70 BEDQU +71 PLOVE +72 ORIEN +73 CAVER +74 SHELL +75 RESER +76 MAIN +76 OFFIC +77 FORK +1001 KEYS +1001 KEY +1002 LAMP +1002 HEADL +1002 LANTE +1003 GRATE +1004 CAGE +1005 ROD +1006 ROD (MUST BE NEXT OBJECT AFTER "REAL" ROD) +1007 STEPS +1008 BIRD +1009 DOOR +1010 PILLO +1010 VELVE +1011 SNAKE +1012 FISSU +1013 TABLE +1014 CLAM +1015 OYSTE +1016 MAGAZ +1016 ISSUE +1016 SPELU +1016 "SPEL +1017 DWARF +1017 DWARV +1018 KNIFE +1018 KNIVE +1019 FOOD +1019 RATIO +1020 BOTTL +1020 JAR +1021 WATER +1021 H2O +1022 OIL +1023 MIRRO +1024 PLANT +1024 BEANS +1025 PLANT (MUST BE NEXT OBJECT AFTER "REAL" PLANT) +1026 STALA +1027 SHADO +1027 FIGUR +1028 AXE +1029 DRAWI +1030 PIRAT +1031 DRAGO +1032 CHASM +1033 TROLL +1034 TROLL (MUST BE NEXT OBJECT AFTER "REAL" TROLL) +1035 BEAR +1036 MESSA +1037 VOLCA +1037 GEYSE (SAME AS VOLCANO) +1038 MACHI +1038 VENDI +1039 BATTE +1040 CARPE +1040 MOSS +1050 GOLD +1050 NUGGE +1051 DIAMO +1052 SILVE +1052 BARS +1053 JEWEL +1054 COINS +1055 CHEST +1055 BOX +1055 TREAS +1056 EGGS +1056 EGG +1056 NEST +1057 TRIDE +1058 VASE +1058 MING +1058 SHARD +1058 POTTE +1059 EMERA +1060 PLATI +1060 PYRAM +1061 PEARL +1062 RUG +1062 PERSI +1063 SPICE +1064 CHAIN +2001 CARRY +2001 TAKE +2001 KEEP +2001 CATCH +2001 STEAL +2001 CAPTU +2001 GET +2001 TOTE +2002 DROP +2002 RELEA +2002 FREE +2002 DISCA +2002 DUMP +2003 SAY +2003 CHANT +2003 SING +2003 UTTER +2003 MUMBL +2004 UNLOC +2004 OPEN +2005 NOTHI +2006 LOCK +2006 CLOSE +2007 LIGHT +2007 ON +2008 EXTIN +2008 OFF +2009 WAVE +2009 SHAKE +2009 SWING +2010 CALM +2010 PLACA +2010 TAME +2011 WALK +2011 RUN +2011 TRAVE +2011 GO +2011 PROCE +2011 CONTI +2011 EXPLO +2011 GOTO +2011 FOLLO +2011 TURN +2012 ATTAC +2012 KILL +2012 FIGHT +2012 HIT +2012 STRIK +2012 SLAY +2013 POUR +2014 EAT +2014 DEVOU +2015 DRINK +2016 RUB +2017 THROW +2017 TOSS +2018 QUIT +2019 FIND +2019 WHERE +2020 INVEN +2021 FEED +2022 FILL +2023 BLAST +2023 DETON +2023 IGNIT +2023 BLOWU +2024 SCORE +2025 FEE +2025 FIE +2025 FOE +2025 FOO +2025 FUM +2026 BRIEF +2027 READ +2027 PERUS +2028 BREAK +2028 SHATT +2028 SMASH +2029 WAKE +2029 DISTU +2030 SUSPE +2030 PAUSE +2030 SAVE +2031 HOURS +3001 FEE +3002 FIE +3003 FOE +3004 FOO +3005 FUM +3050 SESAM +3050 OPENS +3050 ABRA +3050 ABRAC +3050 SHAZA +3050 HOCUS +3050 POCUS +3051 HELP +3051 ? +3064 TREE +3064 TREES +3066 DIG +3066 EXCAV +3068 LOST +3069 MIST +3079 FUCK +3139 STOP +3142 INFO +3142 INFOR +3147 SWIM +-1 +5 +1 SET OF KEYS +000 THERE ARE SOME KEYS ON THE GROUND HERE. +2 BRASS LANTERN +000 THERE IS A SHINY BRASS LAMP NEARBY. +100 THERE IS A LAMP SHINING NEARBY. +3 *GRATE +000 THE GRATE IS LOCKED. +100 THE GRATE IS OPEN. +4 WICKER CAGE +000 THERE IS A SMALL WICKER CAGE DISCARDED NEARBY. +5 BLACK ROD +000 A THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY. +6 BLACK ROD +000 A THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END LIES NEARBY. +7 *STEPS +000 ROUGH STONE STEPS LEAD DOWN THE PIT. +100 ROUGH STONE STEPS LEAD UP THE DOME. +8 LITTLE BIRD IN CAGE +000 A CHEERFUL LITTLE BIRD IS SITTING HERE SINGING. +100 THERE IS A LITTLE BIRD IN THE CAGE. +9 *RUSTY DOOR +000 THE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR. +100 THE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOOR. +10 VELVET PILLOW +000 A SMALL VELVET PILLOW LIES ON THE FLOOR. +11 *SNAKE +000 A HUGE GREEN FIERCE SNAKE BARS THE WAY! +100 >$< (CHASED AWAY) +12 *FISSURE +000 >$< +100 A CRYSTAL BRIDGE NOW SPANS THE FISSURE. +200 THE CRYSTAL BRIDGE HAS VANISHED! +13 *STONE TABLET +000 A MASSIVE STONE TABLET IMBEDDED IN THE WALL READS: +000 "CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROOM!" +14 GIANT CLAM >GRUNT!< +000 THERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED. +15 GIANT OYSTER >GROAN!< +000 THERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSED. +100 INTERESTING. THERE SEEMS TO BE SOMETHING WRITTEN ON THE UNDERSIDE OF +100 THE OYSTER. +16 "SPELUNKER TODAY" +000 THERE ARE A FEW RECENT ISSUES OF "SPELUNKER TODAY" MAGAZINE HERE. +19 TASTY FOOD +000 THERE IS FOOD HERE. +20 SMALL BOTTLE +000 THERE IS A BOTTLE OF WATER HERE. +100 THERE IS AN EMPTY BOTTLE HERE. +200 THERE IS A BOTTLE OF OIL HERE. +21 WATER IN THE BOTTLE +22 OIL IN THE BOTTLE +23 *MIRROR +000 >$< +24 *PLANT +000 THERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING "WATER, WATER, ..." +100 THE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS. +200 THERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT, +200 BELLOWING "WATER!! WATER!!" +300 THE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF THE PIT. +400 THERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE. +500 YOU'VE OVER-WATERED THE PLANT! IT'S SHRIVELING UP! IT'S, IT'S... +25 *PHONY PLANT (SEEN IN TWOPIT ROOM ONLY WHEN TALL ENOUGH) +000 >$< +100 THE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT. +200 THERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE. +26 *STALACTITE +000 >$< +27 *SHADOWY FIGURE +000 THE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTION. +28 DWARF'S AXE +000 THERE IS A LITTLE AXE HERE. +100 THERE IS A LITTLE AXE LYING BESIDE THE BEAR. +29 *CAVE DRAWINGS +000 >$< +30 *PIRATE +000 >$< +31 *DRAGON +000 A HUGE GREEN FIERCE DRAGON BARS THE WAY! +100 CONGRATULATIONS! YOU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE +100 HANDS! (UNBELIEVABLE, ISN'T IT?) +200 THE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE. +32 *CHASM +000 A RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE +000 MIST. A SIGN POSTED ON THE BRIDGE READS, "STOP! PAY TROLL!" +100 THE WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE SEEN AT THE BOTTOM +100 OF THE CHASM. +33 *TROLL +000 A BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A +000 TREASURE BEFORE YOU MAY CROSS. +100 THE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY. +200 >$< (CHASED AWAY) +34 *PHONY TROLL +000 THE TROLL IS NOWHERE TO BE SEEN. +35 >$< (BEAR USES RTEXT 141) +000 THERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROOM! +100 THERE IS A GENTLE CAVE BEAR SITTING PLACIDLY IN ONE CORNER. +200 THERE IS A CONTENTED-LOOKING BEAR WANDERING ABOUT NEARBY. +300 >$< (DEAD) +36 *MESSAGE IN SECOND MAZE +000 THERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWERY SCRIPT, READING: +000 "THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST." +37 *VOLCANO AND/OR GEYSER +000 >$< +38 *VENDING MACHINE +000 THERE IS A MASSIVE VENDING MACHINE HERE. THE INSTRUCTIONS ON IT READ: +000 "DROP COINS HERE TO RECEIVE FRESH BATTERIES." +39 BATTERIES +000 THERE ARE FRESH BATTERIES HERE. +100 SOME WORN-OUT BATTERIES HAVE BEEN DISCARDED NEARBY. +40 *CARPET AND/OR MOSS +000 >$< +50 LARGE GOLD NUGGET +000 THERE IS A LARGE SPARKLING NUGGET OF GOLD HERE! +51 SEVERAL DIAMONDS +000 THERE ARE DIAMONDS HERE! +52 BARS OF SILVER +000 THERE ARE BARS OF SILVER HERE! +53 PRECIOUS JEWELRY +000 THERE IS PRECIOUS JEWELRY HERE! +54 RARE COINS +000 THERE ARE MANY COINS HERE! +55 TREASURE CHEST +000 THE PIRATE'S TREASURE CHEST IS HERE! +56 GOLDEN EGGS +000 THERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS! +100 THE NEST OF GOLDEN EGGS HAS VANISHED! +200 DONE! +57 JEWELED TRIDENT +000 THERE IS A JEWEL-ENCRUSTED TRIDENT HERE! +58 MING VASE +000 THERE IS A DELICATE, PRECIOUS, MING VASE HERE! +100 THE VASE IS NOW RESTING, DELICATELY, ON A VELVET PILLOW. +200 THE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY. +300 THE MING VASE DROPS WITH A DELICATE CRASH. +59 EGG-SIZED EMERALD +000 THERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG! +60 PLATINUM PYRAMID +000 THERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE! +61 GLISTENING PEARL +000 OFF TO ONE SIDE LIES A GLISTENING PEARL! +62 PERSIAN RUG +000 THERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR! +100 THE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!! +63 RARE SPICES +000 THERE ARE RARE SPICES HERE! +64 GOLDEN CHAIN +000 THERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FLOOR! +100 THE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN! +200 THERE IS A GOLDEN CHAIN LOCKED TO THE WALL! +-1 +6 +1 SOMEWHERE NEARBY IS COLOSSAL CAVE, WHERE OTHERS HAVE FOUND FORTUNES IN +1 TREASURE AND GOLD, THOUGH IT IS RUMORED THAT SOME WHO ENTER ARE NEVER +1 SEEN AGAIN. MAGIC IS SAID TO WORK IN THE CAVE. I WILL BE YOUR EYES +1 AND HANDS. DIRECT ME WITH COMMANDS OF 1 OR 2 WORDS. I SHOULD WARN +1 YOU THAT I LOOK AT ONLY THE FIRST FIVE LETTERS OF EACH WORD, SO YOU'LL +1 HAVE TO ENTER "NORTHEAST" AS "NE" TO DISTINGUISH IT FROM "NORTH". +1 (SHOULD YOU GET STUCK, TYPE "HELP" FOR SOME GENERAL HINTS. FOR INFOR- +1 MATION ON HOW TO END YOUR ADVENTURE, ETC., TYPE "INFO".) +1 - - - +1 THIS PROGRAM WAS ORIGINALLY DEVELOPED BY WILLIE CROWTHER. MOST OF THE +1 FEATURES OF THE CURRENT PROGRAM WERE ADDED BY DON WOODS (DON @ SU-AI). +1 CONTACT DON IF YOU HAVE ANY QUESTIONS, COMMENTS, ETC. +2 A LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY. +3 A LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE +3 AXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY. +4 THERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU! +5 ONE SHARP NASTY KNIFE IS THROWN AT YOU! +6 NONE OF THEM HIT YOU! +7 ONE OF THEM GETS YOU! +8 A HOLLOW VOICE SAYS "PLUGH". +9 THERE IS NO WAY TO GO THAT DIRECTION. +10 I AM UNSURE HOW YOU ARE FACING. USE COMPASS POINTS OR NEARBY OBJECTS. +11 I DON'T KNOW IN FROM OUT HERE. USE COMPASS POINTS OR NAME SOMETHING +11 IN THE GENERAL DIRECTION YOU WANT TO GO. +12 I DON'T KNOW HOW TO APPLY THAT WORD HERE. +13 I DON'T UNDERSTAND THAT! +14 I'M GAME. WOULD YOU CARE TO EXPLAIN HOW? +15 SORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL. I WILL REPEAT THE +15 LONG DESCRIPTION OF YOUR LOCATION. +16 IT IS NOW PITCH DARK. IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT. +17 IF YOU PREFER, SIMPLY TYPE W RATHER THAN WEST. +18 ARE YOU TRYING TO CATCH THE BIRD? +19 THE BIRD IS FRIGHTENED RIGHT NOW AND YOU CANNOT CATCH IT NO MATTER +19 WHAT YOU TRY. PERHAPS YOU MIGHT TRY LATER. +20 ARE YOU TRYING TO SOMEHOW DEAL WITH THE SNAKE? +21 YOU CAN'T KILL THE SNAKE, OR DRIVE IT AWAY, OR AVOID IT, OR ANYTHING +21 LIKE THAT. THERE IS A WAY TO GET BY, BUT YOU DON'T HAVE THE NECESSARY +21 RESOURCES RIGHT NOW. +22 DO YOU REALLY WANT TO QUIT NOW? +23 YOU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR BODY! +24 YOU ARE ALREADY CARRYING IT! +25 YOU CAN'T BE SERIOUS! +26 THE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES +26 DISTURBED AND YOU CANNOT CATCH IT. +27 YOU CAN CATCH THE BIRD, BUT YOU CANNOT CARRY IT. +28 THERE IS NOTHING HERE WITH A LOCK! +29 YOU AREN'T CARRYING IT! +30 THE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY +30 DRIVES THE SNAKE AWAY. +31 YOU HAVE NO KEYS! +32 IT HAS NO LOCK. +33 I DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A THING. +34 IT WAS ALREADY LOCKED. +35 THE GRATE IS NOW LOCKED. +36 THE GRATE IS NOW UNLOCKED. +37 IT WAS ALREADY UNLOCKED. +38 YOU HAVE NO SOURCE OF LIGHT. +39 YOUR LAMP IS NOW ON. +40 YOUR LAMP IS NOW OFF. +41 THERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE CHAIN, WHICH IS +41 PROBABLY JUST AS WELL. +42 NOTHING HAPPENS. +43 WHERE? +44 THERE IS NOTHING HERE TO ATTACK. +45 THE LITTLE BIRD IS NOW DEAD. ITS BODY DISAPPEARS. +46 ATTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY DANGEROUS. +47 YOU KILLED A LITTLE DWARF. +48 YOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY. +49 WITH WHAT? YOUR BARE HANDS? +50 GOOD TRY, BUT THAT IS AN OLD WORN-OUT MAGIC WORD. +51 I KNOW OF PLACES, ACTIONS, AND THINGS. MOST OF MY VOCABULARY +51 DESCRIBES PLACES AND IS USED TO MOVE YOU THERE. TO MOVE, TRY WORDS +51 LIKE FOREST, BUILDING, DOWNSTREAM, ENTER, EAST, WEST, NORTH, SOUTH, +51 UP, OR DOWN. I KNOW ABOUT A FEW SPECIAL OBJECTS, LIKE A BLACK ROD +51 HIDDEN IN THE CAVE. THESE OBJECTS CAN BE MANIPULATED USING SOME OF +51 THE ACTION WORDS THAT I KNOW. USUALLY YOU WILL NEED TO GIVE BOTH THE +51 OBJECT AND ACTION WORDS (IN EITHER ORDER), BUT SOMETIMES I CAN INFER +51 THE OBJECT FROM THE VERB ALONE. SOME OBJECTS ALSO IMPLY VERBS; IN +51 PARTICULAR, "INVENTORY" IMPLIES "TAKE INVENTORY", WHICH CAUSES ME TO +51 GIVE YOU A LIST OF WHAT YOU'RE CARRYING. THE OBJECTS HAVE SIDE +51 EFFECTS; FOR INSTANCE, THE ROD SCARES THE BIRD. USUALLY PEOPLE HAVING +51 TROUBLE MOVING JUST NEED TO TRY A FEW MORE WORDS. USUALLY PEOPLE +51 TRYING UNSUCCESSFULLY TO MANIPULATE AN OBJECT ARE ATTEMPTING SOMETHING +51 BEYOND THEIR (OR MY!) CAPABILITIES AND SHOULD TRY A COMPLETELY +51 DIFFERENT TACK. TO SPEED THE GAME YOU CAN SOMETIMES MOVE LONG +51 DISTANCES WITH A SINGLE WORD. FOR EXAMPLE, "BUILDING" USUALLY GETS +51 YOU TO THE BUILDING FROM ANYWHERE ABOVE GROUND EXCEPT WHEN LOST IN THE +51 FOREST. ALSO, NOTE THAT CAVE PASSAGES TURN A LOT, AND THAT LEAVING A +51 ROOM TO THE NORTH DOES NOT GUARANTEE ENTERING THE NEXT FROM THE SOUTH. +51 GOOD LUCK! +52 IT MISSES! +53 IT GETS YOU! +54 OK +55 YOU CAN'T UNLOCK THE KEYS. +56 YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE +56 MAIN PASSAGE. +57 I DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO STREAM CAN RUN ON +57 THE SURFACE FOR LONG. I WOULD TRY THE STREAM. +58 I NEED MORE DETAILED INSTRUCTIONS TO DO THAT. +59 I CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT AND MANIPULATE +59 THINGS. I CANNOT TELL YOU WHERE REMOTE THINGS ARE. +60 I DON'T KNOW THAT WORD. +61 WHAT? +62 ARE YOU TRYING TO GET INTO THE CAVE? +63 THE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK. YOU CANNOT +63 ENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY. I WOULD RECOMMEND +63 LOOKING ELSEWHERE FOR THE KEYS. +64 THE TREES OF THE FOREST ARE LARGE HARDWOOD OAK AND MAPLE, WITH AN +64 OCCASIONAL GROVE OF PINE OR SPRUCE. THERE IS QUITE A BIT OF UNDER- +64 GROWTH, LARGELY BIRCH AND ASH SAPLINGS PLUS NONDESCRIPT BUSHES OF +64 VARIOUS SORTS. THIS TIME OF YEAR VISIBILITY IS QUITE RESTRICTED BY +64 ALL THE LEAVES, BUT TRAVEL IS QUITE EASY IF YOU DETOUR AROUND THE +64 SPRUCE AND BERRY BUSHES. +65 WELCOME TO ADVENTURE!! WOULD YOU LIKE INSTRUCTIONS? +66 DIGGING WITHOUT A SHOVEL IS QUITE IMPRACTICAL. EVEN WITH A SHOVEL +66 PROGRESS IS UNLIKELY. +67 BLASTING REQUIRES DYNAMITE. +68 I'M AS CONFUSED AS YOU ARE. +69 MIST IS A WHITE VAPOR, USUALLY WATER, SEEN FROM TIME TO TIME IN +69 CAVERNS. IT CAN BE FOUND ANYWHERE BUT IS FREQUENTLY A SIGN OF A DEEP +69 PIT LEADING DOWN TO WATER. +70 YOUR FEET ARE NOW WET. +71 I THINK I JUST LOST MY APPETITE. +72 THANK YOU, IT WAS DELICIOUS! +73 YOU HAVE TAKEN A DRINK FROM THE STREAM. THE WATER TASTES STRONGLY OF +73 MINERALS, BUT IS NOT UNPLEASANT. IT IS EXTREMELY COLD. +74 THE BOTTLE OF WATER IS NOW EMPTY. +75 RUBBING THE ELECTRIC LAMP IS NOT PARTICULARLY REWARDING. ANYWAY, +75 NOTHING EXCITING HAPPENS. +76 PECULIAR. NOTHING UNEXPECTED HAPPENS. +77 YOUR BOTTLE IS EMPTY AND THE GROUND IS WET. +78 YOU CAN'T POUR THAT. +79 WATCH IT! +80 WHICH WAY? +81 OH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED. I MIGHT BE ABLE TO +81 HELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE. DO YOU WANT ME +81 TO TRY TO REINCARNATE YOU? +82 ALL RIGHT. BUT DON'T BLAME ME IF SOMETHING GOES WR...... +82 --- POOF!! --- +82 YOU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE. COUGHING AND GASPING, +82 YOU EMERGE FROM THE SMOKE AND FIND.... +83 YOU CLUMSY OAF, YOU'VE DONE IT AGAIN! I DON'T KNOW HOW LONG I CAN +83 KEEP THIS UP. DO YOU WANT ME TO TRY REINCARNATING YOU AGAIN? +84 OKAY, NOW WHERE DID I PUT MY ORANGE SMOKE?.... >POOF!< +84 EVERYTHING DISAPPEARS IN A DENSE CLOUD OF ORANGE SMOKE. +85 NOW YOU'VE REALLY DONE IT! I'M OUT OF ORANGE SMOKE! YOU DON'T EXPECT +85 ME TO DO A DECENT REINCARNATION WITHOUT ANY ORANGE SMOKE, DO YOU? +86 OKAY, IF YOU'RE SO SMART, DO IT YOURSELF! I'M LEAVING! +90 >>> MESSAGES 81 THRU 90 ARE RESERVED FOR "OBITUARIES". <<< +91 SORRY, BUT I NO LONGER SEEM TO REMEMBER HOW IT WAS YOU GOT HERE. +92 YOU CAN'T CARRY ANYTHING MORE. YOU'LL HAVE TO DROP SOMETHING FIRST. +93 YOU CAN'T GO THROUGH A LOCKED STEEL GRATE! +94 I BELIEVE WHAT YOU WANT IS RIGHT HERE WITH YOU. +95 YOU DON'T FIT THROUGH A TWO-INCH SLIT! +96 I RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE INSTEAD OF JUMPING. +97 THERE IS NO WAY ACROSS THE FISSURE. +98 YOU'RE NOT CARRYING ANYTHING. +99 YOU ARE CURRENTLY HOLDING THE FOLLOWING: +100 IT'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS). BESIDES, YOU +100 HAVE NO BIRD SEED. +101 THE SNAKE HAS NOW DEVOURED YOUR BIRD. +102 THERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YOU). +103 YOU FOOL, DWARVES EAT ONLY COAL! NOW YOU'VE MADE HIM *REALLY* MAD!! +104 YOU HAVE NOTHING IN WHICH TO CARRY IT. +105 YOUR BOTTLE IS ALREADY FULL. +106 THERE IS NOTHING HERE WITH WHICH TO FILL THE BOTTLE. +107 YOUR BOTTLE IS NOW FULL OF WATER. +108 YOUR BOTTLE IS NOW FULL OF OIL. +109 YOU CAN'T FILL THAT. +110 DON'T BE RIDICULOUS! +111 THE DOOR IS EXTREMELY RUSTY AND REFUSES TO OPEN. +112 THE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVES AND ASKS, "WATER?" +113 THE HINGES ARE QUITE THOROUGHLY RUSTED NOW AND WON'T BUDGE. +114 THE OIL HAS FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE, +114 ALTHOUGH IT REQUIRES SOME EFFORT. +115 THE PLANT HAS EXCEPTIONALLY DEEP ROOTS AND CANNOT BE PULLED FREE. +116 THE DWARVES' KNIVES VANISH AS THEY STRIKE THE WALLS OF THE CAVE. +117 SOMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TUNNEL WITH YOU. +117 YOU'D BEST TAKE INVENTORY AND DROP SOMETHING. +118 YOU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LITTLE PASSAGE! +119 YOU CAN'T FIT THIS FIVE-FOOT OYSTER THROUGH THAT LITTLE PASSAGE! +120 I ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING IT. >STRAIN!< +121 I ADVISE YOU TO PUT DOWN THE OYSTER BEFORE OPENING IT. >WRENCH!< +122 YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE CLAM. +123 YOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE OYSTER. +124 A GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY. GOODNESS, +124 THIS MUST REALLY BE AN OYSTER. (I NEVER WAS VERY GOOD AT IDENTIFYING +124 BIVALVES.) WHATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN. +125 THE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYSTER INSIDE. IT +125 PROMPTLY SNAPS SHUT AGAIN. +126 YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND FOUND YOUR WAY +126 BLOCKED BY A RECENT CAVE-IN. YOU ARE NOW BACK IN THE MAIN PASSAGE. +127 THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. +128 OUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE! "HAR, HAR," +128 HE CHORTLES, "I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME +128 CHEST DEEP IN THE MAZE!" HE SNATCHES YOUR TREASURE AND VANISHES INTO +128 THE GLOOM. +129 A SEPULCHRAL VOICE REVERBERATING THROUGH THE CAVE, SAYS, "CAVE CLOSING +129 SOON. ALL ADVENTURERS EXIT IMMEDIATELY THROUGH MAIN OFFICE." +130 A MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES: +130 "THIS EXIT IS CLOSED. PLEASE LEAVE VIA MAIN OFFICE." +131 IT LOOKS AS THOUGH YOU'RE DEAD. WELL, SEEING AS HOW IT'S SO CLOSE TO +131 CLOSING TIME ANYWAY, I THINK WE'LL JUST CALL IT A DAY. +132 THE SEPULCHRAL VOICE ENTONES, "THE CAVE IS NOW CLOSED." AS THE ECHOES +132 FADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF ORANGE +132 SMOKE). . . . AS YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND... +133 THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR +133 WALL, BURYING THE DWARVES IN THE RUBBLE. YOU MARCH THROUGH THE HOLE +133 AND FIND YOURSELF IN THE MAIN OFFICE, WHERE A CHEERING BAND OF +133 FRIENDLY ELVES CARRY THE CONQUERING ADVENTURER OFF INTO THE SUNSET. +134 THERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR +134 WALL, BURYING THE SNAKES IN THE RUBBLE. A RIVER OF MOLTEN LAVA POURS +134 IN THROUGH THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLUDING YOU! +135 THERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SPLASHED ACROSS THE +135 WALLS OF THE ROOM. +136 THE RESULTING RUCKUS HAS AWAKENED THE DWARVES. THERE ARE NOW SEVERAL +136 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU! MOST OF THEM THROW +136 KNIVES AT YOU! ALL OF THEM GET YOU! +137 OH, LEAVE THE POOR UNHAPPY BIRD ALONE. +138 I DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWHERE. +139 I DON'T KNOW THE WORD "STOP". USE "QUIT" IF YOU WANT TO GIVE UP. +140 YOU CAN'T GET THERE FROM HERE. +141 YOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR. +142 IF YOU WANT TO END YOUR ADVENTURE EARLY, SAY "QUIT". TO SUSPEND YOUR +142 ADVENTURE SUCH THAT YOU CAN CONTINUE LATER, SAY "SUSPEND" (OR "PAUSE" +142 OR "SAVE"). TO SEE WHAT HOURS THE CAVE IS NORMALLY OPEN, SAY "HOURS". +142 TO SEE HOW WELL YOU'RE DOING, SAY "SCORE". TO GET FULL CREDIT FOR A +142 TREASURE, YOU MUST HAVE LEFT IT SAFELY IN THE BUILDING, THOUGH YOU GET +142 PARTIAL CREDIT JUST FOR LOCATING IT. YOU LOSE POINTS FOR GETTING +142 KILLED, OR FOR QUITTING, THOUGH THE FORMER COSTS YOU MORE. THERE ARE +142 ALSO POINTS BASED ON HOW MUCH (IF ANY) OF THE CAVE YOU'VE MANAGED TO +142 EXPLORE; IN PARTICULAR, THERE IS A LARGE BONUS JUST FOR GETTING IN (TO +142 DISTINGUISH THE BEGINNERS FROM THE REST OF THE PACK), AND THERE ARE +142 OTHER WAYS TO DETERMINE WHETHER YOU'VE BEEN THROUGH SOME OF THE MORE +142 HARROWING SECTIONS. IF YOU THINK YOU'VE FOUND ALL THE TREASURES, JUST +142 KEEP EXPLORING FOR A WHILE. IF NOTHING INTERESTING HAPPENS, YOU +142 HAVEN'T FOUND THEM ALL YET. IF SOMETHING INTERESTING *DOES* HAPPEN, +142 IT MEANS YOU'RE GETTING A BONUS AND HAVE AN OPPORTUNITY TO GARNER MANY +142 MORE POINTS IN THE MASTER'S SECTION. I MAY OCCASIONALLY OFFER HINTS +142 IF YOU SEEM TO BE HAVING TROUBLE. IF I DO, I'LL WARN YOU IN ADVANCE +142 HOW MUCH IT WILL AFFECT YOUR SCORE TO ACCEPT THE HINTS. FINALLY, TO +142 SAVE PAPER, YOU MAY SPECIFY "BRIEF", WHICH TELLS ME NEVER TO REPEAT +142 THE FULL DESCRIPTION OF A PLACE UNLESS YOU EXPLICITLY ASK ME TO. +143 DO YOU INDEED WISH TO QUIT NOW? +144 THERE IS NOTHING HERE WITH WHICH TO FILL THE VASE. +145 THE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SHATTERED THE VASE. +146 IT IS BEYOND YOUR POWER TO DO THAT. +147 I DON'T KNOW HOW. +148 IT IS TOO FAR UP FOR YOU TO REACH. +149 YOU KILLED A LITTLE DWARF. THE BODY VANISHES IN A CLOUD OF GREASY +149 BLACK SMOKE. +150 THE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATTACK. +151 WHAT'S THE MATTER, CAN'T YOU READ? NOW YOU'D BEST START OVER. +152 THE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK SCALES. +153 THE DRAGON LOOKS RATHER NASTY. YOU'D BEST NOT TRY TO GET BY. +154 THE LITTLE BIRD ATTACKS THE GREEN DRAGON, AND IN AN ASTOUNDING FLURRY +154 GETS BURNT TO A CINDER. THE ASHES BLOW AWAY. +155 ON WHAT? +156 OKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME +156 YOU COME TO IT. TO GET THE FULL DESCRIPTION, SAY "LOOK". +157 TROLLS ARE CLOSE RELATIVES WITH THE ROCKS AND HAVE SKIN AS TOUGH AS +157 THAT OF A RHINOCEROS. THE TROLL FENDS OFF YOUR BLOWS EFFORTLESSLY. +158 THE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CAREFULLY, AND TOSSES IT +158 BACK, DECLARING, "GOOD WORKMANSHIP, BUT IT'S NOT VALUABLE ENOUGH." +159 THE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT. +160 THE TROLL REFUSES TO LET YOU CROSS. +161 THERE IS NO LONGER ANY WAY ACROSS THE CHASM. +162 JUST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKLES BENEATH THE +162 WEIGHT OF THE BEAR, WHICH WAS STILL FOLLOWING YOU AROUND. YOU +162 SCRABBLE DESPERATELY FOR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU +162 STUMBLE BACK AND FALL INTO THE CHASM. +163 THE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND +163 SCURRIES AWAY. THE BEAR SOON GIVES UP THE PURSUIT AND WANDERS BACK. +164 THE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU CAN'T GET AT IT. +165 WITH WHAT? YOUR BARE HANDS? AGAINST *HIS* BEAR HANDS?? +166 THE BEAR IS CONFUSED; HE ONLY WANTS TO BE YOUR FRIEND. +167 FOR CRYING OUT LOUD, THE POOR THING IS ALREADY DEAD! +168 THE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM +168 DOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIENDLY. +169 THE BEAR IS STILL CHAINED TO THE WALL. +170 THE CHAIN IS STILL LOCKED. +171 THE CHAIN IS NOW UNLOCKED. +172 THE CHAIN IS NOW LOCKED. +173 THERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LOCKED. +174 THERE IS NOTHING HERE TO EAT. +175 DO YOU WANT THE HINT? +176 DO YOU NEED HELP GETTING OUT OF THE MAZE? +177 YOU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPPING THINGS. +178 ARE YOU TRYING TO EXPLORE BEYOND THE PLOVER ROOM? +179 THERE IS A WAY TO EXPLORE THAT REGION WITHOUT HAVING TO WORRY ABOUT +179 FALLING INTO A PIT. NONE OF THE OBJECTS AVAILABLE IS IMMEDIATELY +179 USEFUL IN DISCOVERING THE SECRET. +180 DO YOU NEED HELP GETTING OUT OF HERE? +181 DON'T GO WEST. +182 GLUTTONY IS NOT ONE OF THE TROLL'S VICES. AVARICE, HOWEVER, IS. +183 YOUR LAMP IS GETTING DIM. YOU'D BEST START WRAPPING THIS UP, UNLESS +183 YOU CAN FIND SOME FRESH BATTERIES. I SEEM TO RECALL THERE'S A VENDING +183 MACHINE IN THE MAZE. BRING SOME COINS WITH YOU. +184 YOUR LAMP HAS RUN OUT OF POWER. +185 THERE'S NOT MUCH POINT IN WANDERING AROUND OUT HERE, AND YOU CAN'T +185 EXPLORE THE CAVE WITHOUT A LAMP. SO LET'S JUST CALL IT A DAY. +186 THERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. AS YOU +186 TURN TOWARD THEM, THE BEAM OF YOUR LAMP FALLS ACROSS A BEARDED PIRATE. +186 HE IS CARRYING A LARGE CHEST. "SHIVER ME TIMBERS!" HE CRIES, "I'VE +186 BEEN SPOTTED! I'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME CHEST!" +186 WITH THAT, HE VANISHES INTO THE GLOOM. +187 YOUR LAMP IS GETTING DIM. YOU'D BEST GO BACK FOR THOSE BATTERIES. +188 YOUR LAMP IS GETTING DIM. I'M TAKING THE LIBERTY OF REPLACING THE +188 BATTERIES. +189 YOUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE BATTERIES. YOU'D +189 BEST START WRAPPING THIS UP. +190 I'M AFRAID THE MAGAZINE IS WRITTEN IN DWARVISH. +191 "THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST." +192 HMMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU 10 POINTS TO +192 READ IT. SHOULD I GO AHEAD AND READ IT ANYWAY? +193 IT SAYS, "THERE IS SOMETHING STRANGE ABOUT THIS PLACE, SUCH THAT ONE +193 OF THE WORDS I'VE ALWAYS KNOWN NOW HAS A NEW EFFECT." +194 IT SAYS THE SAME THING IT DID BEFORE. +195 I'M AFRAID I DON'T UNDERSTAND. +196 "CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROOM!" +197 YOU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON IT SHATTERS INTO A +197 MYRIAD TINY FRAGMENTS. +198 YOU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUND. +199 YOU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, TAKES ONE LOOK AT +199 YOU, CURSES, AND GRABS FOR HIS AXE. +200 IS THIS ACCEPTABLE? +201 THERE'S NO POINT IN SUSPENDING A DEMONSTRATION GAME. +-1 +7 +1 3 +2 3 +3 8 9 +4 10 +5 11 +6 0 +7 14 15 +8 13 +9 94 -1 +10 96 +11 19 -1 +12 17 27 +13 101 -1 +14 103 +15 0 +16 106 +17 0 -1 +18 0 +19 3 +20 3 +21 0 +22 0 +23 109 -1 +24 25 -1 +25 23 67 +26 111 -1 +27 35 110 +28 0 +29 97 -1 +30 0 -1 +31 119 121 +32 117 122 +33 117 122 +34 0 0 +35 130 -1 +36 0 -1 +37 126 -1 +38 140 -1 +39 0 +40 96 -1 +50 18 +51 27 +52 28 +53 29 +54 30 +55 0 +56 92 +57 95 +58 97 +59 100 +60 101 +61 0 +62 119 121 +63 127 +64 130 -1 +-1 +8 +1 24 +2 29 +3 0 +4 33 +5 0 +6 33 +7 38 +8 38 +9 42 +10 14 +11 43 +12 110 +13 29 +14 110 +15 73 +16 75 +17 29 +18 13 +19 59 +20 59 +21 174 +22 109 +23 67 +24 13 +25 147 +26 155 +27 195 +28 146 +29 110 +30 13 +31 13 +-1 +9 +0 1 2 3 4 5 6 7 8 9 10 +0 100 115 116 126 +2 1 3 4 7 38 95 113 24 +1 24 +3 46 47 48 54 56 58 82 85 86 +3 122 123 124 125 126 127 128 129 130 +4 8 +5 13 +6 19 +7 42 43 44 45 46 47 48 49 50 51 +7 52 53 54 55 56 80 81 82 86 87 +8 99 100 101 +9 108 +-1 +10 +35 YOU ARE OBVIOUSLY A RANK AMATEUR. BETTER LUCK NEXT TIME. +100 YOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER. +130 YOU HAVE ACHIEVED THE RATING: "EXPERIENCED ADVENTURER". +200 YOU MAY NOW CONSIDER YOURSELF A "SEASONED ADVENTURER". +250 YOU HAVE REACHED "JUNIOR MASTER" STATUS. +300 YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS C. +330 YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS B. +349 YOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS A. +9999 ALL OF ADVENTUREDOM GIVES TRIBUTE TO YOU, ADVENTURER GRANDMASTER! +-1 +11 +2 9999 10 0 0 +3 9999 5 0 0 +4 4 2 62 63 +5 5 2 18 19 +6 8 2 20 21 +7 75 4 176 177 +8 25 5 178 179 +9 20 3 180 181 +-1 +12 +1 A LARGE CLOUD OF GREEN SMOKE APPEARS IN FRONT OF YOU. IT CLEARS AWAY +1 TO REVEAL A TALL WIZARD, CLOTHED IN GREY. HE FIXES YOU WITH A STEELY +1 GLARE AND DECLARES, "THIS ADVENTURE HAS LASTED TOO LONG." WITH THAT +1 HE MAKES A SINGLE PASS OVER YOU WITH HIS HANDS, AND EVERYTHING AROUND +1 YOU FADES AWAY INTO A GREY NOTHINGNESS. +2 EVEN WIZARDS HAVE TO WAIT LONGER THAN THAT! +3 I'M TERRIBLY SORRY, BUT COLOSSAL CAVE IS CLOSED. OUR HOURS ARE: +4 ONLY WIZARDS ARE PERMITTED WITHIN THE CAVE RIGHT NOW. +5 WE DO ALLOW VISITORS TO MAKE SHORT EXPLORATIONS DURING OUR OFF HOURS. +5 WOULD YOU LIKE TO DO THAT? +6 COLOSSAL CAVE IS OPEN TO REGULAR ADVENTURERS AT THE FOLLOWING HOURS: +7 VERY WELL. +8 ONLY A WIZARD MAY CONTINUE AN ADVENTURE THIS SOON. +9 I SUGGEST YOU RESUME YOUR ADVENTURE AT A LATER TIME. +10 DO YOU WISH TO SEE THE HOURS? +11 DO YOU WISH TO CHANGE THE HOURS? +12 NEW MAGIC WORD (NULL TO LEAVE UNCHANGED): +13 NEW MAGIC NUMBER (NULL TO LEAVE UNCHANGED): +14 DO YOU WISH TO CHANGE THE MESSAGE OF THE DAY? +15 OKAY. YOU CAN SAVE THIS VERSION NOW. +16 ARE YOU A WIZARD? +17 PROVE IT! SAY THE MAGIC WORD! +18 THAT IS NOT WHAT I THOUGHT IT WAS. DO YOU KNOW WHAT I THOUGHT IT WAS? +19 OH DEAR, YOU REALLY *ARE* A WIZARD! SORRY TO HAVE BOTHERED YOU . . . +20 FOO, YOU ARE NOTHING BUT A CHARLATAN! +21 NEW HOURS SPECIFIED BY DEFINING "PRIME TIME". GIVE ONLY THE HOUR +21 (E.G. 14, NOT 14:00 OR 2PM). ENTER A NEGATIVE NUMBER AFTER LAST PAIR. +22 NEW HOURS FOR COLOSSAL CAVE: +23 LIMIT LINES TO 70 CHARS. END WITH NULL LINE. +24 LINE TOO LONG, RETYPE: +25 NOT ENOUGH ROOM FOR ANOTHER LINE. ENDING MESSAGE HERE. +26 DO YOU WISH TO (RE)SCHEDULE THE NEXT HOLIDAY? +27 TO BEGIN HOW MANY DAYS FROM TODAY? +28 TO LAST HOW MANY DAYS (ZERO IF NO HOLIDAY)? +29 TO BE CALLED WHAT (UP TO 20 CHARACTERS)? +30 TOO SMALL! ASSUMING MINIMUM VALUE (45 MINUTES). +31 BREAK OUT OF THIS AND SAVE YOUR CORE-IMAGE. +32 BE SURE TO SAVE YOUR CORE-IMAGE... +-1 +0 diff --git a/src/games/adv3sb.2 b/src/games/adv3sb.2 new file mode 100644 index 00000000..b804c19e --- /dev/null +++ b/src/games/adv3sb.2 @@ -0,0 +1,854 @@ +C I/O ROUTINES (SPEAK, PSPEAK, RSPEAK, GETIN, YES, A5TOA1) + + + SUBROUTINE SPEAK(N) + +C PRINT THE MESSAGE WHICH STARTS AT LINES(N). PRECEDE IT WITH A BLANK LINE +C UNLESS BLKLIN IS FALSE. + + IMPLICIT INTEGER(A-Z) + LOGICAL BLKLIN + COMMON /TXTCOM/ RTEXT,LINES + COMMON /BLKCOM/ BLKLIN + DIMENSION RTEXT(205),LINES(9650) + + IF(N.EQ.0)RETURN + IF(LINES(N+1).EQ.'>$<')RETURN + IF(BLKLIN)TYPE 2 + K=N +1 L=IABS(LINES(K))-1 + K=K+1 + TYPE 2,(LINES(I),I=K,L) +2 FORMAT(' ',14A5) + K=L+1 + IF(LINES(K).GE.0)GOTO 1 + RETURN + END + + + + SUBROUTINE PSPEAK(MSG,SKIP) + +C FIND THE SKIP+1ST MESSAGE FROM MSG AND PRINT IT. MSG SHOULD BE THE INDEX OF +C THE INVENTORY MESSAGE FOR OBJECT. (INVEN+N+1 MESSAGE IS PROP=N MESSAGE). + + IMPLICIT INTEGER(A-Z) + COMMON /TXTCOM/ RTEXT,LINES + COMMON /PTXCOM/ PTEXT + DIMENSION RTEXT(205),LINES(9650),PTEXT(100) + + M=PTEXT(MSG) + IF(SKIP.LT.0)GOTO 9 + DO 3 I=0,SKIP +1 M=IABS(LINES(M)) + IF(LINES(M).GE.0)GOTO 1 +3 CONTINUE +9 CALL SPEAK(M) + RETURN + END + + + + SUBROUTINE RSPEAK(I) + +C PRINT THE I-TH "RANDOM" MESSAGE (SECTION 6 OF DATABASE). + + IMPLICIT INTEGER(A-Z) + COMMON /TXTCOM/ RTEXT + DIMENSION RTEXT(205) + + IF(I.NE.0)CALL SPEAK(RTEXT(I)) + RETURN + END + + + + SUBROUTINE MSPEAK(I) + +C PRINT THE I-TH "MAGIC" MESSAGE (SECTION 12 OF DATABASE). + + IMPLICIT INTEGER(A-Z) + COMMON /MTXCOM/ MTEXT + DIMENSION MTEXT(35) + + IF(I.NE.0)CALL SPEAK(MTEXT(I)) + RETURN + END + + + + SUBROUTINE GETIN(WORD1,WORD1X,WORD2,WORD2X) + +C GET A COMMAND FROM THE ADVENTURER. SNARF OUT THE FIRST WORD, PAD IT WITH +C BLANKS, AND RETURN IT IN WORD1. CHARS 6 THRU 10 ARE RETURNED IN WORD1X, IN +C CASE WE NEED TO PRINT OUT THE WHOLE WORD IN AN ERROR MESSAGE. ANY NUMBER OF +C BLANKS MAY FOLLOW THE WORD. IF A SECOND WORD APPEARS, IT IS RETURNED IN +C WORD2 (CHARS 6 THRU 10 IN WORD2X), ELSE WORD2 IS SET TO ZERO. + + IMPLICIT INTEGER(A-Z) + LOGICAL BLKLIN + COMMON /BLKCOM/ BLKLIN + DIMENSION A(5),MASKS(6) + DATA MASKS/"4000000000,"20000000,"100000,"400,"2,0/ + 1 ,BLANKS/' '/ + + IF(BLKLIN)TYPE 1 +1 FORMAT() +2 ACCEPT 3,(A(I),I=1,4) +3 FORMAT(4A5) + J=0 + DO 9 I=1,4 + IF(A(I).NE.BLANKS)J=1 +9 A(I)=A(I).AND.(SHIFT((A(I).AND.'@@@@@'),-1).XOR.-1) + IF(BLKLIN.AND.J.EQ.0)GOTO 2 + + SECOND=0 + WORD1=A(1) + WORD1X=A(2) + WORD2=0 + + DO 10 J=1,4 + DO 10 K=1,5 + MSK="774000000000 + IF(K.NE.1)MSK="177*MASKS(K) + IF(((A(J).XOR.BLANKS).AND.MSK).EQ.0)GOTO 15 + IF(SECOND.EQ.0)GOTO 10 + MSK=-MASKS(6-K) + WORD2=(SHIFT(A(J),7*(K-1)).AND.MSK) + 1 +(SHIFT(A(J+1),7*(K-6)).AND.(-2-MSK)) + WORD2X=(SHIFT(A(J+1),7*(K-1)).AND.MSK) + 1 +(SHIFT(A(J+2),7*(K-6)).AND.(-2-MSK)) + RETURN + +15 IF(SECOND.EQ.1)GOTO 10 + SECOND=1 + IF(J.EQ.1)WORD1=(WORD1.AND.-MASKS(K)) + 1 .OR.(BLANKS.AND.(-MASKS(K).XOR.-1)) +10 CONTINUE + RETURN + END + + + + LOGICAL FUNCTION YES(X,Y,Z) + +C CALL YESX (BELOW) WITH MESSAGES FROM SECTION 6. + + IMPLICIT INTEGER(A-Z) + EXTERNAL RSPEAK + LOGICAL YESX + + YES=YESX(X,Y,Z,RSPEAK) + RETURN + END + + + + LOGICAL FUNCTION YESM(X,Y,Z) + +C CALL YESX (BELOW) WITH MESSAGES FROM SECTION 12. + + IMPLICIT INTEGER(A-Z) + EXTERNAL MSPEAK + LOGICAL YESX + + YESM=YESX(X,Y,Z,MSPEAK) + RETURN + END + + + + LOGICAL FUNCTION YESX(X,Y,Z,SPK) + +C PRINT MESSAGE X, WAIT FOR YES/NO ANSWER. IF YES, PRINT Y AND LEAVE YEA +C TRUE; IF NO, PRINT Z AND LEAVE YEA FALSE. SPK IS EITHER RSPEAK OR MSPEAK. + + IMPLICIT INTEGER(A-Z) + +1 IF(X.NE.0)CALL SPK(X) + CALL GETIN(REPLY,JUNK1,JUNK2,JUNK3) + IF(REPLY.EQ.'YES'.OR.REPLY.EQ.'Y')GOTO 10 + IF(REPLY.EQ.'NO'.OR.REPLY.EQ.'N')GOTO 20 + TYPE 9 +9 FORMAT(/' PLEASE ANSWER THE QUESTION.') + GOTO 1 +10 YESX=.TRUE. + IF(Y.NE.0)CALL SPK(Y) + RETURN +20 YESX=.FALSE. + IF(Z.NE.0)CALL SPK(Z) + RETURN + END + + + + SUBROUTINE A5TOA1(A,B,C,CHARS,LENG) + +C A AND B CONTAIN A 1- TO 9-CHARACTER WORD IN A5 FORMAT, C CONTAINS ANOTHER +C WORD AND/OR PUNCTUATION. THEY ARE UNPACKED TO ONE CHARACTER PER WORD IN THE +C ARRAY "CHARS", WITH EXACTLY ONE BLANK BETWEEN B AND C (OR NONE, IF C >= 0). +C THE INDEX OF THE LAST NON-BLANK CHAR IN CHARS IS RETURNED IN LENG. + + IMPLICIT INTEGER(A-Z) + DIMENSION CHARS(20),WORDS(3) + DATA MASK,BLANK/"774000000000,' '/ + + WORDS(1)=A + WORDS(2)=B + WORDS(3)=C + POSN=1 + DO 1 WORD=1,3 + IF(WORD.EQ.2.AND.POSN.NE.6)GOTO 1 + IF(WORD.EQ.3.AND.C.LT.0)POSN=POSN+1 + DO 2 CH=1,5 + CHARS(POSN)=(WORDS(WORD).AND.MASK)+(BLANK-(BLANK.AND.MASK)) + IF(CHARS(POSN).EQ.BLANK)GOTO 1 + LENG=POSN + WORDS(WORD)=SHIFT(WORDS(WORD),7) +2 POSN=POSN+1 +1 CONTINUE + RETURN + END + C DATA STRUCTURE ROUTINES (VOCAB, DSTROY, JUGGLE, MOVE, PUT, CARRY, DROP) + + + INTEGER FUNCTION VOCAB(ID,INIT) + +C LOOK UP ID IN THE VOCABULARY (ATAB) AND RETURN ITS "DEFINITION" (KTAB), OR +C -1 IF NOT FOUND. IF INIT IS POSITIVE, THIS IS AN INITIALISATION CALL SETTING +C UP A KEYWORD VARIABLE, AND NOT FINDING IT CONSTITUTES A BUG. IT ALSO MEANS +C THAT ONLY KTAB VALUES WHICH TAKEN OVER 1000 EQUAL INIT MAY BE CONSIDERED. +C (THUS "STEPS", WHICH IS A MOTION VERB AS WELL AS AN OBJECT, MAY BE LOCATED +C AS AN OBJECT.) AND IT ALSO MEANS THE KTAB VALUE IS TAKEN MOD 1000. + + IMPLICIT INTEGER(A-Z) + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + DIMENSION KTAB(300),ATAB(300) + + HASH=ID.XOR.'PHROG' + DO 1 I=1,TABSIZ + IF(KTAB(I).EQ.-1)GOTO 2 + IF(INIT.GE.0.AND.KTAB(I)/1000.NE.INIT)GOTO 1 + IF(ATAB(I).EQ.HASH)GOTO 3 +1 CONTINUE + CALL BUG(21) + +2 VOCAB=-1 + IF(INIT.LT.0)RETURN + CALL BUG(5) + +3 VOCAB=KTAB(I) + IF(INIT.GE.0)VOCAB=MOD(VOCAB,1000) + RETURN + END + + + + SUBROUTINE DSTROY(OBJECT) + +C PERMANENTLY ELIMINATE "OBJECT" BY MOVING TO A NON-EXISTENT LOCATION. + + IMPLICIT INTEGER(A-Z) + + CALL MOVE(OBJECT,0) + RETURN + END + + + + SUBROUTINE JUGGLE(OBJECT) + +C JUGGLE AN OBJECT BY PICKING IT UP AND PUTTING IT DOWN AGAIN, THE PURPOSE +C BEING TO GET THE OBJECT TO THE FRONT OF THE CHAIN OF THINGS AT ITS LOC. + + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) + + I=PLACE(OBJECT) + J=FIXED(OBJECT) + CALL MOVE(OBJECT,I) + CALL MOVE(OBJECT+100,J) + RETURN + END + + + + SUBROUTINE MOVE(OBJECT,WHERE) + +C PLACE ANY OBJECT ANYWHERE BY PICKING IT UP AND DROPPING IT. MAY ALREADY BE +C TOTING, IN WHICH CASE THE CARRY IS A NO-OP. MUSTN'T PICK UP OBJECTS WHICH +C ARE NOT AT ANY LOC, SINCE CARRY WANTS TO REMOVE OBJECTS FROM ATLOC CHAINS. + + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) + + IF(OBJECT.GT.100)GOTO 1 + FROM=PLACE(OBJECT) + GOTO 2 +1 FROM=FIXED(OBJECT-100) +2 IF(FROM.GT.0.AND.FROM.LE.300)CALL CARRY(OBJECT,FROM) + CALL DROP(OBJECT,WHERE) + RETURN + END + + + + INTEGER FUNCTION PUT(OBJECT,WHERE,PVAL) + +C PUT IS THE SAME AS MOVE, EXCEPT IT RETURNS A VALUE USED TO SET UP THE +C NEGATED PROP VALUES FOR THE REPOSITORY OBJECTS. + + IMPLICIT INTEGER(A-Z) + + CALL MOVE(OBJECT,WHERE) + PUT=(-1)-PVAL + RETURN + END + + + + SUBROUTINE CARRY(OBJECT,WHERE) + +C START TOTING AN OBJECT, REMOVING IT FROM THE LIST OF THINGS AT ITS FORMER +C LOCATION. INCR HOLDNG UNLESS IT WAS ALREADY BEING TOTED. IF OBJECT>100 +C (MOVING "FIXED" SECOND LOC), DON'T CHANGE PLACE OR HOLDNG. + + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) + + IF(OBJECT.GT.100)GOTO 5 + IF(PLACE(OBJECT).EQ.-1)RETURN + PLACE(OBJECT)=-1 + HOLDNG=HOLDNG+1 +5 IF(ATLOC(WHERE).NE.OBJECT)GOTO 6 + ATLOC(WHERE)=LINK(OBJECT) + RETURN +6 TEMP=ATLOC(WHERE) +7 IF(LINK(TEMP).EQ.OBJECT)GOTO 8 + TEMP=LINK(TEMP) + GOTO 7 +8 LINK(TEMP)=LINK(OBJECT) + RETURN + END + + + + SUBROUTINE DROP(OBJECT,WHERE) + +C PLACE AN OBJECT AT A GIVEN LOC, PREFIXING IT ONTO THE ATLOC LIST. DECR +C HOLDNG IF THE OBJECT WAS BEING TOTED. + + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) + + IF(OBJECT.GT.100)GOTO 1 + IF(PLACE(OBJECT).EQ.-1)HOLDNG=HOLDNG-1 + PLACE(OBJECT)=WHERE + GOTO 2 +1 FIXED(OBJECT-100)=WHERE +2 IF(WHERE.LE.0)RETURN + LINK(OBJECT)=ATLOC(WHERE) + ATLOC(WHERE)=OBJECT + RETURN + END + C WIZARDRY ROUTINES (START, MAINT, WIZARD, HOURS(X), NEWHRS(X), MOTD, POOF) + + + LOGICAL FUNCTION START(DUMMY) + +C CHECK TO SEE IF THIS IS "PRIME TIME". IF SO, ONLY WIZARDS MAY PLAY, THOUGH +C OTHERS MAY BE ALLOWED A SHORT GAME FOR DEMONSTRATION PURPOSES. IF SETUP<0, +C WE'RE CONTINUING FROM A SAVED GAME, SO CHECK FOR SUITABLE LATENCY. RETURN +C TRUE IF THIS IS A DEMO GAME (VALUE IS IGNORED FOR RESTARTS). + + IMPLICIT INTEGER(A-Z) + LOGICAL PTIME,SOON,YESM + DIMENSION HNAME(4) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + +C FIRST FIND OUT WHETHER IT IS PRIME TIME (SAVE IN PTIME) AND, IF RESTARTING, +C WHETHER IT'S TOO SOON (SAVE IN SOON). PRIME-TIME SPECS ARE IN WKDAY, WKEND, +C AND HOLID; SEE MAINT ROUTINE FOR DETAILS. LATNCY IS REQUIRED DELAY BEFORE +C RESTARTING. WIZARDS MAY CUT THIS TO A THIRD. + + CALL DATIME(D,T) + PRIMTM=WKDAY + IF(MOD(D,7).LE.1)PRIMTM=WKEND + IF(D.GE.HBEGIN.AND.D.LE.HEND)PRIMTM=HOLID + PTIME=(PRIMTM.AND.SHIFT(1,T/60)).NE.0 + SOON=.FALSE. + IF(SETUP.GE.0)GOTO 20 + DELAY=(D-SAVED)*1440+(T-SAVET) + IF(DELAY.GE.LATNCY)GOTO 20 + TYPE 10,DELAY +10 FORMAT(' THIS ADVENTURE WAS SUSPENDED A MERE',I3,' MINUTES AGO.') + SOON=.TRUE. + IF(DELAY.GE.LATNCY/3)GOTO 20 + CALL MSPEAK(2) + STOP + +C IF NEITHER TOO SOON NOR PRIME TIME, NO PROBLEM. ELSE SPECIFY WHAT'S WRONG. + +20 START=.FALSE. + IF(SOON)GOTO 30 + IF(PTIME)GOTO 25 +22 SAVED=-1 + RETURN + +C COME HERE IF NOT RESTARTING TOO SOON (MAYBE NOT RESTARTING AT ALL), BUT IT'S +C PRIME TIME. GIVE OUR HOURS AND SEE IF HE'S A WIZARD. IF NOT, THEN CAN'T +C RESTART, BUT IF JUST BEGINNING THEN WE CAN OFFER A SHORT GAME. + +25 CALL MSPEAK(3) + CALL HOURS + CALL MSPEAK(4) + IF(WIZARD(0))GOTO 22 + IF(SETUP.LT.0)GOTO 33 + START=YESM(5,7,7) + IF(START)GOTO 22 + STOP + +C COME HERE IF RESTARTING TOO SOON. IF HE'S A WIZARD, LET HIM GO (AND NOTE +C THAT IT THEN DOESN'T MATTER WHETHER IT'S PRIME TIME). ELSE, TOUGH BEANS. + +30 CALL MSPEAK(8) + IF(WIZARD(0))GOTO 22 +33 CALL MSPEAK(9) + STOP + END + + + + SUBROUTINE MAINT + +C SOMEONE SAID THE MAGIC WORD TO INVOKE MAINTENANCE MODE. MAKE SURE HE'S A +C WIZARD. IF SO, LET HIM TWEAK ALL SORTS OF RANDOM THINGS, THEN EXIT SO CAN +C SAVE TWEAKED VERSION. SINCE MAGIC WORD MUST BE FIRST COMMAND GIVEN, ONLY +C THING WHICH NEEDS TO BE FIXED UP IS ABB(1). + + IMPLICIT INTEGER(A-Z) + LOGICAL YESM,BLKLIN + DIMENSION HNAME(4),ABB(150) + COMMON /BLKCOM/ BLKLIN + COMMON /ABBCOM/ ABB + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + + IF(.NOT.WIZARD(0))RETURN + BLKLIN=.FALSE. + IF(YESM(10,0,0))CALL HOURS + IF(YESM(11,0,0))CALL NEWHRS + IF(.NOT.YESM(26,0,0))GOTO 10 + CALL MSPEAK(27) + ACCEPT 1,HBEGIN +1 FORMAT(G) + CALL MSPEAK(28) + ACCEPT 1,HEND + CALL DATIME(D,T) + HBEGIN=HBEGIN+D + HEND=HBEGIN+HEND-1 + CALL MSPEAK(29) + ACCEPT 2,HNAME +2 FORMAT(4A5) +10 TYPE 12,SHORT +12 FORMAT(' LENGTH OF SHORT GAME (NULL TO LEAVE AT',I3,'):') + ACCEPT 1,X + IF(X.GT.0)SHORT=X + CALL MSPEAK(12) + CALL GETIN(X,Y,Y,Y) + IF(X.NE.' ')MAGIC=X + CALL MSPEAK(13) + ACCEPT 1,X + IF(X.GT.0)MAGNM=X + TYPE 16,LATNCY +16 FORMAT(' LATENCY FOR RESTART (NULL TO LEAVE AT',I3,'):') + ACCEPT 1,X + IF(X.GT.0.AND.X.LT.45)CALL MSPEAK(30) + IF(X.GT.0)LATNCY=MAX0(45,X) + IF(YESM(14,0,0))CALL MOTD(.TRUE.) + SAVED=0 + SETUP=2 + ABB(1)=0 + CALL MSPEAK(15) + BLKLIN=.TRUE. + CALL CIAO + END + + + + LOGICAL FUNCTION WIZARD(DUMMY) + +C ASK IF HE'S A WIZARD. IF HE SAYS YES, MAKE HIM PROVE IT. RETURN TRUE IF HE +C REALLY IS A WIZARD. + + IMPLICIT INTEGER(A-Z) + LOGICAL YESM + DIMENSION HNAME(4),VAL(5) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + + WIZARD=YESM(16,0,7) + IF(.NOT.WIZARD)RETURN + +C HE SAYS HE IS. FIRST STEP: DOES HE KNOW ANYTHING MAGICAL? + + CALL MSPEAK(17) + CALL GETIN(WORD,X,Y,Z) + IF(WORD.NE.MAGIC)GOTO 99 + +C HE DOES. GIVE HIM A RANDOM CHALLENGE AND CHECK HIS REPLY. + + CALL DATIME(D,T) + T=T*2+1 + WORD='@@@@@' + DO 15 Y=1,5 + X=79+MOD(D,5) + D=D/5 + DO 12 Z=1,X +12 T=MOD(T*1027,1048576) + VAL(Y)=(T*26)/1048576+1 +15 WORD=WORD+SHIFT(VAL(Y),36-7*Y) + IF(YESM(18,0,0))GOTO 99 + TYPE 18,WORD +18 FORMAT(/1X,A5) + CALL GETIN(WORD,X,Y,Z) + CALL DATIME(D,T) + T=(T/60)*40+(T/10)*10 + D=MAGNM + DO 19 Y=1,5 + Z=MOD(Y,5)+1 + X=MOD(IABS(VAL(Y)-VAL(Z))*MOD(D,10)+MOD(T,10),26)+1 + T=T/10 + D=D/10 +19 WORD=WORD-SHIFT(X,36-7*Y) + IF(WORD.NE.'@@@@@')GOTO 99 + +C BY GEORGE, HE REALLY *IS* A WIZARD! + + CALL MSPEAK(19) + RETURN + +C AHA! AN IMPOSTOR! + +99 CALL MSPEAK(20) + WIZARD=.FALSE. + RETURN + END + + + + SUBROUTINE HOURS + +C ANNOUNCE THE CURRENT HOURS WHEN THE CAVE IS OPEN FOR ADVENTURING. THIS INFO +C IS STORED IN WKDAY, WKEND, AND HOLID, WHERE BIT SHIFT(1,N) IS ON IFF THE +C HOUR FROM N:00 TO N:59 IS "PRIME TIME" (CAVE CLOSED). WKDAY IS FOR +C WEEKDAYS, WKEND FOR WEEKENDS, HOLID FOR HOLIDAYS. NEXT HOLIDAY IS FROM +C HBEGIN TO HEND. + + IMPLICIT INTEGER(A-Z) + DIMENSION HNAME(4),VAL(5) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME + + TYPE 1 +1 FORMAT() + CALL HOURSX(WKDAY,'MON -',' FRI:') + CALL HOURSX(WKEND,'SAT -',' SUN:') + CALL HOURSX(HOLID,'HOLID','AYS: ') + CALL DATIME(D,T) + IF(HEND.LT.D.OR.HEND.LT.HBEGIN)RETURN + IF(HBEGIN.GT.D)GOTO 10 + TYPE 5,HNAME +5 FORMAT(/' TODAY IS A HOLIDAY, NAMELY ',4A5) + RETURN + +10 D=HBEGIN-D + T='DAYS,' + IF(D.EQ.1)T='DAY, ' + TYPE 15,D,T,HNAME +15 FORMAT(/' THE NEXT HOLIDAY WILL BE IN',I3,' ',A5,' NAMELY ',4A5) + RETURN + END + + + + SUBROUTINE HOURSX(H,DAY1,DAY2) + +C USED BY HOURS (ABOVE) TO PRINT HOURS FOR EITHER WEEKDAYS OR WEEKENDS. + + IMPLICIT INTEGER(A-Z) + LOGICAL FIRST + + FIRST=.TRUE. + FROM=-1 + IF(H.NE.0)GOTO 10 + TYPE 2,DAY1,DAY2 +2 FORMAT(10X,2A5,' OPEN ALL DAY') + RETURN + +10 FROM=FROM+1 + IF((H.AND.SHIFT(1,FROM)).NE.0)GOTO 10 + IF(FROM.GE.24)GOTO 20 + TILL=FROM +14 TILL=TILL+1 + IF((H.AND.SHIFT(1,TILL)).EQ.0.AND.TILL.NE.24)GOTO 14 + IF(FIRST)TYPE 16,DAY1,DAY2,FROM,TILL + IF(.NOT.FIRST)TYPE 18,FROM,TILL +16 FORMAT(10X,2A5,I4,':00 TO',I3,':00') +18 FORMAT(20X,I4,':00 TO',I3,':00') + FIRST=.FALSE. + FROM=TILL + GOTO 10 + +20 IF(FIRST)TYPE 22,DAY1,DAY2 +22 FORMAT(10X,2A5,' CLOSED ALL DAY') + RETURN + END + + + + SUBROUTINE NEWHRS + +C SET UP NEW HOURS FOR THE CAVE. SPECIFIED AS INVERSE--I.E., WHEN IS IT +C CLOSED DUE TO PRIME TIME? SEE HOURS (ABOVE) FOR DESC OF VARIABLES. + + IMPLICIT INTEGER(A-Z) + DIMENSION HNAME(4) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME + + CALL MSPEAK(21) + WKDAY=NEWHRX('WEEKD','AYS:') + WKEND=NEWHRX('WEEKE','NDS:') + HOLID=NEWHRX('HOLID','AYS:') + CALL MSPEAK(22) + CALL HOURS + RETURN + END + + + + INTEGER FUNCTION NEWHRX(DAY1,DAY2) + +C INPUT PRIME TIME SPECS AND SET UP A WORD OF INTERNAL FORMAT. + + IMPLICIT INTEGER(A-Z) + + NEWHRX=0 + TYPE 1,DAY1,DAY2 +1 FORMAT(' PRIME TIME ON ',2A5) +10 TYPE 2 +2 FORMAT(' FROM:') + ACCEPT 3,FROM +3 FORMAT(G) + IF(FROM.LT.0.OR.FROM.GE.24)RETURN + TYPE 4 +4 FORMAT(' TILL:') + ACCEPT 3,TILL + TILL=TILL-1 + IF(TILL.LT.FROM.OR.TILL.GE.24)RETURN + DO 5 I=FROM,TILL +5 NEWHRX=(NEWHRX.OR.SHIFT(1,I)) + GOTO 10 + END + + + + SUBROUTINE MOTD(ALTER) + +C HANDLES MESSAGE OF THE DAY. IF ALTER IS TRUE, READ A NEW MESSAGE FROM THE +C WIZARD. ELSE PRINT THE CURRENT ONE. MESSAGE IS INITIALLY NULL. + + IMPLICIT INTEGER(A-Z) + LOGICAL ALTER + DIMENSION MSG(100) + DATA MSG/100*-1/ + + IF(ALTER)GOTO 50 + + K=1 +10 IF(MSG(K).LT.0)RETURN + TYPE 20,(MSG(I),I=K+1,MSG(K)-1) +20 FORMAT(' ',14A5) + K=MSG(K) + GOTO 10 + +50 M=1 + CALL MSPEAK(23) +55 ACCEPT 56,(MSG(I),I=M+1,M+14),K +56 FORMAT(15A5) + IF(K.EQ.' ')GOTO 60 + CALL MSPEAK(24) + GOTO 55 +60 DO 62 I=1,14 + K=M+15-I + IF(MSG(K).NE.' ')GOTO 65 +62 CONTINUE + GOTO 90 +65 MSG(M)=K+1 + M=K+1 + IF(M+14.LT.100)GOTO 55 + CALL MSPEAK(25) +90 MSG(M)=-1 + RETURN + END + + + + SUBROUTINE POOF + +C AS PART OF DATABASE INITIALISATION, WE CALL POOF TO SET UP SOME DUMMY +C PRIME-TIME SPECS, MAGIC WORDS, ETC. + + IMPLICIT INTEGER(A-Z) + DIMENSION HNAME(4) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + + WKDAY="00777400 + WKEND=0 + HOLID=0 + HBEGIN=0 + HEND=-1 + SHORT=30 + MAGIC='DWARF' + MAGNM=11111 + LATNCY=90 + RETURN + END + C UTILITY ROUTINES (SHIFT, RAN, DATIME, CIAO, BUG) + + + INTEGER FUNCTION SHIFT(VAL,DIST) + IMPLICIT INTEGER(A-Z) + +C RETURN VAL LEFT-SHIFTED (LOGICALLY) DIST BITS (RIGHT-SHIFT IF DIST<0). + + SHIFT=VAL + IF(DIST)10,20,30 +10 IDIST=-DIST + DO 11 I=1,IDIST + J=0 + IF(SHIFT.LT.0)J="200000000000 +11 SHIFT=((SHIFT.AND."377777777777)/2)+J +20 RETURN +30 DO 31 I=1,DIST + J=0 + IF((SHIFT.AND."200000000000).NE.0)J="400000000000 +31 SHIFT=(SHIFT.AND."177777777777)*2+J + RETURN + END + + + + INTEGER FUNCTION RAN(RANGE) + +C SINCE THE RAN FUNCTION IN LIB40 SEEMS TO BE A REAL LOSE, WE'LL USE ONE OF +C OUR OWN. IT'S BEEN RUN THROUGH MANY OF THE TESTS IN KNUTH VOL. 2 AND +C SEEMS TO BE QUITE RELIABLE. RAN RETURNS A VALUE UNIFORMLY SELECTED +C BETWEEN 0 AND RANGE-1. NOTE RESEMBLANCE TO ALG USED IN WIZARD. + + IMPLICIT INTEGER(A-Z) + DATA R/0/ + + D=1 + IF(R.NE.0)GOTO 1 + CALL DATIME(D,T) + R=18*T+5 + D=1000+MOD(D,1000) +1 DO 2 T=1,D +2 R=MOD(R*1021,1048576) + RAN=(RANGE*R)/1048576 + RETURN + END + + + + SUBROUTINE DATIME(D,T) + +C RETURN THE DATE AND TIME IN D AND T. D IS NUMBER OF DAYS SINCE 01-JAN-77, +C T IS MINUTES PAST MIDNIGHT. THIS IS HARDER THAN IT SOUNDS, BECAUSE THE +C FINAGLED DEC FUNCTIONS RETURN THE VALUES ONLY AS ASCII STRINGS! + + IMPLICIT INTEGER(A-Z) + DIMENSION DAT(2),MONTHS(12),HATH(12) + DATA MONTHS/'-JAN-','-FEB-','-MAR-','-APR-','-MAY-','-JUN-', + 1 '-JUL-','-AUG-','-SEP-','-OCT-','-NOV-','-DEC-'/ + DATA HATH/31,28,31,30,31,30,31,31,30,31,30,31/ + +C FUNCTION I2 TAKES 2-DIGIT ASCII AND YIELDS DECIMAL VALUE. + + I2(X)=(SHIFT(X,-29).AND.15)*10+(SHIFT(X,-22).AND.15) + + CALL DATE(DAT) + CALL TIME(TIM) + + YEAR=I2(SHIFT(DAT(2),14))-77 + D=I2(DAT(1))-1 + X=((SHIFT(DAT(1),14).OR.SHIFT(DAT(2),-21)).AND..NOT."1004020001) + 1 .OR.'-@@@-' +C ABOVE FUNNY EXPRESSION GUARANTEES (A) UPPER-CASE, AND (B) BOTTOM BIT OKAY. + X='-JAN-' + DO 1 MON=1,12 + IF(X.EQ.MONTHS(MON))GOTO 2 +1 D=D+HATH(MON) + CALL BUG(28) + +2 D=D+YEAR*365+YEAR/4 + IF(MOD(YEAR,4).EQ.3.AND.MON.GT.2)D=D+1 + T=I2(TIM)*60+I2(SHIFT(TIM,21)) + RETURN + END + + + + SUBROUTINE CIAO + +C EXITS, AFTER ISSUING REMINDER TO SAVE NEW CORE IMAGE. USED WHEN SUSPENDING +C AND WHEN CREATING NEW VERSION VIA MAGIC MODE. ON SOME SYSTEMS, THE CORE +C IMAGE IS LOST ONCE THE PROGRAM EXITS. IF SO, SET K=31 INSTEAD OF 32. + + IMPLICIT INTEGER(A-Z) + DATA K/32/ + + CALL MSPEAK(K) + IF(K.EQ.31)CALL GETIN(A,B,C,D) + STOP + END + + + + SUBROUTINE BUG(NUM) + IMPLICIT INTEGER(A-Z) + +C THE FOLLOWING CONDITIONS ARE CURRENTLY CONSIDERED FATAL BUGS. NUMBERS < 20 +C ARE DETECTED WHILE READING THE DATABASE; THE OTHERS OCCUR AT "RUN TIME". +C 0 MESSAGE LINE > 70 CHARACTERS +C 1 NULL LINE IN MESSAGE +C 2 TOO MANY WORDS OF MESSAGES +C 3 TOO MANY TRAVEL OPTIONS +C 4 TOO MANY VOCABULARY WORDS +C 5 REQUIRED VOCABULARY WORD NOT FOUND +C 6 TOO MANY RTEXT OR MTEXT MESSAGES +C 7 TOO MANY HINTS +C 8 LOCATION HAS COND BIT BEING SET TWICE +C 9 INVALID SECTION NUMBER IN DATABASE +C 20 SPECIAL TRAVEL (500>L>300) EXCEEDS GOTO LIST +C 21 RAN OFF END OF VOCABULARY TABLE +C 22 VOCABULARY TYPE (N/1000) NOT BETWEEN 0 AND 3 +C 23 INTRANSITIVE ACTION VERB EXCEEDS GOTO LIST +C 24 TRANSITIVE ACTION VERB EXCEEDS GOTO LIST +C 25 CONDITIONAL TRAVEL ENTRY WITH NO ALTERNATIVE +C 26 LOCATION HAS NO TRAVEL ENTRIES +C 27 HINT NUMBER EXCEEDS GOTO LIST +C 28 INVALID MONTH RETURNED BY DATE FUNCTION + + TYPE 1, NUM +1 FORMAT (' FATAL ERROR, SEE SOURCE CODE FOR INTERPRETATION.'/ + 1 ' PROBABLY CAUSE: ERRONEOUS INFO IN DATABASE.'/ + 2 ' ERROR CODE =',I2/) + STOP + END diff --git a/src/games/adv3sr.1 b/src/games/adv3sr.1 new file mode 100644 index 00000000..162ab55b --- /dev/null +++ b/src/games/adv3sr.1 @@ -0,0 +1,2086 @@ +C ADVENTURES + +C CURRENT LIMITS: +C 9650 WORDS OF MESSAGE TEXT (LINES, LINSIZ). +C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). +C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). +C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). +C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). +C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). +C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). +C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). +C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). +C 35 MAGIC MESSAGES (MTEXT, MAGSIZ). +C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF +C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, +C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: +C 1000 NON-SYNONYMOUS VOCABULARY WORDS +C 300 LOCATIONS +C 100 OBJECTS + + IMPLICIT INTEGER(A-Z) + LOGICAL DSEEN,BLKLIN,HINTED,YES,START + + COMMON /TXTCOM/ RTEXT,LINES + COMMON /BLKCOM/ BLKLIN + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + COMMON /MTXCOM/ MTEXT + COMMON /PTXCOM/ PTEXT + COMMON /ABBCOM/ ABB + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + + DIMENSION LINES(9650) + DIMENSION TRAVEL(750) + DIMENSION KTAB(300),ATAB(300) + DIMENSION LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), + 1 ATLOC(150) + DIMENSION PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), + 1 PTEXT(100),PROP(100) + DIMENSION ACTSPK(35) + DIMENSION RTEXT(205) + DIMENSION CTEXT(12),CVAL(12) + DIMENSION HINTLC(20),HINTED(20),HINTS(20,4) + DIMENSION MTEXT(35) + DIMENSION TK(20),DSEEN(6),DLOC(6),ODLOC(6),HNAME(4) + + DATA LINSIZ/9650/,TRVSIZ/750/,TABSIZ/300/,LOCSIZ/150/, + 1 VRBSIZ/35/,RTXSIZ/205/,CLSMAX/12/,HNTSIZ/20/,MAGSIZ/35/ + DATA SETUP/0/,BLKLIN/.TRUE./ + C STATEMENT FUNCTIONS +C +C +C TOTING(OBJ) = TRUE IF THE OBJ IS BEING CARRIED +C HERE(OBJ) = TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED) +C AT(OBJ) = TRUE IF ON EITHER SIDE OF TWO-PLACED OBJECT +C LIQ(DUMMY) = OBJECT NUMBER OF LIQUID IN BOTTLE +C LIQLOC(LOC) = OBJECT NUMBER OF LIQUID (IF ANY) AT LOC +C BITSET(L,N) = TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT) +C FORCED(LOC) = TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2) +C DARK(DUMMY) = TRUE IF LOCATION "LOC" IS DARK +C PCT(N) = TRUE N% OF THE TIME (N INTEGER FROM 0 TO 100) +C +C WZDARK SAYS WHETHER THE LOC HE'S LEAVING WAS DARK +C LMWARN SAYS WHETHER HE'S BEEN WARNED ABOUT LAMP GOING DIM +C CLOSNG SAYS WHETHER ITS CLOSING TIME YET +C PANIC SAYS WHETHER HE'S FOUND OUT HE'S TRAPPED IN THE CAVE +C CLOSED SAYS WHETHER WE'RE ALL THE WAY CLOSED +C GAVEUP SAYS WHETHER HE EXITED VIA "QUIT" +C SCORNG INDICATES TO THE SCORE ROUTINE WHETHER WE'RE DOING A "SCORE" COMMAND +C DEMO IS TRUE IF THIS IS A PRIME-TIME DEMONSTRATION GAME +C YEA IS RANDOM YES/NO REPLY + + LOGICAL TOTING,HERE,AT,BITSET,DARK,WZDARK,LMWARN,CLOSNG,PANIC, + 1 CLOSED,GAVEUP,SCORNG,DEMO,YEA + + TOTING(OBJ)=PLACE(OBJ).EQ.-1 + HERE(OBJ)=PLACE(OBJ).EQ.LOC.OR.TOTING(OBJ) + AT(OBJ)=PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC + LIQ2(PBOTL)=(1-PBOTL)*WATER+(PBOTL/2)*(WATER+OIL) + LIQ(DUMMY)=LIQ2(MAX0(PROP(BOTTLE),-1-PROP(BOTTLE))) + LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2*2,8)-5)*MOD(COND(LOC)/4,2)+1) + BITSET(L,N)=(COND(L).AND.SHIFT(1,N)).NE.0 + FORCED(LOC)=COND(LOC).EQ.2 + DARK(DUMMY)=MOD(COND(LOC),2).EQ.0.AND.(PROP(LAMP).EQ.0.OR. + 1 .NOT.HERE(LAMP)) + PCT(N)=RAN(100).LT.N + C DESCRIPTION OF THE DATABASE FORMAT +C +C +C THE DATA FILE CONTAINS SEVERAL SECTIONS. EACH BEGINS WITH A LINE CONTAINING +C A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1". +C +C SECTION 1: LONG FORM DESCRIPTIONS. EACH LINE CONTAINS A LOCATION NUMBER, +C A TAB, AND A LINE OF TEXT. THE SET OF (NECESSARILY ADJACENT) LINES +C WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X. +C SECTION 2: SHORT FORM DESCRIPTIONS. SAME FORMAT AS LONG FORM. NOT ALL +C PLACES HAVE SHORT DESCRIPTIONS. +C SECTION 3: TRAVEL TABLE. EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND +C LOCATION NUMBER (Y), AND A LIST OF MOTION NUMBERS (SEE SECTION 4). +C EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X. +C Y, IN TURN, IS INTERPRETED AS FOLLOWS. LET M=Y/1000, N=Y MOD 1000. +C IF N<=300 IT IS THE LOCATION TO GO TO. +C IF 300500 MESSAGE N-500 FROM SECTION 6 IS PRINTED, +C AND HE STAYS WHEREVER HE IS. +C MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION. +C IF M=0 IT'S UNCONDITIONAL. +C IF 0$<". +C SECTION 6: ARBITRARY MESSAGES. SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT +C THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS +C IN SECTION 4). +C SECTION 7: OBJECT LOCATIONS. EACH LINE CONTAINS AN OBJECT NUMBER AND ITS +C INITIAL LOCATION (ZERO (OR OMITTED) IF NONE). IF THE OBJECT IS +C IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1". IF IT HAS TWO LOCATIONS +C (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND +C THE OBJECT IS ASSUMED TO BE IMMOVABLE. +C SECTION 8: ACTION DEFAULTS. EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND +C THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB. +C SECTION 9: LIQUID ASSETS, ETC. EACH LINE CONTAINS A NUMBER (N) AND UP TO 20 +C LOCATION NUMBERS. BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN COND(LOC) +C FOR EACH LOC GIVEN. THE COND BITS CURRENTLY ASSIGNED ARE: +C 0 LIGHT +C 1 IF BIT 2 IS ON: ON FOR OIL, OFF FOR WATER +C 2 LIQUID ASSET, SEE BIT 1 +C 3 PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER +C OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES: +C 4 TRYING TO GET INTO CAVE +C 5 TRYING TO CATCH BIRD +C 6 TRYING TO DEAL WITH SNAKE +C 7 LOST IN MAZE +C 8 PONDERING DARK ROOM +C 9 AT WITT'S END +C COND(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED +C MOTION. +C SECTION 10: CLASS MESSAGES. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A +C MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER. THE SCORING SECTION +C SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO +C APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT +C HIGHER THAN THIS N. NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY +C MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM. +C SECTION 11: HINTS. EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A +C COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT +C LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE +C HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE +C NUMBER OF THE HINT. THESE VALUES ARE STASHED IN THE "HINTS" ARRAY. +C HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ). NUMBERS 1-3 ARE +C UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO +C REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO +C REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES +C POINTS). +C SECTION 12: MAGIC MESSAGES. IDENTICAL TO SECTION 6 EXCEPT PUT IN A SEPARATE +C SECTION FOR EASIER REFERENCE. MAGIC MESSAGES ARE USED BY THE STARTUP, +C MAINTENANCE MODE, AND RELATED ROUTINES. +C SECTION 0: END OF DATABASE. + C READ THE DATABASE IF WE HAVE NOT YET DONE SO + + IF(SETUP.NE.0)GOTO 1100 + TYPE 1000 +1000 FORMAT(' INITIALISING...') + +C CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN ARRAY +C LINES; EACH LINE IS PRECEDED BY A WORD POINTING TO THE NEXT POINTER (I.E. +C THE WORD FOLLOWING THE END OF THE LINE). THE POINTER IS NEGATIVE IF THIS IS +C FIRST LINE OF A MESSAGE. THE TEXT-POINTER ARRAYS CONTAIN INDICES OF +C POINTER-WORDS IN LINES. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N. +C LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0. +C SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS. RTEXT CONTAINS +C SECTION 6'S STUFF. CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE. MTEXT IS FOR +C SECTION 12. WE ALSO CLEAR COND. SEE DESCRIPTION OF SECTION 9 FOR DETAILS. + + DO 1001 I=1,300 + IF(I.LE.100)PTEXT(I)=0 + IF(I.LE.RTXSIZ)RTEXT(I)=0 + IF(I.LE.CLSMAX)CTEXT(I)=0 + IF(I.LE.MAGSIZ)MTEXT(I)=0 + IF(I.GT.LOCSIZ)GOTO 1001 + STEXT(I)=0 + LTEXT(I)=0 + COND(I)=0 +1001 CONTINUE + + CALL IFILE(1,'TEXT') + SETUP=1 + LINUSE=1 + TRVS=1 + CLSSES=1 + +C START NEW DATA SECTION. SECT IS THE SECTION NUMBER. + +1002 READ(1,1003)SECT +1003 FORMAT(G) + OLDLOC=-1 + GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004, + 1 1080,1004) (SECT+1) +C (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) +C (11) (12) + CALL BUG(9) + +C SECTIONS 1, 2, 5, 6, 10, 12. READ MESSAGES AND SET UP POINTERS. + +1004 READ(1,1005)LOC,(LINES(J),J=LINUSE+1,LINUSE+14),KK +1005 FORMAT(1G,15A5) + IF(KK.NE.' ')CALL BUG(0) + IF(LOC.EQ.-1)GOTO 1002 + DO 1006 K=1,14 + KK=LINUSE+15-K + IF(LINES(KK).NE.' ')GOTO 1007 +1006 CONTINUE + IF(LOC.EQ.0)GOTO 1004 +C ABOVE KLUGE IS TO AVOID F40 BUG IF CRLF BROKEN ACROSS RECORD BOUNDARY + CALL BUG(1) +1007 LINES(LINUSE)=KK+1 + IF(LOC.EQ.OLDLOC)GOTO 1020 + LINES(LINUSE)=-LINES(LINUSE) + IF(SECT.EQ.12)GOTO 1013 + IF(SECT.EQ.10)GOTO 1012 + IF(SECT.EQ.6)GOTO 1011 + IF(SECT.EQ.5)GOTO 1010 + IF(SECT.EQ.1)GOTO 1008 + + STEXT(LOC)=LINUSE + GOTO 1020 + +1008 LTEXT(LOC)=LINUSE + GOTO 1020 + +1010 IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE + GOTO 1020 + +1011 IF(LOC.GT.RTXSIZ)CALL BUG(6) + RTEXT(LOC)=LINUSE + GOTO 1020 + +1012 CTEXT(CLSSES)=LINUSE + CVAL(CLSSES)=LOC + CLSSES=CLSSES+1 + GOTO 1020 + +1013 IF(LOC.GT.MAGSIZ)CALL BUG(6) + MTEXT(LOC)=LINUSE + +1020 LINUSE=KK+1 + LINES(LINUSE)=-1 + OLDLOC=LOC + IF(LINUSE+14.GT.LINSIZ)CALL BUG(2) + GOTO 1004 + +C THE STUFF FOR SECTION 3 IS ENCODED HERE. EACH "FROM-LOCATION" GETS A +C CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY. EACH ENTRY IN TRAVEL IS +C NEWLOC*1000 + KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF +C THIS IS THE LAST ENTRY FOR THIS LOCATION. KEY(N) IS THE INDEX IN TRAVEL +C OF THE FIRST OPTION AT LOCATION N. + +1030 READ(1,1031)LOC,NEWLOC,TK +1031 FORMAT(99G) + IF(LOC.EQ.0)GOTO 1030 +C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG + IF(LOC.EQ.-1)GOTO 1002 + IF(KEY(LOC).NE.0)GOTO 1033 + KEY(LOC)=TRVS + GOTO 1035 +1033 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) +1035 DO 1037 L=1,20 + IF(TK(L).EQ.0)GOTO 1039 + TRAVEL(TRVS)=NEWLOC*1000+TK(L) + TRVS=TRVS+1 + IF(TRVS.EQ.TRVSIZ)CALL BUG(3) +1037 CONTINUE +1039 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) + GOTO 1030 + +C HERE WE READ IN THE VOCABULARY. KTAB(N) IS THE WORD NUMBER, ATAB(N) IS +C THE CORRESPONDING WORD. THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB +C AS AN END-MARKER. THE WORDS ARE GIVEN A MINIMAL HASH TO MAKE READING THE +C CORE-IMAGE HARDER. NOTE THAT '/7-08' HAD BETTER NOT BE IN THE LIST, SINCE +C IT COULD HASH TO -1. + +1040 DO 1042 TABNDX=1,TABSIZ +1043 READ(1,1041)KTAB(TABNDX),ATAB(TABNDX) +1041 FORMAT(G,A5) + IF(KTAB(TABNDX).EQ.0)GOTO 1043 +C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG + IF(KTAB(TABNDX).EQ.-1)GOTO 1002 +1042 ATAB(TABNDX)=ATAB(TABNDX).XOR.'PHROG' + CALL BUG(4) + +C READ IN THE INITIAL LOCATIONS FOR EACH OBJECT. ALSO THE IMMOVABILITY INFO. +C PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS. FIXD IS -1 FOR IMMOVABLE +C OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS. + +1050 READ(1,1031)OBJ,J,K + IF(OBJ.EQ.-1)GOTO 1002 + PLAC(OBJ)=J + FIXD(OBJ)=K + GOTO 1050 + +C READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK. + +1060 READ(1,1031)VERB,J + IF(VERB.EQ.-1)GOTO 1002 + ACTSPK(VERB)=J + GOTO 1060 + +C READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND. + +1070 READ(1,1031)K,TK + IF(K.EQ.-1)GOTO 1002 + DO 1071 I=1,20 + LOC=TK(I) + IF(LOC.EQ.0)GOTO 1070 + IF(BITSET(LOC,K))CALL BUG(8) +1071 COND(LOC)=COND(LOC)+SHIFT(1,K) + GOTO 1070 + +C READ DATA FOR HINTS. + +1080 HNTMAX=0 +1081 READ(1,1031)K,TK + IF(K.EQ.-1)GOTO 1002 + IF(K.EQ.0)GOTO 1081 + IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7) + DO 1083 I=1,4 +1083 HINTS(K,I)=TK(I) + HNTMAX=MAX0(HNTMAX,K) + GOTO 1081 + C FINISH CONSTRUCTING INTERNAL DATA FORMAT + +C IF SETUP=2 WE DON'T NEED TO DO THIS. IT'S ONLY NECESSARY IF WE HAVEN'T DONE +C IT AT ALL OR IF THE PROGRAM HAS BEEN RUN SINCE THEN. + +1100 IF(SETUP.EQ.2)GOTO 1 + IF(SETUP.EQ.-1)GOTO 8305 + +C HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED. PROPS ARE +C SET TO ZERO. WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL +C ENTRIES. THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST +C OBJECT AT LOCATION N, AND LINK(OBJ) AS THE NEXT OBJECT AT THE SAME LOCATION +C AS OBJ. (OBJ>100 INDICATES THAT FIXED(OBJ-100)=LOC; LINK(OBJ) IS STILL THE +C CORRECT LINK TO USE.) ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED +C DESCRIPTION IS PRINTED. COUNTS MOD 5 UNLESS "LOOK" IS USED. + + DO 1101 I=1,100 + PLACE(I)=0 + PROP(I)=0 + LINK(I)=0 +1101 LINK(I+100)=0 + + DO 1102 I=1,LOCSIZ + ABB(I)=0 + IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102 + K=KEY(I) + IF(MOD(IABS(TRAVEL(K)),1000).EQ.1)COND(I)=2 +1102 ATLOC(I)=0 + +C SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE. WE'LL USE THE DROP +C SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS. SINCE WE WANT THINGS +C IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS. IF THE OBJECT IS IN TWO +C LOCS, WE DROP IT TWICE. THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF +C "PLAC" AND "FIXD". ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST +C DESCRIBED LAST, WE'LL DROP THEM FIRST. + + DO 1106 I=1,100 + K=101-I + IF(FIXD(K).LE.0)GOTO 1106 + CALL DROP(K+100,FIXD(K)) + CALL DROP(K,PLAC(K)) +1106 CONTINUE + + DO 1107 I=1,100 + K=101-I + FIXED(K)=FIXD(K) +1107 IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K)) + +C TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79). +C THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE +C DESCRIBED. TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW +C WHEN TO CLOSE THE CAVE. TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF +C LOST BIRD OR BRIDGE). + + MAXTRS=79 + TALLY=0 + TALLY2=0 + DO 1200 I=50,MAXTRS + IF(PTEXT(I).NE.0)PROP(I)=-1 +1200 TALLY=TALLY-PROP(I) + +C CLEAR THE HINT STUFF. HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT +C I. HINTED(I) IS TRUE IFF HINT I HAS BEEN USED. + + DO 1300 I=1,HNTMAX + HINTED(I)=.FALSE. +1300 HINTLC(I)=0 + +C DEFINE SOME HANDY MNEMONICS. THESE CORRESPOND TO OBJECT NUMBERS. + + KEYS=VOCAB('KEYS',1) + LAMP=VOCAB('LAMP',1) + GRATE=VOCAB('GRATE',1) + CAGE=VOCAB('CAGE',1) + ROD=VOCAB('ROD',1) + ROD2=ROD+1 + STEPS=VOCAB('STEPS',1) + BIRD=VOCAB('BIRD',1) + DOOR=VOCAB('DOOR',1) + PILLOW=VOCAB('PILLO',1) + SNAKE=VOCAB('SNAKE',1) + FISSUR=VOCAB('FISSU',1) + TABLET=VOCAB('TABLE',1) + CLAM=VOCAB('CLAM',1) + OYSTER=VOCAB('OYSTE',1) + MAGZIN=VOCAB('MAGAZ',1) + DWARF=VOCAB('DWARF',1) + KNIFE=VOCAB('KNIFE',1) + FOOD=VOCAB('FOOD',1) + BOTTLE=VOCAB('BOTTL',1) + WATER=VOCAB('WATER',1) + OIL=VOCAB('OIL',1) + PLANT=VOCAB('PLANT',1) + PLANT2=PLANT+1 + AXE=VOCAB('AXE',1) + MIRROR=VOCAB('MIRRO',1) + DRAGON=VOCAB('DRAGO',1) + CHASM=VOCAB('CHASM',1) + TROLL=VOCAB('TROLL',1) + TROLL2=TROLL+1 + BEAR=VOCAB('BEAR',1) + MESSAG=VOCAB('MESSA',1) + VEND=VOCAB('VENDI',1) + BATTER=VOCAB('BATTE',1) + +C OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES. HERE ARE A FEW. + + NUGGET=VOCAB('GOLD',1) + COINS=VOCAB('COINS',1) + CHEST=VOCAB('CHEST',1) + EGGS=VOCAB('EGGS',1) + TRIDNT=VOCAB('TRIDE',1) + VASE=VOCAB('VASE',1) + EMRALD=VOCAB('EMERA',1) + PYRAM=VOCAB('PYRAM',1) + PEARL=VOCAB('PEARL',1) + RUG=VOCAB('RUG',1) + CHAIN=VOCAB('CHAIN',1) + SPICES=VOCAB('SPICE',1) + +C THESE ARE MOTION-VERB NUMBERS. + + BACK=VOCAB('BACK',0) + LOOK=VOCAB('LOOK',0) + CAVE=VOCAB('CAVE',0) + NULL=VOCAB('NULL',0) + ENTRNC=VOCAB('ENTRA',0) + DPRSSN=VOCAB('DEPRE',0) + +C AND SOME ACTION VERBS. + + SAY=VOCAB('SAY',2) + LOCK=VOCAB('LOCK',2) + THROW=VOCAB('THROW',2) + FIND=VOCAB('FIND',2) + INVENT=VOCAB('INVEN',2) + +C INITIALISE THE DWARVES. DLOC IS LOC OF DWARVES, HARD-WIRED IN. ODLOC IS +C PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE. DALTLC IS ALTERNATE INITIAL LOC +C FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER. (NO 2 +C OF THE 5 INITIAL LOCS ARE ADJACENT.) DSEEN IS TRUE IF DWARF HAS SEEN HIM. +C DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS: +C 0 NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS) +C 1 REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF +C 2 MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET +C 3 A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES) +C 3+ DWARVES ARE MAD (INCREASES THEIR ACCURACY) +C SIXTH DWARF IS SPECIAL (THE PIRATE). HE ALWAYS STARTS AT HIS CHEST'S +C EVENTUAL LOCATION INSIDE THE MAZE. THIS LOC IS SAVED IN CHLOC FOR REF. +C THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2. + + CHLOC=114 + CHLOC2=140 + DO 1700 I=1,6 +1700 DSEEN(I)=.FALSE. + DFLAG=0 + DLOC(1)=19 + DLOC(2)=27 + DLOC(3)=33 + DLOC(4)=44 + DLOC(5)=64 + DLOC(6)=CHLOC + DALTLC=18 + +C OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS: +C TURNS TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO) +C LIMIT LIFETIME OF LAMP (NOT SET HERE) +C IWEST HOW MANY TIMES HE'S SAID "WEST" INSTEAD OF "W" +C KNFLOC 0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT +C DETAIL HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL" +C ABBNUM HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS +C MAXDIE NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5) +C NUMDIE NUMBER OF TIMES KILLED SO FAR +C HOLDNG NUMBER OF OBJECTS BEING CARRIED +C DKILL NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG) +C FOOBAR CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO". +C BONUS USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING +C CLOCK1 NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING +C CLOCK2 NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH +C LOGICALS WERE EXPLAINED EARLIER + + TURNS=0 + LMWARN=.FALSE. + IWEST=0 + KNFLOC=0 + DETAIL=0 + ABBNUM=5 + DO 1800 I=0,4 +1800 IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1 + NUMDIE=0 + HOLDNG=0 + DKILL=0 + FOOBAR=0 + BONUS=0 + CLOCK1=30 + CLOCK2=50 + SAVED=0 + CLOSNG=.FALSE. + PANIC=.FALSE. + CLOSED=.FALSE. + GAVEUP=.FALSE. + SCORNG=.FALSE. + +C IF SETUP=1, REPORT ON AMOUNT OF ARRAYS ACTUALLY USED, TO PERMIT REDUCTIONS. + + IF(SETUP.NE.1)GOTO 1 + SETUP=2 + + DO 1998 K=1,LOCSIZ + KK=LOCSIZ+1-K + IF(LTEXT(KK).NE.0)GOTO 1997 +1998 CONTINUE + + OBJ=0 +1997 DO 1996 K=1,100 +1996 IF(PTEXT(K).NE.0)OBJ=OBJ+1 + + DO 1995 K=1,TABNDX +1995 IF(KTAB(K)/1000.EQ.2)VERB=KTAB(K)-2000 + + DO 1994 K=1,RTXSIZ + J=RTXSIZ+1-K + IF(RTEXT(J).NE.0)GOTO 1993 +1994 CONTINUE + +1993 DO 1992 K=1,MAGSIZ + I=MAGSIZ+1-K + IF(MTEXT(I).NE.0)GOTO 1991 +1992 CONTINUE + +1991 K=100 + TYPE 1999,LINUSE,LINSIZ,TRVS,TRVSIZ,TABNDX,TABSIZ,KK + 1 ,LOCSIZ,OBJ,K,VERB,VRBSIZ,J,RTXSIZ,CLSSES,CLSMAX + 2 ,HNTMAX,HNTSIZ,I,MAGSIZ +1999 FORMAT (' TABLE SPACE USED:'/ + 1 ' ',I6,' OF ',I6,' WORDS OF MESSAGES'/ + 2 ' ',I6,' OF ',I6,' TRAVEL OPTIONS'/ + 3 ' ',I6,' OF ',I6,' VOCABULARY WORDS'/ + 4 ' ',I6,' OF ',I6,' LOCATIONS'/ + 5 ' ',I6,' OF ',I6,' OBJECTS'/ + 6 ' ',I6,' OF ',I6,' ACTION VERBS'/ + 7 ' ',I6,' OF ',I6,' RTEXT MESSAGES'/ + 8 ' ',I6,' OF ',I6,' CLASS MESSAGES'/ + 9 ' ',I6,' OF ',I6,' HINTS'/ + 1 ' ',I6,' OF ',I6,' MAGIC MESSAGES'/ + 2 ) + +C FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME... + + CALL POOF + PAUSE 'INIT DONE' + C START-UP, DWARF STUFF + +1 DEMO=START(0) + CALL MOTD(.FALSE.) + I=RAN(1) + HINTED(3)=YES(65,1,0) + NEWLOC=1 + SETUP=3 + LIMIT=330 + IF(HINTED(3))LIMIT=1000 + +C CAN'T LEAVE CAVE ONCE IT'S CLOSING (EXCEPT BY MAIN OFFICE). + +2 IF(NEWLOC.GE.9.OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71 + CALL RSPEAK(130) + NEWLOC=LOC + IF(.NOT.PANIC)CLOCK2=15 + PANIC=.TRUE. + +C SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO. IF SO, +C THE DWARF'S BLOCKING HIS WAY. IF COMING FROM PLACE FORBIDDEN TO PIRATE +C (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED). + +71 IF(NEWLOC.EQ.LOC.OR.FORCED(LOC).OR.BITSET(LOC,3))GOTO 74 + DO 73 I=1,5 + IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73 + NEWLOC=LOC + CALL RSPEAK(2) + GOTO 74 +73 CONTINUE +74 LOC=NEWLOC + +C DWARF STUFF. SEE EARLIER COMMENTS FOR DESCRIPTION OF VARIABLES. REMEMBER +C SIXTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RULES. + +C FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL. ACTIVATE +C THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LOC 15). +C IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE TROLL +C BRIDGE), BYPASS DWARF STUFF. THAT WAY PIRATE CAN'T STEAL RETURN TOLL, AND +C DWARVES CAN'T MEET THE BEAR. ALSO MEANS DWARVES WON'T FOLLOW HIM INTO DEAD +C END IN MAZE, BUT C'EST LA VIE. THEY'LL WAIT FOR HIM OUTSIDE THE DEAD END. + + IF(LOC.EQ.0.OR.FORCED(LOC).OR.BITSET(NEWLOC,3))GOTO 2000 + IF(DFLAG.NE.0)GOTO 6000 + IF(LOC.GE.15)DFLAG=1 + GOTO 2000 + +C WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE 5 DWARVES. IF +C ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE. + +6000 IF(DFLAG.NE.1)GOTO 6010 + IF(LOC.LT.15.OR.PCT(95))GOTO 2000 + DFLAG=2 + DO 6001 I=1,2 + J=1+RAN(5) +C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. +6001 IF(PCT(50).AND.SAVED.EQ.-1)DLOC(J)=0 + DO 6002 I=1,5 + IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC +6002 ODLOC(I)=DLOC(I) + CALL RSPEAK(3) + CALL DROP(AXE,LOC) + GOTO 2000 + +C THINGS ARE IN FULL SWING. MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S SEEN US +C HE STICKS WITH US. DWARVES NEVER GO TO LOCS <15. IF WANDERING AT RANDOM, +C THEY DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE. IF THEY DON'T HAVE TO +C MOVE, THEY ATTACK. AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANYTHING. + +6010 DTOTAL=0 + ATTACK=0 + STICK=0 + DO 6030 I=1,6 + IF(DLOC(I).EQ.0)GOTO 6030 + J=1 + KK=DLOC(I) + KK=KEY(KK) + IF(KK.EQ.0)GOTO 6016 +6012 NEWLOC=MOD(IABS(TRAVEL(KK))/1000,1000) + IF(NEWLOC.GT.300.OR.NEWLOC.LT.15.OR.NEWLOC.EQ.ODLOC(I) + 1 .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20 + 2 .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC) + 3 .OR.(I.EQ.6.AND.BITSET(NEWLOC,3)) + 4 .OR.IABS(TRAVEL(KK))/1000000.EQ.100)GOTO 6014 + TK(J)=NEWLOC + J=J+1 +6014 KK=KK+1 + IF(TRAVEL(KK-1).GE.0)GOTO 6012 +6016 TK(J)=ODLOC(I) + IF(J.GE.2)J=J-1 + J=1+RAN(J) + ODLOC(I)=DLOC(I) + DLOC(I)=TK(J) + DSEEN(I)=(DSEEN(I).AND.LOC.GE.15) + 1 .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC) + IF(.NOT.DSEEN(I))GOTO 6030 + DLOC(I)=LOC + IF(I.NE.6)GOTO 6027 + +C THE PIRATE'S SPOTTED HIM. HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST. +C K COUNTS IF A TREASURE IS HERE. IF NOT, AND TALLY=TALLY2 PLUS ONE FOR +C AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED. + + IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030 + K=0 + DO 6020 J=50,MAXTRS +C PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!). + IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) + 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020 + IF(TOTING(J))GOTO 6022 +6020 IF(HERE(J))K=1 + IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0 + 1 .AND.HERE(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025 + IF(ODLOC(6).NE.DLOC(6).AND.PCT(20))CALL RSPEAK(127) + GOTO 6030 + +6022 CALL RSPEAK(128) +C DON'T STEAL CHEST BACK FROM TROLL! + IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC) + CALL MOVE(MESSAG,CHLOC2) + DO 6023 J=50,MAXTRS + IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) + 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6023 + IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC) + IF(TOTING(J))CALL DROP(J,CHLOC) +6023 CONTINUE +6024 DLOC(6)=CHLOC + ODLOC(6)=CHLOC + DSEEN(6)=.FALSE. + GOTO 6030 + +6025 CALL RSPEAK(186) + CALL MOVE(CHEST,CHLOC) + CALL MOVE(MESSAG,CHLOC2) + GOTO 6024 + +C THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM! + +6027 DTOTAL=DTOTAL+1 + IF(ODLOC(I).NE.DLOC(I))GOTO 6030 + ATTACK=ATTACK+1 + IF(KNFLOC.GE.0)KNFLOC=LOC + IF(RAN(1000).LT.95*(DFLAG-2))STICK=STICK+1 +6030 CONTINUE + +C NOW WE KNOW WHAT'S HAPPENING. LET'S TELL THE POOR SUCKER ABOUT IT. + + IF(DTOTAL.EQ.0)GOTO 2000 + IF(DTOTAL.EQ.1)GOTO 75 + TYPE 67,DTOTAL +67 FORMAT(/' THERE ARE ',I1,' THREATENING LITTLE DWARVES IN THE' + 1 ,' ROOM WITH YOU.') + GOTO 77 +75 CALL RSPEAK(4) +77 IF(ATTACK.EQ.0)GOTO 2000 + IF(DFLAG.EQ.2)DFLAG=3 +C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. DWARVES GET *VERY* MAD! + IF(SAVED.NE.-1)DFLAG=20 + IF(ATTACK.EQ.1)GOTO 79 + TYPE 78,ATTACK +78 FORMAT(/' ',I1,' OF THEM THROW KNIVES AT YOU!') + K=6 +82 IF(STICK.GT.1)GOTO 83 + CALL RSPEAK(K+STICK) + IF(STICK.EQ.0)GOTO 2000 + GOTO 84 +83 TYPE 68,STICK +68 FORMAT(/' ',I1,' OF THEM GET YOU!') +84 OLDLC2=LOC + GOTO 99 + +79 CALL RSPEAK(5) + K=52 + GOTO 82 + C DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND. + +C PRINT TEXT FOR CURRENT LOC. + +2000 IF(LOC.EQ.0)GOTO 99 + KK=STEXT(LOC) + IF(MOD(ABB(LOC),ABBNUM).EQ.0.OR.KK.EQ.0)KK=LTEXT(LOC) + IF(FORCED(LOC).OR..NOT.DARK(0))GOTO 2001 + IF(WZDARK.AND.PCT(35))GOTO 90 + KK=RTEXT(16) +2001 IF(TOTING(BEAR))CALL RSPEAK(141) + CALL SPEAK(KK) + K=1 + IF(FORCED(LOC))GOTO 8 + IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8) + +C PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION. IF NOT CLOSING AND +C PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE. RUG IS SPECIAL +C CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED. +C SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR). THESE HACKS +C ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE. + + IF(DARK(0))GOTO 2012 + ABB(LOC)=ABB(LOC)+1 + I=ATLOC(LOC) +2004 IF(I.EQ.0)GOTO 2012 + OBJ=I + IF(OBJ.GT.100)OBJ=OBJ-100 + IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008 + IF(PROP(OBJ).GE.0)GOTO 2006 + IF(CLOSED)GOTO 2008 + PROP(OBJ)=0 + IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN)PROP(OBJ)=1 + TALLY=TALLY-1 +C IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. + IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) +2006 KK=PROP(OBJ) + IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1 + CALL PSPEAK(OBJ,KK) +2008 I=LINK(I) + GOTO 2004 + +2009 K=54 +2010 SPK=K +2011 CALL RSPEAK(SPK) + +2012 VERB=0 + OBJ=0 + +C CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS. IF BEEN HERE LONG ENOUGH, +C BRANCH TO HELP SECTION (ON LATER PAGE). HINTS ALL COME BACK HERE EVENTUALLY +C TO FINISH THE LOOP. IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE NOTES). + +2600 DO 2602 HINT=4,HNTMAX + IF(HINTED(HINT))GOTO 2602 + IF(.NOT.BITSET(LOC,HINT))HINTLC(HINT)=-1 + HINTLC(HINT)=HINTLC(HINT)+1 + IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000 +2602 CONTINUE + +C KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE. ALSO, +C IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND SET +C THE PROP TO -1-PROP. THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE +C BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES. DON'T +C TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2). + + IF(.NOT.CLOSED)GOTO 2605 + IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER)) + 1 CALL PSPEAK(OYSTER,1) + DO 2604 I=1,100 +2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I) +2605 WZDARK=DARK(0) + IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0 + I=RAN(1) + CALL GETIN(WD1,WD1X,WD2,WD2X) + +C EVERY INPUT, CHECK "FOOBAR" FLAG. IF ZERO, NOTHING'S GOING ON. IF POS, +C MAKE NEG. IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO. + +2608 FOOBAR=MIN0(0,-FOOBAR) + IF(TURNS.EQ.0.AND.WD1.EQ.'MAGIC'.AND.WD2.EQ.'MODE')CALL MAINT + TURNS=TURNS+1 + IF(DEMO.AND.TURNS.GE.SHORT)GOTO 13000 + IF(TURNS.EQ.3)CALL DATIME(XXD,XXT) + IF(TURNS.NE.45)GOTO 2609 +C SEE IF TIMER UUO HAS BEEN ZAPPED; IF SO, HE'S CHEATING. + CALL DATIME(YYD,YYT) + IF(XXD.EQ.YYD.AND.XXT.EQ.YYT)SAVED=0 +2609 IF(VERB.EQ.SAY.AND.WD2.NE.0)VERB=0 + IF(VERB.EQ.SAY)GOTO 4090 + IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33)CLOCK1=CLOCK1-1 + IF(CLOCK1.EQ.0)GOTO 10000 + IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1 + IF(CLOCK2.EQ.0)GOTO 11000 + IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1 + IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0 + 1 .AND.HERE(LAMP))GOTO 12000 + IF(LIMIT.EQ.0)GOTO 12400 + IF(LIMIT.LT.0.AND.LOC.LE.8)GOTO 12600 + IF(LIMIT.LE.30)GOTO 12200 +19999 K=43 + IF(LIQLOC(LOC).EQ.WATER)K=70 + IF(WD1.EQ.'ENTER'.AND.(WD2.EQ.'STREA'.OR.WD2.EQ.'WATER')) + 1 GOTO 2010 + IF(WD1.EQ.'ENTER'.AND.WD2.NE.0)GOTO 2800 + IF((WD1.NE.'WATER'.AND.WD1.NE.'OIL') + 1 .OR.(WD2.NE.'PLANT'.AND.WD2.NE.'DOOR'))GOTO 2610 + IF(AT(VOCAB(WD2,1)))WD2='POUR' +2610 IF(WD1.NE.'WEST')GOTO 2630 + IWEST=IWEST+1 + IF(IWEST.EQ.10)CALL RSPEAK(17) +2630 I=VOCAB(WD1,-1) + IF(I.EQ.-1)GOTO 3000 + K=MOD(I,1000) + KQ=I/1000+1 + GOTO (8,5000,4000,2010)KQ + CALL BUG(22) + +C GET SECOND WORD FOR ANALYSIS. + +2800 WD1=WD2 + WD1X=WD2X + WD2=0 + GOTO 2610 + +C GEE, I DON'T UNDERSTAND. + +3000 SPK=60 + IF(PCT(20))SPK=61 + IF(PCT(20))SPK=13 + CALL RSPEAK(SPK) + GOTO 2600 + +C ANALYSE A VERB. REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND WORD +C UNLESS VERB IS "SAY", WHICH SNARFS ARBITRARY SECOND WORD. + +4000 VERB=K + SPK=ACTSPK(VERB) + IF(WD2.NE.0.AND.VERB.NE.SAY)GOTO 2800 + IF(VERB.EQ.SAY)OBJ=WD2 + IF(OBJ.NE.0)GOTO 4090 + +C ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET). + +4080 GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000, + 1 2011,9120,9130,8140,9150,8000,8000,8180,8000,8200, + 2 8000,9220,9230,8240,8250,8260,8270,8000,8000,8300, + 3 8310)VERB +C TAKE DROP SAY OPEN NOTH LOCK ON OFF WAVE CALM +C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN +C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP +C HOUR + CALL BUG(23) + +C ANALYSE A TRANSITIVE VERB. + +4090 GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011, + 1 2011,9120,9130,9140,9150,9160,9170,2011,9190,9190, + 2 9210,9220,9230,2011,2011,2011,9270,9280,9290,2011, + 3 2011)VERB +C TAKE DROP SAY OPEN NOTH LOCK ON OFF WAVE CALM +C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN +C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP +C HOUR + CALL BUG(24) + +C ANALYSE AN OBJECT WORD. SEE IF THE THING IS HERE, WHETHER WE'VE GOT A VERB +C YET, AND SO ON. OBJECT MUST BE HERE UNLESS VERB IS "FIND" OR "INVENT(ORY)" +C (AND NO NEW VERB YET TO BE ANALYSED). WATER AND OIL ARE ALSO FUNNY, SINCE +C THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE INSIDE +C THE BOTTLE OR AS A FEATURE OF THE LOCATION. + +5000 OBJ=K + IF(FIXED(K).NE.LOC.AND..NOT.HERE(K))GOTO 5100 +5010 IF(WD2.NE.0)GOTO 2800 + IF(VERB.NE.0)GOTO 4090 + CALL A5TOA1(WD1,WD1X,'?',TK,K) + TYPE 5015,(TK(I),I=1,K) +5015 FORMAT(/' WHAT DO YOU WANT TO DO WITH THE ',20A1) + GOTO 2600 + +5100 IF(K.NE.GRATE)GOTO 5110 + IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7)K=DPRSSN + IF(LOC.GT.9.AND.LOC.LT.15)K=ENTRNC + IF(K.NE.GRATE)GOTO 8 +5110 IF(K.NE.DWARF)GOTO 5120 + DO 5112 I=1,5 + IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 5010 +5112 CONTINUE +5120 IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC))GOTO 5010 + IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0)GOTO 5130 + OBJ=PLANT2 + GOTO 5010 +5130 IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC)GOTO 5140 + KNFLOC=-1 + SPK=116 + GOTO 2011 +5140 IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2))GOTO 5190 + OBJ=ROD2 + GOTO 5010 +5190 IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.0)GOTO 5010 + CALL A5TOA1(WD1,WD1X,'HERE.',TK,K) + TYPE 5199,(TK(I),I=1,K) +5199 FORMAT(/' I SEE NO ',20A1) + GOTO 2012 + C FIGURE OUT THE NEW LOCATION +C +C GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT +C THE NEW LOCATION IN "NEWLOC". THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE +C HE WANTS TO RETREAT. THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE +C DIES. (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED +C HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.) + +8 KK=KEY(LOC) + NEWLOC=LOC + IF(KK.EQ.0)CALL BUG(26) + IF(K.EQ.NULL)GOTO 2 + IF(K.EQ.BACK)GOTO 20 + IF(K.EQ.LOOK)GOTO 30 + IF(K.EQ.CAVE)GOTO 40 + OLDLC2=OLDLOC + OLDLOC=LOC + +9 LL=IABS(TRAVEL(KK)) + IF(MOD(LL,1000).EQ.1.OR.MOD(LL,1000).EQ.K)GOTO 10 + IF(TRAVEL(KK).LT.0)GOTO 50 + KK=KK+1 + GOTO 9 + +10 LL=LL/1000 +11 NEWLOC=LL/1000 + K=MOD(NEWLOC,100) + IF(NEWLOC.LE.300)GOTO 13 + IF(PROP(K).NE.NEWLOC/100-3)GOTO 16 +12 IF(TRAVEL(KK).LT.0)CALL BUG(25) + KK=KK+1 + NEWLOC=IABS(TRAVEL(KK))/1000 + IF(NEWLOC.EQ.LL)GOTO 12 + LL=NEWLOC + GOTO 11 + +13 IF(NEWLOC.LE.100)GOTO 14 + IF(TOTING(K).OR.(NEWLOC.GT.200.AND.AT(K)))GOTO 16 + GOTO 12 + +14 IF(NEWLOC.NE.0.AND..NOT.PCT(NEWLOC))GOTO 12 +16 NEWLOC=MOD(LL,1000) + IF(NEWLOC.LE.300)GOTO 2 + IF(NEWLOC.LE.500)GOTO 30000 + CALL RSPEAK(NEWLOC-500) + NEWLOC=LOC + GOTO 2 + +C SPECIAL MOTIONS COME HERE. LABELLING CONVENTION: STATEMENT NUMBERS NNNXX +C (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500). + +30000 NEWLOC=NEWLOC-300 + GOTO (30100,30200,30300)NEWLOC + CALL BUG(20) + +C TRAVEL 301. PLOVER-ALCOVE PASSAGE. CAN CARRY ONLY EMERALD. NOTE: TRAVEL +C TABLE MUST INCLUDE "USELESS" ENTRIES GOING THROUGH PASSAGE, WHICH CAN NEVER +C BE USED FOR ACTUAL MOTION, BUT CAN BE SPOTTED BY "GO BACK". + +30100 NEWLOC=99+100-LOC + IF(HOLDNG.EQ.0.OR.(HOLDNG.EQ.1.AND.TOTING(EMRALD)))GOTO 2 + NEWLOC=LOC + CALL RSPEAK(117) + GOTO 2 + +C TRAVEL 302. PLOVER TRANSPORT. DROP THE EMERALD (ONLY USE SPECIAL TRAVEL IF +C TOTING IT), SO HE'S FORCED TO USE THE PLOVER-PASSAGE TO GET IT OUT. HAVING +C DROPPED IT, GO BACK AND PRETEND HE WASN'T CARRYING IT AFTER ALL. + +30200 CALL DROP(EMRALD,LOC) + GOTO 12 + +C TRAVEL 303. TROLL BRIDGE. MUST BE DONE ONLY AS SPECIAL MOTION SO THAT +C DWARVES WON'T WANDER ACROSS AND ENCOUNTER THE BEAR. (THEY WON'T FOLLOW THE +C PLAYER THERE BECAUSE THAT REGION IS FORBIDDEN TO THE PIRATE.) IF +C PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM. +C (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.) SPECIAL STUFF FOR BEAR. + +30300 IF(PROP(TROLL).NE.1)GOTO 30310 + CALL PSPEAK(TROLL,1) + PROP(TROLL)=0 + CALL MOVE(TROLL2,0) + CALL MOVE(TROLL2+100,0) + CALL MOVE(TROLL,PLAC(TROLL)) + CALL MOVE(TROLL+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + NEWLOC=LOC + GOTO 2 + +30310 NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC + IF(PROP(TROLL).EQ.0)PROP(TROLL)=1 + IF(.NOT.TOTING(BEAR))GOTO 2 + CALL RSPEAK(162) + PROP(CHASM)=1 + PROP(TROLL)=2 + CALL DROP(BEAR,NEWLOC) + FIXED(BEAR)=-1 + PROP(BEAR)=3 + IF(PROP(SPICES).LT.0)TALLY2=TALLY2+1 + OLDLC2=NEWLOC + GOTO 99 + +C END OF SPECIALS. + +C HANDLE "GO BACK". LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO OLDLC2 +C IF OLDLOC HAS FORCED-MOTION. K2 SAVES ENTRY -> FORCED LOC -> PREVIOUS LOC. + +20 K=OLDLOC + IF(FORCED(K))K=OLDLC2 + OLDLC2=OLDLOC + OLDLOC=LOC + K2=0 + IF(K.NE.LOC)GOTO 21 + CALL RSPEAK(91) + GOTO 2 + +21 LL=MOD((IABS(TRAVEL(KK))/1000),1000) + IF(LL.EQ.K)GOTO 25 + IF(LL.GT.300)GOTO 22 + J=KEY(LL) + IF(FORCED(LL).AND.MOD((IABS(TRAVEL(J))/1000),1000).EQ.K)K2=KK +22 IF(TRAVEL(KK).LT.0)GOTO 23 + KK=KK+1 + GOTO 21 + +23 KK=K2 + IF(KK.NE.0)GOTO 25 + CALL RSPEAK(140) + GOTO 2 + +25 K=MOD(IABS(TRAVEL(KK)),1000) + KK=KEY(LOC) + GOTO 9 + +C LOOK. CAN'T GIVE MORE DETAIL. PRETEND IT WASN'T DARK (THOUGH IT MAY "NOW" +C BE DARK) SO HE WON'T FALL INTO A PIT WHILE STARING INTO THE GLOOM. + +30 IF(DETAIL.LT.3)CALL RSPEAK(15) + DETAIL=DETAIL+1 + WZDARK=.FALSE. + ABB(LOC)=0 + GOTO 2 + +C CAVE. DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND. + +40 IF(LOC.LT.8)CALL RSPEAK(57) + IF(LOC.GE.8)CALL RSPEAK(58) + GOTO 2 + +C NON-APPLICABLE MOTION. VARIOUS MESSAGES DEPENDING ON WORD GIVEN. + +50 SPK=12 + IF(K.GE.43.AND.K.LE.50)SPK=9 + IF(K.EQ.29.OR.K.EQ.30)SPK=9 + IF(K.EQ.7.OR.K.EQ.36.OR.K.EQ.37)SPK=10 + IF(K.EQ.11.OR.K.EQ.19)SPK=11 + IF(VERB.EQ.FIND.OR.VERB.EQ.INVENT)SPK=59 + IF(K.EQ.62.OR.K.EQ.65)SPK=42 + IF(K.EQ.17)SPK=80 + CALL RSPEAK(SPK) + GOTO 2 + C "YOU'RE DEAD, JIM." +C +C IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED. WE'LL +C ALLOW THIS MAXDIE TIMES. MAXDIE IS AUTOMATICALLY SET BASED ON THE NUMBER OF +C SNIDE MESSAGES AVAILABLE. EACH DEATH RESULTS IN A MESSAGE (81, 83, ETC.) +C WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82, 84, +C ETC. THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMARK AS +C WE EXIT. WHEN REINCARNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT OLDLC2 +C (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF PROPS. +C THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE CAGE. +C (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD AND CAGE +C ARE DONE BY KEYWORDS.) THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO LEAVE +C IT IN THE CAVE). IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONLY IF HE +C WAS CARRYING IT, OF COURSE). HE HIMSELF IS LEFT INSIDE THE BUILDING (AND +C HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE LAMP!). +C OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT". + +C THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS. + +90 CALL RSPEAK(23) + OLDLC2=LOC + +C OKAY, HE'S DEAD. LET'S GET ON WITH IT. + +99 IF(CLOSNG)GOTO 95 + YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54) + NUMDIE=NUMDIE+1 + IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 20000 + PLACE(WATER)=0 + PLACE(OIL)=0 + IF(TOTING(LAMP))PROP(LAMP)=0 + DO 98 J=1,100 + I=101-J + IF(.NOT.TOTING(I))GOTO 98 + K=OLDLC2 + IF(I.EQ.LAMP)K=1 + CALL DROP(I,K) +98 CONTINUE + LOC=3 + OLDLOC=LOC + GOTO 2000 + +C HE DIED DURING CLOSING TIME. NO RESURRECTION. TALLY UP A DEATH AND EXIT. + +95 CALL RSPEAK(131) + NUMDIE=NUMDIE+1 + GOTO 20000 + C ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS + +C STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 9000 FOR +C TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER. MANY INTRANSITIVE VERBS USE THE +C TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW. + +C RANDOM INTRANSITIVE VERBS COME HERE. CLEAR OBJ JUST IN CASE (SEE "ATTACK"). + +8000 CALL A5TOA1(WD1,WD1X,'WHAT?',TK,K) + TYPE 8002,(TK(I),I=1,K) +8002 FORMAT(/' ',20A1) + OBJ=0 + GOTO 2600 + +C CARRY, NO OBJECT GIVEN YET. OK IF ONLY ONE OBJECT PRESENT. + +8010 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0)GOTO 8000 + DO 8012 I=1,5 + IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 8000 +8012 CONTINUE + OBJ=ATLOC(LOC) + +C CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T +C TAKE ONE WITHOUT THE OTHER. LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON +C STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. + +9010 IF(TOTING(OBJ))GOTO 2011 + SPK=25 + IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115 + IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169 + IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170 + IF(FIXED(OBJ).NE.0)GOTO 2011 + IF(OBJ.NE.WATER.AND.OBJ.NE.OIL)GOTO 9017 + IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ)GOTO 9018 + OBJ=BOTTLE + IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1)GOTO 9220 + IF(PROP(BOTTLE).NE.1)SPK=105 + IF(.NOT.TOTING(BOTTLE))SPK=104 + GOTO 2011 +9018 OBJ=BOTTLE +9017 IF(HOLDNG.LT.7)GOTO 9016 + CALL RSPEAK(92) + GOTO 2012 +9016 IF(OBJ.NE.BIRD)GOTO 9014 + IF(PROP(BIRD).NE.0)GOTO 9014 + IF(.NOT.TOTING(ROD))GOTO 9013 + CALL RSPEAK(26) + GOTO 2012 +9013 IF(TOTING(CAGE))GOTO 9015 + CALL RSPEAK(27) + GOTO 2012 +9015 PROP(BIRD)=1 +9014 IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0) + 1 CALL CARRY(BIRD+CAGE-OBJ,LOC) + CALL CARRY(OBJ,LOC) + K=LIQ(0) + IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=-1 + GOTO 2009 + +C DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. SPECIAL CASES FOR +C BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE. +C DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES. + +9020 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 + IF(.NOT.TOTING(OBJ))GOTO 2011 + IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 9024 + CALL RSPEAK(30) + IF(CLOSED)GOTO 19000 + CALL DSTROY(SNAKE) +C SET PROP FOR USE BY TRAVEL OPTIONS + PROP(SNAKE)=1 +9021 K=LIQ(0) + IF(K.EQ.OBJ)OBJ=BOTTLE + IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=0 + IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0)CALL DROP(BIRD,LOC) + IF(OBJ.EQ.BIRD)PROP(BIRD)=0 + CALL DROP(OBJ,LOC) + GOTO 2012 + +9024 IF(OBJ.NE.COINS.OR..NOT.HERE(VEND))GOTO 9025 + CALL DSTROY(COINS) + CALL DROP(BATTER,LOC) + CALL PSPEAK(BATTER,0) + GOTO 2012 + +9025 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0)GOTO 9026 + CALL RSPEAK(154) + CALL DSTROY(BIRD) + PROP(BIRD)=0 + IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 + GOTO 2012 + +9026 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 9027 + CALL RSPEAK(163) + CALL MOVE(TROLL,0) + CALL MOVE(TROLL+100,0) + CALL MOVE(TROLL2,PLAC(TROLL)) + CALL MOVE(TROLL2+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + PROP(TROLL)=2 + GOTO 9021 + +9027 IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW))GOTO 9028 + CALL RSPEAK(54) + GOTO 9021 + +9028 PROP(VASE)=2 + IF(AT(PILLOW))PROP(VASE)=0 + CALL PSPEAK(VASE,PROP(VASE)+1) + IF(PROP(VASE).NE.0)FIXED(VASE)=-1 + GOTO 9021 + +C SAY. ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).) MAGIC WORDS OVERRIDE. + +9030 CALL A5TOA1(WD2,WD2X,'".',TK,K) + IF(WD2.EQ.0)CALL A5TOA1(WD1,WD1X,'".',TK,K) + IF(WD2.NE.0)WD1=WD2 + I=VOCAB(WD1,-1) + IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025)GOTO 9035 + TYPE 9032,(TK(I),I=1,K) +9032 FORMAT(/' OKAY, "',20A1) + GOTO 2012 + +9035 WD2=0 + OBJ=0 + GOTO 2630 + +C LOCK, UNLOCK, NO OBJECT GIVEN. ASSUME VARIOUS THINGS IF PRESENT. + +8040 SPK=28 + IF(HERE(CLAM))OBJ=CLAM + IF(HERE(OYSTER))OBJ=OYSTER + IF(AT(DOOR))OBJ=DOOR + IF(AT(GRATE))OBJ=GRATE + IF(OBJ.NE.0.AND.HERE(CHAIN))GOTO 8000 + IF(HERE(CHAIN))OBJ=CHAIN + IF(OBJ.EQ.0)GOTO 2011 + +C LOCK, UNLOCK OBJECT. SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR CHAIN. + +9040 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 9046 + IF(OBJ.EQ.DOOR)SPK=111 + IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1)SPK=54 + IF(OBJ.EQ.CAGE)SPK=32 + IF(OBJ.EQ.KEYS)SPK=55 + IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN)SPK=31 + IF(SPK.NE.31.OR..NOT.HERE(KEYS))GOTO 2011 + IF(OBJ.EQ.CHAIN)GOTO 9048 + IF(.NOT.CLOSNG)GOTO 9043 + K=130 + IF(.NOT.PANIC)CLOCK2=15 + PANIC=.TRUE. + GOTO 2010 + +9043 K=34+PROP(GRATE) + PROP(GRATE)=1 + IF(VERB.EQ.LOCK)PROP(GRATE)=0 + K=K+2*PROP(GRATE) + GOTO 2010 + +C CLAM/OYSTER. +9046 K=0 + IF(OBJ.EQ.OYSTER)K=1 + SPK=124+K + IF(TOTING(OBJ))SPK=120+K + IF(.NOT.TOTING(TRIDNT))SPK=122+K + IF(VERB.EQ.LOCK)SPK=61 + IF(SPK.NE.124)GOTO 2011 + CALL DSTROY(CLAM) + CALL DROP(OYSTER,LOC) + CALL DROP(PEARL,105) + GOTO 2011 + +C CHAIN. +9048 IF(VERB.EQ.LOCK)GOTO 9049 + SPK=171 + IF(PROP(BEAR).EQ.0)SPK=41 + IF(PROP(CHAIN).EQ.0)SPK=37 + IF(SPK.NE.171)GOTO 2011 + PROP(CHAIN)=0 + FIXED(CHAIN)=0 + IF(PROP(BEAR).NE.3)PROP(BEAR)=2 + FIXED(BEAR)=2-PROP(BEAR) + GOTO 2011 + +9049 SPK=172 + IF(PROP(CHAIN).NE.0)SPK=34 + IF(LOC.NE.PLAC(CHAIN))SPK=173 + IF(SPK.NE.172)GOTO 2011 + PROP(CHAIN)=2 + IF(TOTING(CHAIN))CALL DROP(CHAIN,LOC) + FIXED(CHAIN)=-1 + GOTO 2011 + +C LIGHT LAMP + +9070 IF(.NOT.HERE(LAMP))GOTO 2011 + SPK=184 + IF(LIMIT.LT.0)GOTO 2011 + PROP(LAMP)=1 + CALL RSPEAK(39) + IF(WZDARK)GOTO 2000 + GOTO 2012 + +C LAMP OFF + +9080 IF(.NOT.HERE(LAMP))GOTO 2011 + PROP(LAMP)=0 + CALL RSPEAK(40) + IF(DARK(0))CALL RSPEAK(16) + GOTO 2012 + +C WAVE. NO EFFECT UNLESS WAVING ROD AT FISSURE. + +9090 IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2))) + 1 SPK=29 + IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ) + 1 .OR.CLOSNG)GOTO 2011 + PROP(FISSUR)=1-PROP(FISSUR) + CALL PSPEAK(FISSUR,2-PROP(FISSUR)) + GOTO 2012 + +C ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE +C OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS +C (BIRD, CLAM). AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS. + +9120 DO 9121 I=1,5 + IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 9122 +9121 CONTINUE + I=0 +9122 IF(OBJ.NE.0)GOTO 9124 + IF(I.NE.0)OBJ=DWARF + IF(HERE(SNAKE))OBJ=OBJ*100+SNAKE + IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*100+DRAGON + IF(AT(TROLL))OBJ=OBJ*100+TROLL + IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*100+BEAR + IF(OBJ.GT.100)GOTO 8000 + IF(OBJ.NE.0)GOTO 9124 +C CAN'T ATTACK BIRD BY THROWING AXE. + IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD +C CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. + IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=100*OBJ+CLAM + IF(OBJ.GT.100)GOTO 8000 +9124 IF(OBJ.NE.BIRD)GOTO 9125 + SPK=137 + IF(CLOSED)GOTO 2011 + CALL DSTROY(BIRD) + PROP(BIRD)=0 + IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 + SPK=45 +9125 IF(OBJ.EQ.0)SPK=44 + IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150 + IF(OBJ.EQ.SNAKE)SPK=46 + IF(OBJ.EQ.DWARF)SPK=49 + IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 19000 + IF(OBJ.EQ.DRAGON)SPK=167 + IF(OBJ.EQ.TROLL)SPK=157 + IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2 + IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011 +C FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET PROP TO DEAD, +C MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND +C MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. + CALL RSPEAK(49) + VERB=0 + OBJ=0 + CALL GETIN(WD1,WD1X,WD2,WD2X) + IF(WD1.NE.'Y'.AND.WD1.NE.'YES')GOTO 2608 + CALL PSPEAK(DRAGON,1) + PROP(DRAGON)=2 + PROP(RUG)=0 + K=(PLAC(DRAGON)+FIXD(DRAGON))/2 + CALL MOVE(DRAGON+100,-1) + CALL MOVE(RUG+100,0) + CALL MOVE(DRAGON,K) + CALL MOVE(RUG,K) + DO 9126 OBJ=1,100 + IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) + 1 CALL MOVE(OBJ,K) +9126 CONTINUE + LOC=K + K=NULL + GOTO 8 + +C POUR. IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE. +C SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR. + +9130 IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0)OBJ=LIQ(0) + IF(OBJ.EQ.0)GOTO 8000 + IF(.NOT.TOTING(OBJ))GOTO 2011 + SPK=78 + IF(OBJ.NE.OIL.AND.OBJ.NE.WATER)GOTO 2011 + PROP(BOTTLE)=1 + PLACE(OBJ)=0 + SPK=77 + IF(.NOT.(AT(PLANT).OR.AT(DOOR)))GOTO 2011 + + IF(AT(DOOR))GOTO 9132 + SPK=112 + IF(OBJ.NE.WATER)GOTO 2011 + CALL PSPEAK(PLANT,PROP(PLANT)+1) + PROP(PLANT)=MOD(PROP(PLANT)+2,6) + PROP(PLANT2)=PROP(PLANT)/2 + K=NULL + GOTO 8 + +9132 PROP(DOOR)=0 + IF(OBJ.EQ.OIL)PROP(DOOR)=1 + SPK=113+PROP(DOOR) + GOTO 2011 + +C EAT. INTRANSITIVE: ASSUME FOOD IF PRESENT, ELSE ASK WHAT. TRANSITIVE: FOOD +C OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS. + +8140 IF(.NOT.HERE(FOOD))GOTO 8000 +8142 CALL DSTROY(FOOD) + SPK=72 + GOTO 2011 + +9140 IF(OBJ.EQ.FOOD)GOTO 8142 + IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER + 1 .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL + 2 .OR.OBJ.EQ.BEAR)SPK=71 + GOTO 2011 + +C DRINK. IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE. IF WATER IS IN +C THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM. + +9150 IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER + 1 .OR..NOT.HERE(BOTTLE)))GOTO 8000 + IF(OBJ.NE.0.AND.OBJ.NE.WATER)SPK=110 + IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE))GOTO 2011 + PROP(BOTTLE)=1 + PLACE(WATER)=0 + SPK=74 + GOTO 2011 + +C RUB. YIELDS VARIOUS SNIDE REMARKS. + +9160 IF(OBJ.NE.LAMP)SPK=76 + GOTO 2011 + +C THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNORE BIRD, +C AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO!) +C AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR TROLL. + +9170 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 + IF(.NOT.TOTING(OBJ))GOTO 2011 + IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL))GOTO 9178 + IF(OBJ.EQ.FOOD.AND.HERE(BEAR))GOTO 9177 + IF(OBJ.NE.AXE)GOTO 9020 + DO 9171 I=1,5 +C NEEDN'T CHECK DFLAG IF AXE IS HERE. + IF(DLOC(I).EQ.LOC)GOTO 9172 +9171 CONTINUE + SPK=152 + IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)GOTO 9175 + SPK=158 + IF(AT(TROLL))GOTO 9175 + IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)GOTO 9176 + OBJ=0 + GOTO 9120 + +9172 SPK=48 +C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. + IF(RAN(3).EQ.0.OR.SAVED.NE.-1)GOTO 9175 + DSEEN(I)=.FALSE. + DLOC(I)=0 + SPK=47 + DKILL=DKILL+1 + IF(DKILL.EQ.1)SPK=149 +9175 CALL RSPEAK(SPK) + CALL DROP(AXE,LOC) + K=NULL + GOTO 8 + +C THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! +9176 SPK=164 + CALL DROP(AXE,LOC) + FIXED(AXE)=-1 + PROP(AXE)=1 + CALL JUGGLE(BEAR) + GOTO 2011 + +C BUT THROWING FOOD IS ANOTHER STORY. +9177 OBJ=BEAR + GOTO 9210 + +9178 SPK=159 +C SNARF A TREASURE FOR THE TROLL. + CALL DROP(OBJ,0) + CALL MOVE(TROLL,0) + CALL MOVE(TROLL+100,0) + CALL DROP(TROLL2,PLAC(TROLL)) + CALL DROP(TROLL2+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + GOTO 2011 + +C QUIT. INTRANSITIVE ONLY. VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS. + +8180 GAVEUP=YES(22,54,54) +8185 IF(GAVEUP)GOTO 20000 + GOTO 2012 + +C FIND. MIGHT BE CARRYING IT, OR IT MIGHT BE HERE. ELSE GIVE CAVEAT. + +9190 IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE)) + 1 .OR.K.EQ.LIQLOC(LOC))SPK=94 + DO 9192 I=1,5 +9192 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94 + IF(CLOSED)SPK=138 + IF(TOTING(OBJ))SPK=24 + GOTO 2011 + +C INVENTORY. IF OBJECT, TREAT SAME AS FIND. ELSE REPORT ON CURRENT BURDEN. + +8200 SPK=98 + DO 8201 I=1,100 + IF(I.EQ.BEAR.OR..NOT.TOTING(I))GOTO 8201 + IF(SPK.EQ.98)CALL RSPEAK(99) + BLKLIN=.FALSE. + CALL PSPEAK(I,-1) + BLKLIN=.TRUE. + SPK=0 +8201 CONTINUE + IF(TOTING(BEAR))SPK=141 + GOTO 2011 + +C FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM +C MAD. BEAR, SPECIAL. + +9210 IF(OBJ.NE.BIRD)GOTO 9212 + SPK=100 + GOTO 2011 + +9212 IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL)GOTO 9213 + SPK=102 + IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=110 + IF(OBJ.EQ.TROLL)SPK=182 + IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD))GOTO 2011 + SPK=101 + CALL DSTROY(BIRD) + PROP(BIRD)=0 + TALLY2=TALLY2+1 + GOTO 2011 + +9213 IF(OBJ.NE.DWARF)GOTO 9214 + IF(.NOT.HERE(FOOD))GOTO 2011 + SPK=103 + DFLAG=DFLAG+1 + GOTO 2011 + +9214 IF(OBJ.NE.BEAR)GOTO 9215 + IF(PROP(BEAR).EQ.0)SPK=102 + IF(PROP(BEAR).EQ.3)SPK=110 + IF(.NOT.HERE(FOOD))GOTO 2011 + CALL DSTROY(FOOD) + PROP(BEAR)=1 + FIXED(AXE)=0 + PROP(AXE)=0 + SPK=168 + GOTO 2011 + +9215 SPK=14 + GOTO 2011 + +C FILL. BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE. (VASE IS NASTY.) + +9220 IF(OBJ.EQ.VASE)GOTO 9222 + IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE)GOTO 2011 + IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE))GOTO 8000 + SPK=107 + IF(LIQLOC(LOC).EQ.0)SPK=106 + IF(LIQ(0).NE.0)SPK=105 + IF(SPK.NE.107)GOTO 2011 + PROP(BOTTLE)=MOD(COND(LOC),4)/2*2 + K=LIQ(0) + IF(TOTING(BOTTLE))PLACE(K)=-1 + IF(K.EQ.OIL)SPK=108 + GOTO 2011 + +9222 SPK=29 + IF(LIQLOC(LOC).EQ.0)SPK=144 + IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE))GOTO 2011 + CALL RSPEAK(145) + PROP(VASE)=2 + FIXED(VASE)=-1 + GOTO 9024 + +C BLAST. NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK! + +9230 IF(PROP(ROD2).LT.0.OR..NOT.CLOSED)GOTO 2011 + BONUS=133 + IF(LOC.EQ.115)BONUS=134 + IF(HERE(ROD2))BONUS=135 + CALL RSPEAK(BONUS) + GOTO 20000 + +C SCORE. GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS TRUE. + +8240 SCORNG=.TRUE. + GOTO 20000 + +8241 SCORNG=.FALSE. + TYPE 8243,SCORE,MXSCOR +8243 FORMAT(/' IF YOU WERE TO QUIT NOW, YOU WOULD SCORE',I4 + 1 ,' OUT OF A POSSIBLE',I4,'.') + GAVEUP=YES(143,54,54) + GOTO 8185 + +C FEE FIE FOE FOO (AND FUM). ADVANCE TO NEXT STATE IF GIVEN IN PROPER ORDER. +C LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT. LAST +C WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE). + +8250 K=VOCAB(WD1,3) + SPK=42 + IF(FOOBAR.EQ.1-K)GOTO 8252 + IF(FOOBAR.NE.0)SPK=151 + GOTO 2011 + +8252 FOOBAR=K + IF(K.NE.4)GOTO 2009 + FOOBAR=0 + IF(PLACE(EGGS).EQ.PLAC(EGGS) + 1 .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011 +C BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING. + IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0) + 1 PROP(TROLL)=1 + K=2 + IF(HERE(EGGS))K=1 + IF(LOC.EQ.PLAC(EGGS))K=0 + CALL MOVE(EGGS,PLAC(EGGS)) + CALL PSPEAK(EGGS,K) + GOTO 2012 + +C BRIEF. INTRANSITIVE ONLY. SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME. + +8260 SPK=156 + ABBNUM=10000 + DETAIL=3 + GOTO 2011 + +C READ. MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER? + +8270 IF(HERE(MAGZIN))OBJ=MAGZIN + IF(HERE(TABLET))OBJ=OBJ*100+TABLET + IF(HERE(MESSAG))OBJ=OBJ*100+MESSAG + IF(CLOSED.AND.TOTING(OYSTER))OBJ=OYSTER + IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(0))GOTO 8000 + +9270 IF(DARK(0))GOTO 5190 + IF(OBJ.EQ.MAGZIN)SPK=190 + IF(OBJ.EQ.TABLET)SPK=196 + IF(OBJ.EQ.MESSAG)SPK=191 + IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER))SPK=194 + IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER) + 1 .OR..NOT.CLOSED)GOTO 2011 + HINTED(2)=YES(192,193,54) + GOTO 2012 + +C BREAK. ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE. + +9280 IF(OBJ.EQ.MIRROR)SPK=148 + IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 9282 + IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011 + CALL RSPEAK(197) + GOTO 19000 + +9282 SPK=198 + IF(TOTING(VASE))CALL DROP(VASE,LOC) + PROP(VASE)=2 + FIXED(VASE)=-1 + GOTO 2011 + +C WAKE. ONLY USE IS TO DISTURB THE DWARVES. + +9290 IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011 + CALL RSPEAK(199) + GOTO 19000 + +C SUSPEND. OFFER TO EXIT LEAVING THINGS RESTARTABLE, BUT REQUIRING A DELAY +C BEFORE RESTARTING (SO CAN'T SAVE THE WORLD BEFORE TRYING SOMETHING RISKY). +C UPON RESTARTING, SETUP=-1 CAUSES RETURN TO 8305 TO PICK UP AGAIN. + +8300 SPK=201 + IF(DEMO)GOTO 2011 + TYPE 8302,LATNCY +8302 FORMAT(/' I CAN SUSPEND YOUR ADVENTURE FOR YOU SO THAT YOU CAN', + 1 ' RESUME LATER, BUT'/' YOU WILL HAVE TO WAIT AT LEAST', + 2 I3,' MINUTES BEFORE CONTINUING.') + IF(.NOT.YES(200,54,54))GOTO 2012 + CALL DATIME(SAVED,SAVET) + SETUP=-1 + CALL CIAO + +8305 YEA=START(0) + SETUP=3 + K=NULL + GOTO 8 + +C HOURS. REPORT CURRENT NON-PRIME-TIME HOURS. + +8310 CALL MSPEAK(6) + CALL HOURS + GOTO 2012 + C HINTS + +C COME HERE IF HE'S BEEN LONG ENOUGH AT REQUIRED LOC(S) FOR SOME UNUSED HINT. +C HINT NUMBER IS IN VARIABLE "HINT". BRANCH TO QUICK TEST FOR ADDITIONAL +C CONDITIONS, THEN COME BACK TO DO NEAT STUFF. GOTO 40010 IF CONDITIONS ARE +C MET AND WE WANT TO OFFER THE HINT. GOTO 40020 TO CLEAR HINTLC BACK TO ZERO, +C 40030 TO TAKE NO ACTION YET. + +40000 GOTO (40400,40500,40600,40700,40800,40900)(HINT-3) +C CAVE BIRD SNAKE MAZE DARK WITT + CALL BUG(27) + +40010 HINTLC(HINT)=0 + IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2602 + TYPE 40012,HINTS(HINT,2) +40012 FORMAT(/' I AM PREPARED TO GIVE YOU A HINT, BUT IT WILL COST YOU', + 1 I2,' POINTS.') + HINTED(HINT)=YES(175,HINTS(HINT,4),54) + IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2) +40020 HINTLC(HINT)=0 +40030 GOTO 2602 + +C NOW FOR THE QUICK TESTS. SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES. + +40400 IF(PROP(GRATE).EQ.0.AND..NOT.HERE(KEYS))GOTO 40010 + GOTO 40020 + +40500 IF(HERE(BIRD).AND.TOTING(ROD).AND.OBJ.EQ.BIRD)GOTO 40010 + GOTO 40030 + +40600 IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010 + GOTO 40020 + +40700 IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0 + 1 .AND.ATLOC(OLDLC2).EQ.0.AND.HOLDNG.GT.1)GOTO 40010 + GOTO 40020 + +40800 IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010 + GOTO 40020 + +40900 GOTO 40010 + C CAVE CLOSING AND SCORING + + +C THESE SECTIONS HANDLE THE CLOSING OF THE CAVE. THE CAVE CLOSES "CLOCK1" +C TURNS AFTER THE LAST TREASURE HAS BEEN LOCATED (INCLUDING THE PIRATE'S +C CHEST, WHICH MAY OF COURSE NEVER SHOW UP). NOTE THAT THE TREASURES NEED NOT +C HAVE BEEN TAKEN YET, JUST LOCATED. HENCE CLOCK1 MUST BE LARGE ENOUGH TO GET +C OUT OF THE CAVE (IT ONLY TICKS WHILE INSIDE THE CAVE). WHEN IT HITS ZERO, +C WE BRANCH TO 10000 TO START CLOSING THE CAVE, AND THEN SIT BACK AND WAIT FOR +C HIM TO TRY TO GET OUT. IF HE DOESN'T WITHIN CLOCK2 TURNS, WE CLOSE THE +C CAVE; IF HE DOES TRY, WE ASSUME HE PANICS, AND GIVE HIM A FEW ADDITIONAL +C TURNS TO GET FRANTIC BEFORE WE CLOSE. WHEN CLOCK2 HITS ZERO, WE BRANCH TO +C 11000 TO TRANSPORT HIM INTO THE FINAL PUZZLE. NOTE THAT THE PUZZLE DEPENDS +C UPON ALL SORTS OF RANDOM THINGS. FOR INSTANCE, THERE MUST BE NO WATER OR +C OIL, SINCE THERE ARE BEANSTALKS WHICH WE DON'T WANT TO BE ABLE TO WATER, +C SINCE THE CODE CAN'T HANDLE IT. ALSO, WE CAN HAVE NO KEYS, SINCE THERE IS A +C GRATE (HAVING MOVED THE FIXED OBJECT!) THERE SEPARATING HIM FROM ALL THE +C TREASURES. MOST OF THESE PROBLEMS ARISE FROM THE USE OF NEGATIVE PROP +C NUMBERS TO SUPPRESS THE OBJECT DESCRIPTIONS UNTIL HE'S ACTUALLY MOVED THE +C OBJECTS. + +C WHEN THE FIRST WARNING COMES, WE LOCK THE GRATE, DESTROY THE BRIDGE, KILL +C ALL THE DWARVES (AND THE PIRATE), REMOVE THE TROLL AND BEAR (UNLESS DEAD), +C AND SET "CLOSNG" TO TRUE. LEAVE THE DRAGON; TOO MUCH TROUBLE TO MOVE IT. +C FROM NOW UNTIL CLOCK2 RUNS OUT, HE CANNOT UNLOCK THE GRATE, MOVE TO ANY +C LOCATION OUTSIDE THE CAVE (LOC<9), OR CREATE THE BRIDGE. NOR CAN HE BE +C RESURRECTED IF HE DIES. NOTE THAT THE SNAKE IS ALREADY GONE, SINCE HE GOT +C TO THE TREASURE ACCESSIBLE ONLY VIA THE HALL OF THE MT. KING. ALSO, HE'S +C BEEN IN GIANT ROOM (TO GET EGGS), SO WE CAN REFER TO IT. ALSO ALSO, HE'S +C GOTTEN THE PEARL, SO WE KNOW THE BIVALVE IS AN OYSTER. *AND*, THE DWARVES +C MUST HAVE BEEN ACTIVATED, SINCE WE'VE FOUND CHEST. + +10000 PROP(GRATE)=0 + PROP(FISSUR)=0 + DO 10010 I=1,6 + DSEEN(I)=.FALSE. +10010 DLOC(I)=0 + CALL MOVE(TROLL,0) + CALL MOVE(TROLL+100,0) + CALL MOVE(TROLL2,PLAC(TROLL)) + CALL MOVE(TROLL2+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + IF(PROP(BEAR).NE.3)CALL DSTROY(BEAR) + PROP(CHAIN)=0 + FIXED(CHAIN)=0 + PROP(AXE)=0 + FIXED(AXE)=0 + CALL RSPEAK(129) + CLOCK1=-1 + CLOSNG=.TRUE. + GOTO 19999 + +C ONCE HE'S PANICKED, AND CLOCK2 HAS RUN OUT, WE COME HERE TO SET UP THE +C STORAGE ROOM. THE ROOM HAS TWO LOCS, HARDWIRED AS 115 (NE) AND 116 (SW). +C AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF +C OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM. AND +C THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED BIRDS, +C MORE RODS, AND PILLOWS. A MIRROR STRETCHES ACROSS ONE WALL. MANY OF THE +C OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KNOWN TO +C HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD "PLACE"), +C MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY. WE ALSO DROP ALL OTHER +C OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TROUBLE, +C SUCH AS THE KEYS). WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK. + +11000 PROP(BOTTLE)=PUT(BOTTLE,115,1) + PROP(PLANT)=PUT(PLANT,115,0) + PROP(OYSTER)=PUT(OYSTER,115,0) + PROP(LAMP)=PUT(LAMP,115,0) + PROP(ROD)=PUT(ROD,115,0) + PROP(DWARF)=PUT(DWARF,115,0) + LOC=115 + OLDLOC=115 + NEWLOC=115 + +C LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY). + + FOO=PUT(GRATE,116,0) + PROP(SNAKE)=PUT(SNAKE,116,1) + PROP(BIRD)=PUT(BIRD,116,1) + PROP(CAGE)=PUT(CAGE,116,0) + PROP(ROD2)=PUT(ROD2,116,0) + PROP(PILLOW)=PUT(PILLOW,116,0) + + PROP(MIRROR)=PUT(MIRROR,115,0) + FIXED(MIRROR)=116 + + DO 11010 I=1,100 +11010 IF(TOTING(I))CALL DSTROY(I) + + CALL RSPEAK(132) + CLOSED=.TRUE. + GOTO 2 + +C ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE OUT. +C WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM. WE GO TO 12000 IF THE LAMP +C AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES AND +C CONTINUE. 12200 IS FOR OTHER CASES OF LAMP DYING. 12400 IS WHEN IT GOES +C OUT, AND 12600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, IN WHICH +C CASE WE FORCE HIM TO GIVE UP. + +12000 CALL RSPEAK(188) + PROP(BATTER)=1 + IF(TOTING(BATTER))CALL DROP(BATTER,LOC) + LIMIT=LIMIT+2500 + LMWARN=.FALSE. + GOTO 19999 + +12200 IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999 + LMWARN=.TRUE. + SPK=187 + IF(PLACE(BATTER).EQ.0)SPK=183 + IF(PROP(BATTER).EQ.1)SPK=189 + CALL RSPEAK(SPK) + GOTO 19999 + +12400 LIMIT=-1 + PROP(LAMP)=0 + IF(HERE(LAMP))CALL RSPEAK(184) + GOTO 19999 + +12600 CALL RSPEAK(185) + GAVEUP=.TRUE. + GOTO 20000 + +C AND, OF COURSE, DEMO GAMES ARE ENDED BY THE WIZARD. + +13000 CALL MSPEAK(1) + GAVEUP=.TRUE. + GOTO 20000 + +C OH DEAR, HE'S DISTURBED THE DWARVES. + +19000 CALL RSPEAK(136) + +C EXIT CODE. + +C THE PRESENT SCORING ALGORITHM IS AS FOLLOWS: +C OBJECTIVE: POINTS: PRESENT TOTAL POSSIBLE: +C GETTING WELL INTO CAVE 25 25 +C EACH TREASURE < CHEST 12 60 +C TREASURE CHEST ITSELF 14 14 +C EACH TREASURE > CHEST 16 144 +C SURVIVING (MAX-NUM)*10 30 +C NOT QUITTING 4 4 +C REACHING "CLOSNG" 25 25 +C "CLOSED": QUIT/KILLED 10 +C KLUTZED 25 +C WRONG WAY 30 +C SUCCESS 45 45 +C CAME TO WITT'S END 1 1 +C ROUND OUT THE TOTAL 2 2 +C TOTAL: 350 +C (POINTS CAN ALSO BE DEDUCTED FOR USING HINTS.) + +20000 SCORE=0 + MXSCOR=0 + +C FIRST TALLY UP THE TREASURES. MUST BE IN BUILDING AND NOT BROKEN. +C GIVE THE POOR GUY 2 POINTS JUST FOR FINDING EACH TREASURE. + + DO 20010 I=50,MAXTRS + IF(PTEXT(I).EQ.0)GOTO 20010 + K=12 + IF(I.EQ.CHEST)K=14 + IF(I.GT.CHEST)K=16 + IF(PROP(I).GE.0)SCORE=SCORE+2 + IF(PLACE(I).EQ.3.AND.PROP(I).EQ.0)SCORE=SCORE+K-2 + MXSCOR=MXSCOR+K +20010 CONTINUE + +C NOW LOOK AT HOW HE FINISHED AND HOW FAR HE GOT. MAXDIE AND NUMDIE TELL US +C HOW WELL HE SURVIVED. GAVEUP SAYS WHETHER HE EXITED VIA QUIT. DFLAG WILL +C TELL US IF HE EVER GOT SUITABLY DEEP INTO THE CAVE. CLOSNG STILL INDICATES +C WHETHER HE REACHED THE ENDGAME. AND IF HE GOT AS FAR AS "CAVE CLOSED" +C (INDICATED BY "CLOSED"), THEN BONUS IS ZERO FOR MUNDANE EXITS OR 133, 134, +C 135 IF HE BLEW IT (SO TO SPEAK). + + SCORE=SCORE+(MAXDIE-NUMDIE)*10 + MXSCOR=MXSCOR+MAXDIE*10 + IF(.NOT.(SCORNG.OR.GAVEUP))SCORE=SCORE+4 + MXSCOR=MXSCOR+4 + IF(DFLAG.NE.0)SCORE=SCORE+25 + MXSCOR=MXSCOR+25 + IF(CLOSNG)SCORE=SCORE+25 + MXSCOR=MXSCOR+25 + IF(.NOT.CLOSED)GOTO 20020 + IF(BONUS.EQ.0)SCORE=SCORE+10 + IF(BONUS.EQ.135)SCORE=SCORE+25 + IF(BONUS.EQ.134)SCORE=SCORE+30 + IF(BONUS.EQ.133)SCORE=SCORE+45 +20020 MXSCOR=MXSCOR+45 + +C DID HE COME TO WITT'S END AS HE SHOULD? + + IF(PLACE(MAGZIN).EQ.108)SCORE=SCORE+1 + MXSCOR=MXSCOR+1 + +C ROUND IT OFF. + + SCORE=SCORE+2 + MXSCOR=MXSCOR+2 + +C DEDUCT POINTS FOR HINTS. HINTS < 4 ARE SPECIAL; SEE DATABASE DESCRIPTION. + + DO 20030 I=1,HNTMAX +20030 IF(HINTED(I))SCORE=SCORE-HINTS(I,2) + +C RETURN TO SCORE COMMAND IF THAT'S WHERE WE CAME FROM. + + IF(SCORNG)GOTO 8241 + +C THAT SHOULD BE GOOD ENOUGH. LET'S TELL HIM ALL ABOUT IT. + + TYPE 20100,SCORE,MXSCOR,TURNS +20100 FORMAT(///' YOU SCORED',I4,' OUT OF A POSSIBLE',I4, + 1 ', USING',I5,' TURNS.') + + DO 20200 I=1,CLSSES + IF(CVAL(I).GE.SCORE)GOTO 20210 +20200 CONTINUE + TYPE 20202 +20202 FORMAT(/' YOU JUST WENT OFF MY SCALE!!'/) + GOTO 25000 + +20210 CALL SPEAK(CTEXT(I)) + IF(I.EQ.CLSSES-1)GOTO 20220 + K=CVAL(I)+1-SCORE + KK='S.' + IF(K.EQ.1)KK='. ' + TYPE 20212,K,KK +20212 FORMAT(/' TO ACHIEVE THE NEXT HIGHER RATING, YOU NEED',I3, + 1 ' MORE POINT',A2/) + GOTO 25000 + +20220 TYPE 20222 +20222 FORMAT(/' TO ACHIEVE THE NEXT HIGHER RATING ', + 1 'WOULD BE A NEAT TRICK!'//' CONGRATULATIONS!!'/) + +25000 STOP + + + END diff --git a/src/games/adv4db.2 b/src/games/adv4db.2 new file mode 100644 index 00000000..5b0360f5 --- /dev/null +++ b/src/games/adv4db.2 @@ -0,0 +1,2212 @@ + 1 + 1You are standing at the end of a road before a small brick building. + 1Around you is a forest. A small stream flows out of the building and + 1down a gully. + 2You have walked up a hill, still in the forest. The road slopes back + 2down the other side of the hill. There is a building in the distance. + 3You are inside a building, a well house for a large spring. + 4You are in a valley in the forest beside a stream tumbling along a + 4rocky bed. + 5You are in open forest, with a deep valley to one side. + 6You are in open forest near both a valley and a road. + 7At your feet all the water of the stream splashes into a 2-inch slit + 7in the rock. Downstream the streambed is bare rock. + 8You are in a 20-foot depression floored with bare dirt. Set into the + 8dirt is a strong steel grate mounted in concrete. A dry streambed + 8leads into the depression. + 9You are in a small chamber beneath a 3x3 steel grate to the surface. + 9A low crawl over cobbles leads inward to the west. + 10You are crawling over cobbles in a low passage. There is a dim light + 10at the east end of the passage. + 11You are in a debris room filled with stuff washed in from the surface. + 11A low wide passage with cobbles becomes plugged with mud and debris + 11here, but an awkward canyon leads upward and west. A note on the wall + 11says "MAGIC WORD XYZZY". + 12You are in an awkward sloping east/west canyon. + 13You are in a splendid chamber thirty feet high. The walls are frozen + 13rivers of orange stone. An awkward canyon and a good passage exit + 13from east and west sides of the chamber. + 14At your feet is a small pit breathing traces of white mist. An east + 14passage ends here except for a small crack leading on. + 15You are at one end of a vast hall stretching forward out of sight to + 15the west. There are openings to either side. Nearby, a wide stone + 15staircase leads downward. The hall is filled with wisps of white mist + 15swaying to and fro almost as if alive. A cold wind blows up the + 15staircase. There is a passage at the top of a dome behind you. + 16The crack is far too small for you to follow. + 17You are on the east bank of a fissure slicing clear across the hall. + 17The mist is quite thick here, and the fissure is too wide to jump. + 18This is a low room with a crude note on the wall. The note says, + 18"YOU WON'T GET IT UP THE STEPS". + 19You are in the hall of the mountain king, with passages off in all + 19directions. + 20You are at the bottom of the pit with a broken neck. + 21You didn't make it. + 22The dome is unclimbable. + 23You are at the west end of the two-pit room. There is a large hole in + 23the wall above the pit at this end of the room. + 24You are at the bottom of the eastern pit in the two-pit room. There is + 24a small pool of oil in one corner of the pit. + 25You are at the bottom of the western pit in the two-pit room. There is + 25a large hole in the wall about 25 feet above you. + 26You clamber up the plant and scurry through the hole at the top. + 27You are on the west side of the fissure in the hall of the mists. + 28You are in a low N/S passage at a hole in the floor. The hole goes + 28down to an E/W passage. + 29You are in the south side chamber. + 30You are in the west side chamber of the hall of the mountain king. + 30A passage continues west and up here. + 31>$< + 32You can't get by the snake. + 33You are in a large room, with a passage to the south, a passage to the + 33west, and a wall of broken rock to the east. There is a large "Y2" on + 33a rock in the room's center. + 34You are in a jumble of rock, with cracks everywhere. + 35You're at a low window overlooking a huge pit, which extends up out of + 35sight. A floor is indistinctly visible over 50 feet below. Traces of + 35white mist cover the floor of the pit, becoming thicker to the right. + 35Marks in the dust around the window would seem to indicate that + 35someone has been here recently. Directly across the pit from you and + 3525 feet away there is a similar window looking into a lighted room. A + 35shadowy figure can be seen there peering back at you. + 36You are in a dirty broken passage. To the east is a crawl. To the + 36west is a large passage. Above you is a hole to another passage. + 37You are on the brink of a small clean climbable pit. A crawl leads + 37west. + 38You are in the bottom of a small pit with a little stream, which + 38enters and exits through tiny slits. + 39You are in a large room full of dusty rocks. There is a big hole in + 39the floor. There are cracks everywhere, and a passage leading east. + 40You are in a small room with exits to the east and west. There is a + 40very tight passage leading upwards which you might squeeze through. + 41You are at the west end of hall of mists. A low wide crawl continues + 41west and another goes north. To the south is a little passage 6 feet + 41off the floor. + 42You are in a maze of twisty little passages, all alike. + 43You are in a maze of twisty little passages, all alike. + 44You are in a maze of twisty little passages, all alike. + 45You are in a maze of twisty little passages, all alike. + 46Dead end + 47Dead end + 48Dead end + 49You are in a maze of twisty little passages, all alike. + 50You are in a maze of twisty little passages, all alike. + 51You are in a maze of twisty little passages, all alike. + 52You are in a maze of twisty little passages, all alike. + 53You are in a maze of twisty little passages, all alike. + 54Dead end + 55You are in a maze of twisty little passages, all alike. + 56Dead end + 57You are on the brink of a thirty foot pit with a massive orange column + 57down one wall. You could climb down here but you could not get back + 57up. The maze continues at this level. + 58Dead end + 59You are in a cramped chamber looking out over the fissure in the hall + 59of Mists. A tight passage leads back down. + 60You are at the east end of a very long hall apparently without side + 60chambers. To the east a low wide crawl slants up. To the north a + 60round two foot hole slants down. + 61You are at the west end of a very long featureless hall. The hall + 61joins up with a narrow north/south passage. There is a narrow doorway + 61leading to the west. + 62You are at a crossover of a high N/S passage and a low E/W one. + 63You are in a slightly sloping N/S passage which seems to fall + 63off sharply not too far to the North. There is a ONE WAY sign + 63pointing in that direction. + 64You are at a complex junction. A low hands and knees passage from the + 64north joins a higher crawl from the east to make a walking passage + 64going west. There is also a large room above. The air is damp here. + 65You are in bedquilt, a long east/west passage with holes everywhere. + 65To explore at random select north, south, up, or down. + 66You are in a room whose walls resemble swiss cheese. Obvious passages + 66go west, east, NE, and NW. Part of the room is occupied by a large + 66bedrock block. + 67You are at the east end of the twopit room. The floor here is + 67littered with thin rock slabs, which make it easy to descend the pits. + 67There is a path here bypassing the pits to connect passages from east + 67and west. There are holes all over, but the only big one is on the + 67wall directly over the west pit where you can't get to it. + 68You are in a large low circular chamber whose floor is an immense slab + 68fallen from the ceiling (slab room). East and west there once were + 68large passages, but they are now filled with boulders. Low small + 68passages go north and south, and the south one quickly bends west + 68around the boulders. + 69You are in a secret N/S canyon above a large room. + 70You are in a secret N/S canyon above a sizable passage. + 71You are in a secret canyon at a junction of the three canyons, bearing + 71north, south, and SE. The north one is as tall as the other two + 71combined. + 72You are in a large low room. Crawls lead north, SE, and SW. + 73Dead end crawl. + 74You are in a secret canyon which here runs E/W. It crosses over a + 74very tight canyon 15 feet below. If you do go down you may not be able + 74to get back up. + 75You are at a wide place in a very tight N/S canyon. + 76The canyon here becomes too tight to go further south. + 77You are in a tall E/W canyon. A low tight crawl goes 3 feet north and + 77seems to open up. + 78The canyon runs into a mass of boulders -- Dead end. + 79The stream flows out through a pair of 1 foot diameter sewer pipes. + 79It would be advisable to use the exit. + 80You are in a maze of twisty little passages, all alike. + 81Dead end + 82Dead end + 83You are in a maze of twisty little passages, all alike. + 84You are in a maze of twisty little passages, all alike. + 85Dead end + 86Dead end + 87You are in a maze of twisty little passages, all alike. + 88You are in a long, narrow corridor stretching out of sight to the + 88west. At the eastern end is a hole through which you can see a + 88profusion of leaves. + 89There is nothing here to climb. Use "UP" or "OUT" to leave the pit. + 90You have climbed up the plant and out of the pit. + 91You are at the top of a steep incline above a large room. You could + 91climb down here, but you would not be able to climb up. There is a + 91passage leading back to the north. + 92You are in the giant room. The ceiling here is too high up for your + 92lamp to show it. Cavernous passages lead east, north, and south. On + 92the west wall is scrawled the inscription, "Fee Fie Foe Foo" (sic). + 93The passage here is blocked by a recent cave-in. + 94You are at one end of an immense north/south passage. + 95You are in a magnificent cavern with a rushing stream, which cascades + 95over a sparkling waterfall into a roaring whirlpool which disappears + 95through a hole in the floor. Passages exit to the south and west. + 96You are in the soft room. The walls are covered with heavy curtains, + 96the floor with a thick pile carpet. Moss covers the ceiling. + 97This is the Oriental room. Ancient Oriental cave drawings cover the + 97walls. A gently sloping passage leads upward to the north, another + 97passage leads SE, and a hands and knees crawl leads west. + 98You are following a wide path around the outer edge of a large cavern. + 98Far below, through a heavy white mist, strange splashing noises can be + 98heard. The mist rises up through a fissure in the ceiling. The path + 98exits to the south and west. + 99You are in an alcove. A small NW path seems to widen after a short + 99distance. An extremely tight tunnel leads east. It looks like a very + 99tight squeeze. An eerie light can be seen at the other end. + 100You're in a small chamber lit by an eerie green light. An extremely + 100narrow tunnel exits to the west. A dark corridor leads NE. + 101You're in the dark-room. A corridor leading south is the only exit. + 102You are in an arched hall. A coral passage once continued up and east + 102from here, but is now blocked by debris. The air smells of sea water. + 103You're in a large room carved out of sedimentary rock. The floor and + 103walls are littered with bits of shells imbedded in the stone. A + 103shallow passage proceeds downward, and a somewhat steeper one leads + 103up. A low hands and knees passage enters from the south. + 104You are in a long sloping corridor with ragged sharp walls. + 105You are in a cul-de-sac about eight feet across. + 106You are in an anteroom leading to a large passage to the east. Small + 106passages go west and up. The remnants of recent digging are evident. + 106A sign in midair here says "CAVE UNDER CONSTRUCTION BEYOND THIS POINT. + 106PROCEED AT OWN RISK. (WITT CONSTRUCTION COMPANY )" + 107You are in a maze of twisty little passages, all different. + 108You are at Witt's End. Passages lead off in ALL directions. + 109You are in a north/south canyon about 25 feet across. The floor is + 109covered by white mist seeping in from the north. The walls extend + 109upward for well over 100 feet. Suspended from some unseen point far + 109above you, an enormous two-sided mirror is hanging parallel to and + 109midway between the canyon walls. (The mirror is obviously provided + 109for the use of the dwarves, who as you know, are extremely vain.) A + 109small window can be seen in either wall, some fifty feet up. + 110You're at a low window overlooking a huge pit, which extends up out of + 110sight. A floor is indistinctly visible over 50 feet below. Traces of + 110white mist cover the floor of the pit, becoming thicker to the left. + 110Marks in the dust around the window would seem to indicate that + 110someone has been here recently. Directly across the pit from you and + 11025 feet away there is a similar window looking into a lighted room. A + 110shadowy figure can be seen there peering back at you. + 111A large stalactite extends from the roof and almost reaches the floor + 111below. You could climb down it, and jump from it to the floor, but + 111having done so you would be unable to reach it to climb back up. + 111There are exits to the west and north. + 112You are in a little maze of twisting passages, all different. + 113You are at the edge of a large underground reservoir. An opaque cloud + 113of white mist fills the room and rises rapidly upward. The lake is + 113fed by a stream, which tumbles out of a hole in the wall about 10 feet + 113overhead and splashes noisily into the water somewhere within the + 113mist. The only passage goes back to the south. + 114Dead end + 115You are at the northeast end of an immense room, even larger than the + 115giant room. It appears to be a repository for the "ADVENTURE" + 115program. Massive torches far overhead bathe the room with smoky + 115yellow light. Scattered about you can be seen a pile of bottles (all + 115of them empty), a nursery of young beanstalks murmuring quietly, a bed + 115of oysters, a bundle of black rods with rusty stars on their ends, and + 115a collection of brass lanterns. Off to one side a great many dwarves + 115are sleeping on the floor, snoring loudly. A sign nearby reads: "DO + 115NOT DISTURB THE DWARVES!" An immense mirror is hanging against one + 115wall, and stretches to the other end of the room, where various other + 115sundry objects can be glimpsed dimly in the distance. + 116You are at the southwest end of the repository. To one side is a pit + 116full of fierce green snakes. On the other side is a row of small + 116wicker cages, each of which contains a little sulking bird. In one + 116corner is a bundle of black rods with rusty marks on their ends. A + 116large number of velvet pillows are scattered about the floor. A + 116vast mirror stretches off to the northeast. At your feet is a large + 116steel grate, next to which is a sign which reads, "TREASURE VAULT. + 116KEYS IN MAIN OFFICE." + 117You are on one side of a large, deep chasm. A heavy white mist rising + 117up from below obscures all view of the far side. A SW path leads away + 117from the chasm into a winding corridor. + 118You are in a long winding corridor sloping out of sight in both + 118directions. A sign on the wall reads: + 118 SLOW DOWN - + 118PAY TROLL AHEAD + 118There is an empty rusted socket at each corner of the sign. + 119You are in a secret canyon which exits to the north and east. + 120You are in a secret canyon which exits to the north and east. + 121You are in a secret canyon which exits to the north and east. + 122You are on the far side of the chasm. A NE path leads away from the + 122chasm on this side. + 123You're in a long east/west corridor. A faint rumbling noise can be + 123heard in the distance. + 124The path forks here. The left fork leads northeast. A dull rumbling + 124seems to get louder in that direction. The right fork leads southeast + 124down a gentle slope. The main corridor enters from the west. + 125The walls are quite warm here. From the north can be heard a steady + 125roar, so loud that the entire cave seems to be trembling. Another + 125passage leads south, and a low crawl goes east. + 126You are on the edge of a breath-taking view. Far below you is an + 126active volcano, from which great gouts of molten lava come surging + 126out, cascading back down into the depths. The glowing rock fills the + 126farthest reaches of the cavern with a blood-red glare, giving every- + 126thing an eerie, macabre appearance. The air is filled with flickering + 126sparks of ash and a heavy smell of brimstone. The walls are hot to + 126the touch, and the thundering of the volcano drowns out all other + 126sounds. Embedded in the jagged roof far overhead are myriad twisted + 126formations composed of pure white alabaster, which scatter the murky + 126light into sinister apparitions upon the walls. To one side is a deep + 126gorge, filled with a bizarre chaos of tortured rock which seems to + 126have been crafted by the devil himself. An immense river of fire + 126crashes out from the depths of the volcano, burns its way through the + 126gorge, and plummets into a bottomless pit far off to your left. To + 126the right, an immense geyser of blistering steam erupts continuously + 126from a barren island in the center of a sulfurous lake, which bubbles + 126ominously. The far right wall is aflame with an incandescence of its + 126own, which lends a additional infernal splendor to the already + 126hellish scene. A dark, foreboding passage exits to the south. + 127You are in a small chamber filled with large boulders. The walls are + 127very warm, causing the air in the room to be almost stifling from the + 127heat. The only exit is a crawl heading west, through which is coming + 127a low rumbling. + 128You are walking along a gently sloping north/south passage lined with + 128oddly shaped limestone formations. + 129You are standing at the entrance to a large, barren room. A sign + 129posted above the entrance reads: "CAUTION! BEAR IN ROOM!" + 130You are inside a barren room. The center of the room is completely + 130empty except for some dust. Marks in the dust lead away toward the + 130far end of the room. The only exit is the way you came in. + 131You are in a maze of twisting little passages, all different. + 132You are in a little maze of twisty passages, all different. + 133You are in a twisting maze of little passages, all different. + 134You are in a twisting little maze of passages, all different. + 135You are in a twisty little maze of passages, all different. + 136You are in a twisty maze of little passages, all different. + 137You are in a little twisty maze of passages, all different. + 138You are in a maze of little twisting passages, all different. + 139You are in a maze of little twisty passages, all different. + 140Dead end + 141You have slid a long way down a steep gravel bank. You are covered with + 141scrapes and bruises from your rather rough journey. Several of your + 141larger cuts are bleeding. + 142You're in a small chamber with a slope of gravel too steep to climb to + 142the west. The chamber opens up to the east. + 143You are in a large chamber decorated like an ancient Druid temple + 143continuing to the west with passages leading off to the north and south. + 143A large stone dominates the center of the room. + 144You're in a small chamber which shows much evidence of heavy use in the + 144recent past. Tracks lead from a good-sized passabe in the south to a + 144small hold in the northern wall which leads upwards. + 145You're in the throne room where the walls are covered with large + 145brightly painted murals of Colossal Cave and the lands surrounding it. + 145In the center of the room is a large throne on a raised dias. + 145To the south can be seen the entrance to a large hall while a low + 145passage exits to the north heading slightly downwards. + 146You are in a small dusty chamber which appears as though you're the + 146first person to enter it in years. The only visible exit is to the + 146north. + 147You're on a spiral staircase lit by torches with an eastern door. + 148You're on a spiral staircase lit by torches with an eastern door. + 149You're on a spiral staircase lit by torches with an eastern door. + 150You're in the magician's tower, a small cluttered room filled with + 150all manner of strange artifacts, the purpose of which cannot be + 150kenned immediately. The walls of the chamber are themselves cloaked + 150in shadows which seem to move of their own accord. There is one + 150small window in the wall but it is far over your head and lets in + 150a minimum of light. Torches set in the wall across from the window + 150supplement the meager light but the entire room seems to disapprove + 150of light and gloom clings to all the corners. In the center of the + 150room a spiral staircase descends into to the lower levels of the cave. + 151You're on a spiral staircase lit by torches with an eastern door. + 152You're in the Magician's Chamber, a large pentagonal room with a + 152spiral staircase leading up from the center of the room. + 153You're in a long straight corridor ending in a massive slab of stone + 153to the east. To the west a slightly smaller corridor continues while + 153there is a passage leading up to the northwest and another leading + 153down to the southwest. + 154Dead end. + 155You're in what looks to be an old guard's room. There are broken + 155pieces of weaponry and armour in racks around the walls. The only exit + 155is east. + 156You're in the Lower Hall of the ancient dwarven mines. There are signs + 156of ancient battles all over and most of the passages out of the hall are + 156blocked. The only usable exits are a wide staircase leading up to the + 156east and a corridor leading down to the south. + 157You're in the Dwarves Great Hall where in the past were held great + 157feasts and displayed the most beautiful of their craft. Now the hall + 157look as if a great battle had been waged here. All the smaller + 157passages leading out have been blocked intentionally. The only exits + 157are wide staircases leading down to the west and up to the east. + 158You're in the Upper Hall of the ancient dwarven mines. There are signs + 158of ancient battles all over and most of the passages out of the hall are + 158blocked. The only usable exits are a wide staircase leading down to the + 158west and a corridor leading up to the south. + 159You're in a corridor which ends in a door to the west and leads down to + 159the north. + 160You're beneath the trap door. The passage leads east and west. + 161The passage leads north and east. + 162The passage leads north and south. + 163The passage leads southeast and south. + 164The passage leads northeast and northwest. + 165The passage leads south and southwest. + 166The passage leads east and north. + 167The passage leads southwest and west. + 168The passage leads west and northeast. + 169You're in a small hexagonal room with a single door in the west wall. + 170You enter a thick, cold, gray mist. You seem to be falling forever + 170and the light slowly fades away. + 171As you enter the ethereal plane, you seem to be twisted and pulled + 171at and lose all sense of orientation. + -1End + 2 + 1You're at end of road again. + 2You're at hill in road. + 3You're inside building. + 4You're in valley. + 5You're in forest. + 6You're in forest. + 7You're at slit in streambed. + 8You're outside grate. + 9You're below the grate. + 10You're in cobble crawl. + 11You're in debris room. + 13You're in bird chamber. + 14You're at top of small pit. + 15You're in hall of mists. + 17You're on east bank of fissure. + 18You're in nugget of gold room. + 19You're in hall of mt. king. + 23You're at west end of two-pit room. + 24You're in east pit. + 25You're in west pit. + 28You're in low n/s passage at hole. + 33You're at "y2". + 35You're at window on pit. + 36You're in dirty passage. + 39You're in dusty rock room. + 41You're at west end of hall of mists. + 57You're at brink of pit. + 60You're at east end of long hall. + 61You're at west end of long hall. + 64You're at complex junction. + 65You're in bedquilt. + 66You're in swiss cheese room. + 67You're at east end of two-pit room. + 68You're in slab room. + 71You're at junction of three secret canyons. + 74You're in secret e/w canyon above tight canyon. + 88You're in narrow corridor. + 91You're at steep incline above large room. + 92You're in giant room. + 95You're in cavern with waterfall. + 96You're in soft room. + 97You're in oriental room. + 98You're in misty cavern. + 99You're in alcove. + 100You're in plover room. + 101You're in dark-room. + 102You're in arched hall. + 103You're in shell room. + 106You're in anteroom. + 108You're at witt's end. + 109You're in mirror canyon. + 110You're at window on pit. + 111You're at top of stalactite. + 113You're at reservoir. + 115You're at ne end. + 116You're at sw end. + 117You're on sw side of chasm. + 118You're in sloping corridor. + 122You're on ne side of chasm. + 123You're in corridor. + 124You're at fork in path. + 125You're at junction with warm walls. + 126You're at breath-taking view. + 127You're in chamber of boulders. + 128You're in limestone passage. + 129You're in front of barren room. + 130You're in barren room. + 142You're at bottom of gravel bank. + 143You're in druid temple room. + 144You're at passage to throne room. + 145You're in throne room. + 146You're in dusty chamber. + 150You're in magicians tower. + -1End short descriptions + 3 + 1 2 2 44 29 + 1 3 3 12 19 43 + 1 4 5 13 14 46 30 + 1 5 6 45 43 + 1 8 63 + 2 1 2 12 7 43 45 30 + 2 5 6 45 46 + 3 1 3 11 32 44 + 3 148171 62 + 3 11 62 + 3 148171 65 + 3 33 65 + 3 79 5 14 + 3 147 99 + 4 1 4 12 45 + 4 5 6 43 44 29 + 4 7 5 46 30 + 4 8 63 + 5 4 9 43 30 + 5 50005 6 7 45 + 5 6 6 + 5 5 44 46 + 6 1 2 45 + 6 4 9 43 44 30 + 6 5 6 46 + 7 1 12 + 7 4 4 45 + 7 5 6 43 44 + 7 8 5 15 16 46 + 7 595 60 14 30 + 8 5 6 43 44 46 + 8 1 12 + 8 7 4 13 45 + 8 303009 3 19 30 + 8 593 3 + 9 303008 11 29 + 9 593 11 + 9 10 17 18 19 44 + 9 14 31 + 9 11 51 + 10 9 11 20 21 43 + 10 11 19 22 44 51 + 10 14 31 + 11 303008 63 + 11 9 64 + 11 10 17 18 23 24 43 + 11 12 25 19 29 44 + 11 148171 62 + 11 3 62 + 11 14 31 + 12 303008 63 + 12 9 64 + 12 11 30 43 51 + 12 13 19 29 44 + 12 14 31 + 13 303008 63 + 13 9 64 + 13 11 51 + 13 12 25 43 + 13 14 23 31 44 + 14 303008 63 + 14 9 64 + 14 11 51 + 14 13 23 43 + 14 150020 30 31 34 + 14 15 30 + 14 16 33 44 + 15 18 37 46 + 15 17 7 38 44 + 15 19 10 30 45 + 15 150022 29 31 34 35 23 43 + 15 14 29 + 15 34 55 + 16 14 1 + 17 15 38 43 + 17 312596 39 + 17 412021 7 + 17 412597 41 42 44 69 + 17 27 41 + 18 15 38 11 45 + 19 15 10 29 43 + 19 311145 45 36 78 + 19 311029 46 37 + 19 311030 44 7 + 19 32 45 + 19 35074 49 + 19 211032 49 + 19 74 66 + 20 0 1 + 21 0 1 + 22 15 1 + 23 67 43 42 + 23 68 44 61 + 23 25 30 31 + 23 648 52 + 24 67 29 11 + 25 23 29 11 + 25 724031 56 + 25 26 56 + 26 88 1 + 27 312596 39 + 27 412021 7 + 27 412597 41 42 43 69 + 27 17 41 + 27 40 45 + 27 41 44 + 28 145 78 11 46 + 28 33 45 55 + 28 36 30 52 + 29 19 38 11 45 + 30 19 38 11 43 + 30 62 44 29 + 31 524089 1 + 31 90 1 + 32 19 1 + 33 148171 65 + 33 3 65 + 33 28 46 + 33 34 43 53 54 + 33 35 44 + 33 159302 71 + 33 148171 71 + 33 100 71 + 34 33 30 55 + 34 15 29 + 35 33 43 55 + 35 20 39 + 36 37 43 17 + 36 28 29 52 + 36 39 44 + 36 65 70 + 37 36 44 17 + 37 38 30 31 56 + 38 37 56 29 11 + 38 595 60 14 30 4 5 + 39 36 43 23 + 39 64 30 52 58 + 39 65 70 + 40 41 44 + 40 27 43 + 40 59 29 23 + 41 42 46 29 23 56 + 41 27 43 + 41 40 45 + 41 60 44 17 + 42 41 29 + 42 42 45 + 42 43 43 + 42 45 46 + 42 80 44 + 43 42 44 + 43 44 46 + 43 45 43 + 44 43 43 + 44 48 30 + 44 50 46 + 44 82 45 + 45 42 44 + 45 43 45 + 45 46 43 + 45 47 46 + 45 87 29 30 + 46 45 44 11 + 47 45 43 11 + 48 44 29 11 + 49 50 43 + 49 51 44 + 50 44 43 + 50 49 44 + 50 51 30 + 50 52 46 + 51 49 44 + 51 50 29 + 51 52 43 + 51 53 46 + 52 50 44 + 52 51 43 + 52 52 46 + 52 53 29 + 52 55 45 + 52 86 30 + 53 51 44 + 53 52 45 + 53 54 46 + 54 53 44 11 + 55 52 44 + 55 55 45 + 55 56 30 + 55 57 43 + 56 55 29 11 + 57 13 30 56 + 57 55 44 + 57 58 46 + 57 83 45 + 57 84 43 + 58 57 43 11 + 59 40 30 23 + 59 111 46 + 60 41 43 29 17 + 60 61 44 + 60 62 45 30 52 + 61 100147 44 + 61 60 43 + 61 62 45 + 61 100107 46 + 62 60 44 + 62 63 45 + 62 30 43 + 62 61 46 + 63 62 46 11 + 63 141 45 30 7 + 64 39 29 56 59 + 64 65 44 70 + 64 103 45 74 + 64 106 43 + 65 64 43 + 65 66 44 + 65 80556 46 + 65 68 61 + 65 80556 29 + 65 50070 29 + 65 39 29 + 65 60556 45 + 65 75072 45 + 65 71 45 + 65 80556 30 + 65 106 30 + 66 65 47 + 66 67 44 + 66 80556 46 + 66 77 25 + 66 96 43 + 66 50556 50 + 66 97 72 + 67 66 43 + 67 23 44 42 + 67 24 30 31 + 68 23 46 + 68 69 29 56 + 68 65 45 + 69 68 30 61 + 69 331120 46 + 69 119 46 + 69 109 45 + 69 113 75 + 70 71 45 + 70 65 30 23 + 70 111 46 + 71 65 48 + 71 70 46 + 71 110 45 + 72 65 70 + 72 118 49 + 72 73 45 + 72 97 48 72 + 73 72 46 17 11 + 74 19 43 + 74 331120 44 + 74 121 44 + 74 75 30 + 75 76 46 + 75 77 45 + 76 75 45 + 77 75 43 + 77 78 44 + 77 66 45 17 + 78 77 46 + 79 3 1 + 80 42 45 + 80 80 44 + 80 80 46 + 80 81 43 + 81 80 44 11 + 82 44 46 11 + 83 57 46 + 83 84 43 + 83 85 44 + 84 57 45 + 84 83 44 + 84 114 49 + 85 83 43 11 + 86 52 29 11 + 87 45 29 30 + 88 25 30 56 43 + 88 20 39 + 88 92 44 27 + 89 25 1 + 90 23 1 + 91 95 45 73 23 + 91 72 30 56 + 92 88 46 + 92 93 43 + 92 94 45 + 92 3 99 + 93 92 46 27 11 + 94 92 46 27 23 + 94 309095 45 3 73 + 94 611 45 + 95 94 46 11 + 95 92 27 + 95 91 44 + 96 66 44 11 + 97 66 48 + 97 72 44 17 + 97 98 29 45 73 + 98 97 46 72 + 98 99 44 + 99 98 50 73 + 99 301 43 23 + 99 100 43 + 100 301 44 23 11 + 100 99 44 + 100 159302 71 + 100 33 71 + 100 101 47 22 + 101 100 46 71 11 + 102 103 30 74 11 + 103 102 29 38 + 103 104 30 + 103 114618 46 + 103 115619 46 + 103 64 46 + 104 103 29 74 + 104 105 30 + 105 104 29 11 + 105 103 74 + 106 64 29 + 106 65 44 + 106 108 43 + 107 131 46 + 107 132 49 + 107 133 47 + 107 134 48 + 107 135 29 + 107 136 50 + 107 137 43 + 107 138 44 + 107 139 45 + 107 61 30 + 108 95556 43 45 46 47 48 49 50 29 30 + 108 106 43 + 108 626 44 + 109 69 46 + 109 113 45 75 + 110 71 44 + 110 20 39 + 111 70 44 + 111 59 45 + 111 40050 30 39 56 + 111 50053 30 + 111 45 30 + 112 131 49 + 112 132 45 + 112 133 43 + 112 134 50 + 112 135 48 + 112 136 47 + 112 137 44 + 112 138 30 + 112 139 29 + 112 140 46 + 113 109 46 11 109 + 114 84 47 + 115 116 49 + 116 115 47 + 116 593 30 + 117 118 49 + 117 233660 41 42 69 47 + 117 332661 41 + 117 303 41 + 117 332021 39 + 117 596 39 + 118 72 30 + 118 117 29 + 119 69 45 11 + 119 653 43 7 + 120 69 45 + 120 74 43 + 121 74 43 11 + 121 653 45 7 + 122 123 47 + 122 233660 41 42 69 49 + 122 303 41 + 122 596 39 + 122 124 77 + 122 126 28 + 122 129 40 + 123 122 44 + 123 124 43 77 + 123 126 28 + 123 129 40 + 124 123 44 + 124 125 47 36 + 124 128 48 37 30 + 124 126 28 + 124 129 40 + 125 124 46 77 + 125 126 45 28 + 125 127 43 17 + 126 125 46 23 11 + 126 124 77 + 126 610 30 39 + 127 125 44 11 17 + 127 124 77 + 127 126 28 + 128 124 45 29 77 + 128 129 46 30 40 + 128 126 28 + 129 128 44 29 + 129 124 77 + 129 130 43 19 40 3 + 129 126 28 + 129 92 99 + 130 129 44 11 + 130 124 77 + 130 126 28 + 131 107 44 + 131 132 48 + 131 133 50 + 131 134 49 + 131 135 47 + 131 136 29 + 131 137 30 + 131 138 45 + 131 139 46 + 131 112 43 + 132 107 50 + 132 131 29 + 132 133 45 + 132 134 46 + 132 135 44 + 132 136 49 + 132 137 47 + 132 138 43 + 132 139 30 + 132 112 48 + 133 107 29 + 133 131 30 + 133 132 44 + 133 134 47 + 133 135 49 + 133 136 43 + 133 137 45 + 133 138 50 + 133 139 48 + 133 112 46 + 134 107 47 + 134 131 45 + 134 132 50 + 134 133 48 + 134 135 43 + 134 136 30 + 134 137 46 + 134 138 29 + 134 139 44 + 134 112 49 + 135 107 45 + 135 131 48 + 135 132 30 + 135 133 46 + 135 134 43 + 135 136 44 + 135 137 49 + 135 138 47 + 135 139 50 + 135 112 29 + 136 107 43 + 136 131 44 + 136 132 29 + 136 133 49 + 136 134 30 + 136 135 46 + 136 137 50 + 136 138 48 + 136 139 47 + 136 112 45 + 137 107 48 + 137 131 47 + 137 132 46 + 137 133 30 + 137 134 29 + 137 135 50 + 137 136 45 + 137 138 49 + 137 139 43 + 137 112 44 + 138 107 30 + 138 131 43 + 138 132 47 + 138 133 29 + 138 134 44 + 138 135 45 + 138 136 46 + 138 137 48 + 138 139 49 + 138 112 50 + 139 107 49 + 139 131 50 + 139 132 43 + 139 133 44 + 139 134 45 + 139 135 30 + 139 136 48 + 139 137 29 + 139 138 46 + 139 112 47 + 140 112 45 11 + 141 142 1 + 142 143 43 79 + 143 142 44 + 143 144 45 + 143 146 46 + 143 129 99 + 144 956145 45 29 78 + 144 716 45 29 78 + 144 143 46 79 + 145 956144 30 + 145 28 45 30 + 145 19 46 38 + 146 143 45 79 + 146 349160 30 + 146 747 30 + 147 60061 43 + 147 19 43 + 147 348304 30 + 147 60152 30 + 147 15148 30 + 147 147 30 + 147 60148 29 + 147 147 29 + 147 143 99 + 148 148171 43 + 148 955170 43 + 148 956170 43 + 148 167143 43 + 148 157114 43 + 148 168157 43 + 148 60019 43 + 148 30149 43 + 148 151 43 + 148 60147 30 + 148 15149 30 + 148 148 30 + 148 60149 29 + 148 15147 29 + 148 148 29 + 149 169 43 + 149 60148 30 + 149 15151 30 + 149 149 30 + 149 60151 29 + 149 15148 29 + 149 149 29 + 150 148151 30 + 150 151 30 + 151 305 43 + 151 10149 29 + 151 148150 29 + 151 151 29 + 151 60149 30 + 151 151 30 + 152 398153 80 + 152 147 29 + 153 154 30 49 + 153 155 44 + 153 156 29 50 + 154 153 29 + 155 153 43 + 156 153 30 46 + 156 157 29 43 + 157 156 30 44 + 157 158 29 43 + 158 157 30 44 + 158 159 29 46 + 159 158 30 45 + 159 151 44 + 160 146 29 + 160 168 43 + 160 161 44 + 161 160 43 + 161 162 45 + 162 161 46 + 162 163 45 + 163 162 46 + 163 164 48 + 164 163 50 + 164 165 47 + 165 164 49 + 165 166 46 + 166 165 45 + 166 167 43 + 167 166 44 + 167 168 49 + 168 167 47 + 168 160 44 + 169 149 44 + 170 0 1 + 171 150 1 + -1 + 4 + 2ROAD + 2HILL + 3ENTER + 4UPSTR + 5DOWNS + 6FORES + 7FORWA + 7CONTI + 7ONWAR + 8BACK + 8RETUR + 8RETRE + 9VALLE + 10STAIR + 11OUT + 11OUTSI + 11EXIT + 11LEAVE + 12BUILD + 12HOUSE + 13GULLY + 14STREA + 15ROCK + 16BED + 17CRAWL + 18COBBL + 19INWAR + 19INSID + 19IN + 20SURFA + 21NULL + 21NOWHE + 22DARK + 23PASSA + 23TUNNE + 24LOW + 25CANYO + 26AWKWA + 27GIANT + 28VIEW + 29UPWAR + 29UP + 29U + 29ABOVE + 29ASCEN + 30D + 30DOWNW + 30DOWN + 30DESCE + 31PIT + 32OUTDO + 33CRACK + 34STEPS + 35DOME + 36LEFT + 37RIGHT + 38HALL + 39JUMP + 40BARRE + 41OVER + 42ACROS + 43EAST + 43E + 44WEST + 44W + 45NORTH + 45N + 46SOUTH + 46S + 47NE + 48SE + 49SW + 50NW + 51DEBRI + 52HOLE + 53WALL + 54BROKE + 55Y2 + 56CLIMB + 57LOOK + 57EXAMI + 57TOUCH + 57DESCR + 58FLOOR + 59ROOM + 60SLIT + 61SLAB + 61SLABR + 62XYZZY + 63DEPRE + 64ENTRA + 65PLUGH + 66SECRE + 67CAVE + 69CROSS + 70BEDQU + 71PLOVE + 72ORIEN + 73CAVER + 74SHELL + 75RESER + 76MAIN + 76OFFIC + 77FORK + 78THRONE + 79DRUID + 79TEMPLE + 80FRIEND + 99TESTM + 1001KEYS + 1001KEY + 1002LAMP + 1002HEADL + 1002LANTE + 1003GRATE + 1004CAGE + 1005ROD + 1006ROD (MUST BE NEXT OBJECT AFTER "REAL" ROD) + 1007STEPS + 1008BIRD + 1009DOOR + 1010PILLO + 1010VELVE + 1011SNAKE + 1012FISSU + 1013TABLE + 1014CLAM + 1015OYSTE + 1016MAGAZ + 1016ISSUE + 1016SPELU + 1016"SPEL + 1017DWARF + 1017DWARV + 1018KNIFE + 1018KNIVE + 1019FOOD + 1019RATIO + 1020BOTTL + 1020JAR + 1021WATER + 1021H20 + 1022OIL + 1023MIRRO + 1024PLANT + 1024BEANS + 1025PLANT (MUST BE NEXT OBJECT AFTER "REAL" PLANT) + 1026STALA + 1027SHADO + 1027FIGUR + 1028AX + 1028AXE + 1029DRAWI + 1030PIRAT + 1031DRAGO + 1032CHASM + 1033TROLL + 1034TROLL (MUST BE NEXT OBJECT AFTER "REAL" TROLL) + 1035BEAR + 1036MESSA + 1037VOLCA + 1037GEYSE (SAME AS VOLCANO) + 1038MACHI + 1038VENDI + 1039BATTE + 1040CARPE + 1040MOSS + 1041STONE + 1042PLAQUE + 1043TPASS + 1044BROOM + 1045MAP + 1046DAGGER + 1047THRONE + 1048STAFF + 1049TRAP + 1049TRAPD + 1050GOLD + 1050NUGGE + 1051DIAMO + 1052SILVE + 1052BARS + 1053JEWEL + 1054COINS + 1055CROWN + 1055ELFIN + 1055ELVIN + 1056RING + 1057CHEST + 1057BOX + 1057TREAS + 1058VASE + 1058MING + 1058SHARD + 1058POTTE + 1059EMERA + 1060PLATI + 1060PYRAM + 1061PEARL + 1062RUG + 1062PERSI + 1063SPICE + 1064CHAIN + 1065EGGS + 1065EGG + 1065NEST + 1066TRIDE + 1067SWORD + 1068MITHR + 1068MAIL + 1069SCHOL + 1069BROWN + 1069PAPER + 1070FIGUR + 1070CRYST + 1096BOOK + 1096SPELL + 1097SIGN + 1098MAGIC + 1099ELVEN + 2001CARRY + 2001TAKE + 2001KEEP + 2001CATCH + 2001STEAL + 2001CAPTU + 2001GET + 2001TOTE + 2002DROP + 2002RELEA + 2002FREE + 2002DISCA + 2002DUMP + 2003SAY + 2003CHANT + 2003SING + 2003UTTER + 2003MUMBL + 2004UNLOC + 2004OPEN + 2005NOTHI + 2006LOCK + 2006CLOSE + 2007LIGHT + 2008EXTIN + 2009WAVE + 2009SHAKE + 2009SWING + 2010CALM + 2010PLACA + 2010TAME + 2011WALK + 2011RUN + 2011TRAVE + 2011GO + 2012ATTAC + 2012KILL + 2012FIGHT + 2012HIT + 2012SLAY + 2012STRIK + 2013POUR + 2013SPILL + 2014EAT + 2014DEVOUR + 2015DRINK + 2016RUB + 2017THROW + 2017TOSS + 2018QUIT + 2018Q + 2019FIND + 2019WHERE + 2020INVEN + 2020I + 2021FEED + 2022FILL + 2023BLAST + 2023DETON + 2023IGNIT + 2023BLOWU + 2024SCORE + 2025FEE + 2025FIE + 2025FOE + 2025FOO + 2025FUM + 2026BRIEF + 2027READ + 2027PERUS + 2028BREAK + 2028SHATT + 2028SMASH + 2029WAKE + 2029DISTU + 2030SUSPE + 2030PAUSE + 2030SAVE + 2031HOURS + 2032WEAR + 2032DON + 2032PUTON + 2033PULL + 2033TUG + 2033YANK + 2033JERK + 2034REMOVE + 2034DOFF + 2035ON + 2036OFF + 2037SWEEP + 3001FEE + 3002FIE + 3003FOE + 3004FOO + 3005FUM + 3050HOCUS + 3050POCUS + 3051HELP + 3051? + 3064TREE + 3064TREES + 3066DIG + 3066EXCAV + 3068LOST + 3069MIST + 3079FUCK + 3139STOP + 3142INFO + 3142INFOR + 3147SWIM + 3249WAIT + 3250GESTURE + -1 + 5 + 1Set of Keys + 000There are some keys on the ground here. + 2Brass Lantern + 000There is a shiny brass lamp nearby. + 100There is a lamp shining nearby. + 3*Grate + 000The grate is locked. + 100The grate is open. + 4Wicker Cage + 000There is a small wicker cage discarded nearby. + 5Black Rod + 000A three foot black rod with a rusty star on an end lies nearby. + 6Black Rod + 000A three foot black rod with a rusty mark on an end lies nearby. + 7*Steps + 000Rough stone steps lead down the pit. + 100Rough stone steps lead up the dome. + 8Little bird in cage + 000A cheerful little bird is sitting here singing. + 100There is a little bird in the cage. + 9*Rusty Door + 000The way north is barred by a massive, rusty, iron door. + 100The way north leads through a massive, rusty, iron door. + 10Velvet Pillow + 000A small velvet pillow lies on the floor. + 11*Snake + 000A huge green fierce snake bars the way! + 100>$< (chased away) + 12*Fissure + 000>$< + 100A crystal bridge now spans the fissure. + 200The crystal bridge has vanished! + 13*Stone Tablet + 000A massive stone tablet imbedded in the wall reads: + 000"Congratulations on bringing light into the Dark-room!" + 14Giant Clam >Grunt!< + 000There is an enormous clam here with its shell tightly closed. + 15Giant Oyster >Groan!< + 000There is an enormous oyster here with its shell tightly closed. + 100Interesting. There seems to be something written on the underside of + 100the oyster. + 16"Spelunker Today" + 000There are a few recent issues of "Spelunker Today" magazine here. + 19Tasty Food + 000There is food here. + 20Small Bottle + 000There is a bottle of water here. + 100There is an empty bottle here. + 200There is a bottle of oil here. + 21Water in the Bottle + 22Oil in the Bottle + 23*Mirror + 000>$< + 24*Plant + 000There is a tiny little plant in the pit, murmuring "Water, water, ..." + 100The plant spurts into furious growth for a few seconds. + 200There is a 12-foot-tall beanstalk stretching up out of the pit, + 200bellowing "WATER!! WATER!!" + 300The plant grows explosively, almost filling the bottom of the pit. + 400There is a gigantic beanstalk stretching all the way up to the hole. + 500You've over-watered the plant! It's shriveling up! It's, it's... + 25*Phony plant (seen in twopit room only when tall enough) + 000>$< + 100The top of a 12-foot-tall beanstalk is poking out of the west pit. + 200There is a huge beanstalk growing out of the west pit up to the hole. + 26*Stalactite + 000>$< + 27*Shadowy figure + 000The shadowy figure seems to be trying to attract your attention. + 28Dwarf's Axe + 000There is a little axe here. + 100There is a little axe lying beside the bear. + 29*Cave Drawings + 000>$< + 30*Pirate + 000>$< + 31*Dragon + 000A huge green fierce dragon bars the way! + 100Congratulations! You have just vanquished a dragon with your bare + 100hands! (Unbelievable, isn't it?) + 200The body of a huge green dead dragon is lying off to one side. + 32*Chasm + 000A rickety wooden bridge extends across the chasm, vanishing into the + 000mist. A sign posted on the bridge reads, "Stop! Pay Troll!" + 100The wreckage of a bridge (and a dead bear) can be seen at the bottom + 100of the chasm. + 33*Troll + 000A burly troll stands by the bridge and insists you throw him a + 000treasure before you may cross. + 100The troll steps out from beneath the bridge and blocks your way. + 200>$< (chased away) + 34*Phony Troll + 000The troll is nowhere to be seen. + 35>$< (bear uses rtext 141) + 000There is a ferocious cave bear eying you from the far end of the room! + 100There is a gentle cave bear sitting placidly in one corner. + 200There is a contented-looking bear wandering about nearby. + 300>$< (dead) + 36*Message in second maze + 000There is a message scrawled in the dust in a flowery script, reading: + 000"This is not the maze where the pirate leaves his treasure chest." + 37*Volcano and/or Geyser + 000>$< + 38*Vending Machine + 000There is a massive vending machine here. The instructions on it read: + 000"Drop coins here to receive fresh batteries." + 39Batteries + 000There are fresh batteries here. + 100Some worn-out batteries have been discarded nearby. + 40*Carpet and/or Moss + 000>$< + 41*STONE + 000>$< + 100The top of the stone has an elongated hole in it. + 42*Plaque + 000There is a plaque on the wall which reads + 000"This way to the throne room" + 43*Throne room passage + 000>$< + 100There is a small dark passage leading down from behind the throne. + 44Broom + 000There is a dusty old broom lying on the ground. + 45*Map + 000There is a large map on the wall. + 46Dagger + 000There is a short ornate dagger here. + 100There is a dagger lying beside the bear. + 47*Throne + 000>$< + 48Staff + 000The magician's staff is leaning against the wall. + 100>$< + 49*Trap door + 000>$< + 100There is a trap door under the dust leading down. + 50Large Gold Nugget + 000There is a large sparkling nugget of gold here! + 51Several Diamonds + 000There are diamonds here! + 52Bars of Silver + 000There are bars of silver here! + 53Precious Jewelry + 000There is precious jewelry here! + 54Rare Coins + 000There are many coins here! + 55Elfin Crown + 000There is a bejeweled elfin crown sitting at your feet! + 100There is an old crown sitting on the throne! + 56Ring + 000There is a dull gold ring here! + 100There is an unadorned gold ring on a hook on the wall! + 57Treasure Chest + 000The pirate's treasure chest is here! + 58Ming Vase + 000There is a delicate, precious Ming vase here! + 100The vase is now resting, delicately, on a velvet pillow. + 200The floor is littered with worthless shards of pottery. + 300The Ming vase drops with a delicate crash. + 59Egg-sized Emerald + 000There is an emerald here the size of a plover's egg! + 60Platinum Pyramid + 000There is a platinum pyramid here, 8 inches on a side! + 61Glistening Pearl + 000Off to one side lies a glistening pearl! + 62Persian Rug + 000There is a Persian rug spread out on the floor! + 100The dragon is sprawled out on a Persian rug!! + 63Rare Spices + 000There are rare spices here! + 64Golden Chain + 000There is a golden chain lying in a heap on the floor! + 100The bear is locked to the wall with a golden chain! + 200There is a golden chain locked to the wall! + 65Golden Eggs + 000There is a large nest here, full of golden eggs! + 100The nest of golden eggs has vanished! + 200Done! + 66Jeweled Trident + 000There is a jewel-encrusted trident here! + 67Sword + 000There is a brilliant sword lying on the ground! + 100The sword is firmly imbedded in the stone! + 200The ground is covered with thousands of tiny pieces of rust! + 68Mithril Mail + 000There is a gleaming coat of Mithril chain mail here! + 69Scholarship + 000There is a full four-year MIT Scholarship here! + 100>$< + 70Crystal figure + 000There is a large piece of crystal here carved to the shape of a God! + 96Book + 000The Magician's Book of Spells is here. + 97*Sign + 000There is a large sign floating here in mid-air. + 98*Magician + 000The Magician is here gesturing frantically in front of the elven door. + 99*Elven Door + 000There is a massive stone Elven door set into the western wall. The + 000surface of the door is covered with indecipherable runes. + 100There is a massive stone Elven door set into the western wall. + 200There is a massive stone Elven door set into the western wall. The + 200surface of the door is covered with runes. + -1 + 6 + 1Somewhere nearby is Colossal Cave, where others have found fortunes in + 1treasure and gold, though it is rumored that some who enter are never + 1seen again. Magic is said to work in the cave. I will be your eyes + 1and hands. Direct me with commands of 1 or 2 words. I should warn + 1you that I look at only the first five letters of each word, so you'll + 1have to enter "Northeast" as "NE" to distinguish it from "North". + 1(Should you get stuck, type "help" for some general hints. For infor- + 1mation on how to end your adventure, etc., type "INFO".) + 1 - - - + 1This program was originally developed by Willie Crowther. Most of the + 1features of the current program were added by Don Woods. + 1Additional features added at Brown University. + 2A little dwarf with a big knife blocks your way. + 3A little dwarf just walked around a corner, saw you, threw a little + 3axe at you which missed, cursed, and ran away. + 4There is a threatening little dwarf in the room with you! + 5One sharp nasty knife is thrown at you! + 6None of them hit you! + 7One of them gets you! + 8A hollow voice says "Plugh". + 9There is no way to go that direction. + 10I am unsure how you are facing. Use compass points or nearby objects. + 11I don't know in from out here. Use compass points or name something + 11in the general direction you want to go. + 12I don't know how to apply that word here. + 13I don't understand that! + 14I'm game. Would you care to explain how? + 15Sorry, but I am not allowed to give more detail. I will repeat the + 15long description of your location. + 16It is now pitch dark. If you proceed you will likely fall into a pit. + 17If you prefer, simply type W rather than WEST. + 18Are you trying to catch the bird? + 19The bird is frightened right now and you cannot catch it no matter + 19what you try. Perhaps you might try later. + 20Are you trying to somehow deal with the snake? + 21You can't kill the snake, or drive it away, or avoid it, or anything + 21like that. There is a way to get by, but you don't have the necessary + 21resources right now. + 22Do you really want to quit now? + 23AAAAAIIIIIEEEEeeee . . . (!) + 23You fell into a pit and broke every bone in your body. + 24You are already carrying it! + 25You can't be serious! + 26The bird was unafraid when you entered, but as you approach it becomes + 26disturbed and you cannot catch it. + 27You can catch the bird, but you cannot carry it. + 28There is nothing here with a lock! + 29You aren't carrying it! + 30The little bird attacks the green snake, and in an astounding flurry + 30drives the snake away. + 31You have no keys! + 32It has no lock. + 33I don't know how to lock or unlock such a thing. + 34It was already locked. + 35The grate is now locked. + 36The grate is now unlocked. + 37It was already unlocked. + 38You have no source of light. + 39Your lamp is now on. + 40Your lamp is now off. + 41There is no way to get past the bear to unlock the chain, which is + 41probably just as well. + 42Nothing happens. + 43Where? + 44There is nothing here to attack. + 45The little bird is now dead. Its body disappears. + 46Attacking the snake both doesn't work and is very dangerous. + 47You killed a little dwarf. + 48You attack a little dwarf, but he dodges out of the way. + 49With what? Your bare hands? + 50Good try, but that is an old worn-out magic word. + 51I know of places, actions, and things. Most of my vocabulary + 51describes places and is used to move you there. To move, try words + 51like forest, building, downstream, enter, east, west, north, south, + 51up, or down. I know about a few special objects, like a black rod + 51hidden in the cave. These objects can be manipulated using some of + 51the action words that I know. Usually you will need to give both the + 51object and action words (in either order), but sometimes I can infer + 51the object from the verb alone. Some objects also imply verbs; in + 51particular, "INVENTORY" implies "TAKE INVENTORY", which causes me to + 51give you a list of what you're carrying. The objects have side + 51effects; for instance, the rod scares the bird. Usually people having + 51trouble moving just need to try a few more words. Usually people + 51trying unsuccessfully to manipulate an object are attempting something + 51beyond their (or my!) capabilities and should try a completely + 51different tack. To speed the game you can sometimes move long + 51distances with a single word. For example, "BUILDING" usually gets + 51you to the building from anywhere above ground except when lost in the + 51forest. Also, note that cave passages turn a lot, and that leaving a + 51room to the north does not guarantee entering the next from the south. + 51Good luck! + 52It misses! + 53It gets you! + 54OK. + 55You can't unlock the keys. + 56You have crawled around in some little holes and wound up back in the + 56main passage. + 57I don't know where the cave is, but hereabouts no stream can run on + 57the surface for long. I would try the stream. + 58I need more detailed instructions to do that. + 59I can only tell you what you see as you move about and manipulate + 59things. I cannot tell you where remote things are. + 60I don't know that word. + 61What? + 62Are you trying to get into the cave? + 63The grate is very solid and has a hardened steel lock. You cannot + 63enter without a key, and there are no keys nearby. I would recommend + 63looking elsewhere for the keys. + 64The trees of the forest are large hardwood oak and maple, with an + 64occasional grove of pine or spruce. There is quite a bit of under- + 64growth, largely birch and ash saplings plus nondescript bushes of + 64various sorts. This time of year visibility is quite restricted by + 64all the leaves, but travel is quite easy if you detour around the + 64spruce and berry bushes. + 65Welcome to Adventure!! Would you like instructions? + 66Digging without a shovel is quite impractical. Even with a shovel + 66progress is unlikely. + 67Blasting requires dynamite. + 68I'm as confused as you are. + 69Mist is a white vapor, usually water, seen from time to time in + 69caverns. It can be found anywhere but is frequently a sign of a deep + 69pit leading down to water. + 70Your feet are now wet. + 71I think I just lost my appetite. + 72Thank you, it was delicious! + 73You have taken a drink from the stream. The water tastes strongly of + 73minerals, but is not unpleasant. It is extremely cold. + 74The bottle of water is now empty. + 75Rubbing the electric lamp is not particularly rewarding. Anyway, + 75nothing exciting happens. + 76Peculiar. Nothing unexpected happens. + 77Your bottle is empty and the ground is wet. + 78You can't pour that. + 79Watch it! + 80Which way? + 81Oh dear, you seem to have gotten yourself killed. I might be able to + 81help you out, but I've never really done this before. Do you want me + 81to try to reincarnate you? + 82All right. But don't blame me if something goes wr...... + 82 --- POOF!! --- + 82You are engulfed in a cloud of orange smoke. Coughing and gasping, + 82you emerge from the smoke and find.... + 83You clumsy oaf, you've done it again! I don't know how long I can + 83keep this up. Do you want me to try reincarnating you again? + 84Okay, now where did I put my orange smoke?.... >POOF!< + 84Everything disappears in a dense cloud of orange smoke. + 85Now look here. I'm sick and tired of you coming back here all the time. + 85Do you know how much orange smoke costs these days? And I'm not even + 85making minimum wage! Do you really want to be reincarnated? + 86All this work and I don't even get a share of the profits. Oh well, + 86 POOF! You are swallowed by a cloud of (very expensive) orange smoke. + 87Now you've really done it! I'm out of orange smoke! You don't expect + 87me to do a decent reincarnation without any orange smoke, do you? + 88Okay, if you're so smart, do it yourself! I'm leaving! + 90>>> Messages 81 thru 90 are reserved for "obituaries". <<< + 91Sorry, but I no longer seem to remember how it was you got here. + 92You can't carry anything more. You'll have to drop something first. + 93You can't go through a locked steel grate! + 94I believe what you want is right here with you. + 95You don't fit through a two-inch slit! + 96I respectfully suggest you go across the bridge instead of jumping. + 97There is no way across the fissure. + 98You're not carrying anything. + 99You are currently holding the following: + 100It's not hungry (It's merely pinin' for the fjords). Besides, you + 100have no bird seed. + 101The snake has now devoured your bird. + 102There's nothing here it wants to eat (except perhaps you). + 103You fool, dwarves eat only coal! Now you've made him REALLY mad!! + 104You have nothing in which to carry it. + 105Your bottle is already full. + 106There is nothing here with which to fill the bottle. + 107Your bottle is now full of water. + 108Your bottle is now full of oil. + 109You can't fill that. + 110Don't be ridiculous! + 111The door is extremely rusty and refuses to open. + 112The plant shakes the oil off its leaves and asks, "Water?" + 113The hinges are quite thoroughly rusted now and won't budge. + 114The oil has freed up the hinges so that the door will now move, + 114although it requires some effort. + 115The plant has exceptionally deep roots and cannot be pulled free. + 116The dwarves' knives vanish as they strike the walls of the cave. + 117Something you're carrying won't fit through the tunnel with you. + 117You'd best take inventory and drop something. + 118You can't fit this five-foot clam through that little passage! + 119You can't fit this five-foot oyster through that little passage! + 120I advise you to put down the clam before opening it. >Strain!< + 121I advise you to put down the oyster before opening it. >Wrench!< + 122You don't have anything strong enough to open the clam. + 123You don't have anything strong enough to open the oyster. + 124A glistening pearl falls out of the clam and rolls away. Goodness, + 124this must really be an oyster. (I never was very good at identifying + 124bivalves.) Whatever it is, it has now snapped shut again. + 125The oyster creaks open, revealing nothing but oyster inside. It + 125promptly snaps shut again. + 126You have crawled around in some little holes and found your way + 126blocked by a recent cave-in. You are now back in the main passage. + 127There are faint rustling noises from the darkness behind you. + 128Out from the shadows behind you pounces a bearded pirate! "Har, Har," + 128he chortles, "I'll just take all this booty and hide it away with me + 128chest deep in the maze!" He snatches your treasure and vanishes into + 128the gloom. + 129A sepulchral voice reverberating through the cave, says, "Cave closing + 129soon. All adventurers exit immediately through main office." + 130A mysterious recorded voice groans into life and announces: + 130 "This exit is closed. Please leave via main office." + 131It looks as though you're dead. Well, seeing as how it's so close to + 131closing time anyway, I think we'll just call it a day. + 132The sepulchral voice entones, "The cave is now closed." As the echoes + 132fade, there is a blinding flash of light (and a small puff of orange + 132smoke). . . . As your eyes refocus, you look around and find... + 133There is a loud explosion, and a twenty-foot hole appears in the far + 133wall, burying the dwarves in the rubble. You march through the hole + 133and find yourself in the main office, where a cheering band of + 133friendly elves carry the conquering adventurer off into the sunset. + 134There is a loud explosion, and a twenty-foot hole appears in the far + 134wall, burying the snakes in the rubble. A river of molten lava pours + 134in through the hole, destroying everything in its path, including you! + 135There is a loud explosion, and you are suddenly splashed across the + 135walls of the room. + 136The resulting ruckus has awakened the dwarves. There are now several + 136threatening little dwarves in the room with you! Most of them throw + 136knives at you! All of them get you! + 137Oh, leave the poor unhappy bird alone. + 138I daresay whatever you want is around here somewhere. + 139I don't know the word "STOP". Use "QUIT" if you want to give up. + 140You can't get there from here. + 141You are being followed by a very large, tame bear. + 142If you want to end your adventure early, say "QUIT". To suspend your + 142adventure such that you can continue later, say "SUSPEND" (or "PAUSE" + 142or "SAVE"). To see what hours the cave is normally open, say "HOURS". + 142To see how well you're doing, say "SCORE". To get full credit for a + 142treasure, you must have left it safely in the building, though you get + 142partial credit just for locating it. You lose points for getting + 142killed, or for quitting, though the former costs you more. There are + 142also points based on how much (if any) of the cave you've managed to + 142explore; in particular, there is a large bonus just for getting in (to + 142distinguish the beginners from the rest of the pack), and there are + 142other ways do determine whether you've been through some of the more + 142harrowing sections. If you think you've found all the treasures, just + 142keep exploring for a while. If nothing interesting happens, you + 142haven't found them all yet. If something interesting DOES happen, + 142it means you're getting a bonus and have an opportunity to garner many + 142more points in the master's section. I may occasionally offer hints + 142if you seem to be having trouble. If I do, I'll warn you in advance + 142how much it will affect your score to accept the hints. Finally, to + 142save paper, you may specify "BRIEF", which tells me never to repeat + 142the full description of a place unless you explicitly ask me to. + 143Do you indeed wish to quit now? + 144There is nothing here with which to fill the vase. + 145The sudden change in temperature has delicately shattered the vase. + 146It is beyond your power to do that. + 147I don't know how. + 148It is too far up for you to reach. + 149You killed a little dwarf. The body vanishes in a cloud of greasy + 149black smoke. + 150The shell is very strong and is impervious to attack. + 151What's the matter, can't you read? Now you'd best start over. + 152The axe bounces harmlessly off the dragon's thick scales. + 153The dragon looks rather nasty. You'd best not try to get by. + 154The little bird attacks the green dragon, and in an astounding flurry + 154gets burnt to a cinder. The ashes blow away. + 155On what? + 156Okay, from now on I'll only describe a place in full the first time + 156you come to it. To get the full description, say "LOOK". + 157Trolls are close relatives with the rocks and have skin as tough as + 157that of a rhinoceros. The troll fends off your blows effortlessly. + 158The troll deftly catches the axe, examines it carefully, and tosses it + 158back, declaring, "Good workmanship, but it's not valuable enough." + 159The troll catches your treasure and scurries away out of sight. + 160The troll refuses to let you cross. + 161There is no longer any way across the chasm. + 162Just as you reach the other side, the bridge buckles beneath the + 162weight of the bear, which was still following you around. You + 162scrabble desperately for support, but as the bridge collapses you + 162stumble back and fall into the chasm. + 163The bear lumbers toward the troll, who lets out a startled shriek and + 163scurries away. The bear soon gives up the pursuit and wanders back. + 164The axe misses and lands near the bear where you can't get at it. + 165With what? Your bare hands? Against HIS bear hands? + 166The bear is confused; he only wants to be your friend. + 167For crying out loud, the poor thing is already dead! + 168The bear eagerly wolfs down your food, after which he seems to calm + 168down considerably and even becomes rather friendly. + 169The bear is still chained to the wall. + 170The chain is still locked. + 171The chain is now unlocked. + 172The chain is now locked. + 173There is nothing here to which the chain can be locked. + 174There is nothing here to eat. + 175Do you want the hint? + 176Do you need help getting out of the maze? + 177You can make the passages look less alike by dropping things. + 178Are you trying to explore beyond the plover room? + 179There is a way to explore that region without having to worry about + 179falling into a pit. None of the objects available is immediately + 179useful in discovering the secret. + 180Do you need help getting out of here? + 181Don't go west + 182Gluttony is not one of the troll's vices. Avarice, however, is. + 183Your lamp is getting dim. You'd best start wrapping this up, unless + 183you can find some fresh batteries. I seem to recall there's a vending + 183machine in the maze. Bring some coins with you. + 184Your lamp has run out of power. + 185There's not much point in wandering around out here, and you can't + 185explore the cave without a lamp. So let's just call it a day. + 186There are faint rustling noises from the darkness behind you. As you + 186turn toward them, the beam of your lamp falls across a bearded pirate. + 186He is carrying a large chest. "Shiver me timbers!" he cries, "I've + 186been spotted! I'd best hie meself off to the maze to hide me chest!" + 186With that, he vanishes into the gloom. + 187Your lamp is getting dim. You'd best go back for those batteries. + 188Your lamp is getting dim. I'm taking the liberty of replacing the + 188batteries. + 189Your lamp is getting dim, and you're out of spare batteries. You'd + 189best start wrapping this up. + 190I'm afraid the magazine is written in dwarvish. + 191"This is not the maze where the pirate leaves his treasure chest." + 192Hmmm, this looks like a clue, which means it'll cost you 10 points to + 192read it. Should I go ahead and read it anyway? + 193It says, "There is something strange about this place, such that one + 193of the words I've always known now has a new effect." + 194It says the same thing it did before. + 195I'm afraid I don't understand. + 196"Congratulations on bringing light into the dark-room!" + 197You strike the mirror a resounding blow, whereupon it shatters into a + 197myriad tiny fragments. + 198You have taken the vase and hurled it delicately to the ground. + 199You prod the nearest dwarf, who wakes up grumpily, takes one look at + 199you, curses, and grabs for his axe. + 200Is this acceptable? + 201There's no point in suspending a demonstration game. + 202The troll seems to enjoy your attention but still wants something + 202more tangible. + 203You fool, dwarves are very ticklish! Now you've made him REALLY mad!! + 204As you undoubtedly now realize, dragons have a skin temperature of + 204over 500 degrees. I suggest you pick up all the things you dropped + 204while you were frying your hands. + 205>GRUNT!< >GROAN!!< Forget it, Charlie, the bear's a wee bit + 205bigger than you are. + 206You are currently wearing the following: + 206The clothes on your back + 207You don't have it with you to wear. + 208Wear that? You've got to be joking. + 209You already have it on. + 210You can't expect me to try to pull THAT out! + 211I don't see anything which needs pulling. + 212>TUG!< >GROAN!< It seems to be stuck. Shall I keep pulling? + 213Oh Dear! It seems I pulled a little too hard. The sword has + 213shattered into many tiny pieces. + 214Voila! The sword has slid effortlessly out of the stone. + 215"This way to the throne room" + 216The hold shrinks as you approach it until it is too small to enter. + 217Are you trying to get through to the throne room? + 218Occasionally the wearing of certain objects alters whoever is + 218wearing them. + 219Are you trying to get the sword out? + 220It is deeply imbedded in the stone and may require some force + 220to remove. + 221You aren't wearing it! + 222The map shows a small complex of rooms connected to the throne + 222room by a passage beneath the throne. + 223Is this a restarted game? + 224The force of your blow was too much for the ancient metal and the + 224sword shatters. + 225As you pass your hand along the carved wood of the staff, it's + 225power flows through your body and drains away your meager life force. + 226As you wave the staff, the spirit of the staff appears before you. + 226It sees you are not it's rightful master and hits you with a bolt + 226of seemingly limitless energy. + 227The staff strikes the ground and disappears with a blinding flash. + 228The dagger is incapable of doing more than scratch the surface of the + 228dragon's thick scales. + 229The troll seems willing to play catch with the dagger. He tosses it + 229back, and narrowly misses hitting your head. + 230Your dagger fails to penetrate the thick fur of the bear and falls to + 230the ground beside it. + 231The dagger catches the attention of the dwarf and he proceeds to + 231pocket it. + 232Your axe strikes the Magician, causing him to notice your presence. + 233Your dagger strikes the Magician, who stumbles back in astonishment and + 233vanishes in a cloud of orange smoke. + 234The Magician notices you standing there and muttering something about + 234fool adventurers, waves his hand in your general direction. + 235The Magician turns, and with a cry of "I'm sick and tired of your + 235constant interference" points his finger at you. + 235 - - - C R A C K L E - - - + 236The staff in your hand seems to have had enough of all this and fades + 236away into nothingness. + 237The mithril mail is a small size, even for dwarves. You don't stand + 237a chance of getting it on yourself. + 238Your sweeping stirs up the dust and reveals a piece of paper on the + 238ground. + 239As the dust is dislodged and shifts around the room a trap door appears + 239in the middle of the floor. + 240A hoard of angry dwarves charges through the door as soon as you open + 240it. They are brandishing all manner of weapon and you get crushed in + 240their rush downstairs. + 241The book seems to be a big book of fairy tales. This particular tale + 241concerns an adventurer wandering around in a cave. + 242Speak, Friend, and enter + 243You hear a rumble from deep within the earth and the room shakes a bit. + 244The earth rumbles and opens up beneath the dragon. Both the dragon and + 244the rug vanish down the hole which closes behind them. + 245Notice! Dwarves not allowed to open this door by themselves! + 246You move the dirt around a little. The place is no cleaner for it. + 247You are now filthy from crawling around on the dusty floor. + 248"Congratulations. Due to your extraordinary abilities as an + 248adventurer, you have won a full four-year scholarship to the + 248College of your choice -- limited to Cambridge Massachusetts. Sorry, + 248but Harvard excluded. Void where prohibited by law." + 249Thanks, I needed a chance to sit down for a minute. + 250Boy do you look funny doing that. + -1 End of Rtext messages + 7 + 1 3 + 2 9 + 3 8 9 + 4 10 + 5 11 + 6 0 + 7 14 15 + 8 13 + 9 94 -1 + 10 96 + 11 19 -1 + 12 17 27 + 13 101 -1 + 14 103 + 15 0 + 16 106 + 17 0 -1 + 18 0 + 19 3 + 20 3 + 21 0 + 22 0 + 23 109 -1 + 24 25 -1 + 25 23 67 + 26 111 -1 + 27 35 110 + 28 0 + 29 97 -1 + 30 0 -1 + 31 119 121 + 32 117 122 + 33 117 122 + 34 0 0 + 35 130 -1 + 36 0 -1 + 37 126 -1 + 38 140 -1 + 39 0 + 40 96 -1 + 41 143 -1 + 42 144 -1 + 43 145 -1 + 44 150 + 45 150 -1 + 46 169 + 47 145 -1 + 48 152 -1 + 49 146 -1 + 50 18 + 51 27 + 52 59 + 53 29 + 54 30 + 55 145 + 56 150 + 57 0 + 58 97 + 59 100 + 60 101 + 61 0 + 62 119 121 + 63 127 + 64 130 -1 + 65 92 + 66 95 + 67 143 -1 + 68 155 + 69 39 -1 + 70 164 + 96 150 + 97 159 -1 + 98 152 -1 + 99 152 -1 + -1 + 8 + 1 24 + 2 29 + 3 0 + 4 33 + 5 0 + 6 33 + 7 38 + 8 38 + 9 42 + 10 14 + 11 43 + 12 110 + 13 29 + 14 110 + 15 73 + 16 76 + 17 29 + 18 13 + 19 59 + 20 59 + 21 174 + 22 109 + 23 67 + 24 13 + 25 147 + 26 155 + 27 195 + 28 146 + 29 110 + 30 13 + 31 13 + 32 207 + 33 210 + 34 221 + 35 14 + 36 13 + 37 43 + -1 + 9 + 0 1 2 3 4 5 6 7 8 9 + 0 10 100 115 116 126 + 0 147 148 149 150 151 152 169 + 2 1 3 4 7 38 95 113 24 + 1 24 + 3 46 47 48 54 56 58 82 85 86 + 3 122 123 124 125 126 127 128 129 130 + 4 8 + 5 13 + 6 19 + 7 42 43 44 45 46 47 48 49 50 + 7 51 52 53 54 55 56 80 81 82 + 7 86 87 + 8 99 100 101 + 9 108 + 10 142 143 144 146 + 11 143 + -1 + 10 + 40You are a fool and shouldn't be wandering around dangerous caves. + 75You are obviously a Rank Amateur. Better luck next time. + 100Your score qualifies you as a Novice Class Adventurer. + 140You have reached the esteemed rank of "Amateur Adventurer". + 210You have achieved the rating: "Experienced Adventurer". + 270You may now consider yourself a "Seasoned Adventurer". + 335You have reached "Junior Master" status. + 388Your score puts you in Master Adventurer Class C. + 423Your score puts you in Master Adventurer Class B. + 447Your score puts you in Master Adventurer Class A. + 9999All of Adventuredom gives tribute to you, Adventurer Grandmaster! + -1 + 11 + 2 9999 10 0 0 + 3 9999 5 0 0 + 4 4 2 62 63 + 5 5 2 18 19 + 6 8 2 20 21 + 7 75 4 176 177 + 8 25 5 178 179 + 9 20 3 180 181 + 10 45 10 217 218 + 11 10 3 219 220 + -1 + 12 + 1A large cloud of green smoke appears in front of you. It clears away + 1to reveal a tall wizard, clothed in grey. He fixes you with a steely + 1glare and declares, "This adventure has lasted too long." With that + 1he makes a single pass over you with his hands, and everything around + 1you fades away into a grey nothingness. + 2Even wizards have to wait longer than that! + 3I'm terribly sorry, but Colossal Cave is closed. Our hours are: + 4Only wizards are permitted within the cave right now. + 5We do allow visitors to make short explorations during our off hours. + 5Would you like to do that? + 6Colossal Cave is open to regular adventurers at the following hours: + 7Very well. + 8Only a wizard may continue an adventure this soon. + 9I suggest you resume your adventure at a later time. + 10Do you wish to see the hours? + 11Do you wish to change the hours? + 12New magic word (null to leave unchanged): + 13New magic number (null to leave unchanged): + 14Do you wish to change the message of the day? + 15Okay. You can save this version now. + 16Are you a wizard? + 17Prove it! Say the *MAGIC* word! + 18That is not what I thought it was. Do you know what I thought it was? + 19Oh dear, you really *ARE* a wizard! Sorry to have bothered you . . . + 20Foo, you are nothing but a charlatan! + 21New hours available by defining "Prime Time". Give only the hour + 21(e.g. 14, not 14:00 or 2PM). enter a negative number after last pair. + 22New hours for Colossal Cave: + 23Limit lines to 70 chars. End with null line. + 24Line too long, retype: + 25Not enough room for another line. Ending message here. + 26Do you wish to (re)schedule the next holiday? + 27To begin how many days from today? + 28To last how many days (zero if no holiday)? + 29To be called what (up to 20 characters)? + 30Too small! Assuming minimum value (45 minutes). + 31Break out of this and save your core-image. + 32Be sure to save your core-image... + 33All pertinant data has been placed in a file called + 33"DSKB:ADVENT.DAT" + -1 + 0 diff --git a/src/games/adv4ma.3 b/src/games/adv4ma.3 new file mode 100644 index 00000000..48c72210 --- /dev/null +++ b/src/games/adv4ma.3 @@ -0,0 +1,2576 @@ +C ADVENTURES +C +C CURRENT LIMITS: +C 15000 WORDS OF MESSAGE TEXT (LINES, LINSIZ). +C 900 TRAVEL OPTIONS (TRAVEL, TRVSIZ). +C 400 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). +C 200 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). +C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). +C 50 "ACTION" VERBS (ACTSPK, VRBSIZ). +C 250 RANDOM MESSAGES (RTEXT, RTXSIZ). +C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). +C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). +C 35 MAGIC MESSAGES (MTEXT, MAGSIZ). +C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE +C OF THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD +C TYPE, SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS +C ARE: +C 1000 NON-SYNONYMOUS VOCABULARY WORDS +C 300 LOCATIONS +C 100 OBJECTS +C +C Modified for the Brown University system, April 1978 +C Dave Wallace '78 +C Dave Nebiker '79 +C Eric Albert '80 +C LES WU '82 (ALSO MADE CONVERSIONS FOR A NBS-10) +C Modified for the ITS system, July 1979 by EJS@MC +C + IMPLICIT INTEGER(A-Z) + LOGICAL DSEEN,BLKLIN,HINTED,YES,START + LOGICAL TOTING,HERE,AT,BITSET,DARK,WZDARK,LMWARN,CLOSNG,PANIC, + 1 CLOSED,GAVEUP,SCORNG,SCORE2,DEMO,YEA,PCT,FORCED,STAT4, + 2 WEARNG +C + COMMON /TXTCOM/ RTEXT,LINES + COMMON /BLKCOM/ BLKLIN + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + COMMON /MTXCOM/ MTEXT + COMMON /PTXCOM/ PTEXT + COMMON /ABBCOM/ ABB + COMMON /WIZCOM/ WKDAY,WKEND,HOLID, HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + COMMON /SAVCOM/ SEGOFF,ABBNUM,ATTACK,CLOCK1,CLOCK2,CLOSED,CLOSNG, + 1 DETAIL,DFLAG,DKILL,DLOC,DSEEN,DTOTAL,GAVEUP,HINT,HINTED, + 2 IWEST,KNFLOC,LIMIT,LMWARN,LOC,NUMDIE,PANIC,PROP,STICK, + 3 TALLY,TALLY2,TURNS,WZDARK,XXD,XXT,ACCT,HINTLC,HINTS, + 4 MAGIC1,MAGIC2,FILLER,TURNS3 +C + DIMENSION LINES(15000) + DIMENSION TRAVEL(900) + DIMENSION KTAB(400),ATAB(400) + DIMENSION LTEXT(200),STEXT(200),KEY(200),COND(200),ABB(200), + 1 ATLOC(200) + DIMENSION PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), + 1 PTEXT(100),PROP(100) + DIMENSION ACTSPK(50) + DIMENSION RTEXT(250) + DIMENSION CTEXT(12),CVAL(12) + DIMENSION HINTLC(20),HINTED(20),HINTS(20,4) + DIMENSION MTEXT(35) + DIMENSION TK(20),DSEEN(12),DLOC(12),ODLOC(12),HNAME(4),TK1(9) + DIMENSION FILLER(20) +C + DATA LINSIZ/15000/,TRVSIZ/900/,LOCSIZ/200/, + 1 VRBSIZ/50/,RTXSIZ/250/,CLSMAX/12/,HNTSIZ/20/,MAGSIZ/35/ + DATA TABSIZ/400/,SETUP/0/,BLKLIN/.TRUE./ +C STATEMENT FUNCTIONS +C +C +C WEARNG(OBJ) = TRUE IF THE OBJ IS BEING WORN +C TOTING(OBJ) = TRUE IF THE OBJ IS BEING CARRIED +C HERE(OBJ) = TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED OR WORN) +C AT(OBJ) = TRUE IF IN EITHER SIDE OF TWO-PLACED OBJECT +C LIQ(DUMMY) = OBJECT NUMBER OF LIQUID IN BOTTLE +C LIQLOC(LOC) = OBJECT NUMBER OF LIQUID (IF ANY) AT LOC +C BITSET(L,N) = TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT) +C FORCED(LOC) = TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2) +C DARK(DUMMY) = TRUE IF LOCATION "LOC" IS DARK +C PCT(N) = TRUE N% OF THE TIME ( N INTEGER FROM 0 TO 100 ) +C +C WZDARK says whether the location he's leaving was dark +C LMWARN says whether he's been warned about the lamp going dim +C CLOSNG says whether its closing time yet +C PANIC says whether he's found out he's trapped in the cave +C CLOSED says whether we're all the way closed +C GAVEUP says whether he exited via "QUIT" +C SCORNG indicates to the score routine whether we're doing a "SCORE" cmnd +C SCORE2 does the same as SCORING but used when pausing +C DEMO is true if this is a prime-time demonstration +C YEA is a random YES/NO reply +C +C + WEARNG(OBJ) = PLACE(OBJ) .EQ. -2 + TOTING(OBJ) = PLACE(OBJ) .EQ. -1 + HERE(OBJ) = PLACE(OBJ) .EQ. LOC .OR. TOTING(OBJ) .OR. WEARNG(OBJ) + AT(OBJ) = PLACE(OBJ) .EQ. LOC .OR. FIXED(OBJ) .EQ. LOC + LIQ2(PBOTL) = (1-PBOTL) * WATER + (PBOTL / 2) * (WATER + OIL) + LIQ(DUMMY) = LIQ2(MAX0(PROP(BOTTLE), -1 - PROP(BOTTLE))) + 1 + (DUMMY-DUMMY) + LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2 *2,8)-5)*MOD(COND(LOC)/4,2)+1) +C BITSET(L, N) = AND(COND(L), SHIFT(1,N)) .NE. 0 + BITSET(L,N)=(COND(L).AND.SHIFT(1,N)).NE.0 + FORCED(LOC) = COND(LOC) .EQ. 2 + DARK(DUMMY) = MOD(COND(LOC), 2) .EQ. 0 .AND. (PROP(LAMP) .EQ. 0 + 1 .OR. .NOT. HERE(LAMP)) + 2 .AND.(DUMMY.EQ.DUMMY) + PCT(N) = RAN(100) .LT. N +C Description of the database format +C +C +C The data file contains several sections. Each begins with a line containing +C a number identifying the section, and ends with a line containing "-1" +C +C Section 1 : Long form descriptions. Each line contains a location number, +C a tab, and a line of text. The set of (necessatily adjacent) lines +C whose numbers are X form the long description of location X. +C Section 2 : Short form descriptions. Same format as long form. Not all +C places have short descriptions . +C Section 3 : Travel table. Each line contains a location number (X), a second +C location number (Y), and a list of motion numbers (see section 4). +C Each motion represents a verb which will go to Y if currently at X. +C Y, in turn, is interpreted as follows. Let M = Y/1000, N = Y MOD 1000, +C If N <= 300 It is the location to go to. +C If 300 < N <= 500 N - 300 is used in a computed goto to +C a section of special code. +C If N > 500 Message N-500 from section 6 is typed +C and he stays wherever he is. +C Meanwhile, M specifies the conditions on the motion. +C If M = 0 It's unconditional. +C If 0 < M < 100 It is done with M% probability. +C If M = 100 Unconditional, bit forbidden to Dwarves. +C If 100 < M <= 200 He must be carrying object M - 100. +C If 200 < M <= 300 Must be carrying or in same room as M - 200. +C If 300 < M <= 400 Prop(M MOD 100) must NOT be 0. +C If 400 < M <= 500 Prop(M MOD 100) must NOT be 1. +C If 500 < M <= 600 Prop(M MOD 100) must NOT be 2, etc. +C SPECIAL KLUDGE FOR WEARING OBJECTS (6/28/78) +C IF 900 < M <= 1000 HE MUST BE WEARING OBJ M-900 +C If the condition (If any) is not met, then the next DIFFERENT +C "Destination" value is used (unless it fails to meet ITS conditions, +C in which case the next is found, etc.). Typically, the next dest will +C be for one of the same verbs, so that its only use is as the alternate +C destination for those verbs. For instance: +C 15 110022 29 31 34 35 23 43 +C 15 14 29 +C This says that, from loc 15, any of the verbs 29, 31, etc., will take +C him to 22 if he's carrying object 10, and otherwise will go to 14. +C 11 303008 49 +C 11 9 50 +C This says that, from 11, 49 takes him to 8 unless Prop(3) = 0, in which +C case he goes to 9. Verb 50 takes him to 9 regardless of Prop(3). +C Section 4 : Vocabulary. Each line contains a number (N), a tab, and a +C file-letter word. Call M = N / 1000. If M = 0, then the word is a +C motion verb for use in travelling (see section 3). Else, if M = 1, +C the word is an object. Else, if M = 2, the word is an action vert +C (such as "carry" or "attack"). Else, if M =3, the word is a special +C case verb (such as "dig") and N MOD 1000 is an index into section 6. +C Objects from 50 to (currently, anyway) 79 are considered treasures +C (for Pirate, closeout). +C +C Section 5: Object descriptions. Each line contains a number (N), a tab, +C and a message. If N is from 1 to 100, the message is the "INVENTORY" +C message for object N. Otherwise, N should be 000, 100, 200, etc., and +C the message should be the description of the preceding object when its +C prop value is N/100. The N/100 is used only to distinguish multiple +C messages from multi-line messages; the prop info actually requires all +C messages for an object to be present and consecutive. Properties which +C produce no message should be given the message ">$<". +C Section 6: Arbitrary messages. Same format as sections 1, 2, and 5, except +C the numbers bear no relation to anything (except for special verbs +C in section 4). +C Section 7: Object locations. Each line contains an object number and its +C initial location (zero (or omitted) if none). If the object is +C immovable, the location is followed by a "-1". If it has two locations +C (e.g. the grate) the first location is followed with the second, and +C the object is assumed to be immovable. +C Section 8: Action defaults. Each line contains an "action-verb" number and +C the index (in section 6) of the default message for the verb. +C Section 9: Liquid assets, etc. Each line contains a number (N) and up to 20 +C location numbers. Bit N (where 0 is the units bit) is set in cond(loc) +C for each loc given. The cond bits currentlly assigned are: +C 0 light +C 1 if bit 2 is on: on for oil, off for water +C 2 liquid asset, see bit 1 +C 3 Pirate doesn't go here unless following player +C Other bits are used to indicate areas of interest to "Hint" routines: +C 4 Trying to get into cave +C 5 Trying to catch bird +C 6 Trying to deal with snake +C 7 Lost in maze +C 8 Pondering dark room +C 9 At Witt's end +C 10 Trying to get through Throne Room Passage +C 11 Trying to get sword out of stone +C Cond(loc) is set to 2, overriding all other bits, if loc has forced +C motion. +C Section 10: Class messages. Each line contains a number (N), a tab, and a +C message describing a classification of player. The scoring section +C selects the appropriate message, where each message is considered to +C apply to players whose scores are higher than the previous N but not +C higher than this N. Note that these scores probably change with every +C modification (and particularly expansion) of the program. +C Section 11: Hints. Each line contains a hint numbr (corresponding to a +C cond bit, see Section 9), the number of turns he must be at the right +C loc(s) before triggering the hint, the points deducted for taking the +C hint, the message number (section 6) of the question, and the message +C hntmax is set to the max hint number (<= hntsiz). Numbers 1-3 are +C unusable since cond bits are otherwise assigned, so 2 is used to +C remember if he's read the clue in the repository, and 3 is used to +C remember whether he asked for instructions (gets more turns, but loses +C points). +C Section 12: Magic Messages. Identical to Section 6 except put in a separate +C SECTION FOR EASIER REFERENCE. MAGIC MESSAGES ARE USED BY THE STARTUP, +C MAINTENANCE MODE, AND RELATED ROUTINES. +C SECTION 0: END OF DATABASE. +C READ THE DATABASE IF WE HAVE NOT YET DONE SO +C + IF(SETUP.NE.0)GOTO 1100 + WRITE (5,1000) +1000 FORMAT(' INITIALISING...') + OPEN (UNIT=1,FILE='FT01.DAT',ACCESS='SEQIN') +C +C CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN ARRAY +C LINES; EACH LINE IS PRECEDED BY A WORD POINTING TO THE NEXT POINTER (I.E. +C THE WORD FOLLOWING THE END OF THE LINE). THE POINTER IS NEGATIVE IF THIS IS +C FIRST LINE OF A MESSAGE. THE TEXT-POINTER ARRAYS CONTAIN INDICES OF +C POINTER-WORDS IN LINES. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N. +C LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0. +C SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS. RTEXT CONTAINS +C SECTION 6'S STUFF. CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE. MTEXT IS FOR +C SECTION 12. WE ALSO CLEAR COND. SEE DESCRIPTION OF SECTION 9 FOR DETAILS. +C + DO 1001 I=1,300 + IF(I.LE.100)PTEXT(I)=0 + IF(I.LE.RTXSIZ)RTEXT(I)=0 + IF(I.LE.CLSMAX)CTEXT(I)=0 + IF(I.LE.MAGSIZ)MTEXT(I)=0 + IF(I.GT.LOCSIZ)GOTO 1001 + KEY(I) = 0 + STEXT(I)=0 + LTEXT(I)=0 + COND(I)=0 +1001 CONTINUE +C + ACCT = 015501888 + SETUP=1 + LINUSE=1 + TRVS=1 + CLSSES=1 +C +C START NEW DATA SECTION. SECT IS THE SECTION NUMBER. +C +1002 READ(1,1003)SECT + WRITE (5,9898) SECT +9898 FORMAT (' NOW READING SECTION',I5) + IF (SECT.EQ.0) CLOSE (UNIT=1,FILE='FT01.DAT') +1003 FORMAT(I7) + OLDLOC=-1 + ERA1=SECT+1 + GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004, + 1 1080,1004), ERA1 +C (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) +C (11) (12) + CALL BUG(9) +C +C SECTIONS 1, 2, 3, 5, 6, 10, 12. READ MESSAGES AND SET UP POINTERS +C +1004 ERA2=LINUSE+1 + ERA3=LINUSE+18 + READ(1,1005)LOC,(LINES(J),J=ERA2,ERA3) +1005 FORMAT(1I8,18A4) + IF(LOC.EQ.-1)GOTO 1002 + DO 1006 K=1,18 + KK=LINUSE+19-K + IF((LINES(KK).XOR.' ').NE.0)GOTO 1007 +1006 CONTINUE + IF(LOC.EQ.0)GOTO 1004 +C ABOVE KLUGE IS TO AVOID F40 BUG IF CRLF BROKEN ACROSS RECORD BOUNDARY + CALL BUG(1) +1007 LINES(LINUSE)=KK+1 +C HASH UP MESSAGES TO MAKE CORE HARDER TO READ. NOTE THAT ERA2 AND ERA3 +C MUST NOT HAVE CHANGED SINCE WE READ LINE IN (I.E. DON'T BRANCH INTO +C AREA BETWEEN 1004 AND HERE). + DO 1009 J=ERA2,ERA3 +1009 LINES(J)=LINES(J).XOR.'?L.0' + IF(LOC.EQ.OLDLOC)GOTO 1020 + LINES(LINUSE)=-LINES(LINUSE) + IF(SECT.EQ.12)GOTO 1013 + IF(SECT.EQ.10)GOTO 1012 + IF(SECT.EQ.6)GOTO 1011 + IF(SECT.EQ.5)GOTO 1010 + IF(SECT.EQ.1)GOTO 1008 +C + STEXT(LOC)=LINUSE + GOTO 1020 +C +1008 LTEXT(LOC)=LINUSE + GOTO 1020 +C +1010 IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE + GOTO 1020 +C +1011 IF(LOC.GT.RTXSIZ)CALL BUG(6) + RTEXT(LOC)=LINUSE + GOTO 1020 +C +1012 CTEXT(CLSSES)=LINUSE + CVAL(CLSSES)=LOC + CLSSES=CLSSES+1 + GOTO 1020 +C +1013 IF(LOC.GT.MAGSIZ)CALL BUG(6) + MTEXT(LOC)=LINUSE +C +1020 LINUSE=KK+1 + LINES(LINUSE)=-1 + OLDLOC=LOC + IF(LINUSE+18.GT.LINSIZ)CALL BUG(2) + GOTO 1004 +C +C THE STUFF FOR SECTION 3 IS ENCODED HERE. EACH "FROM-LOCATION" GETS A +C CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY. EACH ENTRY IN TRAVEL IS +C NEWLOC*1000 + KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF +C THIS IS THE LAST ENTRY FOR THIS LOCATION. KEY(N) IS THE INDEX IN TRAVEL +C OF THE FIRST OPTION AT LOCATION N. +C +1030 READ(1,1031)LOC,NEWLOC,TK1 +1031 FORMAT(11I7) + IF(LOC.EQ.0)GOTO 1030 +C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG + IF(LOC.EQ.-1)GOTO 1002 + IF(KEY(LOC).NE.0)GOTO 1033 + KEY(LOC)=TRVS + GOTO 1035 +1033 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) +1035 DO 1037 L=1,20 + IF(TK1(L).EQ.0)GOTO 1039 + TRAVEL(TRVS)=NEWLOC*1000+TK1(L) + TRVS=TRVS+1 + IF(TRVS.EQ.TRVSIZ)CALL BUG(3) +1037 CONTINUE +1039 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) + GOTO 1030 +C +C HERE WE READ IN THE VOCABULARY. KTAB(N) IS THE WORD NUMBER, ATAB(N) IS +C THE CORRESPONDING WORD. THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB +C AS AN END-MARKER. THE WORDS ARE GIVEN A MINIMAL HASH TO MAKE READING THE +C CORE-IMAGE HARDER. NOTE THAT '/7-08' HAD BETTER NOT BE IN THE LIST, SINCE +C IT COULD HASH TO -1. +C +1040 DO 1042 TABNDX=1,TABSIZ +C1043 READ(1,1041)KTAB(TABNDX),DEW1,DEW2 +1043 READ(1,1041)KTAB(TABNDX),ATAB(TABNDX) +C ATAB(TABNDX)=CODE(DEW1,DEW2) +C1041 FORMAT(I7,A4,A1) +1041 FORMAT (I7,A5) + IF(KTAB(TABNDX).EQ.0)GOTO 1043 +C ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG + IF(KTAB(TABNDX).EQ.-1)GOTO 1002 +1042 ATAB(TABNDX)=ATAB(TABNDX).XOR.'PHRO' + CALL BUG(4) +C +C READ IN THE INITIAL LOCATIONS FOR EACH OBJECT. ALSO THE IMMOVABILITY INFO. +C PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS. FIXD IS -1 FOR IMMOVABLE +C OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS. +C +1050 READ(1,1031)OBJ,J,K + IF(OBJ.EQ.-1)GOTO 1002 + PLAC(OBJ)=J + FIXD(OBJ)=K + GOTO 1050 +C +C READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK. +C +1060 READ(1,1031)VERB,J + IF(VERB.EQ.-1)GOTO 1002 + ACTSPK(VERB)=J + GOTO 1060 +C +C READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND. +C +1070 READ(1,1031)K,TK1 + IF(K.EQ.-1)GOTO 1002 + DO 1071 I=1,9 + LOC=TK1(I) + IF(LOC.EQ.0)GOTO 1070 + IF(BITSET(LOC,K)) CALL BUG(8) +1071 COND(LOC)=COND(LOC)+SHIFT(1,K) + GOTO 1070 +C +C READ DATA FOR HINTS. +C +1080 HNTMAX=0 +1081 READ(1,1031)K,TK1 + IF(K.EQ.-1)GOTO 1002 + IF(K.EQ.0)GOTO 1081 + IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7) + DO 1083 I=1,4 +1083 HINTS(K,I)=TK1(I) + HNTMAX=MAX0(HNTMAX,K) + GOTO 1081 +C +C FINISH CONSTRUCTING INTERNAL DATA FORMAT +C +C IF SETUP=2 WE DON'T NEED TO DO THIS. IT'S ONLY NECESSARY IF WE HAVEN'T DONE +C IT AT ALL OR IF THE PROGRAM HAS BEEN RUN SINCE THEN. +C +1100 IF(SETUP.EQ.2)GOTO 1 + IF(SETUP.EQ.-1)GOTO 8305 +C +C HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED. PROPS ARE +C SET TO ZERO. WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL +C ENTRIES. THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST +C OBJECT AT LOCATION N, AND LINK(OBJ) AS THE NEXT OBJECT AT THE SAME LOCATION +C AS OBJ. (OBJ>100 INDICATES THAT FIXED(OBJ-100)=LOC; LINK(OBJ) IS STILL THE +C CORRECT LINK TO USE.) ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED +C DESCRIPTION IS TYPEED. COUNTS MOD 5 UNLESS "LOOK" IS USED. +C + DO 1101 I=1,100 + PLACE(I)=0 + PROP(I)=0 + LINK(I)=0 +1101 LINK(I+100)=0 +C + DO 1102 I=1,LOCSIZ + ABB(I)=0 + IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102 + K=KEY(I) + IF(MOD(IABS(TRAVEL(K)),1000).EQ.1)COND(I)=2 +1102 ATLOC(I)=0 +C +C SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE. WE'LL USE THE DROP +C SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS. SINCE WE WANT THINGS +C IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS. IF THE OBJECT IS IN TWO +C LOCS, WE DROP IT TWICE. THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF +C "PLAC" AND "FIXD". ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST +C DESCRIBED LAST, WE'LL DROP THEM FIRST. +C + DO 1106 I=1,100 + K=101-I + IF(FIXD(K).LE.0)GOTO 1106 + CALL DROP(K+100,FIXD(K)) + CALL DROP(K,PLAC(K)) +1106 CONTINUE +C + DO 1107 I=1,100 + K=101-I + FIXED(K)=FIXD(K) +1107 IF(PLAC(K).NE.0.AND.FIXED(K).LE.0)CALL DROP(K,PLAC(K)) +C +C TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79), +C THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE +C DESCRIBED. TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW +C WHEN TO CLOSE THE CAVE. TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF +C LOST BIRD OR BRIDGE). +C + MAXTRS=79 + TALLY=0 + TALLY2=0 + DO 1200 I=50,MAXTRS + IF(PTEXT(I).NE.0)PROP(I)=-1 +1200 TALLY=TALLY-PROP(I) +C +C CLEAR THE HINT STUFF. HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT +C I. HINTED(I) IS TRUE IFF HINT I HAS BEEN USED. +C + DO 1300 I=1,HNTMAX + HINTED(I)=.FALSE. +1300 HINTLC(I)=0 +C +C DEFINE SOME HANDY MNEMONICS. THESE CORRESPOND TO OBJECT NUMBERS. +C +C KEYS=VOCAB(CODE('KEYS'),1) +C LAMP=VOCAB(CODE('LAMP'),1) +C GRATE=VOCAB(CODE('GRAT','E'),1) +C CAGE=VOCAB(CODE('CAGE'),1) +C ROD=VOCAB(CODE('ROD'),1) +C ROD2=ROD+1 +C STEPS=VOCAB(CODE('STEP','S'),1) +C BIRD=VOCAB(CODE('BIRD'),1) +C DOOR=VOCAB(CODE('DOOR'),1) +C PILLOW=VOCAB(CODE('PILL','O'),1) +C SNAKE=VOCAB(CODE('SNAK','E'),1) +C FISSUR=VOCAB(CODE('FISS','U'),1) +C TABLET=VOCAB(CODE('TABL','E'),1) +C CLAM=VOCAB(CODE('CLAM'),1) +C OYSTER=VOCAB(CODE('OYST','E'),1) +C MAGZIN=VOCAB(CODE('MAGA','Z'),1) +C DWARF=VOCAB(CODE('DWAR','F'),1) +C KNIFE=VOCAB(CODE('KNIF','E'),1) +C FOOD=VOCAB(CODE('FOOD'),1) +C BOTTLE=VOCAB(CODE('BOTT','L'),1) +C WATER=VOCAB(CODE('WATE','R'),1) +C OIL=VOCAB(CODE('OIL'),1) +C PLANT=VOCAB(CODE('PLAN','T'),1) +C PLANT2=PLANT+1 +C AXE=VOCAB(CODE('AXE'),1) +C MIRROR=VOCAB(CODE('MIRR','O'),1) +C DRAGON=VOCAB(CODE('DRAG','O'),1) +C CHASM=VOCAB(CODE('CHAS','M'),1) +C TROLL=VOCAB(CODE('TROL','L'),1) +C TROLL2=TROLL+1 +C BEAR=VOCAB(CODE('BEAR'),1) +C MESSAG=VOCAB(CODE('MESS','A'),1) +C VEND=VOCAB(CODE('VEND','I'),1) +C BATTER=VOCAB(CODE('BATT','E'),1) +C STONE=VOCAB(CODE('STON','E'),1) +C PLAQUE= VOCAB(CODE('PLAQ','U'),1) +C TPASS = VOCAB(CODE('TPAS','S'),1) +C BROOM = VOCAB(CODE('BROO','M'),1) +C MAP = VOCAB(CODE('MAP'),1) +C DAGGER= VOCAB(CODE('DAGG','E'),1) +C ELVNDR= VOCAB(CODE('ELVE','N'),1) +C TRAP = VOCAB(CODE('TRAP'),1) +C MAGICN= VOCAB(CODE('MAGI','C'),1) +C SIGN = VOCAB(CODE('SIGN'),1) +C BOOK = VOCAB(CODE('BOOK'),1) +C STAFF = VOCAB(CODE('STAF','F'),1) +CC +CC OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES. HERE ARE A FEW. +CC +C NUGGET=VOCAB(CODE('GOLD'),1) +C COINS=VOCAB(CODE('COIN','S'),1) +C CHEST=VOCAB(CODE('CHES','T'),1) +C EGGS=VOCAB(CODE('EGGS'),1) +C TRIDNT=VOCAB(CODE('TRID','E'),1) +C VASE=VOCAB(CODE('VASE'),1) +C EMRALD=VOCAB(CODE('EMER','A'),1) +C PYRAM=VOCAB(CODE('PYRA','M'),1) +C PEARL=VOCAB(CODE('PEAR','L'),1) +C RUG=VOCAB(CODE('RUG'),1) +C CHAIN=VOCAB(CODE('CHAI','N'),1) +C SPICES=VOCAB(CODE('SPIC','E'),1) +C CROWN=VOCAB(CODE('CROW','N'),1) +C RING=VOCAB(CODE('RING'),1) +C SWORD=VOCAB(CODE('SWOR','D'),1) +C MITHRL= VOCAB(CODE('MITH','R'),1) +C SCHOL = VOCAB(CODE('SCHO','L'),1) +CC +CC THESE ARE MOTION-VERB NUMBERS. +CC +C BACK=VOCAB(CODE('BACK'),0) +C LOOK=VOCAB(CODE('LOOK'),0) +C CAVE=VOCAB(CODE('CAVE'),0) +C NULL=VOCAB(CODE('NULL'),0) +C ENTRNC=VOCAB(CODE('ENTR','A'),0) +C DPRSSN=VOCAB(CODE('DEPR','E'),0) +CC +CC AND SOME ACTION VERBS. +CC +C SAY=VOCAB(CODE('SAY'),2) +C LOCK=VOCAB(CODE('LOCK'),2) +C THROW=VOCAB(CODE('THRO','W'),2) +C FIND=VOCAB(CODE('FIND'),2) +C INVENT=VOCAB(CODE('INVE','N'),2) +C WEAR = VOCAB(CODE('WEAR'),2) +C REMOVE= VOCAB(CODE('REMO','V'),2) +C +C THESE ARE THE ORIGINAL DEC-10 DEFINITIONS TO BE USED WHEN +C CODE IS NOT AVAILABLE + KEYS=VOCAB('KEYS',1) + LAMP=VOCAB('LAMP',1) + GRATE=VOCAB('GRATE',1) + CAGE=VOCAB('CAGE',1) + ROD=VOCAB('ROD',1) + ROD2=ROD+1 + STEPS=VOCAB('STEPS',1) + BIRD=VOCAB('BIRD',1) + DOOR=VOCAB('DOOR',1) + PILLOW=VOCAB('PILLOW',1) + SNAKE=VOCAB('SNAKE',1) + FISSUR=VOCAB('FISSU',1) + TABLET=VOCAB('TABLE',1) + CLAM=VOCAB('CLAM',1) + OYSTER=VOCAB('OYSTE',1) + MAGZIN=VOCAB('MAGAZ',1) + DWARF=VOCAB('DWARF',1) + KNIFE=VOCAB('KNIFE',1) + FOOD=VOCAB('FOOD',1) + BOTTLE=VOCAB('BOTTL',1) + WATER=VOCAB('WATER',1) + OIL=VOCAB('OIL',1) + PLANT=VOCAB('PLANT',1) + PLANT2=PLANT+1 + AXE=VOCAB('AXE',1) + MIRROR=VOCAB('MIRRO',1) + DRAGON=VOCAB('DRAGO',1) + CHASM=VOCAB('CHASM',1) + TROLL=VOCAB('TROLL',1) + TROLL2=TROLL+1 + BEAR=VOCAB('BEAR',1) + MESSAG=VOCAB('MESSA',1) + VEND=VOCAB('VENDI',1) + BATTER=VOCAB('BATTE',1) + STONE=VOCAB('STONE',1) + PLAQUE=VOCAB('PLAQU',1) + TPASS=VOCAB('TPASS',1) + BROOM=VOCAB('BROOM',1) + MAP=VOCAB('MAP',1) + DAGGER=VOCAB('DAGGER',1) + ELVNDR=VOCAB('ELVEN',1) + TRAP=VOCAB('TRAP',1) + MAGICN=VOCAB('MAGIC',1) + SIGN=VOCAB('SIGN',1) + BOOK=VOCAB('BOOK',1) + STAFF=VOCAB('STAFF',1) + NUGGET=VOCAB('GOLD',1) + COINS=VOCAB('COINS',1) + CHEST=VOCAB('CHEST',1) + EGGS=VOCAB('EGGS',1) + TRIDNT=VOCAB('TRIDE',1) + VASE=VOCAB('VASE',1) + EMRALD=VOCAB('EMERA',1) + PYRAM=VOCAB('PYRAM',1) + PEARL=VOCAB('PEARL',1) + RUG=VOCAB('RUG',1) + CHAIN=VOCAB('CHAIN',1) + SPICES=VOCAB('SPICE',1) + CROWN=VOCAB('CROWN',1) + RING=VOCAB('RING',1) + SWORD=VOCAB('SWORD',1) + MITHRL=VOCAB('MITHR',1) + SCHOL=VOCAB('SCHOL',1) + BACK=VOCAB('BACK',0) + LOOK=VOCAB('LOOK',0) + CAVE=VOCAB('CAVE',0) + NULL=VOCAB('NULL',0) + ENTRNC=VOCAB('ENTRA',0) + DPRSSN=VOCAB('DEPRE',0) + SAY=VOCAB('SAY',2) + LOCK=VOCAB('LOCK',2) + THROW=VOCAB('THROW',2) + FIND=VOCAB('FIND',2) + INVENT=VOCAB('INVEN',2) + WEAR=VOCAB('WEAR',2) + REMOVE=VOCAB('REMOV',2) +C INITIALIZE THE DWARVES. DLOC IS LOC OF DWARVES, HARD-WIRED IN. ODLOC IS +C PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE. DALTLC IS ALTERNATE INITIAL LOC +C FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER. (NO 2 +C OF THE 5 INITIAL LOCS ARE ADJACENT.) DSEEN IS TRUE IF DWARF HAS SEEN HIM. +C DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS: +C 0 NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS) +C 1 REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF +C 2 MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET +C 3 A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES) +C 3+ DWARVES ARE MAD (INCREASES THEIR ACCURACY) +C SIXTH DWARF IS SPECIAL (THE PIRATE). HE ALWAYS STARTS AT HIS CHEST'S +C EVENTUAL LOCATION INSIDE THE MAZE. THIS LOC IS SAVED IN CHLOC FOR REF. +C THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2. +C + CHLOC=114 + CHLOC2=140 + DO 1700 I=1,12 +1700 DSEEN(I)=.FALSE. + DFLAG=0 + DLOC(1)=19 + DLOC(2)=27 + DLOC(3)=33 + DLOC(4)=44 + DLOC(5)=64 + DO 1701 I = 6, 10 + DLOC(I)=0 +1701 CONTINUE + DLOC(11)=CHLOC + DLOC(12)=0 + DALTLC=18 +C +C OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS: +C TURNS TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO) +C TURNS2 USED TO VERIFY TURNS ARE BEING COUNTED +C TURNS3 ANOTHER BACKUP TURNS COUNTER +C LIMIT LIFETIME OF LAMP (NOT SET HERE) +C IWEST HOW MANY TIMES HE'S SAID "WEST" INSTEAD OF W +C KNFLOC 0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT +C DETAIL HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL" +C ABBNUM HOW OFTEN WE SHOULD TYPE NON-ABBREVIATED DESCRIPTIONS +C MAXDIE NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5) +C NUMDIE NUMBER OF TIMES KILLED SO FAR +C HOLDNG NUMBER OF OBJECTS BEING CARRIED +C DKILL NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG) +C FOOBAR CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO". +C BONUS USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING +C CLOCK1 NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING +C CLOCK2 NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH +C MAGIC1 CURRENT PROGRESS IN ENCOUNTERING MAGICIAN +C MAGIC2 HOW ANNOYED THE MAGICIAN IS +C LOGICALS WERE EXPLAINED EARLIER +C + TURNS=0 + LMWARN=.FALSE. + IWEST=0 + KNFLOC=0 + DETAIL=0 + ABBNUM=5 + DO 1800 I=1,5 +1800 IF(RTEXT(2*I+79).NE.0)MAXDIE=I + NUMDIE=0 + HOLDNG=0 + DKILL=0 + FOOBAR=0 + BONUS=0 + CLOCK1=30 + CLOCK2=50 + SAVED=0 + TURNS2 = 0 + TURNS3 = 0 + CLOSNG=.FALSE. + PANIC=.FALSE. + CLOSED=.FALSE. + GAVEUP=.FALSE. + SCORNG=.FALSE. + SCORE2 = .FALSE. + MAGIC1 = 0 + MAGIC2 = 0 +C +C IF SETUP=1, REPORT ON AMOUNT OF ARRAYS ACTUALLY USED, TO PERMIT REDUCTIONS. +C + IF(SETUP.NE.1)GOTO 1 + SETUP=2 +C + DO 1998 K=1,LOCSIZ + KK=LOCSIZ+1-K + IF(LTEXT(KK).NE.0)GOTO 1997 +1998 CONTINUE +C + OBJ=0 +1997 DO 1996 K=1,100 +1996 IF(PTEXT(K).NE.0)OBJ=OBJ+1 +C + DO 1995 K=1,TABNDX +1995 IF(KTAB(K)/1000.EQ.2)VERB=KTAB(K)-2000 +C + DO 1994 K=1,RTXSIZ + J=RTXSIZ+1-K + IF(RTEXT(J).NE.0)GOTO 1993 +1994 CONTINUE +C +1993 DO 1992 K=1,MAGSIZ + I=MAGSIZ+1-K + IF(MTEXT(I).NE.0)GOTO 1991 +1992 CONTINUE +C +1991 K=100 + WRITE (5,1999)LINUSE,LINSIZ,TRVS,TRVSIZ,TABNDX,TABSIZ,KK + 1 ,LOCSIZ,OBJ,K,VERB,VRBSIZ,J,RTXSIZ,CLSSES,CLSMAX + 2 ,HNTMAX,HNTSIZ,I,MAGSIZ +1999 FORMAT (' TABLE SPACE USED:'/ + 1 ' ',I6,' OF ',I6,' WORDS OF MESSAGES'/ + 2 ' ',I6,' OF ',I6,' TRAVEL OPTIONS'/ + 3 ' ',I6,' OF ',I6,' VOCABULARY WORDS'/ + 4 ' ',I6,' OF ',I6,' LOCATIONS'/ + 5 ' ',I6,' OF ',I6,' OBJECTS'/ + 6 ' ',I6,' OF ',I6,' ACTION VERBS'/ + 7 ' ',I6,' OF ',I6,' RTEXT MESSAGES'/ + 8 ' ',I6,' OF ',I6,' CLASS MESSAGES'/ + 9 ' ',I6,' OF ',I6,' HINTS'/ + 1 ' ',I6,' OF ',I6,' MAGIC MESSAGES'/ + 2 ) +C +C FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME... +C + CALL POOF + CALL MAINT +C START-UP, DWARF STUFF +C +C Modified to ask about restarted games 10/24/78 +1 DEMO=START(0) + CALL MOTD(.FALSE.) + I=RAN(1) + NEWLOC=1 + SETUP=3 + LIMIT=430 + IF (DEMO) GOTO 5 + IF (.NOT.YES(223,0,0)) GOTO 5 + CALL LOAD('REST') + TURNS2 = TURNS + TURNS3 = TURNS/10 + IF (MOD(TURNS,10).GE.2) TURNS3 = TURNS3 + 1 + DEMO=START(0) + K = NULL + IF (SEGOFF.EQ.0) GOTO 4 +C IF (.NOT.STAT4(SEGOFF,ACCT)) GOTO 4 + SAVED = 1 + LIMIT = MIN0(35,LIMIT) +4 CONTINUE + GOTO 8 +5 CONTINUE + HINTED(3)=YES(65,1,0) + IF(HINTED(3))LIMIT=1200 +C +C CAN'T LEAVE CAVE ONCE IT'S CLOSING (EXCEPT BY MAIN OFFICE). +C +2 IF(NEWLOC.GE.9.OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71 + CALL RSPEAK(130) + NEWLOC=LOC + IF(.NOT.PANIC)CLOCK2=15 + PANIC=.TRUE. +C +C SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO. IF SO, +C THE DWARF'S BLOCKING HIS WAY. IF COMING FROM PLACE FORBIDDEN TO PIRATE +C (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED). +C +71 IF(NEWLOC.EQ.LOC.OR.FORCED(LOC).OR.BITSET(LOC,3))GOTO 74 + DO 73 I=1,10 + IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73 + NEWLOC=LOC + CALL RSPEAK(2) + GOTO 74 +73 CONTINUE +74 LOC=NEWLOC +C +C DWARF STUFF. SEE EARILIER COMMENTS FOR DESCRIPTION OF VARIABLES. REMEMBER +C ELEVENTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RULES. +C +C FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL. ACTIVATE +C THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LOC 15). +C IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE TROLL +C BRIDGE), BYPASS DWARF STUFF. THAT WAY PIRATE CAN'T STEAL RETURN TOLL, AND +C DWARVES CAN'T MEET THE BEAR. ALSO MEANS DWARVES WON'T FOLLOW HIM INTO DEAD +C END IN MAZE, BUT C'EST LA VIE. THEY'LL WAIT FOR HIM OUTSIDE THE DEAD END. +C + IF(LOC.EQ.0.OR.FORCED(LOC).OR.BITSET(NEWLOC,3))GOTO 2000 + IF(DFLAG.NE.0)GOTO 6000 + IF(LOC.GE.15)DFLAG=1 + GOTO 2000 +C +C WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE 5 DWARVES. IF +C ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE. +C +6000 IF(DFLAG.NE.1)GOTO 6010 + IF(LOC.LT.15.OR.PCT(95))GOTO 2000 + DFLAG=2 + DO 6001 I=1,2 + J=1+RAN(5) +C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. +6001 IF(PCT(50).AND.SAVED.EQ.-1)DLOC(J)=0 + DO 6002 I=1,10 + IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC +6002 ODLOC(I)=DLOC(I) + CALL RSPEAK(3) + CALL DROP(AXE,LOC) + GOTO 2000 +C +C THINGS ARE IN FULL SWING. MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S SEEN US +C HE STICKS WITH US. DWARVES NEVER GO TO LOCS <15. IF WANDERING AT RANDOM, +C THEY DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE. IF THEY DON'T HAVE TO +C MOVE, THEY ATTACK. AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANYTHING, +C UNLESS HE'S CHEATING, IN WHICH CASE THEY ARE RESSURECTED. +C +6010 DTOTAL=0 + ATTACK=0 + STICK=0 + DO 6030 I=1,12 + IF(DLOC(I).EQ.0)GOTO 6029 + J=1 + KK=DLOC(I) + KK=KEY(KK) + IF(KK.EQ.0)GOTO 6016 +6012 NEWLOC=MOD(IABS(TRAVEL(KK))/1000,1000) + IF(NEWLOC.GT.300.OR.NEWLOC.LT.15.OR.NEWLOC.EQ.ODLOC(I) + 1 .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20 + 2 .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC) + 3 .OR.(I.EQ.6.AND.BITSET(NEWLOC,3)) + 4 .OR.IABS(TRAVEL(KK))/1000000.EQ.100)GOTO 6014 + TK(J)=NEWLOC + J=J+1 +6014 KK=KK+1 + IF(TRAVEL(KK-1).GE.0)GOTO 6012 +6016 TK(J)=ODLOC(I) + IF(J.GE.2)J=J-1 + J=1+RAN(J) + ODLOC(I)=DLOC(I) + DLOC(I)=TK(J) + DSEEN(I)=(DSEEN(I).AND.LOC.GE.15) + 1 .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC) + IF(.NOT.DSEEN(I))GOTO 6030 + DLOC(I)=LOC + IF(I.NE.11)GOTO 6027 +C +C THE PIRATE'S SPOTTED HIM. HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST. +C K COUNTS IF A TREASURE IS HERE. IF NOT, AND TALLY=TALLY2 PLUS ONE FOR +C AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED. +C + IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030 + K=0 + DO 6020 J=50,MAXTRS +C PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!). + IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) + 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020 + IF(TOTING(J))GOTO 6022 +6020 IF(HERE(J))K=1 + IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0 + 1 .AND.HERE(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025 + IF(ODLOC(6).NE.DLOC(6).AND.PCT(20))CALL RSPEAK(127) + GOTO 6030 +C +6022 CALL RSPEAK(128) +C DON'T STEAL CHEST BACK FROM TROLL! + IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC) + CALL MOVE(MESSAG,CHLOC2) + DO 6023 J=50,MAXTRS + IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) + 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6023 + IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC) + IF(TOTING(J))CALL DROP(J,CHLOC) +6023 CONTINUE +6024 DLOC(11)=CHLOC + ODLOC(11)=CHLOC + DSEEN(11)=.FALSE. + GOTO 6030 +C +6025 CALL RSPEAK(186) + CALL MOVE(CHEST,CHLOC) + CALL MOVE(MESSAG,CHLOC2) + GOTO 6024 +C +C THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM! +C +6027 DTOTAL=DTOTAL+1 + IF(ODLOC(I).NE.DLOC(I))GOTO 6030 + ATTACK=ATTACK+1 + IF(KNFLOC.GE.0)KNFLOC=LOC + IF(RAN(1000).LT.95*(DFLAG-2))STICK=STICK+1 + GOTO 6030 +6029 CONTINUE +C IF HE'S CHEATING AND THE DWARF IS DEAD, BRING IT BACK TO LIFE +C IT COMES BACK AT Y2 UNLESS HE'S THERE IN WHICH CASE IT CONES +C BACK IN THE HALL OF MISTS. + IF (.NOT.(SAVED.NE.-1.AND.DLOC(I).EQ.0)) GOTO 6030 + DLO C(I) = 33 + IF (LOC.EQ.33) DLOC(I) = 15 +6030 CONTINUE +C IF TURNS2 IS NOT EQUAL TO TURNS THEN SOMEONE IS CHEATING + IF (LOC.LT.15.OR. (TURNS.EQ.TURNS2.AND.TURNS .GE.0)) GOTO 6035 + DTOTAL = DTOTAL + 1 + ATTACK = ATTACK + 1 + STICK = STICK + 1 +6035 CONTINUE +C +C NOW WE KNOW WHAT'S HAPPENING. LET'S TELL THE POOR SUCKER ABOUT IT. +C + IF(DTOTAL.EQ.0)GOTO 2000 + IF(DTOTAL.EQ.1)GOTO 75 + TYPE 67,DTOTAL +67 FORMAT(/' THERE ARE ',I1,' THREATENING LITTLE DWARVES IN THE' + 1 ,' ROOM WITH YOU.') + GOTO 77 +75 CALL RSPEAK(4) +77 IF(ATTACK.EQ.0)GOTO 2000 + IF(DFLAG.EQ.2)DFLAG=3 +C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. DWARVES GET *VERY* MAD! + IF(SAVED.NE.-1)DFLAG=20 + IF(ATTACK.EQ.1)GOTO 79 + TYPE 78,ATTACK +78 FORMAT(/' ',I1,' OF THEM THROW KNIVES AT YOU!') + K=6 +82 IF(STICK.GT.1)GOTO 83 + CALL RSPEAK(K+STICK) + IF(STICK.EQ.0)GOTO 2000 + GOTO 84 +83 TYPE 68,STICK +68 FORMAT(/' ',I1,' OF THEM GET YOU!') +84 OLDLC2=LOC + GOTO 99 +C +79 CALL RSPEAK(5) + K=52 + GOTO 82 +C +C DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND. +C +C TYPE TEXT FOR CURRENT LOC. +C +2000 IF(LOC.EQ.0)GOTO 99 + KK=STEXT(LOC) + IF(MOD(ABB(LOC),ABBNUM).EQ.0.OR.KK.EQ.0)KK=LTEXT(LOC) + IF(FORCED(LOC).OR..NOT.DARK(0))GOTO 2001 + IF(WZDARK.AND.PCT(35))GOTO 90 + KK=RTEXT(16) +2001 IF(TOTING(BEAR))CALL RSPEAK(141) + CALL SPEAK(KK) + K=1 + IF(FORCED(LOC))GOTO 8 + IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8) +C +C TYPE OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION. IF NOT CLOSING AND +C PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE. RUG IS SPECIAL +C CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED. +C SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR). THESE HACKS +C ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE. +C + IF(DARK(0))GOTO 2012 + ABB(LOC)=ABB(LOC)+1 + I=ATLOC(LOC) +2004 IF(I.EQ.0)GOTO 2012 + OBJ=I + IF(OBJ.GT.100)OBJ=OBJ-100 + IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008 + IF(PROP(OBJ).GE.0)GOTO 2006 + IF(CLOSED)GOTO 2008 + PROP(OBJ)=0 + IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN.OR.OBJ.EQ.CROWN.OR.OBJ.EQ.RING + 1 .OR.OBJ.EQ.SWORD.OR.OBJ.EQ.SCHOL) PROP(OBJ)=1 + TALLY=TALLY-1 +C IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. + IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) +2006 KK=PROP(OBJ) + IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1 + CALL PSPEAK(OBJ,KK) +2008 I=LINK(I) + GOTO 2004 +C +2009 K=54 +2010 SPK=K +2011 CALL RSPEAK(SPK) +C +2012 VERB=0 + OBJ=0 +C +C CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS. IF BEEN HERE LONG ENOUGH, +C BRANCH TO HELP SECTION (ON LATER PAGE). HINTS ALL COME BACK HERE EVENTUALLY +C TO FINISH THE LOOP. IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE NOTES). +C +2600 DO 2602 HINT=4,HNTMAX + IF(HINTED(HINT))GOTO 2602 + IF(.NOT.BITSET(LOC,HINT))HINTLC(HINT)=-1 + HINTLC(HINT)=HINTLC(HINT)+1 + IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000 +2602 CONTINUE +C +C KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE. ALSO, +C IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < O AND SET +C THE PROP TO -1-PROP. THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE +C BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES. DON'T +C TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2). +C + IF(.NOT.CLOSED)GOTO 2605 + IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER)) + 1 CALL PSPEAK(OYSTER,1) + DO 2604 I=1,100 +2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I) +2605 WZDARK=DARK(0) + IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0 + I=RAN(1) + CALL GETIN(WD1,WD1X,WD2,WD2X) +C +C EVERY INPUT, CHECK "FOOBAR" FLAG. IF ZERO, NOTHING'S GOING ON. IF POS, +C MAKE NEG. IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO. +C +2608 FOOBAR=MIN0(0,-FOOBAR) +C +C IF THIS IS TURN 0 THEN WE MIGHT WANT TO RECOGNIZE SPECIAL COMMANDS. +C IF COMMAND IS "MAGIC MODE" THEN HE WANTS TO UPDATE SOMETHING AND WE +C PROCEED TO MAINT. IF THE COMMAND IS "RESTORE" AND THIS IS NOT A +C DEMONSTRATION GAME (NOT PRIME TIME) THEN THE LOAD ROUTINE IS CALLED AND WE +C CONTINUE WITH A NULL COMMAND. (IF THIS IS PRIME TIME WE PASS THE COMMAND +C ON TO HAVE IT IGNORED). IF FINISHED IS TRUE THEN THE GAME HAS ALREADY +C BEEN FINISHED SO SET THE DWARVES ON HIM. +C IF THIS IS NOT A RESTORE OR MAINTENANCE THEN +C STAT1 IS CALLED TO KEEP STATISTICS ON A NEW GAME. +C + IF (TURNS.NE.0) GOTO 2609 +C IF (WD1.EQ.CODE('MAGI','C').AND.WD2.EQ.CODE('MODE')) CALL MAINT +C IF (DEMO.OR.WD1.NE.CODE('REST','O').OR.WD1X.NE.CODE('RE')) + IF (WD1.EQ.'MAGIC'.AND.WD2.EQ.'MODE') CALL MAINT + IF (DEMO.OR.WD1.NE.'RESTO'.OR.WD1X.NE.'RE') + 1 GOTO 2615 + CALL LOAD ('REST') + TURNS2 = TURNS + TURNS3 = TURNS/10 + IF (MOD(TURNS,10).GE.2) TURNS3 = TURNS3 + 1 + DEMO = START(0) +C WD1 = CODE('NULL') + WD1 = 'NULL' + IF (SEGOFF.EQ.0) GOTO 2609 +C IF (.NOT.STAT4(SEGOFF,ACCT)) GOTO 2621 + SAVED = 1 + LIMIT = MIN0(35,LIMIT) +2621 CONTINUE + GOTO 2609 +C ELSE +C2615 SEGOFF = STAT1(DEMO,ACCT) +C ENDIF +C ENDIF +2615 CONTINUE +2609 CONTINUE + TURNS=TURNS+1 + IF(DEMO.AND.TURNS.GE.SHORT)GOTO 13000 + IF (MOD(TURNS,10).EQ.2) TURNS3 = TURNS3 + 1 + IF (TURNS3.NE.(TURNS+8)/10) SAVED = 1 + IF(TURNS.EQ.3)CALL DATIME(XXD,XXT) + IF(TURNS.NE.45)GOTO 2617 +C SEE IF TIMER HAS BEEN ZAPPED; IF SO, HE'S CHEATING + CALL DATIME(YYD,YYT) + IF(XXD.EQ.YYD.AND.XXT.EQ.YYT)SAVED=0 +2617 IF(VERB.EQ.SAY.AND.WD2.NE.0)VERB=0 + TURNS2 = TURNS2 + 1 + IF (TURNS.LT.0.OR.TURNS.NE.TURNS2) SAVED = 1 + IF(VERB.EQ.SAY)GOTO 4090 + IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33)CLOCK1=CLOCK1-1 + IF(CLOCK1.EQ.0)GOTO 10000 + IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1 + IF(CLOCK2.EQ.0)GOTO 11000 + IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1 + IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0 + 1 .AND.HERE(LAMP))GOTO 12000 + IF(LIMIT.EQ.0)GOTO 12400 + IF(LIMIT.LT.0.AND.LOC.LE.8)GOTO 12600 + IF(LIMIT.LE.30)GOTO 12200 +C +C SEE IF MAGICIAN IS IS ROOM WITH HIM. IF HE IS AND WE HAVE BEEN HERE +C FOR A SUFFICIENTLY LONG TIME, ZAP HIM. IF THE MAGICIAN IS NOT HERE, +C RESET HOW LONG WE HAVE BEEN VISITING HIM. (MAGIC1) +19999 IF (.NOT.HERE(MAGICN)) MAGIC1 = 0 + IF (MAGIC1.EQ.0) GOTO 2611 + IF (MAGIC1.EQ.1.AND..NOT.WEARNG(CROWN).AND..NOT.WEARNG(RING)) + 1 GOTO 2611 + MAGIC2 = MAGIC2 + 1 + IF (WEARNG(CROWN).OR.WEARNG(RING).OR.MAGIC2.GE.4) GOTO 7050 + IF (CLOSNG) GOTO 7050 +C BUMP HIM BACK TO BUILDING + CALL RSPEAK(234) + LOC = 3 + OLDLOC = 3 + GOTO 2611 +C HE'S REALLY BOTHERING MAGICIAN +C SO KILL HIM +7050 CALL RSPEAK(235) + DO 7055 I = 1, 99 + J = 101 - I + IF (.NOT.TOTING(J).AND..NOT.WEARNG(J)) GOTO 7055 + IF (PLAC(J).EQ.0) GOTO 7053 + CALL DROP (J,LOC) + GOTO 7055 +7053 CALL DROP (J,PLAC(J)) +7055 CONTINUE + GOTO 99 +C +2611 K=43 + IF(LIQLOC(LOC).EQ.WATER)K=70 +C IF(WD1.EQ.CODE('ENTE','R').AND.(WD2.EQ. +C 1 CODE('STRE','A').OR.WD2.EQ.CODE('WATE','R'))) +C 2 GOTO 2010 +C IF(WD1.EQ.CODE('ENTE','R').AND.WD2.NE.0)GOTO 2800 +C IF((WD1.NE.CODE('WATE','R').AND.WD1.NE.CODE('OIL')) +C 1 .OR.(WD2.NE.CODE('PLAN','T').AND.WD2.NE.CODE('DOOR'))) +C 2 GOTO 2610 +C IF(AT(VOCAB(WD2,1)))WD2=CODE('POUR') +C2610 IF(WD1.NE.CODE('WEST'))GOTO 2630 + IF(WD1.EQ.'ENTER'.AND.(WD2.EQ.'STREA'.OR.WD2.EQ.'WATER')) + 1 GOTO 2010 + IF(WD1.EQ.'ENTER'.AND.WD2.NE.0)GOTO 2800 + IF((WD1.NE.'WATER'.AND.WD1.NE.'OIL') .OR. + 1 (WD2.NE.'PLANT'.AND.WD2.NE.'DOOR')) GOTO 2610 + IF(AT(VOCAB(WD2,1))) WD2='POUR' +2610 IF(WD1.NE.'WEST') GOTO 2630 + IWEST=IWEST+1 + IF(IWEST.EQ.10)CALL RSPEAK(17) +2630 I=VOCAB(WD1,-1) + IF(I.EQ.-1)GOTO 3000 + K=MOD(I,1000) + KQ=I/1000+1 + GOTO (8,5000,4000,2010),KQ + CALL BUG(22) +C +C GET SECOND WORD FOR ANALYSIS. +C +2800 WD1=WD2 + WD1X=WD2X + WD2=0 + GOTO 2610 +C +C GEE, I DON'T UNDERSTAND. +C +3000 SPK=60 + IF(PCT(20))SPK=61 + IF(PCT(20))SPK=13 + CALL RSPEAK(SPK) + GOTO 2600 +C ANALYSE A VERB. REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND WORD +C UNLESS VERB IS 'SAY', WHICH SNARFS ARBITRARY SECOND WORD. +C +4000 VERB=K + SPK=ACTSPK(VERB) + IF(WD2.NE.0.AND.VERB.NE.SAY)GOTO 2800 + IF(VERB.EQ.SAY)OBJ=WD2 + IF(OBJ.NE.0)GOTO 4090 +C +C ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET). +C +4080 GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000, + 1 2011,9120,9130,8140,9150,8000,8000,8180,8000,8200, + 2 8000,9220,9230,8240,8250,8260,8270,8000,8000,8300, + 3 8310,8320,8330,8340,9070,9080,8370),VERB +C TAKE DROP SAY OPEN NOTH LOCK LGHT EXTI WAVE CALM +C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN +C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP +C HOUR WEAR PULL REMV ON OFF SWEP + CALL BUG(23) +C +C ANALYSE A TRANSITIVE VERB. +C +4090 GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011, + 1 2011,9120,9130,9140,9150,9160,9170,2011,9190,9190, + 2 9210,9220,9230,2011,2011,2011,9270,9280,9290,2011, + 3 2011,9320,9330,9340,9350,9360,2011),VERB +C TAKE DROP SAY OPEN NOTH LOCK LGHT EXTI WAVE CALM +C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN +C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP +C HOUR WEAR PULL REMV ON OFF SWEP + CALL BUG(24) +C +C ANALYSE AN OBJECT WORD. SEE IF THE THING IS HERE, WHETHER WE'VE GOT A VERB +C YET, AND SO ON. OBJECT MUST BE HERE UNLESS VERB IS 'FIND' OR 'INVENT(ORY)' +C (AND NO NEW VERB YET TO BE ANALYSED). WATER AND OIL ARE ALSO FUNNY, SINCE +C THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE INSIDE +C THE BOTTLE OR AS A FEATURE OF THE LOCATION. +C +5000 OBJ=K + IF(FIXED(K).NE.LOC.AND..NOT.HERE(K))GOTO 5100 +5010 IF(WD2.NE.0)GOTO 2800 + IF(VERB.NE.0)GOTO 4090 + CALL A5TOA1(WD1,WD1X,'?',TK,K) + TYPE 5015,(TK(I),I=1,K) +5015 FORMAT(/' WHAT DO YOU WANT TO DO WITH THE ',20A1) + GOTO 2600 +C +5100 IF(K.NE.GRATE)GOTO 5110 + IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7)K=DPRSSN + IF(LOC.GT.9.AND.LOC.LT.15)K=ENTRNC + IF(K.NE.GRATE)GOTO 8 +5110 IF(K.NE.DWARF)GOTO 5120 + DO 5112 I=1,10 + IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 5010 +5112 CONTINUE +5120 IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC))GOTO 5010 + IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0)GOTO 5130 + OBJ=PLANT2 + GOTO 5010 +5130 IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC)GOTO 5140 + KNFLOC=-1 + SPK=116 + GOTO 2011 +5140 IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2))GOTO 5190 + OBJ=ROD2 + GOTO 5010 +5190 IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.0)GOTO 5010 + CALL A5TOA1(WD1,WD1X,'HERE.',TK,K) + TYPE 5199,(TK(I),I=1,K) +5199 FORMAT(/' I SEE NO ',20A1) + GOTO 2012 +C FIGURE OUT THE NEW LOCATION +C +C GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT +C THE NEW LOCATION IN "NEWLOC". THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE +C HE WANTS TO RETREAT. THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE +C DIES. (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED +C HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.) +C +8 KK=KEY(LOC) + NEWLOC=LOC + IF(KK.EQ.0)CALL BUG(26) + IF(K.EQ.NULL)GOTO 2 + IF(K.EQ.BACK)GOTO 20 + IF (K.EQ.LOOK)GOTO 30 + IF(K.EQ.CAVE)GOTO 40 + OLDLC2=OLDLOC + OLDLOC=LOC +C +9 LL=IABS(TRAVEL(KK)) + IF(MOD(LL,1000).EQ.1.OR.MOD(LL,1000).EQ.K)GOTO 10 + IF(TRAVEL(KK).LT.0)GOTO 50 + KK=KK+1 + GOTO 9 +C +10 LL=LL/1000 +11 NEWLOC=LL/1000 + K=MOD(NEWLOC,100) + IF(NEWLOC.LE.300)GOTO 13 + IF(PROP(K).NE.NEWLOC/100-3.AND.NEWLOC/100.NE.9)GOTO 16 + IF (WEARNG(K) .AND. NEWLOC/100.EQ.9) GOTO 16 +12 IF(TRAVEL(KK).LT.0)CALL BUG(25) + KK=KK+1 + NEWLOC=IABS(TRAVEL(KK))/1000 + IF(NEWLOC.EQ.LL)GOTO 12 + LL=NEWLOC + GOTO 11 +C +13 IF(NEWLOC.LE.100)GOTO 14 + IF(TOTING(K).OR.(NEWLOC.GT.200.AND.AT(K)))GOTO 16 + GOTO 12 +C +14 IF(NEWLOC.NE.0.AND..NOT.PCT(NEWLOC))GOTO 12 +16 NEWLOC=MOD(LL,1000) + IF(NEWLOC.LE.300)GOTO 2 + IF(NEWLOC.LE.500)GOTO 30000 + CALL RSPEAK(NEWLOC-500) + NEWLOC=LOC + GOTO 2 +C +C SPECIAL MOTIONS COME HERE. LABELLING CONVENTION: STATEMENT NUMBERS NNNXX +C (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500) +C +30000 NEWLOC=NEWLOC-300 + GOTO (30100,30200,30300,30400,30500),NEWLOC + CALL BUG(20) +C +C TRAVEL 301. PLOVER-ALCOVE PASSAGE. CAN CARRY ONLY EMERALD. NOTE: TRAVEL +C TABLE MUST INCLUDE "USELESS" ENTRIES GOING THROUGH PASSAGE, WHICH CAN NEVER +C BE USED FOR ACTUAL MOTION, BUT CAN BE SPOTTED BY "GO BACK". +C +30100 NEWLOC=99+100-LOC + IF(HOLDNG.EQ.0.OR.(HOLDNG.EQ.1.AND.TOTING(EMRALD)))GOTO 2 + NEWLOC=LOC + CALL RSPEAK(117) + GOTO 2 +C +C TRAVEL 302. PLOVER TRANSPORT. DROP THE EMERALD (ONLY USE SPECIAL TRAVEL IF +C TOTING IT), SO HE'S FORCED TO USE THE PLOVER-PASSAGE TO GET IT OUT. HAVING +C DROPPED IT, GO BACK AND PRETEND HE WASN'T CARRYING IT AFTER ALL. +C +30200 CALL DROP(EMRALD,LOC) + GOTO 12 +C +C TRAVEL 303. TROLL BRIDGE. MUST BE DONE ONLY AS SPECIAL MOTION SO THAT +C DWARVES WON'T WANDER ACROSS AND ENCOUNTER THE BEAR. (THEY WON'T FOLLOW THE +C PLAYER THERE BECAUSE THAT REGION IS FORBIDDEN TO THE PIRATE.) IF +C PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM. +C (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.) SPECIAL STUFF FOR BEAR. +C +30300 IF(PROP(TROLL).NE.1)GOTO 30310 + CALL PSPEAK(TROLL,1) + PROP(TROLL)=0 + CALL MOVE(TROLL2,0) + CALL MOVE(TROLL2+100,0) + CALL MOVE(TROLL,PLAC(TROLL)) + CALL MOVE(TROLL+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + NEWLOC=LOC + GOTO 2 +C +30310 NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC + IF(PROP(TROLL).EQ.0)PROP(TROLL)=1 + IF(.NOT.TOTING(BEAR))GOTO 2 + CALL RSPEAK(162) + PROP(CHASM)=1 + PROP(TROLL)=2 + CALL DROP(BEAR,NEWLOC) + FIXED(BEAR)=-1 + PROP(BEAR)=3 + IF(PROP(SPICES).LT.0)TALLY2=TALLY2+1 + OLDLC2=NEWLOC + GOTO 99 +C +C TRAVEL 304 +C SPECIAL MOTION TO WIZARDS CHAMBER FROM STAIRS +C IF STAFF HAS BEEN DROPPED AFTER BEING PICKED UP, MAKE +C SURE THAT MAGICIAN IS PUT BACK. +C +30400 CALL MOVE(MAGICN,PLAC(MAGICN)) + CALL MOVE (STAFF, PLAC(STAFF)) + PROP(MAGICN) = 0 + PROP(STAFF) = 0 + FIXED(STAFF) = -1 + PROP(ELVNDR) = 0 + GOTO 12 +C +C TRAVEL 305 +C DWARVE'S MINE FROM STAIRS. IF THE NEW DWARVES HAVE BEEN RELEASED +C AND ARE NOT ALL DEAD, HE GETS THROUGH. OTHERWISE HE DIES. +C +30500 IF (CLOSNG) GOTO 30530 + DO 30510 I = 6, 10 + IF (DLOC(I) .NE. 0) GOTO 30530 +30510 CONTINUE + CALL RSPEAK(240) + DO 30520 I = 6, 10 + DLOC(I) = 16 +30520 CONTINUE + GOTO 99 +30530 NEWLOC = PLACE(SIGN) + GOTO 2 +C +C END OF SPECIALS. +C +C HANDLE "GO BACK". LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO OLDLC2 +C IF OLDLOC HAS FORCED-MOTION. K2 SAVES ENTRY -> FORCED LOC -> PREVIOUS LOC. +C +20 K=OLDLOC + IF(FORCED(K))K=OLDLC2 + OLDLC2=OLDLOC + OLDLOC=LOC + K2=0 + IF(K.NE.LOC)GOTO 21 + CALL RSPEAK(91) + GOTO 2 +C +21 LL=MOD((IABS(TRAVEL(KK))/1000),1000) + IF(LL.EQ.K)GOTO 25 + IF(LL.GT.300)GOTO 22 + J=KEY(LL) + IF(FORCED(LL).AND.MOD((IABS(TRAVEL(J))/1000),1000).EQ.K)K2=KK +22 IF(TRAVEL(KK).LT.0)GOTO 23 + KK=KK+1 + GOTO 21 +C +23 KK=K2 + IF(KK.NE.0)GOTO 25 + CALL RSPEAK(140) + GOTO 2 +C +25 K=MOD(IABS(TRAVEL(KK)),1000) + KK=KEY(LOC) + GOTO 9 +C +C LOOK. CAN'T GIVE MORE DETAIL. PRETEND IT WASN'T DARK (THOUGH IT MAY "NOW" +C BE DARK) SO HE WON'T FALL INTO A PIT WHILE STARING INTO THE GLOOM. +C +30 IF(DETAIL.LT.3)CALL RSPEAK(15) + DETAIL=DETAIL+1 + WZDARK=.FALSE. + ABB(LOC)=0 + GOTO 2 +C +C CAVE. DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND. +C +40 IF(LOC.LT.8)CALL RSPEAK(57) + IF(LOC.GE.8)CALL RSPEAK(58) + GOTO 2 +C +C NON-APPLICABLE MOTION. VARIOUS MESSAGES DEPENDING ON WORD GIVEN. +C +50 SPK=12 + IF(K.GE.43.AND.K.LE.50)SPK=9 + IF(K.EQ.29.OR.K.EQ.30)SPK=9 + IF(K.EQ.7.OR.K.EQ.36.OR.K.EQ.37)SPK=10 + IF(K.EQ.11.OR.K.EQ.19)SPK=11 + IF(VERB.EQ.FIND.OR.VERB.EQ.INVENT)SPK=59 + IF(K.EQ.62.OR.K.EQ.65)SPK=42 + IF(K.EQ.17)SPK=80 + CALL RSPEAK(SPK) + GOTO 2 +C "YOU'RE DEAD, JIM." +C +C IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED. WE'LL +C ALLOW THIS MAXDIE TIMES. MAXDIE IS AUTOMATICALLY SET BASED ON THE NUMBER OF +C SNIDE MESSAGES AVAILABLE. EACH DEATH RESULTS IN A MESSAGE (81, 83, ETC.) +C WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82, 84, +C ETC. THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMARK AS +C WE EXIT. WHEN REINCARNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT OLDLC2 +C (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF PROPS. +C THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE CAGE. +C (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD AND CAGE +C ARE DONE BY KEYWORDS.) THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO LEAVE +C IT IN THE CAVE). IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONLY IF HE +C WAS CARRYING IT, OF COURSE). HE HIMSELF IS LEFT INSIDE THE BUILDING (AND +C HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE LAMP!). +C OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT". +C +C THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS. +C +90 CALL RSPEAK(23) + OLDLC2=LOC +C +C OKAY, HE'S DEAD. LET'S GET ON WITH IT. +C +99 IF(CLOSNG)GOTO 95 + YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54) + NUMDIE=NUMDIE+1 + IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 20000 + PLACE(WATER)=0 + PLACE(OIL)=0 + IF(TOTING(LAMP))PROP(LAMP)=0 + DO 98 J=1,100 + I=101-J + IF(.NOT.TOTING(I))GOTO 98 + K=OLDLC2 + IF(I.EQ.LAMP)K=1 + CALL DROP(I,K) +98 CONTINUE + IF (PLACE(STAFF).NE.PLAC(STAFF)) CALL MOVE (STAFF, PLAC(STAFF)) + LOC=3 + OLDLOC=LOC + GOTO 2000 +C +C HE DIED DURING CLOSING TIME. NO RESURRECTION. TALLY UP A DEATH AND EXIT +C +95 CALL RSPEAK(131) + NUMDIE=NUMDIE+1 + GOTO 20000 +C ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS +C +C STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 9000 FOR +C TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER. MANY INTRANSITIVE VERBS USE THE +C TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW. +C IF THE NUMBER OF STATEMENT NUMBERS REQUIRED FOR ANY ONE VERB EXCEEDS THE +C TEN PROVIDED, EXTRA STATEMENT NUMBERS ARE TAKEN FROM THE GROUP 9XXYY, +C WHERE XX IS THE NUMBER OF THE PARTICULAR VERB IN QUESTION. +C +C RANDOM INTRANSITIVE VERBS COME HERE. CLEAR OBJ JUST IN CASE (SEE "ATTACK"). +C +8000 CALL A5TOA1(WD1,WD1X,'WHAT?',TK,K) + TYPE 8002,(TK(I),I=1,K) +8002 FORMAT(/' ',20A1) + OBJ=0 + GOTO 2600 +C +C CARRY, NO OBJECT GIVEN YET. OK IF ONLY ONE OBJECT PRESENT. +C +8010 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0)GOTO 8000 + DO 8012 I=1,5 + IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 8000 +8012 CONTINUE + OBJ=ATLOC(LOC) +C +C CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T +C TAKE ONE WITHOUT THE OTHER. LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON +C STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. +C +9010 IF(TOTING(OBJ))GOTO 2011 + SPK=25 + IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115 + IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169 + IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170 + IF(FIXED(OBJ).NE.0)GOTO 2011 + IF(OBJ.NE.WATER.AND.OBJ.NE.OIL)GOTO 9017 + IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ)GOTO 9018 + OBJ=BOTTLE + IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1)GOTO 9220 + IF(PROP(BOTTLE).NE.1)SPK=105 + IF(.NOT.TOTING(BOTTLE))SPK=104 + GOTO 2011 +9018 OBJ=BOTTLE +9017 IF(HOLDNG.LT.7)GOTO 9016 + CALL RSPEAK(92) + GOTO 2012 +9016 IF(OBJ.NE.BIRD)GOTO 9014 + IF(PROP(BIRD).NE.0)GOTO 9014 + IF(.NOT.TOTING(ROD))GOTO 9013 + CALL RSPEAK(26) + GOTO 2012 +9013 IF(TOTING(CAGE))GOTO 9015 + CALL RSPEAK(27) + GOTO 2012 +9015 PROP(BIRD)=1 +9014 IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0) + 1 CALL CARRY(BIRD+CAGE-OBJ,LOC) + CALL CARRY(OBJ,LOC) + K=LIQ(0) + IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=-1 + IF ((OBJ.EQ.CROWN.OR.OBJ.EQ.RING).AND.PROP(OBJ).EQ.1) + 1 PROP(OBJ) = 0 + GOTO 2009 +C +C DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. SPECIAL CASES FOR +C BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE. +C DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES. +C +9020 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 + IF(.NOT.TOTING(OBJ) .AND. .NOT.WEARNG(OBJ))GOTO 2011 + IF (OBJ.EQ.RING) PROP(TPASS) = 0 + IF (OBJ.EQ.STAFF) GOTO 9029 + IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 9024 + CALL RSPEAK(30) + IF(CLOSED)GOTO 19000 + CALL DSTROY(SNAKE) +C SET PROP FOR USE BY TRAVEL OPTIONS + PROP(SNAKE)=1 +9021 K=LIQ(0) + IF(K.EQ.OBJ)OBJ=BOTTLE + IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=0 + IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0)CALL DROP(BIRD,LOC) + IF(OBJ.EQ.BIRD)PROP(BIRD)=0 + CALL DROP(OBJ,LOC) + GOTO 2012 +C +9024 IF(OBJ.NE.COINS.OR..NOT.HERE(VEND))GOTO 9025 + CALL DSTROY(COINS) + CALL DROP(BATTER,LOC) + CALL PSPEAK(BATTER,0) + GOTO 2012 +C +9025 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0)GOTO 9026 + CALL RSPEAK(154) + CALL DSTROY(BIRD) + PROP(BIRD)=0 + IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 + GOTO 2012 +C +9026 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 9027 + CALL RSPEAK(163) + CALL MOVE(TROLL,0) + CALL MOVE (TROLL+100,0) + CALL MOVE(TROLL2,PLAC(TROLL)) + CALL MOVE(TROLL2+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + PROP(TROLL)=2 + GOTO 9021 +C +9027 IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW))GOTO 9028 + CALL RSPEAK(54) + GOTO 9021 +C +9028 PROP(VASE)=2 + IF(AT(PILLOW))PROP(VASE)=0 + CALL PSPEAK(VASE,PROP(VASE)+1) + IF(PROP(VASE).NE.0)FIXED(VASE)=-1 + GOTO 9021 +C +9029 CALL DROP (STAFF, 0) + CALL RSPEAK (227) + PROP (STAFF) = 1 + GOTO 2012 +C +C SAY. ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).) MAGIC WORDS OVERRIDE. +C +9030 CALL A5TOA1(WD2,WD2X,'".',TK,K) + IF(WD2.EQ.0)CALL A5TOA1(WD1,WD1X,'".',TK,K) + IF(WD2.NE.0)WD1=WD2 + I=VOCAB(WD1,-1) + IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025.OR.I.EQ.80) + 1 GOTO 9035 + TYPE 9032,(TK(I),I=1,K) +9032 FORMAT(/' OKAY, "',20A1) + GOTO 2012 +C +9035 WD2=0 + OBJ=0 + GOTO 2630 +C +C LOCK, UNLOCK, NO OBJECT GIVEN. ASSUME VARIOUS THINGS IF PRESENT. +C +8040 SPK=28 + IF(HERE(CLAM))OBJ=CLAM + IF(HERE(OYSTER))OBJ=OYSTER + IF(AT(DOOR))OBJ=DOOR + IF(AT(GRATE))OBJ=GRATE + IF(OBJ.NE.0.AND.HERE(CHAIN))GOTO 8000 + IF(HERE(CHAIN))OBJ=CHAIN + IF(OBJ.EQ.0)GOTO 2011 +C +C LOCK, UNLOCK OBJECT. SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR CHAIN. +C +9040 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 9046 + IF(OBJ.EQ.DOOR)SPK=111 + IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1)SPK=54 + IF(OBJ.EQ.CAGE)SPK=32 + IF(OBJ.EQ.KEYS)SPK=55 + IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN)SPK=31 + IF(SPK.NE.31.OR..NOT.HERE(KEYS))GOTO 2011 + IF(OBJ.EQ.CHAIN)GOTO 9048 + IF(.NOT.CLOSNG)GOTO 9043 + K=130 + IF(.NOT.PANIC)CLOCK2=15 + PANIC=.TRUE. + GOTO 2010 +C +9043 K=34+PROP(GRATE) + PROP(GRATE)=1 + IF(VERB.EQ.LOCK)PROP(GRATE)=0 + K=K+2*PROP(GRATE) + GOTO 2010 +C +C CLAM/OYSTER +9046 K=0 + IF(OBJ.EQ.OYSTER)K=1 + SPK=124+K + IF(TOTING(OBJ))SPK=120+K + IF(.NOT.TOTING(TRIDNT))SPK=122+K + IF(VERB.EQ.LOCK)SPK=61 + IF(SPK.NE.124)GOTO 2011 + CALL DSTROY(CLAM) + CALL DROP(OYSTER,LOC) + CALL DROP(PEARL,105) + GOTO 2011 +C +C CHAIN. +9048 IF(VERB.EQ.LOCK)GOTO 9049 + SPK=171 + IF(PROP(BEAR).EQ.0)SPK=41 + IF(PROP(CHAIN).EQ.0)SPK=37 + IF(SPK.NE.171)GOTO 2011 + PROP(CHAIN)=0 + FIXED(CHAIN)=0 + IF(PROP(BEAR).NE.3)PROP(BEAR)=2 + FIXED(BEAR)=2-PROP(BEAR) + GOTO 2011 +C +9049 SPK=172 + IF(PROP(CHAIN).NE.0)SPK=34 + IF(LOC.NE.PLAC(CHAIN))SPK=173 + IF(SPK.NE.172)GOTO 2011 + PROP(CHAIN)=2 + IF(TOTING(CHAIN))CALL DROP(CHAIN,LOC) + FIXED(CHAIN)=-1 + GOTO 2011 +C +C LIGHT LAMP +C +9070 IF(.NOT.HERE(LAMP))GOTO 2011 + SPK=184 + IF(LIMIT.LT.0)GOTO 2011 + PROP(LAMP)=1 + CALL RSPEAK(39) + IF(WZDARK)GOTO 2000 + GOTO 2012 +C +C EXTINGUISH LAMP +C +9080 IF(.NOT.HERE(LAMP))GOTO 2011 + PROP(LAMP)=0 + CALL RSPEAK(40) + IF(DARK(0))CALL RSPEAK(16) + GOTO 2012 +C +C WAVE. NO EFFECT UNLESS WAVING ROD AT FISSURE. +C OR WAVING STAFF +C +9090 IF (OBJ.EQ.STAFF.AND.TOTING(STAFF)) GOTO 9091 + IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2))) + 1 SPK=29 + IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ) + 1 .OR.TOTING(STAFF).OR.CLOSNG)GOTO 2011 + PROP(FISSUR)=1-PROP(FISSUR) + CALL PSPEAK(FISSUR,2-PROP(FISSUR)) + GOTO 2012 +9091 CALL RSPEAK (226) + IF (TOTING(LAMP)) PROP(LAMP) = 0 + IF (TOTING(LAMP)) CALL DROP(LAMP, 1) + PROP(STAFF) = 1 + CALL DROP(STAFF,0) + DO 9093 I = 1, 100 + J = 101 - I + IF (.NOT.TOTING(J) .AND. .NOT.WEARNG(J)) GOTO 9094 + IF (PLAC(J).NE.0) GOTO 9095 + CALL DROP (J,LOC) + GOTO 9094 +9095 CALL DROP (J,PLAC(J)) +9094 CONTINUE +9093 CONTINUE + GOTO 99 +C +C ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE +C OBJECTS FALL INTO TWO CATAGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS +C (BIRD, CLAM). AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS. +C IF ATTACKING DWARVES WITH A SWORD, SMALL CHANCE TO KILL DWARF, GREATER +C CHANCE TO BREAK SWORD. +C +9120 DO 9121 I=1,10 + IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 9122 +9121 CONTINUE + I=0 +9122 IF(OBJ.NE.0)GOTO 9124 + IF(I.NE.0)OBJ=DWARF + IF(HERE(SNAKE))OBJ=OBJ*100+SNAKE + IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*100+DRAGON + IF(AT(TROLL))OBJ=OBJ*100+TROLL + IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*100+BEAR + IF(OBJ.GT.100)GOTO 8000 + IF(OBJ.NE.0)GOTO 9124 +C CAN'T ATTACK BIRD BY THROWING AXE. + IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD +C CLAM AND OYSTER BOTH TREATED AS OYSTER FOR INTRANSITIVE CASE; NO HARM DONE. + IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=100*OBJ+CLAM + IF(OBJ.GT.100)GOTO 8000 +9124 IF(OBJ.NE.BIRD)GOTO 9125 + SPK=137 + IF(CLOSED)GOTO 2011 + CALL DSTROY(BIRD) + PROP(BIRD)=0 + IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 + SPK=45 +9125 IF(OBJ.EQ.0)SPK=44 + IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150 + IF(OBJ.EQ.SNAKE)SPK=46 + IF(OBJ.EQ.DWARF)SPK=49 + IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 19000 + IF(OBJ.EQ.DRAGON)SPK=167 + IF(OBJ.EQ.TROLL)SPK=157 + IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2 +C +C KILL DWARVES IF WE'RE LUCKY, OR POSSIBLY LOSE DAGGER. +C MAYBE BREAK SWORD IF USING THAT AGAINST DWARVES. + IF (OBJ.NE.DWARF.OR..NOT.TOTING(SWORD)) GOTO 9128 + SPK = 48 + IF (RAN(5).NE.0.OR.SAVED.NE.-1) GOTO 9126 + DSEEN(I) = .FALSE. + DLOC(I) = 0 + DKILL = DKILL + 1 + SPK = 47 + IF (DKILL.EQ.1) SPK = 149 +9126 CONTINUE + CALL RSPEAK (SPK) + IF (RAN(4).NE.0) GOTO 9127 + CALL DROP (SWORD,LOC) + FIXED(SWORD) = -1 + PROP(SWORD) = 2 + CALL RSPEAK(224) +9127 CONTINUE + K = NULL + GOTO 8 +9128 IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011 +C FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, HE WINS! SET PROP TO +C DEAD! MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), +C AND MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. + CALL RSPEAK(49) + VERB=0 + OBJ=0 + CALL GETIN(WD1,WD1X,WD2,WD2X) +C IF(WD1.NE.CODE('Y').AND.WD1.NE.CODE('YES'))GOTO 2608 + IF(WD1.NE.'Y'.AND.WD1.NE.'YES') GOTO 2608 + CALL PSPEAK(DRAGON,1) + PROP(DRAGON)=2 + PROP(RUG)=0 + K=(PLAC(DRAGON)+FIXD(DRAGON))/2 + CALL MOVE(DRAGON+100,-1) + CALL MOVE(RUG+100,0) + CALL MOVE(DRAGON,K) + CALL MOVE(RUG,K) + DO 9129 OBJ=1,100 + IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) + 1 CALL MOVE(OBJ,K) +9129 CONTINUE + LOC=K + K=NULL + GOTO 8 +C +C POUR. IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE. +C SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR. +C +9130 IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0)OBJ=LIQ(0) + IF(OBJ.EQ.0)GOTO 8000 + IF(.NOT.TOTING(OBJ))GOTO 2011 + SPK=78 + IF(OBJ.NE.OIL.AND.OBJ.NE.WATER)GOTO 2011 + PROP(BOTTLE)=1 + PLACE(OBJ)=0 + SPK=77 + IF(.NOT.(AT(PLANT).OR.AT(DOOR)))GOTO 2011 +C + IF(AT(DOOR))GOTO 9132 + SPK=112 + IF(OBJ.NE.WATER)GOTO 2011 + CALL PSPEAK(PLANT,PROP(PLANT)+1) + PROP(PLANT)=MOD(PROP(PLANT)+2,6) + PROP(PLANT2)=PROP(PLANT)/2 + K=NULL + GOTO 8 +C +9132 PROP(DOOR)=0 + IF(OBJ.EQ.OIL)PROP(DOOR)=1 + SPK=113+PROP(DOOR) + GOTO 2011 +C +C EAT. INTRANSITIVE: ASSUME FOOD IF PRESENT, ELSE ASK WHAT. TRANSITIVE: FOOD +C OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS. +8140 IF(.NOT.HERE(FOOD))GOTO 8000 +8142 CALL DSTROY(FOOD) + SPK=72 + GOTO 2011 +C +9140 IF(OBJ.EQ.FOOD)GOTO 8142 + IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER + 1 .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL + 2 .OR.OBJ.EQ.BEAR)SPK=71 + GOTO 2011 +C +C DRINK. IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE. IF WATER IS IN +C THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM. +C +9150 IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER + 1 .OR..NOT.HERE(BOTTLE)))GOTO 8000 + IF(OBJ.NE.0.AND.OBJ.NE.WATER)SPK=110 + IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE))GOTO 2011 + PROP(BOTTLE)=1 + PLACE(WATER)=0 + SPK=74 + GOTO 2011 +C +C RUB. YIELDS VARIOUS SNIDE REMARKS. +C +9160 IF (OBJ.EQ.LAMP) SPK = 75 + IF (OBJ.EQ.TROLL) SPK = 202 + IF (OBJ.EQ.DWARF) SPK = 203 + IF (OBJ.EQ.DWARF) DFLAG = DFLAG + 1 + IF (OBJ.NE.STAFF) GOTO 9162 + IF (TOTING(LAMP)) PROP(LAMP) = 0 + IF (TOTING(LAMP)) CALL DROP(LAMP, 1) + CALL RSPEAK (225) + PROP(STAFF) = 1 + CALL DROP (STAFF,0) + DO 9164 I = 1, 100 + J = 101 - I + IF (.NOT.TOTING(J).AND..NOT.WEARNG(J)) GOTO 9165 + IF (PLAC(J).NE.0) GOTO 9166 + CALL DROP (J, LOC) + GOTO 9165 +9166 CALL DROP (J, PLAC(J)) +9165 CONTINUE +9164 CONTINUE + GOTO 99 +9162 IF (OBJ.NE.DRAGON) GOTO 2011 +C RUBBING THE DRAGON BURNS HIS PINKIES, SO DROP EVERYTHING + SPK = 204 + DO 9161 J= 1,100 + I = 101 - J + IF (.NOT.TOTING(I)) GOTO 9161 + CALL DROP(I,LOC) +9161 CONTINUE + GOTO 2011 +C +C THROW. SAME AS DISCARD UNLESS AXE, FOOD, STAFF, DAGGER, OR BEAR. +C THEN SAME AS ATTACK FOR AXE AND DAGGER EXCEPT IGNORE BIRD, +C AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO!) +C AXE AND DAGGER ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. +C TREASURES SPECIAL FOR TROLL. +C BEAR IS JUST A WEE BIT TOO BIG TO THROW +C +9170 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 + IF(.NOT.TOTING(OBJ))GOTO 2011 + IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL))GOTO 9178 + IF(OBJ.EQ.FOOD.AND.HERE(BEAR))GOTO 9177 + IF (OBJ.EQ.BEAR) GOTO 9179 + IF ((OBJ.EQ.AXE.OR.OBJ.EQ.DAGGER).AND.HERE(MAGICN)) GOTO 9174 + IF(OBJ.NE.AXE.AND.OBJ.NE.DAGGER.AND.DFLAG.GE.2)GOTO 9020 + DO 9171 I=1,10 + IF(DLOC(I).EQ.LOC)GOTO 9172 +9171 CONTINUE + SPK=152 + IF (OBJ.EQ.DAGGER) SPK = 228 + IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)GOTO 9175 + SPK=158 + IF (OBJ.EQ.DAGGER) SPK = 229 + IF(AT(TROLL))GOTO 9175 + IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)GOTO 9176 + OBJ=0 + GOTO 9120 +C +9172 SPK=48 + CALL DROP (OBJ,LOC) + IF (RAN(4).NE.0.OR.OBJ.NE.DAGGER) GOTO 9173 + SPK = 231 + CALL DSTROY(DAGGER) + GOTO 9175 +9173 CONTINUE +C IF SAVED NOT = -1, HE BYPASSED THE "START" CALL. + IF(RAN(3).EQ.0.OR.SAVED.NE.-1)GOTO 9175 + DSEEN(I)=.FALSE. + DLOC(I)=0 + SPK=47 + DKILL=DKILL+1 + IF(DKILL.EQ.1)SPK=149 +9175 CALL RSPEAK(SPK) + K=NULL + GOTO 8 +C +C THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! +9176 SPK=164 + IF (OBJ.EQ.DAGGER) SPK = 230 + CALL DROP(OBJ,LOC) + FIXED(OBJ)=-1 + PROP(OBJ)=1 + CALL JUGGLE(BEAR) + GOTO 2011 +C +C BUT THROWING FOOD IS ANOTHER STORY. +9177 OBJ=BEAR + GOTO 9210 +C +9178 SPK=159 +C SNARF A TREASURE FOR THE TROLL. + CALL DROP(OBJ,0) + CALL MOVE(TROLL,0) + CALL MOVE(TROLL+100,0) + CALL DROP(TROLL2,PLAC(TROLL)) + CALL DROP(TROLL2+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + GOTO 2011 +C TRYING TO THROW THE BEAR IS HE?? WE'LL JUST SEE ABOUT THAT! +9179 IF (OBJ.EQ.BEAR) SPK = 205 + GOTO 2011 +C TRYING TO ELIMINATE MAGIC USER. +9174 SPK = 232 + CALL DROP (OBJ, LOC) + IF (OBJ.EQ.AXE) GOTO 91701 + SPK = 233 + MAGIC1 = 0 + PROP(MAGICN) = 1 + CALL MOVE (MAGICN,0) + FIXED(STAFF) = 0 + PROP(ELVNDR) = 1 +91701 MAGIC2 = 5 + MAGIC2 + MAGIC1 = 2 + MAGIC1 + CALL RSPEAK(SPK) + K = NULL + GOTO 8 +C +C QUIT. INTRANSITIVE ONLY. VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS. +C +8180 GAVEUP=YES(22,54,54) +8185 IF(GAVEUP)GOTO 20000 + GOTO 2012 +C +C FIND. MIGHT BE CARRYING IT, OR IT MIGHT BE HERE. ELSE GIVE CAVEAT. +C +9190 IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE)) + 1 .OR.K.EQ.LIQLOC(LOC))SPK=94 + DO 9192 I=1,5 +9192 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94 + IF(CLOSED)SPK=138 + IF(TOTING(OBJ))SPK=24 + GOTO 2011 +C +C INVENTORY. IF OBJECT, TREAT SAME AS FIND. ELSE REPORT ON CURRENT BURDEN. +C +8200 SPK=98 + DO 8201 I=1,100 + IF(I.EQ.BEAR.OR..NOT.TOTING(I))GOTO 8201 + IF(SPK.EQ.98)CALL RSPEAK(99) + BLKLIN=.FALSE. + CALL PSPEAK(I,-1) + BLKLIN=.TRUE. + SPK=0 +8201 CONTINUE + SPK = 206 + DO 8203 I=1,100 + IF (.NOT.WEARNG(I)) GOTO 8203 + IF (SPK.EQ.206) CALL RSPEAK(206) + BLKLIN = .FALSE. + CALL PSPEAK(I,-1) + SPK = 0 +8203 CONTINUE + BLKLIN = .TRUE. + SPK = 0 + IF(TOTING(BEAR))SPK=141 + GOTO 2011 +C +C FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM +C MAD. BEAR, SPECIAL. +C +9210 IF(OBJ.NE.BIRD)GOTO 9212 + SPK=100 + GOTO 2011 +C +9212 IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL)GOTO 9213 + SPK=102 + IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=110 + IF(OBJ.EQ.TROLL)SPK=182 + IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD))GOTO 2011 + SPK=101 + CALL DSTROY(BIRD) + PROP(BIRD)=0 + TALLY2=TALLY2+1 + GOTO 2011 +C +9213 IF(OBJ.NE.DWARF)GOTO 9214 + IF(.NOT.HERE(FOOD))GOTO 2011 + SPK=103 + DFLAG=DFLAG+1 + GOTO 2011 +C +9214 IF(OBJ.NE.BEAR)GOTO 9215 + IF(PROP(BEAR).EQ.0)SPK=102 + IF(PROP(BEAR).EQ.3)SPK=110 + IF(.NOT.HERE(FOOD))GOTO 2011 + CALL DSTROY(FOOD) + PROP(BEAR)=1 + FIXED(AXE)=0 + PROP(AXE)=0 + FIXED(DAGGER) = 0 + PROP(DAGGER) = 0 + SPK=168 + GOTO 2011 +C +9215 SPK=14 + GOTO 2011 +C +C FILL. BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE. (VASE IS NASTY.) +C +9220 IF(OBJ.EQ.VASE)GOTO 9222 + IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE)GOTO 2011 + IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE))GOTO 8000 + SPK=107 + IF(LIQLOC(LOC).EQ.0)SPK=106 + IF(LIQ(0).NE.0)SPK=105 + IF(SPK.NE.107)GOTO 2011 + PROP(BOTTLE)=MOD(COND(LOC),4)/2*2 + K=LIQ(0) + IF(TOTING(BOTTLE))PLACE(K)=-1 + IF(K.EQ.OIL)SPK=108 + GOTO 2011 +C +9222 SPK=29 + IF(LIQLOC(LOC).EQ.0)SPK=144 + IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE))GOTO 2011 + CALL RSPEAK(145) + PROP(VASE)=2 + FIXED(VASE)=-1 + GOTO 9024 +C +C BLAST. NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK! +C +9230 IF(PROP(ROD2).LT.0.OR..NOT.CLOSED)GOTO 2011 + BONUS=133 + IF(LOC.EQ.115)BONUS=134 + IF(HERE(ROD2))BONUS=135 + CALL RSPEAK(BONUS) + GOTO 20000 +C +C SCORE. GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS TRUE +C +8240 SCORNG=.TRUE. + SCORE = SCORES(MXSCOR,CHEST,MAXDIE,SCORNG,BONUS,HNTMAX,MAXTRS) +C +8241 SCORNG=.FALSE. + TYPE 8243,SCORE,MXSCOR +8243 FORMAT(/' IF YOU WERE TO QUIT NOW, YOU WOULD SCORE',I4 + 1 ,' OUT OF A POSSIBLE',I4,'.') + GAVEUP=YES(143,54,54) + GOTO 8185 +C +C FEE FIE FOE FOO (AND FUM). ADVANCE TO NEXT STATE IF GIVEN IN PROPER ORDER. +C LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT. LAST +C WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE). +C +8250 K=VOCAB(WD1,3) + SPK=42 + IF(FOOBAR.EQ.1-K)GOTO 8252 + IF(FOOBAR.NE.0)SPK=151 + GOTO 2011 +C +8252 FOOBAR=K + IF(K.NE.4)GOTO 2009 +8254 FOOBAR=0 + IF(PLACE(EGGS).EQ.PLAC(EGGS).OR.TOTING(STAFF) + 1 .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011 +C BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING. + IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0) + 1 PROP(TROLL)=1 + K=2 + IF(HERE(EGGS))K=1 + IF(LOC.EQ.PLAC(EGGS))K=0 + CALL MOVE(EGGS,PLAC(EGGS)) + CALL PSPEAK(EGGS,K) + GOTO 2012 +C +C BRIEF. INTRANSITIVE ONLY. SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME. +C +8260 SPK=156 + ABBNUM=10000 + DETAIL=3 + GOTO 2011 +C +C READ. MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER? +C +8270 IF(HERE(MAGZIN))OBJ=MAGZIN + IF(HERE(TABLET))OBJ=OBJ*100+TABLET + IF(HERE(MESSAG))OBJ=OBJ*100+MESSAG + IF (HERE(PLAQUE)) OBJ = OBJ*100 + PLAQUE + IF (HERE(MAP)) OBJ = OBJ*100 + MAP + IF (HERE(SIGN)) OBJ = OBJ*100 + SIGN + IF (HERE(ELVNDR).AND.PROP(ELVNDR).EQ.2) OBJ = OBJ*100 + ELVNDR + IF (HERE(BOOK)) OBJ = OBJ*100 + BOOK + IF (HERE(SCHOL).AND.PROP(SCHOL).NE.1) OBJ = OBJ*100 + SCHOL + IF(CLOSED.AND.TOTING(OYSTER))OBJ=OYSTER + IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(0))GOTO 8000 +C +9270 IF(DARK(0))GOTO 5190 + IF(OBJ.EQ.MAGZIN)SPK=190 + IF(OBJ.EQ.TABLET)SPK=196 + IF(OBJ.EQ.MESSAG)SPK=191 + IF (OBJ.EQ.PLAQUE) SPK=215 + IF (OBJ.EQ.MAP) SPK=222 + IF (OBJ.EQ.SIGN) SPK = 245 + IF (OBJ.EQ.ELVNDR.AND.PROP(ELVNDR).EQ.2) SPK = 242 + IF (OBJ.EQ.SCHOL.AND.PROP(SCHOL).NE.1) SPK = 248 + IF (OBJ.EQ.BOOK) GOTO 9271 + IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER))SPK=194 + IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER) + 1 .OR..NOT.CLOSED)GOTO 2011 + HINTED(2)=YES(192,193,54) + GOTO 2012 +C +9271 SPK = 241 + IF (LOC.EQ.PLAC(EGGS)) GOTO 8254 + IF (.NOT.CLOSNG.AND.HERE(ELVNDR).AND..NOT.HERE(MAGICN)) GOTO 9272 + IF (AT(DRAGON).AND.PROP(DRAGON).EQ.0) GOTO 9273 + IF (HERE(STONE)) SPK = 243 + GOTO 2011 +9272 PROP(ELVNDR) = 2 + SPK = 54 + GOTO 2011 +9273 PROP(DRAGON) = 2 + K = (PLAC(DRAGON) + FIXD(DRAGON)) /2 + CALL MOVE (DRAGON+100, -1) + CALL MOVE(RUG+100, 0) + CALL MOVE (DRAGON, 0) + CALL MOVE (RUG, 0) + DO 9274 OBJ = 1, 100 + IF (PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) + 1 CALL MOVE (OBJ, K) +9274 CONTINUE + CALL RSPEAK(244) + LOC = K + K = NULL + GOTO 8 +C +C BREAK. ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE. +C +9280 IF(OBJ.EQ.MIRROR)SPK=148 + IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 9282 + IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011 + CALL RSPEAK(197) + GOTO 19000 +C +9282 SPK=198 + IF(TOTING(VASE))CALL DROP(VASE,LOC) + PROP(VASE)=2 + FIXED(VASE)=-1 + GOTO 2011 +C WAKE. ONLY USE IS TO DISTURB THE DWARVES. +C +9290 IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011 + CALL RSPEAK(199) + GOTO 19000 +C +C SUSPEND. OFFER TO EXIT LEAVING THINGS RESTARTABLE, BUT REQUIRING A DELAY +C BEFORE RESTARTING (SO CAN'T SAVE THE WORLD BEFORE TRYING SOMETHING RISKY). +C CALL STAT3 (IF SEGMENT AROUND) SO WE KNOW THAT THE GAME WAS SUSPENDED +C CALL FILE TO SAVE THE IMPORTANT INFORMATION IN A FILE (AND REDUCE THE +C SIZE FILE A SUSPENDED GAME CREATES). +C UPON RESTARTING, SETUP=-1 CAUSES RETURN TO 8305 TO PICK UP AGAIN. +C +8300 SPK=201 + IF(DEMO)GOTO 2011 + TYPE 8302,LATNCY +8302 FORMAT(/' I CAN SUSPEND YOUR ADVENTURE FOR YOU SO THAT YOU CAN', + 1 ' RESUME LATER, BUT'/' YOU WILL HAVE TO WAIT AT LEAST', + 2 I3,' MINUTES BEFORE CONTINUING.') + IF(.NOT.YES(200,54,54))GOTO 2012 + CALL DATIME(SAVED,SAVET) + SETUP=-1 + IF (SEGOFF.EQ.0) GOTO 8304 + SCORNG = .TRUE. + SCORE = SCORES(MXSCOR,CHEST,MAXDIE,SCORNG,BONUS,HNTMAX,MAXTRS) +8303 SCORNG = .FALSE. +C CALL STAT2(SEGOFF,SCORE,TURNS,MXSCOR,NUMDIE,GAVEUP, +C 1 CLOSNG,CLOSED,.FALSE.,ACCT) +C CALL STAT3(SEGOFF,ACCT) +8304 CONTINUE + CALL LOAD('FILE') + CALL CIAO(.TRUE.) +C +8305 YEA=START(0) + SETUP=3 + K=NULL + GOTO 8 +C +C HOURS. REPORT CURRENT NON-PRIME-TIME HOURS. +C +8310 CALL MSPEAK(6) + CALL HOURS + GOTO 2012 +C +C WEARING ROUTINES +C +8320 IF (TOTING(RING)) OBJ = RING + IF (TOTING(CROWN)) OBJ = OBJ*100 + CROWN + IF (OBJ.GT.100.OR.OBJ.EQ.0) GOTO 8000 +C +9320 IF (OBJ.NE.RING.AND.OBJ.NE.CROWN) SPK = 208 + IF (OBJ.EQ.MITHRL) SPK = 237 + IF (WEARNG(OBJ)) SPK = 209 + IF (.NOT.TOTING(OBJ).OR.SPK.EQ.208.OR.SPK.EQ.237) GOTO 2011 + PLACE(OBJ) = -2 + SPK = 54 + HOLDNG = HOLDNG - 1 + IF (OBJ.EQ.RING) PROP(TPASS) = 1 + GOTO 2011 +C +C PULL. PULL SWORD OUT OF STONE (IF WEARNG CROWN) OR IF HE PERSISTS +C IN TRYING TO PULL IT OUT WITHOUT THE CROWN SMASH IT. +C +8330 IF (PLACE(SWORD).NE.LOC.OR.PROP(SWORD).NE.1) GOTO 8000 + OBJ = SWORD +C +9330 IF (OBJ.NE.SWORD) GOTO 2011 + SPK = 211 + IF (PROP(SWORD).NE.1) GOTO 2011 + IF (WEARNG(CROWN)) GOTO 9335 + IF (.NOT.YES(212,213,54)) GOTO 2012 + PROP(SWORD) = 2 + GOTO 2012 +9335 SPK = 92 + IF (HOLDNG.GE.7) GOTO 2011 + FIXED(SWORD) = 0 + CALL CARRY(SWORD,LOC) + PROP(SWORD) = 0 + SPK = 214 + PROP(STONE) = 1 + GOTO 2011 +C +C REMOVE. IF NO OBJECT GIVEN AND ONLY WEARING 1 OBJECT THEN ASSUME THAT. +C OTHERWISE ASK WHAT. +C +8340 IF (WEARNG(RING)) OBJ = RING + IF (WEARNG(CROWN)) OBJ = OBJ*100 + CROWN + IF (OBJ.GT.100.OR.OBJ.EQ.0) GOTO 8000 +C IF WEARING OBJECT AND HAVE ROOM IN HANDS TO HOLD IT, THEN TAKE IT OFF +9340 IF (.NOT.WEARNG(OBJ)) GOTO 2011 + IF (HOLDNG.LT.7) GOTO 9345 + SPK=92 + GOTO 2011 +9345 SPK=54 + HOLDNG=HOLDNG+1 + PLACE(OBJ) = -1 + IF (OBJ.EQ.RING) PROP(TPASS) = 0 + GOTO 2011 +C +C ON +C +9350 IF (OBJ.EQ.LAMP) GOTO 9070 + SPK=ACTSPK(MOD(WEAR,1000)) + GOTO 9320 +C +C OFF +C +9360 IF (OBJ.EQ.LAMP) GOTO 9080 + SPK=ACTSPK(MOD(REMOVE,1000)) + GOTO 9340 +C +C SWEEP. MUST BE EITHER IN ROOM WITH TRAP DOOR OR WITH SCHOLORSHIP +C WITH PROP SET TO 1 +C +8370 SPK = 49 + IF (.NOT.TOTING(BROOM)) GOTO 2011 + SPK = 246 + IF (.NOT.HERE(SCHOL).OR.PROP(SCHOL).NE.1) GOTO 8371 + SPK = 238 + PROP(SCHOL) = 0 + FIXED(SCHOL) = 0 +8371 IF (.NOT.HERE(TRAP).OR.PROP(TRAP).NE.0) GOTO 8372 + SPK = 239 + PROP(TRAP) = 1 +8372 GOTO 2011 +C +C HINTS +C +C COME HERE IF HE'S BEEN LONG ENOUGH AT REQUIRED LOC(S) FOR SOME UNUSED HINT. +C HINT NUMBER IS IN VARIABLE "HINT". BRANCH TO QUICK TEST FOR ADDITIONAL +C CONDITIONS, THEN COME BACK TO DO NEAT STUFF. GOTO 40010 IF CONDITIONS ARE +C MET AND WE WANT TO OFFER THE HINT. GOTO 40020 TO CLEAR HINTLC BACK TO ZERO, +C 40030 TO TAKE NO ACTION YET. +C +40000 ERA4=HINT-3 + GOTO (40400,40500,40600,40700,40800,40900,41000,41100),ERA4 +C CAVE BIRD SNAKE MAZE DARK WITT SWORD TPASS + CALL BUG(27) +C +40010 HINTLC(HINT)=0 + IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2602 + TYPE 40012,HINTS(HINT,2) +40012 FORMAT(/' I AM PREPARED TO GIVE YOU A HINT, BUT IT WILL COST YOU', + 1 I2,' POINTS.') + HINTED(HINT)=YES(175,HINTS(HINT,4),54) + IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2) +40020 HINTLC(HINT)=0 +40030 GOTO 2602 +C +C NOW FOR THE QUICK TESTS. SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES. +C +40400 IF(PROP(GRATE).EQ.0.AND..NOT.HERE(KEYS))GOTO 40010 + GOTO 40020 +C +40500 IF(HERE(BIRD).AND.TOTING(ROD).AND.OBJ.EQ.BIRD)GOTO 40010 + GOTO 40030 +C +40600 IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010 + GOTO 40020 +C +40700 IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0 + 1 .AND.ATLOC(OLDLC2).EQ.0.AND.HOLDNG.GT.1)GOTO 40010 + GOTO 40020 +C +40800 IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010 + GOTO 40020 +C +40900 GOTO 40010 +C +41000 IF (.NOT.WEARNG(RING)) GOTO 40010 + GOTO 40020 +C +41100 IF (PROP(SWORD).EQ.1) GOTO 40010 + GOTO 40020 +C +C CAVE CLOSING AND SCORING +C +C +C THESE SECTIONS HANDLE THE CLOSING OF THE CAVE. THE CAVE CLOSES "CLOCK1" +C TURNS AFTER THE LAST TREASURE HAS BEEN LOCATED (INCLUDING THE PIRATE'S +C CHEST, WHICH MAY OF COURSE NEVER SHOW UP). NOTE THAT THE TREASURES NEED NOT +C HAVE BEEN TAKEN YET, JUST LOCATED. HENCE CLOCK1 MUST BE LARGE ENOUGH TO GET +C OUT OF THE CAVE (IT ONLY TICKS WHILE INSIDE THE CAVE). WHEN IT HITS ZERO, +C WE BRANCH TO 10000 TO START CLOSING THE CAVE, AND THEN SIT BACK AND WAIT FOR +C HIM TO TRY TO GET OUT. IF HE DOESN'T WITHIN CLOCK2 TURNS, WE CLOSE THE +C CAVE; IF HE DOES TRY, WE ASSUME HE PANICS, AND GIVE HIM A FEW ADDITIONAL +C TURNS TO GET FRANTIC BEFORE WE CLOSE. WHEN CLOCK2 HITS ZERO, WE BRANCH TO +C 11000 TO TRANSPORT HIM INTO THE FINAL PUZZLE. NOTE THAT THE PUZZLE DEPENDS +C UPON ALL SORTS OF RANDOM THINGS. FOR INSTANCE, THERE MUST BE NO WATER OR +C OIL, SINCE THERE ARE BEANSTALKS WHICH WE DON'T WANT TO BE ABLE TO WATER, +C SINCE THE CODE CAN'T HANDLE IT. ALSO, WE CAN HAVE NO KEYS, SINCE THERE IS A +C GRATE (HAVING MOVED THE FIXED OBJECT!) THERE SEPARATING HIM FROM ALL THE +C TREASURES. MOST OF THESE PROBLEMS ARISE FROM THE USE OF NEGATIVE PROP +C NUMBERS TO SUPPRESS THE OBJECT DESCRIPTIONS UNTIL HE'S ACTUALLY MOVED THE +C OBJECTS. +C +C WHEN THE FIRST WARNING COMES, WE LOCK THE GRATE, DESTROY THE BRIDGE, KILL +C ALL THE DWARVES (AND THE PIRATE), REMOVE THE TROLL AND BEAR (UNLESS DEAD), +C AND SET "CLOSNG" TO TRUE. LEAVE THE DRAGON; TOO MUCH TROUBLE TO MOVE IT. +C FROM NOW UNTIL CLOCK2 RUNS OUT, HE CANNOT UNLOCK THE GRATE, MOVE TO ANY +C LOCATION OUTSIDE THE CAVE (LOC<9), OR CREATE THE BRIDGE. NOR CAN HE BE +C RESURRECTED IF HE DIES. NOTE THAT THE SNAKE IS ALREADY GONE, SINCE HE GOT +C TO THE TREASURE ACCESSIBLE ONLY VIA THE HALL OF THE MT. KING. ALSO, HE'S +C BEEN IN THE GIANT ROOM (TO GET EGGS), SO WE CAN REFER TO IT. ALSO ALSO, HE'S +C GOTTEN THE PEARL, SO WE KNOW THE BIVALVE IS AN OYSTER. *AND*, THE DWARVES +C MUST HAVE BEEN ACTIVATED, SINCE WE'VE FOUND CHEST. +C +10000 PROP(GRATE)=0 + PROP(FISSUR)=0 + DO 10010 I=1,12 + DSEEN(I)=.FALSE. +10010 DLOC(I)=0 + CALL MOVE(TROLL,0) + CALL MOVE(TROLL+100,0) + CALL MOVE(TROLL2,PLAC(TROLL)) + CALL MOVE(TROLL2+100,FIXD(TROLL)) + CALL JUGGLE(CHASM) + IF (PROP(BEAR).NE.3)CALL DSTROY(BEAR) + PROP(CHAIN)=0 + FIXED(CHAIN)=0 + PROP(AXE)=0 + FIXED(AXE)=0 + CALL RSPEAK(129) + IF (.NOT.TOTING(STAFF)) GOTO 10020 + CALL RSPEAK(236) + CALL DROP(STAFF,0) + GOTO 10030 +10020 CALL MOVE(STAFF,0) +10030 CALL MOVE(MAGICN,0) + PROP(STAFF) = 0 + PROP(ELVNDR) = 1 + CLOCK1=-1 + CLOSNG=.TRUE. + GOTO 19999 +C +C ONCE HE'S PANICKED, AND CLOCK2 HAS RUN OUT, WE COME HERE TO SET UP THE +C STORAGE ROOM. THE ROOM HAS TWO LOCS, HARDWIRED AS 115 (NE) AND 116 (SW). +C AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF +C OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM. AND +C THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED BIRDS, +C MORE RODS, AND PILLOWS. A MIRROR STRETCHES ACROSS ONE WALL. MANY OF THE +C OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KNOWN TO +C HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD 'PLACE'), +C MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY. WE ALSO DROP ALL OTHER +C OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TROUBLE, +C SUCH AS KEYS). WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK. +C +11000 PROP(BOTTLE)=PUT(BOTTLE,115,1) + PROP(PLANT)=PUT(PLANT,115,0) + PROP(OYSTER)=PUT(OYSTER,115,0) + PROP(LAMP)=PUT(LAMP,115,0) + PROP(ROD)=PUT(ROD,115,0) + PROP(DWARF)=PUT(DWARF,115,0) + LOC=115 + OLDLOC=115 + NEWLOC=115 +C +C LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY). +C + FOO=PUT(GRATE,116,0) + PROP(SNAKE)=PUT(SNAKE,116,1) + PROP(BIRD)=PUT(BIRD,116,1) + PROP(CAGE)=PUT(CAGE,116,0) + PROP(ROD2)=PUT(ROD2,116,0) + PROP(PILLOW)=PUT(PILLOW,116,0) +C + PROP(MIRROR)=PUT(MIRROR,115,0) + FIXED(MIRROR)=116 +C + DO 11010 I=1,100 +11010 IF(TOTING(I))CALL DSTROY(I) +C + CALL RSPEAK(132) + CLOSED=.TRUE. + GOTO 2 +C +C ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE OUT. +C WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM. WE GO TO 12000 IF THE LAMP +C AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES AND +C CONTINUE. 12200 IS FOR OTHER CASES OF LAMP DYING. 12400 IS WHEN IT GOES +C OUT, AND 12600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, IN WHICH +C CASE WE FORCE HIM TO GIVE UP. +C +12000 CALL RSPEAK(188) + PROP(BATTER)=1 + IF(TOTING(BATTER))CALL DROP(BATTER,LOC) + LIMIT=LIMIT+2500 + LMWARN=.FALSE. + GOTO 19999 +C +12200 IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999 + LMWARN=.TRUE. + SPK=187 + IF(PLACE(BATTER).EQ.0)SPK=183 + IF(PROP(BATTER).EQ.1)SPK=189 + CALL RSPEAK(SPK) + GOTO 19999 +C +12400 LIMIT=-1 + PROP(LAMP)=0 + IF (HERE(LAMP))CALL RSPEAK(184) + GOTO 19999 +C +12600 CALL RSPEAK(185) + GAVEUP=.TRUE. + GOTO 20000 +C +C AND, OF COURSE, DEMO GAMES ARE ENDED BY THE WIZARD. +C +13000 CALL MSPEAK(1) + GAVEUP=.TRUE. + GOTO 20000 +C +C OH DEAR, HE'S DISTURBED THE DWARVES. +C +19000 CALL RSPEAK(136) +20000 SCORE = SCORES(MXSCOR,CHEST,MAXDIE + 1,GAVEUP,BONUS,HNTMAX,MAXTRS) +C THAT SHOULD BE GOOD ENOUGH. LET'S TELL HIM ALL ABOUT IT +C AFTER RECORDING FOR OUR RECORDS +C +C CALL STAT2(SEGOFF,SCORE,TURNS,MXSCOR,NUMDIE,GAVEUP, +C 1 CLOSNG,CLOSED,.TRUE.,ACCT) + TYPE 20100,SCORE,MXSCOR,TURNS +20100 FORMAT(///' YOU SCORED',I4,' OUT OF A POSSIBLE',I4, + 1 ', USING',I5,' TURNS.') +C + DO 20200 I=1,CLSSES + IF(CVAL(I).GE.SCORE)GOTO 20210 +20200 CONTINUE + TYPE 20202 +20202 FORMAT(/' YOU JUST WENT OFF MY SCALE!!'/) + GOTO 25000 +C +20210 CALL SPEAK(CTEXT(I)) + IF(I.EQ.CLSSES-1)GOTO 20220 + K=CVAL(I)+1-SCORE + IF(K.EQ.1)GOTO 20214 + TYPE 20212,K + GOTO 20218 +20214 TYPE 20216,K +20212 FORMAT(/' TO ACHIEVE THE NEXT HIGHER RATING, YOU NEED',I3, + 1 ' MORE POINTS.'/) +20216 FORMAT(/' TO ACHIEVE THE NEXT HIGHER RATING, YOU NEED',I3, + 1 ' MORE POINT.'/) +20218 GOTO 25000 +C +20220 TYPE 20222 +20222 FORMAT(/' TO ACHIEVE THE NEXT HIGHER RATING ', + 1 'WOULD BE A NEAT TRICK!'//' CONGRATULATIONS!!'/) +C +25000 STOP +C +C + END diff --git a/src/games/adv4su.16 b/src/games/adv4su.16 new file mode 100644 index 00000000..d3953daa --- /dev/null +++ b/src/games/adv4su.16 @@ -0,0 +1,970 @@ + SUBROUTINE SPEAK(N) +C +C PRINT THE MESSAGE WHICH STARTS AT LINES(N). PRECEDE IT WITH A BLANK LINE +C UNLESS BLKLIN IS FALSE. +C + IMPLICIT INTEGER(A-Z) + LOGICAL BLKLIN + COMMON /TXTCOM/ RTEXT,LINES + COMMON /BLKCOM/ BLKLIN + DIMENSION RTEXT (250),LINES(15000),LINE(18) +C + IF(N.EQ.0)RETURN +C IF(LINES(N+1).EQ.XOR('>$<','?L.0'))RETURN + IF(LINES(N+1).EQ.('>$<'.XOR.'?L.0'))RETURN + IF(BLKLIN)TYPE 2 + K=N +1 L=IABS(LINES(K))-1 + J=K+1 + UPLIM=L-K + DO 3 I=1,UPLIM +C LINE(I)=XOR(LINES(J),'?L.0') + LINE(I)=LINES(J).XOR.'?L.0' +3 J=J+1 + WRITE (5,2)(LINE(I),I=1,UPLIM) +2 FORMAT(' ',18A4) + K=L+1 + IF(LINES(K).GE.0)GOTO 1 + RETURN + END + + SUBROUTINE PSPEAK(MSG,SKIP) +C +C FIND THE SKIP+1ST MESSAGE FROM MSG AND PRINT IT. MSG SHOULD BE THE INDEX OF +C THE INVENTORY MESSAGE FOR OBJECT. (INVEN+N+1 MESSAGE IS PROP=N MESSAGE). +C + IMPLICIT INTEGER(A-Z) + COMMON /TXTCOM/ RTEXT,LINES + COMMON /PTXCOM/ PTEXT + DIMENSION RTEXT(250),LINES(15000),PTEXT(100) +C + M=PTEXT(MSG) + IF(SKIP.LT.0)GOTO 9 + SKIPI = SKIP + 1 + DO 3 I=1,SKIPI +1 M=IABS(LINES(M)) + IF(LINES(M).GE.0)GOTO 1 +3 CONTINUE +9 CALL SPEAK(M) + RETURN + END + + SUBROUTINE RSPEAK(I) +C +C PRINT THE I-TH "RANDOM" MESSAGE (SECTION 6 OF DATABASE). +C + IMPLICIT INTEGER(A-Z) + COMMON /TXTCOM/ RTEXT + DIMENSION RTEXT(250) +C + IF(I.NE.0)CALL SPEAK(RTEXT(I)) + RETURN + END + + SUBROUTINE MSPEAK(I) +C +C PRINT THE I-TH "MAGIC" MESSAGE (SECTION 12 OF THE DATABASE). +C + IMPLICIT INTEGER(A-Z) + COMMON /MTXCOM/ MTEXT + DIMENSION MTEXT(35) +C + IF(I.NE.0)CALL SPEAK(MTEXT(I)) + RETURN + END + + SUBROUTINE GETIN(WORD1,WORD1X,WORD2,WORD2X) + +C GET A COMMAND FROM THE ADVENTURER. SNARF OUT THE FIRST WORD, PAD IT WITH +C BLANKS, AND RETURN IT IN WORD1. CHARS 6 THRU 10 ARE RETURNED IN WORD1X, IN +C CASE WE NEED TO PRINT OUT THE WHOLE WORD IN AN ERROR MESSAGE. ANY NUMBER OF +C BLANKS MAY FOLLOW THE WORD. IF A SECOND WORD APPEARS, IT IS RETURNED IN +C WORD2 (CHARS 6 THRU 10 IN WORD2X), ELSE WORD2 IS SET TO ZERO. + + IMPLICIT INTEGER(A-Z) + LOGICAL BLKLIN + COMMON /BLKCOM/ BLKLIN + DIMENSION A(5),MASKS(6) + DATA MASKS/"4000000000,"20000000,"100000,"400,"2,0/ + 1 ,BLANKS/' '/ + IF(BLKLIN)TYPE 1 +1 FORMAT() +2 ACCEPT 3,(A(I),I=1,4) +3 FORMAT(4A5) + J=0 + DO 9 I=1,4 + IF(A(I).NE.BLANKS)J=1 +9 A(I)=A(I).AND.(SHIFT((A(I).AND.'@@@@@'),-1).XOR.-1) + IF(BLKLIN.AND.J.EQ.0)GOTO 2 + + SECOND=0 + WORD1=A(1) + WORD1X=A(2) + WORD2=0 + + DO 10 J=1,4 + DO 10 K=1,5 + MSK="774000000000 + IF(K.NE.1)MSK="177*MASKS(K) + IF(((A(J).XOR.BLANKS).AND.MSK).EQ.0)GOTO 15 + IF(SECOND.EQ.0)GOTO 10 + MSK=-MASKS(6-K) + WORD2=(SHIFT(A(J),7*(K-1)).AND.MSK) + 1 +(SHIFT(A(J+1),7*(K-6)).AND.(-2-MSK)) + WORD2X=(SHIFT(A(J+1),7*(K-1)).AND.MSK) + 1 +(SHIFT(A(J+2),7*(K-6)).AND.(-2-MSK)) + RETURN + +15 IF(SECOND.EQ.1)GOTO 10 + SECOND=1 + IF(J.EQ.1)WORD1=(WORD1.AND.-MASKS(K)) + 1 .OR.(BLANKS.AND.(-MASKS(K).XOR.-1)) +10 CONTINUE + RETURN + END + + LOGICAL FUNCTION YES(X,Y,Z) +C +C CALL YESX (BELOW) WITH MESSAGES FROM SECTION 6. +C + IMPLICIT INTEGER(A-Z) + EXTERNAL RSPEAK + LOGICAL YESX +C + YES=YESX(X,Y,Z,RSPEAK) + RETURN + END + + LOGICAL FUNCTION YESM(X,Y,Z) +C +C CALL YESX (BELOW) WITH MESSAGES FROM SECTION 12. +C + IMPLICIT INTEGER(A-Z) + EXTERNAL MSPEAK + LOGICAL YESX +C + YESM=YESX(X,Y,Z,MSPEAK) + RETURN + END + + LOGICAL FUNCTION YESX(X,Y,Z,SPK) +C +C PRINT MESSAGE X, WAIT FOR YES/NO ANSWER. IF YES, PRINT Y AND LEAVE YEA +C TRUE; IF NO, PRINT Z AND LEAVE YEA FALSE. SPK IS EITHER RSPEAK OR MSPEAK. +C + IMPLICIT INTEGER(A-Z) +C +1 IF(X.NE.0)CALL SPK(X) + CALL GETIN(REPLY,JUNK1,JUNK2,JUNK3) +C IF(REPLY.EQ.CODE('YES').OR.REPLY.EQ.CODE('Y'))GOTO 10 + IF(REPLY.EQ.'YES'.OR.REPLY.EQ.'Y')GOTO 10 +C IF(REPLY.EQ.CODE('NO').OR.REPLY.EQ.CODE('N'))GOTO 20 + IF(REPLY.EQ.'NO'.OR.REPLY.EQ.'N')GOTO 20 + TYPE 9 +9 FORMAT(/' PLEASE ANSWER THE QUESTION.') + GOTO 1 +10 YESX=.TRUE. + IF(Y.NE.0)CALL SPK(Y) + RETURN +20 YESX=.FALSE. + IF(Z.NE.0)CALL SPK(Z) + RETURN + END + + + SUBROUTINE A5TOA1(A,B,C,CHARS,LENG) + +C A AND B CONTAIN A 1- TO 9-CHARACTER WORD IN A5 FORMAT, C CONTAINS ANOTHER +C WORD AND/OR PUNCTUATION. THEY ARE UNPACKED TO ONE CHARACTER PER WORD IN THE +C ARRAY "CHARS", WITH EXACTLY ONE BLANK BETWEEN B AND C (OR NONE, IF C >= 0). +C THE INDEX OF THE LAST NON-BLANK CHAR IN CHARS IS RETURNED IN LENG. + + IMPLICIT INTEGER(A-Z) + DIMENSION CHARS(20),WORDS(3) + DATA MASK,BLANK/"774000000000,' '/ + + WORDS(1)=A + WORDS(2)=B + WORDS(3)=C + POSN=1 + DO 1 WORD=1,3 + IF(WORD.EQ.2.AND.POSN.NE.6)GOTO 1 + IF(WORD.EQ.3.AND.C.LT.0)POSN=POSN+1 + DO 2 CH=1,5 + CHARS(POSN)=(WORDS(WORD).AND.MASK)+(BLANK-(BLANK.AND.MASK)) + IF(CHARS(POSN).EQ.BLANK)GOTO 1 + LENG=POSN + WORDS(WORD)=SHIFT(WORDS(WORD),7) +2 POSN=POSN+1 +1 CONTINUE + RETURN + END + + INTEGER FUNCTION VOCAB(ID,INIT) +C +C LOOK UP ID IN THE VOCABULARY (ATAB) AND RETURN ITS "DEFINITION" (KTAB), OR +C -1 IF NOT FOUND. IF INIT IS POSITIVE, THIS IS AN INITIALIZATION CALL SETTING +C UP A KEYWORD VARIABLE, AND NOT FINDING IT CONSTITUTES A BUG. IT ALSO MEANS +C THAT ONLY KTAB VALUES WHICH TAKEN OVER 1000 EQUAL INIT MAY BE CONSIDERED. +C (THUS "STEPS", WHICH IS A MOTION VERB AS WELL AS AN OBJECT, MAY BE LOCATED +C AS AN OBJECT.) AND IT ALSO MEANS THE KTAB VALUE IS TAKEN MOD 1000. +C + IMPLICIT INTEGER(A-Z) + COMMON /VOCCOM/ KTAB,ATAB,TABSIZ + DIMENSION KTAB(400),ATAB(400) +C +C HASH=XOR(ID,'PHRO') + HASH=ID.XOR.'PHRO' + DO 1 I=1,TABSIZ + IF(KTAB(I).EQ.-1)GOTO 2 + IF(INIT.GE.0.AND.KTAB(I)/1000.NE.INIT)GOTO 1 + IF(ATAB(I).EQ.HASH)GOTO 3 +1 CONTINUE + CALL BUG(21) +C +2 VOCAB=-1 + IF(INIT.LT.0)RETURN + CALL BUG(5) +C +3 VOCAB=KTAB(I) + IF(INIT.GE.0)VOCAB=MOD(VOCAB,1000) + RETURN + END + + SUBROUTINE DSTROY(OBJECT) +C +C PERMANENTLY ELIMINATE "OBJECT" BY MOVING TO A NON-EXISTENT LOCATION. +C + IMPLICIT INTEGER(A-Z) +C + CALL MOVE(OBJECT,0) + RETURN + END + + SUBROUTINE JUGGLE(OBJECT) +C JUGGLE AN OBJECT BY PICKING IT UP AND PUTTING IT DOWN AGAIN, THE PURPOSE +C BEING TO GET THE OBJECT TO THE FRONT OF THE CHAIN OF THINGS AT ITS LOC. +C + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(200),LINK(200),PLACE(100),FIXED(100) +C + I=PLACE(OBJECT) + J=FIXED(OBJECT) + CALL MOVE(OBJECT,I) + CALL MOVE(OBJECT+100,J) + RETURN + END + + SUBROUTINE MOVE(OBJECT,WHERE) +C +C PLACE ANY OBJECT ANYWHERE BY PICKING IT UP AND DROPPING IT. MAY ALREADY BE +C TOTING, IN WHICH CASE THE CARRY IS A NO-OP. MUSTN'T PICK UP OBJECTS WHICH +C ARE NOT AT ANY LOC, SINCE CARRY WANTS TO REMOVE OBJECTS FROM ATLOC CHAINS. +C + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(200),LINK(200),PLACE(100),FIXED(100) +C + IF(OBJECT.GT.100)GOTO 1 + FROM=PLACE(OBJECT) + GOTO 2 +1 FROM=FIXED(OBJECT-100) +2 IF(FROM.GT.0.AND.FROM.LE.300)CALL CARRY(OBJECT,FROM) + CALL DROP(OBJECT,WHERE) + RETURN + END + + INTEGER FUNCTION PUT(OBJECT,WHERE,PVAL) +C +C PUT IS THE SAME AS MOVE, EXCEPT IT RETURNS A VALUE USED TO SET UP THE +C NEGATED PROP VALUES FOR THE REPOSITORY OBJECTS. +C + IMPLICIT INTEGER(A-Z) +C + CALL MOVE(OBJECT,WHERE) + PUT=(-1)-PVAL + RETURN + END + + SUBROUTINE CARRY(OBJECT,WHERE) +C +C START TOTING AN OBJECT, REMOVING IT FROM THE LIST OF THINGS AT ITS FORMER +C LOCATION. INCR HOLDNG UNLESS IT WAS ALREADY BEING TOTED. IF OBJECT>100 +C (MOVING "FIXED" SECOND LOC), DON'T CHANGE PLACE OR HOLDNG. +C + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(200),LINK(200),PLACE(100),FIXED(100) +C + IF(OBJECT.GT.100)GOTO 5 + IF(PLACE(OBJECT).EQ.-1)RETURN + PLACE(OBJECT)=-1 + HOLDNG=HOLDNG+1 +5 IF(ATLOC(WHERE).NE.OBJECT)GOTO 6 + ATLOC(WHERE)=LINK(OBJECT) + RETURN +6 TEMP=ATLOC(WHERE) +7 IF(LINK(TEMP).EQ.OBJECT)GOTO 8 + TEMP=LINK(TEMP) + GOTO 7 +8 LINK(TEMP)=LINK(OBJECT) + RETURN + END + + SUBROUTINE DROP(OBJECT,WHERE) +C +C PLACE AN OBJECT AT A GIVEN LOC, PREFIXING IT ONTO THE ATLOC LIST. DECR +C HOLDING IF THE OBJECT WAS BEING TOTED. +C + IMPLICIT INTEGER(A-Z) + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + DIMENSION ATLOC(200),LINK(200),PLACE(100),FIXED(100) +C + IF(OBJECT.GT.100)GOTO 1 + IF(PLACE(OBJECT).EQ.-1)HOLDNG=HOLDNG-1 + PLACE(OBJECT)=WHERE + GOTO 2 +1 FIXED(OBJECT-100)=WHERE +2 IF(WHERE.LE.0)RETURN + LINK(OBJECT)=ATLOC(WHERE) + ATLOC(WHERE)=OBJECT + RETURN + END + + LOGICAL FUNCTION START(DUMMY) +C +C CHECK TO SEE IF THIS IS "PRIME TIME". IF SO, ONLY WIZARDS MAY PLAY, THOUGH +C OTHERS MAY BE ALLOWED A SHORT GAME FOR DEMONSTRATION PURPOSES. IF SETUP<0, +C WE'RE CONTINUING FROM A SAVED GAME, SO CHECK FOR SUITABLE LATENCY. RETURN +C TRUE IF THIS IS A DEMO GAME (VALUE IS IGNORED FOR RESTARTS). +C + IMPLICIT INTEGER(A-Z) + LOGICAL PTIME,SOON,YESM,WIZARD + DIMENSION HNAME(4) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP +C +C FIRST FIND OUT WHETHER IT IS PRIME TIME (SAVE IN PTIME) AND, IF RESTARTING, +C WHETHER IT'S TOO SOON (SAVE IN SOON). PRIME-TIME SPECS ARE IN WKDAY, WKEND, +C AND HOLID; SEE MAINT ROUTINE FOR DETAILS. LATNCY IS REQUIRED DELAY BEFORE +C RESTARTING. WIZARDS MAY CUT THIS TO A THIRD. +C + CALL DATIME(D,T) + PRIMTM=WKDAY + IF(MOD(D,7).LE.1)PRIMTM=WKEND + IF(D.GE.HBEGIN.AND.D.LE.HEND)PRIMTM=HOLID +C PTIME=AND(PRIMTM,SHIFT(1,T/60)).NE.0 + PTIME=(PRIMTM.AND.SHIFT(1,T/60)).NE.0 + SOON=.FALSE. + IF(SETUP.GE.0)GOTO 20 + DELAY=IABS((D-SAVED)*1440+(T-SAVET)) + IF(DELAY.GE.LATNCY)GOTO 20 + TYPE 10,DELAY +10 FORMAT(' THIS ADVENTURE WAS SUSPENDED A MERE',I3,' MINUTES AGO.') + SOON=.TRUE. + IF(DELAY.GE.LATNCY/3)GOTO 20 + CALL MSPEAK(2) + STOP +C +C IF NEITHER TOO SOON NOR PRIME TIME, NO PROBLEM. ELSE SPECIFY WHAT'S WRONG. +C +20 START=.FALSE. + IF(SOON)GOTO 30 + IF(PTIME)GOTO 25 +22 SAVED=-1 + RETURN +C +C COME HERE IF NOT RESTARTING TOO SOON (MAYBE NOT RESTARTING AT ALL), BUT IT'S +C PRIME TIME. GIVE OUR HOURS AND SEE IF HE'S A WIZARD. IF NOT, THEN CAN'T +C RESTART, BUT IF JUST BEGINNING THEN WE CAN OFFER A SHORT GAME. +C +25 CALL MSPEAK(3) + CALL HOURS + CALL MSPEAK(4) + IF(WIZARD(0))GOTO 22 + IF(SETUP.LT.0)GOTO 33 + START=YESM(5,7,7) + IF(START)GOTO 22 + STOP +C +C COME HERE IF RESTARTING TOO SOON. IF HE'S A WIZARD, LET HIM GO (AND NOTE +C THAT IT THEN DOESN'T MATTER WHETHER IT'S PRIME TIME). ELSE, TOUGH BEANS. +C +30 CALL MSPEAK(8) + IF(WIZARD(0))GOTO 22 +33 CALL MSPEAK(9) + STOP + END + + SUBROUTINE MAINT +C +C SOMEONE SAID THE MAGIC WORD TO INVOKE MAINTENANCE MODE. MAKE SURE HE +C IS A +C WIZARD. IF SO, LET HIM TWEAK ALL SORTS OF RANDOM THINGS, THEN EXIT +C SO HE CAN +C SAVE TWEAKED VERSION. SINCE MAGIC WORD MUST BE FIRST COMMAND GIVEN, +C THE ONLY THING WHICH NEEDS TO BE FIXED UP IS ABB(1). +C + IMPLICIT INTEGER(A-Z) + LOGICAL YESM,BLKLIN,WIZARD + DIMENSION HNAME(4),ABB(200) + COMMON /BLKCOM/ BLKLIN + COMMON /ABBCOM/ ABB + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP + COMMON /SAVCOM/ SEGOFF,ABBNUM,ATTACK,CLOCK1,CLOCK2,CLOSED,CLOSNG, + 1DETAIL,DFLAG,DKILL,DLOC,DSEEN,DTOTAL,GAVEUP,HINT,HINTED, + 2IWEST,KNFLOC,LIMIT,LMWARN,LOC,NUMDIE,PANIC,PROP,STICK, + 3TALLY,TALLY2,TURNS,WZDARK,XXD,XXT,ACCT,HINTLC,HINTS, + 4FILLER +C + DIMENSION HINTLC(20),HINTED(20),HINTS(20,4),PROP(100) + DIMENSION DSEEN(12),DLOC(12),ODLOC(12) + LOGICAL DSEEN + DIMENSION FILLER(20) +C +C + IF(.NOT.WIZARD(0))RETURN + BLKLIN=.FALSE. + IF(YESM(10,0,0))CALL HOURS + IF(YESM(11,0,0))CALL NEWHRS + IF(.NOT.YESM(26,0,0))GOTO 10 + CALL MSPEAK(27) + READ (5,1)HBEGIN +1 FORMAT(I7) + CALL MSPEAK(28) + READ (5,1)HEND + CALL DATIME(D,T) + HBEGIN=HBEGIN+D + HEND=HBEGIN+HEND-1 + CALL MSPEAK(29) + READ (5,2)HNAME +2 FORMAT(5A4) +10 WRITE (5,12)SHORT +12 FORMAT(' LENGTH OF SHORT GAME (NULL TO LEAVE AT',I3,'):') + READ(5,1) X + IF(X.GT.0)SHORT=X + CALL MSPEAK(12) + CALL GETIN(X,Y,Y,Y) +C IF(X.NE.CODE(' '))MAGIC=X + IF(X.NE.' ')MAGIC=X + CALL MSPEAK(13) + READ(5,1) X + IF(X.GT.0)MAGNM=X + WRITE (5,16)LATNCY +16 FORMAT(' LATENCY FOR RESTART (NULL TO LEAVE AT',I3,'):') + READ(5,1) X + IF(X.GT.0.AND.X.LT.45)CALL MSPEAK(30) +C THE FOLLOWING CHANGE SHORT CIRCUITS THE MINIMUM LATENCY TIME + IF(X.GE.0)LATNCY=X +C GET A NEW ACCOUNT NUMBER FOR KEEPING STATISTICS (IF WANTED) + WRITE (5,20) ACCT +20 FORMAT (' ACCOUNT NUMBER FOR STATS (NULL TO LEAVE ',I9,') :') + READ (5,21) X +21 FORMAT (I9) + IF (X.GT.0) ACCT = X + IF(YESM(14,0,0))CALL MOTD(.TRUE.) + SAVED=0 + SETUP=2 + ABB(1)=0 + CALL MSPEAK(15) + BLKLIN=.TRUE. + CALL CIAO(.FALSE.) + RETURN + END + + LOGICAL FUNCTION WIZARD(DUMMY) +C +C ASK IF HE'S A WIZARD. IF HE SAYS YES, MAKE HIM PROVE IT. RETURN TRUE IF HE +C REALLY IS A WIZARD. +C + IMPLICIT INTEGER(A-Z) + LOGICAL YESM + DIMENSION HNAME(4),VAL(5) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP +C + WIZARD=YESM(16,0,7) + IF(.NOT.WIZARD)RETURN +C +C HE SAYS HE IS. FIRST STEP: DOES HE KNOW ANYTHING MAGICAL? +C + CALL MSPEAK(17) + CALL GETIN(WORD,X,Y,Z) + IF(WORD.NE.MAGIC)GOTO 99 + GOTO 20 +C +C HE DOES. GIVE HIM A RANDOM CHALLENGE AND CHECK HIS REPLY. +C + CALL DATIME(D,T) + T=T*2+1 + WORD='@@@@@' + DO 15 Y=1,5 + X=79+MOD(D,5) + D=D/5 + DO 12 Z=1,X +12 T=MOD(T*1027,1048576) + VAL(Y)=(T*26)/1048576+1 +15 WORD=WORD+SHIFT(VAL(Y),36-7*Y) + IF(YESM(18,0,0))GOTO 99 + TYPE 18,WORD +18 FORMAT(/1X,A5) + CALL GETIN(WORD,X,Y,Z) + CALL DATIME(D,T) + T=(T/60)*40+(T/10)*10 + D=MAGNM + DO 19 Y=1,5 + Z=MOD(Y,5)+1 + X=MOD(IABS(VAL(Y)-VAL(Z))*MOD(D,10)+MOD(T,10),26)+1 + T=T/10 + D=D/10 +19 WORD=WORD-SHIFT(X,36-7*Y) + IF(WORD.NE.'@@@@@')GOTO 99 +C +C BY GEORGE, HE REALLY *IS* A WIZARD! +C +20 CALL MSPEAK(19) + RETURN +C +C AHA! AN IMPOSTER! +C +99 CALL MSPEAK(20) + WIZARD=.FALSE. + RETURN + END + + SUBROUTINE HOURS +C +C ANNOUNCE THE CURRENT HOURS WHEN THE CAVE IS OPEN FOR ADVENTURING. THIS INFO +C IS STORED IN WKDAY, WKEND, AND HOLID, WHERE BIT SHIFT(1,N) IS ON IFF THE +C HOUR FROM N:00 TO N:59 IS "PRIME TIME" (CAVE CLOSED). WKDAY IS FOR +C WEEKDAYS, WKEND FOR WEEKENDS, HOLID FOR HOLIDAYS. NEXT HOLIDAY IS FROM +C HBEGIN TO HEND. +C + IMPLICIT INTEGER(A-Z) + DIMENSION HNAME(4),VAL(5) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME +C + WRITE (5,1) +1 FORMAT() + CALL HOURSX(WKDAY,'MON ','- FR','I:') + CALL HOURSX(WKEND,'SAT ','- SU','N:') + CALL HOURSX(HOLID,'HOLI','DAYS',':') + CALL DATIME(D,T) + IF(HEND.LT.D.OR.HEND.LT.HBEGIN)RETURN + IF(HBEGIN.GT.D)GOTO 10 + WRITE (5,5)HNAME + LEN = HEND - D + WRITE (5,7) LEN +5 FORMAT(/' TODAY IS A HOLIDAY, NAMELY ',4A4) +7 FORMAT (/' IT WILL LAST ANOTHER',I3,' DAYS') + RETURN +C +10 D=HBEGIN-D + IF(D.EQ.1)GOTO 12 + WRITE(5,20)D,HNAME + GOTO 50 +12 WRITE(5,25)D,HNAME +20 FORMAT(/' THE NEXT HOLIDAY WILL BE IN',I3,' DAYS, NAMELY ',5A4) +25 FORMAT(/' THE NEXT HOLIDAY WILL BE IN',I3,' DAY, NAMELY ',5A4) +C +50 LEN = HEND - HBEGIN + 1 + IF (LEN .LT. 1) RETURN + IF (LEN .EQ. 1) GOTO 55 + WRITE (5,75) LEN + RETURN +55 WRITE (5,80) LEN + RETURN +75 FORMAT (' IT WILL LAST',I3,' DAYS') +80 FORMAT (' IT WILL LAST,'I3,' DAY') + END + + SUBROUTINE HOURSX(H,DAY1,DAY2,DAY3) +C +C USED BY HOURS (ABOVE) TO PRINT HOURS FOR EITHER WEEKDAYS OR WEEKENDS. +C + IMPLICIT INTEGER(A-Z) + LOGICAL FIRST +C + FIRST=.TRUE. + FROM=-1 + IF(H.NE.0)GOTO 10 + WRITE (5,2)DAY1,DAY2,DAY3 +2 FORMAT(10X,3A4,' OPEN ALL DAY') + RETURN +C +10 FROM=FROM+1 +C IF(AND(H,SHIFT(1,FROM)).NE.0)GOTO 10 + IF((H.AND.SHIFT(1,FROM)).NE.0)GOTO 10 + IF(FROM.GE.24)GOTO 20 + TILL=FROM +14 TILL=TILL+1 +C IF(AND(H,SHIFT(1,TILL)).EQ.0.AND.TILL.NE.24)GOTO 14 + IF((H.AND.SHIFT(1,TILL)).EQ.0.AND.TILL.NE.24)GOTO 14 + IF(FIRST)WRITE (5,16) DAY1,DAY2,DAY3,FROM,TILL + IF(.NOT.FIRST)WRITE (5,18) FROM,TILL +16 FORMAT(10X,3A4,I4,':00 TO',I3,':00') +18 FORMAT(22X,I4,':00 TO',I3,':00') + FIRST=.FALSE. + FROM=TILL + GOTO 10 +C +20 IF(FIRST)WRITE (5,22) DAY1,DAY2,DAY3 +22 FORMAT(10X,3A4,' CLOSED ALL DAY') + RETURN + END + + SUBROUTINE NEWHRS +C +C SET UP NEW HOURS FOR THE CAVE. SPECIFIED AS INVERSE--I.E., WHEN IS IT +C CLOSED DUE TO PRIME TIME? SEE HOURS (ABOVE) FOR DESC OF VARIABLES. +C + IMPLICIT INTEGER(A-Z) + DIMENSION HNAME(4) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME +C + CALL MSPEAK(21) + WKDAY=NEWHRX('WEEK','DAYS',':') + WKEND=NEWHRX('WEEK','ENDS',':') + HOLID=NEWHRX('HOLI','DAYS',':') + CALL MSPEAK(22) + CALL HOURS + RETURN + END + + INTEGER FUNCTION NEWHRX(DAY1,DAY2,DAY3) +C +C INPUT PRIME TIME SPECS AND SET UP A WORD OF INTERNAL FORMAT. +C + IMPLICIT INTEGER(A-Z) +C + NEWHRX=0 + TYPE 1,DAY1,DAY2,DAY3 +1 FORMAT(' PRIME TIME ON ',3A4) +10 TYPE 2 +2 FORMAT(' FROM:') + READ (5,3)FROM +3 FORMAT(I7) + IF(FROM.LT.0.OR.FROM.GE.24)RETURN + TYPE 4 +4 FORMAT(' TILL:') + READ (5,3)TILL + TILL=TILL-1 + IF(TILL.LT.FROM.OR.TILL.GE.24)RETURN + DO 5 I=FROM,TILL +C5 NEWHRX=OR(NEWHRX,SHIFT(1,I)) +5 NEWHRX=NEWHRX.OR.SHIFT(1,I) + GOTO 10 + END + + SUBROUTINE MOTD(ALTER) +C +C HANDLES MESSAGE OF THE DAY. IF ALTER IS TRUE, READ A NEW MESSAGE FROM THE +C WIZARD. ELSE PRINT THE CURRENT ONE. MESSAGE IS INITIALLY NULL. +C + IMPLICIT INTEGER(A-Z) + LOGICAL ALTER + DIMENSION MSG(100) + DATA MSG/100*-1/ +C + IF(ALTER)GOTO 50 +C + K=1 +10 IF(MSG(K).LT.0)RETURN + LIM1=K+1 + LIM2=MSG(K)-1 + WRITE(5,20)(MSG(I),I=LIM1,LIM2) +20 FORMAT(' ',18A4) + K=MSG(K) + GOTO 10 +C +50 M=1 + CALL MSPEAK(23) +55 LIM1=M+1 + LIM2=M+18 + READ(5,56)(MSG(I),I=LIM1,LIM2),K +56 FORMAT(19A4) +C IF(XOR(K,' ').EQ.0)GOTO 60 + IF((K.XOR.' ').EQ.0)GOTO 60 + CALL MSPEAK(24) + GOTO 55 +60 DO 62 I=1,18 + K=M+19-I +C IF(XOR(MSG(K),' ').NE.0)GOTO 65 + IF((MSG(K).XOR.' ').NE.0)GOTO 65 +62 CONTINUE + GOTO 90 +65 MSG(M)=K+1 + M=K+1 + IF(M+18.LT.100)GOTO 55 + CALL MSPEAK(25) +90 MSG(M)=-1 + RETURN + END + + SUBROUTINE POOF +C +C AS PART OF DATABASE INITIALISATION, WE CALL POOF TO SET UP SOME DUMMY +C PRIME-TIME SPECS, MAGIC WORDS, ETC. NOTE THAT THE DEFAULT VALUES FOR +C WKDAY AND LATNCY HAVE BEEN CHANGED BY DAVID NEBIKER (6/28/78) +C + IMPLICIT INTEGER(A-Z) + DIMENSION HNAME(4) + COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME, + 1 SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP +C + WKDAY=126976 + WKEND=0 + HOLID=0 + HBEGIN=0 + HEND=-1 + SHORT=30 + MAGIC='DWARF' + MAGNM=11111 + LATNCY=60 + RETURN + END + + INTEGER FUNCTION RAN(RANGE) +C +C SINCE THE RAN FUNCTION IN LIB40 SEEMS TO BE A REAL LOSER, WE'LL USE ONE OF +C OUR OWN. IT'S BEEN RUN THROUGH MANY OF THE TESTS IN KNUTH VOL. 2 AND +C SEEMS TO BE QUITE RELIABLE. RAN RETURNS A VALUE UNIFORMLY SELECTED +C BETWEEN 0 AND RANGE-1. NOTE RESEMBLANCE TO ALG USED IN WIZARD. +C + IMPLICIT INTEGER(A-Z) + DATA R/0/ +C + D=1 + IF(R.NE.0)GOTO 1 + CALL DATIME(D,T) + R=18*T+5 + D=1000+MOD(D,1000) +1 DO 2 T=1,D +2 R=MOD(R*1021,1048576) + RAN=(RANGE*R)/1048576 + RETURN + END + + SUBROUTINE DATIME(D,T) + +C RETURN THE DATE AND TIME IN D AND T. D IS NUMBER OF DAYS SINCE 01-JAN-77, +C T IS MINUTES PAST MIDNIGHT. THIS IS HARDER THAN IT SOUNDS, BECAUSE THE +C FINAGLED DEC FUNCTIONS RETURN THE VALUES ONLY AS ASCII STRINGS! + + IMPLICIT INTEGER(A-Z) + DIMENSION DAT(2),MONTHS(12),HATH(12) + DATA MONTHS/'-JAN-','-FEB-','-MAR-','-APR-','-MAY-','-JUN-', + 1 '-JUL-','-AUG-','-SEP-','-OCT-','-NOV-','-DEC-'/ + DATA HATH/31,28,31,30,31,30,31,31,30,31,30,31/ + +C FUNCTION I2 TAKES 2-DIGIT ASCII AND YIELDS DECIMAL VALUE. + + I2(X)=(SHIFT(X,-29).AND.15)*10+(SHIFT(X,-22).AND.15) + + CALL DATE(DAT) + CALL TIME(TIM) + + YEAR=I2(SHIFT(DAT(2),14))-77 + D=I2(DAT(1))-1 + X=((SHIFT(DAT(1),14).OR.SHIFT(DAT(2),-21)).AND..NOT."1004020001) + 1 .OR.'-@@@-' +C ABOVE FUNNY EXPRESSION GUARANTEES (A) UPPER-CASE, AND (B) BOTTOM BIT OKAY. + D=20 + GOTO 2 + DO 1 MON=1,12 + IF(X.EQ.MONTHS(MON))GOTO 2 +1 D=D+HATH(MON) + CALL BUG(28) + +2 D=D+YEAR*365+YEAR/4 + IF(MOD(YEAR,4).EQ.3.AND.MON.GT.2)D=D+1 + T=I2(TIM)*60+I2(SHIFT(TIM,21)) + RETURN + END + + SUBROUTINE CIAO (SUSPND) + +C EXITS, AFTER ISSUING REMINDER TO SAVE NEW CORE IMAGE. USED WHEN SUSPENDING +C AND WHEN CREATING NEW VERSION VIA MAGIC MODE. ON SOME SYSTEMS, THE CORE +C IMAGE IS LOST ONCE THE PROGRAM EXITS. IF SO, SET K=31 INSTEAD OF 32. + + IMPLICIT INTEGER(A-Z) + LOGICAL SUSPND + DATA K/32/ + IF (SUSPND) GOTO 10 + CALL MSPEAK(K) + IF(K.EQ.31)CALL GETIN(A,B,C,D) + GOTO 50 +10 CALL MSPEAK (33) +50 STOP + END + + SUBROUTINE BUG(NUM) + IMPLICIT INTEGER(A-Z) + +C THE FOLLOWING CONDITIONS ARE CURRENTLY CONSIDERED FATAL BUGS. NUMBERS < 20 +C ARE DETECTED WHILE READING THE DATABASE; THE OTHERS OCCUR AT "RUN TIME". +C 0 MESSAGE LINE > 70 CHARACTERS +C 1 NULL LINE IN MESSAGE +C 2 TOO MANY WORDS OF MESSAGES +C 3 TOO MANY TRAVEL OPTIONS +C 4 TOO MANY VOCABULARY WORDS +C 5 REQUIRED VOCABULARY WORD NOT FOUND +C 6 TOO MANY RTEXT OR MTEXT MESSAGES +C 7 TOO MANY HINTS +C 8 LOCATION HAS COND BIT BEING SET TWICE +C 9 INVALID SECTION NUMBER IN DATABASE +C 20 SPECIAL TRAVEL (500>L>300) EXCEEDS GOTO LIST +C 21 RAN OFF END OF VOCABULARY TABLE +C 22 VOCABULARY TYPE (N/1000) NOT BETWEEN 0 AND 3 +C 23 INTRANSITIVE ACTION VERB EXCEEDS GOTO LIST +C 24 TRANSITIVE ACTION VERB EXCEEDS GOTO LIST +C 25 CONDITIONAL TRAVEL ENTRY WITH NO ALTERNATIVE +C 26 LOCATION HAS NO TRAVEL ENTRIES +C 27 HINT NUMBER EXCEEDS GOTO LIST +C 28 INVALID MONTH RETURNED BY DATE FUNCTION + + TYPE 1, NUM +1 FORMAT (' FATAL ERROR, SEE SOURCE CODE FOR INTERPRETATION.'/ + 1 ' PROBABLY CAUSE: ERRONEOUS INFO IN DATABASE.'/ + 2 ' ERROR CODE =',I2/) + STOP + END + + INTEGER FUNCTION SCORES (MXSCOR,CHEST,MAXDIE,SCORNG,BONUS,HNTMAX, + 1 MAXTRS) + IMPLICIT INTEGER (A-Z) + LOGICAL SCORNG +C +C EXIT CODE. WILL EVENTUALLY INCLUDE SCORING. FOR NOW, HOWEVER, ... +C +C THE PRESENT SCORING ALGORITHM IS AS FOLLOWS: +C OBJECTIVE:POINTS: PRESENT TOTAL POSSIBLE: +C GETTING WELL INTO CAVE 2525 +C EACH TREASURE < CHEST 1284 +C TREASURE CHEST ITSELF 1414 +C EACH TREASURE > CHEST 16 208 +C SURVIVING (MAX-NUM)*10 40 +C NOT QUITTING 4 4 +C REACHING "CLOSNG" 2525 +C "CLOSED": QUIT/KILLED 10 +C KLUTZED 25 +C WRONG WAY 30 +C SUCCESS 4545 +C CAME TO WITT'S END 1 1 +C ROUND OUT THE TOTAL 2 2 +CTOTAL: 448 +C (POINTS CAN ALSO BE DEDUCTED FOR USING HINTS.) +C + COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG + COMMON /PTXCOM/ PTEXT + DIMENSION PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), + 1ATLOC(200),PTEXT(100) + COMMON /SAVCOM/ SEGOFF,ABBNUM,ATTACK,CLOCK1,CLOCK2,CLOSED,CLOSNG, + 1 DETAIL,DFLAG,DKILL,DLOC,DSEEN,DTOTAL,GAVEUP,HINT,HINTED, + 2 IWEST,KNFLOC,LIMIT,LMWARN,LOC,NUMDIE,PANIC,PROP,STICK, + 3 TALLY,TALLY2,TURNS,WZDARK,XXD,XXT,ACCT,HINTLC,HINTS, + 4 FILLER +C + LOGICAL CLOSNG,CLOSED,HINTED + DIMENSION HINTLC(20),HINTED(20),HINTS(20,4),PROP(100) + DIMENSION DSEEN(12),DLOC(12),ODLOC(12) + LOGICAL DSEEN + DIMENSION FILLER(20) +C +C MAGZIN = VOCAB(CODE('MAGA','Z'),1) + MAGZIN=VOCAB('MAGAZ',1) +20000 SCORES=0 + MXSCOR=0 +C +C FIRST TALLY UP THE TREASURES. MUST BE IN BUILDING AND NOT BROKEN. +C GIVE THE POOR GUY 2 POINTS JUST FOR FINDING EACH TREASURE. +C + DO 20010 I=50,MAXTRS + IF(PTEXT(I).EQ.0)GOTO 20010 + K=12 + IF(I.EQ.CHEST)K=14 + IF(I.GT.CHEST)K=16 + IF(PROP(I).GE.0)SCORES=SCORES+2 + IF(PLACE(I).EQ.3.AND.PROP(I).EQ.0)SCORES=SCORES+K-2 + MXSCOR=MXSCOR+K +20010 CONTINUE +C +C NOW LOOK AT HOW HE FINISHED AND HOW FAR HE GOT. MAXDIE AND NUMDIE TELL US +C HOW WELL HE SURVIVED. GAVEUP SAYS WHETHER HE EXITED VIA QUIT. DFLAG WILL +C TELL US IF HE EVER GOT SUITABLY DEEP INTO THE CAVE. CLOSNG STILL INDICATE +C WHETHER HE REACHED THE ENDGAME. AND IF HE GOT AS FAR AS "CAVE CLOSED" +C (INDICATED BY "CLOSED"), THEN BONUS IS ZERO FOR MUNDANE EXITS OR 133, 134, +C 135 IF HE BLEW IT (SO TO SPEAK). +C + SCORES=SCORES+(MAXDIE-NUMDIE)*10 + MXSCOR=MXSCOR+MAXDIE*10 + IF(.NOT.SCORNG)SCORES=SCORES+4 + MXSCOR=MXSCOR+4 + IF(DFLAG.NE.0)SCORES=SCORES+25 + MXSCOR=MXSCOR+25 + IF(CLOSNG)SCORES=SCORES+25 + MXSCOR=MXSCOR+25 + IF(.NOT.CLOSED)GOTO 20020 + IF(BONUS.EQ.0)SCORES=SCORES+10 + IF(BONUS.EQ.135)SCORES=SCORES+25 + IF(BONUS.EQ.134)SCORES=SCORES+30 + IF(BONUS.EQ.133)SCORES=SCORES+45 +20020 MXSCOR=MXSCOR+45 +C +C DID HE COME TO WITT'S END AS HE SHOULD? +C + IF(PLACE(MAGZIN).EQ.108)SCORES=SCORES+1 + MXSCOR=MXSCOR+1 +C +C ROUND IT OFF. +C + SCORES=SCORES+2 + MXSCOR=MXSCOR+2 +C +C DEDUCT POINTS FOR HINTS. HINTS < 4 ARE SPECIAL; SEE DATABASE DESCRIPTION +C + MAXHNT = HNTMAX + DO 20030 I=1,MAXHNT +20030 IF(HINTED(I))SCORES=SCORES-HINTS(I,2) +C + RETURN + END + + SUBROUTINE LOAD(WORD) + IMPLICIT INTEGER (A-Z) + RETURN + +C + DATA XFILE/'FILE'/, XREST/'REST'/ + IF (WORD.EQ.XFILE) GOTO 50 + IF (WORD.EQ.XREST) GOTO 30 + WRITE (6,10) WORD +10 FORMAT (' LOAD OPTION ',A4,' NOT IMPLEMENTED') + GOTO 100 +30 CALL RESTOR + GOTO 100 +50 CALL FILE +100 CONTINUE + RETURN + END + + INTEGER FUNCTION SHIFT(VAL,DIST) + IMPLICIT INTEGER(A-Z) + SHIFT=VAL + IF(DIST)10,20,30 +10 IDIST=-DIST + DO 11 I=1,IDIST + J=0 + IF(SHIFT.LT.0)J="200000000000 +11 SHIFT=((SHIFT.AND."377777777777)/2).OR.J +20 RETURN +30 DO 31 I=1,DIST + J=0 + IF((SHIFT.AND."200000000000).NE.0)J=-34359738367 + SHIFT=((SHIFT.AND."177777777777)*2)+J +31 SHIFT=SHIFT.AND."777777777776 + RETURN + END diff --git a/src/games/trek.2 b/src/games/trek.2 new file mode 100644 index 00000000..62fbc337 --- /dev/null +++ b/src/games/trek.2 @@ -0,0 +1,1760 @@ +C THIS FILE HAS BEEN MODIFIED BY EJS@MIT-MC +C LAST UPDATE -- 4/18/79 + + IMPLICIT INTEGER(A-Z) +C +C SPACE--THE FINAL FRONTIER +C ----- --- ----- -------- +C +C +C THESE ARE THE VOYAGES OF THE STARSHIP 'ENTERPRISE.' +C IT'S FIVE YEAR MISSION: TO EXPLORE STRANGE NEW WORLDS; TO SEEK +C OUT NEW LIFE AND NEW CIVILIZATIONS; TO BOLDLY GO WHERE NO MAN +C HAS GONE BEFORE. +C +C THIS IS 'STAR TREK'. +C + REAL RAN,XXX,R,FLOAT,WARP,X,Y,DAMAGE,COS,SIN,ALOG10, + $K5,YYY,SQRT,AMIN1,ATAN2,PIE,DELTAX,DELTAY,SIGN,AMAX1, + $ATAN,RATING,MINWRP,XWARP,YWARP,RESUSD,X2,X3,TEMP,TT + LOGICAL SAVRES,FILE + DIMENSION QDOL(6),GALAXY(14,14),QUADRT(8,8),DAMAGE(11), + $KLING1(9,2),LONG(3),KNOWN(14,14),CLOAK(8,8),DAMSTR(3,11), + $LDOL(64),KLING2(9),LINE(8),LOCATE(8,14,14),RANKS(3,12), + $HITVAL(9),CDOL(2),TDATE(2),FLAGSH(3) + COMMON DAMSTR + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + DATA BNAME,PIE,DOCKED/'-1 ',3.1415926,'DOCKE'/ + DATA YES,NO/'Y ','N '/ + DATA QDOL/'-','E','K','B','*','F'/ + DATA DAMSTR/'WARP ','ENGIN','ES ','S.R. ','SENSO','RS ', + $'L.R. ','SENSO','RS ','PHASE','R CON','TROL ', + $'PHOTO','N TUB','ES ','DAMAG','E CON','TROL ', + $'DEFLE','CTORS',' ','COMMU','NICAT','IONS ', + $'TRANS','PORTE','R ','TRACT','OR BE','AMS ', + $'BATTL','E COM','PUTER'/ + DATA LDOL/'G VIR','GO II','SOL I','II ','G DRA','CO IT', + $'RIGEL',' III ','DENEB',' VII ','ANTAR','ES II','CANOP', + $'US V ','CAPEL','LA VI','POLLU','X III','SPICA',' VIII', + $'VEGA ','VII ','ALTAI','R III','PROCY','ON I ','LALAN', + $'DE II','KRUGE','R IV ','SIRIU','S VII','HAMAL',' VII ', + $'POLAR','IS II','ALKAI','D II ','ACAMA','R VI ','AVIOR', + $' III ','CETUS',' VII ','NUNKI',' VII ','ANKAA',' III ', + $'MENKE','NT VI','DIPHD','A III','VALIO','TH VI','SUHAI', + $'L VI ','A SER','PEN I','G CAR','INA V','A AQU','ILA I', + $'CALLA','M 1X '/ + DATA RANKS/'YEOMA','N ',' ', + $'ENSIG','N ',' ', + $'LIEUT','ENANT',', JG ', + $'LIEUT','ENANT',' ', + $'LT CO','MMAND','ER ', + $'COMMA','NDER ',' ', + $'CAPTA','IN ',' ', + $'COMMO','DORE ',' ', + $'REAR ','ADMIR','AL ', + $'VICE ','ADMIR','AL ', + $'ADMIR','AL ',' ', + $'FLEET',' ADMI','RAL '/ +C C + NIN=5 + NOUT=5 + WRITE (NOUT,10) +10 FORMAT('0STREK VERSION DATED 18 APRIL 79. SEND BUGS TO EJS@MC'/) + CALL TIME(A,XXX) + XXX=XXX*(2.**5) + XXX=XXX/(2.**5) + CALL SETRAN(XXX) + RATING=500. + GAMES=0 + WINS=0 + FILE=.FALSE. + STAMOD=1 + SHOMOD=0 + LONMOD=1 + TT=0 +12 WRITE (NOUT,11) +11 FORMAT (' DO YOU WANT TO LOAD YOUR BATTLE RECORD?') + WRITE (NOUT, 15) +15 FORMAT (' USE CAPITAL LETTERS PLEASE. ',$) + READ (NIN,665,ERR=12) CCC + IF (CCC.EQ.YES) GO TO 1305 + IF (CCC.NE.NO) GO TO 12 + WRITE (NOUT,13) +13 FORMAT (' YOUR RATING IS 500 AND YOUR RANK IS ENSIGN.') +C C +C INITIALIZE A NEW GAME +C +85 IMESS=0 + LSTCOM=-1 + PRTY=0 + DEFLCT=0 + BOARD=0 + EUSED=0 + PUSED=0 + BUSED=0 + KLGMAX=200 + STTORP=10 + STENEG=3000 + SHUSIG=0 + BEGDAT=2000.*(1.+RAN(XXX)) + CURDAT=BEGDAT +87 WRITE (NOUT,90) +90 FORMAT(' WHAT SIZE GALAXY DO YOU WISH TO DEFEND?(1 TO 14)',$) + READ (NIN,259,ERR=87) GALSIZ + WRITE (NOUT, 92) +92 FORMAT('0TO LIST COMMANDS, TYPE -1. DO NOT USE LETTERS.'//) + IF (GALSIZ.LT.1.OR.GALSIZ.GT.14) GO TO 87 + DO 95 I=1,GALSIZ + DO 95 J=1,GALSIZ +95 KNOWN(I,J)=0 + ENERGY=STENEG + TORPS=STTORP + PROBES=GALSIZ/2. + IF (2*PROBES.NE.GALSIZ) PROBES=PROBES+RAN(XXX)+.5 + DO 104 I=1,11 +104 DAMAGE(I)=0 + QUADRW=GALSIZ*RAN(XXX)+1. + QUADCL=GALSIZ*RAN(XXX)+1. +C C +C SET UP GALAXY +C + FLAGSH(1)=0 + FLAGSH(2)=0 + FLAGSH(3)=1 + TOTBAS=0 + TOTENE=0 + KQUADS=0 + DO 121 I=1,GALSIZ + DO 121 J=1,GALSIZ + R=RAN(XXX)*64. + ENEMYS=XLTY(R,.08)+XLTY(R,.16)+XLTY(R,.26)+XLTY(R,.5) + ENEMYS=ENEMYS+XLTY(R,1.2)+XLTY(R,3.)+XLTY(R,7.) + ENEMYS=ENEMYS+XLTY(R,13.)+XLTY(R,25.) + IF (ENEMYS.NE.0) KQUADS=KQUADS+1 + TOTENE=TOTENE+ENEMYS + BASES=0 + IF (RAN(XXX).LE..96) GO TO 120 + BASES=1 + IF (RAN(XXX).GE..80) BASES=2 +120 TOTBAS=TOTBAS+BASES + STARS=RAN(XXX)*9.+1. +121 GALAXY(I,J)=ENEMYS*100+BASES*10+STARS + IF (TOTENE.GT.0) GO TO 125 + I=RAN(XXX)*GALSIZ+1. + J=RAN(XXX)*GALSIZ+1. + GALAXY(I,J)=GALAXY(I,J)+100 + TOTENE=1 + KQUADS=1 +125 IF (TOTENE.LE.4) GO TO 127 + K=RAN(XXX)*GALSIZ+1 + L=RAN(XXX)*GALSIZ+1 +126 DO 129 I=K,GALSIZ + DO 129 J=L,GALSIZ + IF (GALAXY(I,J)/100.EQ.0) GO TO 129 + FLAGSH(1)=I + FLAGSH(2)=J + GO TO 127 +129 CONTINUE + K=1 + J=1 + GO TO 126 +127 STTOTE=TOTENE + IF (TOTBAS.GT.0) GO TO 128 + I=RAN(XXX)*GALSIZ+1. + J=RAN(XXX)*GALSIZ+1. + GALAXY(I,J)=GALAXY(I,J)+10 + TOTBAS=1 +128 BOTTOM=KQUADS+TOTENE/2+GALSIZ*GALSIZ/KQUADS/2. + TOP=2*TOTENE + SPREAD=TOP-BOTTOM + SPREAD=SPREAD*(1.-ALOG10(FLOAT(GALSIZ))/3.) + AVADAT=10.*(SPREAD*RAN(XXX)+BOTTOM) + L=BEGDAT+AVADAT + CALL DATE(TDATE) + CALL TIME(TIMES) + WRITE (NOUT,130) TIMES,TDATE(1),TDATE(2) +130 FORMAT (' CURRENT TIME IS ',A5,' ON ',A5,A4) + IF (GAMES.EQ.0) GO TO 641 + WRITE (NOUT,642) TOTENE,AVADAT +642 FORMAT (' YOUR MISSION: ',I3,' KLINGONS IN ',I4,' STARDATES.') + GO TO 643 +641 WRITE (NOUT,640) CURDAT,TOTENE,AVADAT,L +640 FORMAT(' ORDERS: STARDATE = ',I4// + $' YOU ARE IN COMMAND OF THE UNITED STARSHIP ENTERPRISE.'/ + $' YOUR MISSION IS TO RID THE GALAXY OF THE DEADLY'/ + $' KLINGON MENACE. TO DO THIS, YOU MUST DESTROY THE'/ + $' KLINGON INVASION FORCE OF ',I3,' BATTLE CRUISERS.'/ + $' YOU HAVE ',I4,' STARDATES TO COMPLETE YOUR MISSION.'/ + $' (I.E. UNTIL STARDATE ',I4,' ).'//) +C C +C SET UP EACH QUADRANT +C +C FIRST, FIND A PLACE TO PUT ALL THE KLINGONS +643 DO 830 I=1,GALSIZ + DO 830 J=1,GALSIZ + DO 710 R1=1,8 + DO 710 R2=1,8 +710 QUADRT(R1,R2)=0 + L=GALAXY(I,J) + ENEMYS=L/100 + L=L-100*ENEMYS + BASES=L/10 + STARS=L-10*BASES + IF (ENEMYS.EQ.0) GO TO 740 + DO 730 L=1,ENEMYS +720 R1=8.*RAN(XXX)+1. + R2=8.*RAN(XXX)+1. + IF (QUADRT(R1,R2).NE.0) GO TO 720 + QUADRT(R1,R2)=2 +730 IF (RAN(XXX).LT..3) QUADRT(R1,R2)=6 +740 IF (BASES.EQ.0) GO TO 770 + DO 760 L=1,BASES +750 R1=8.*RAN(XXX)+1. + R2=8.*RAN(XXX)+1. + IF (QUADRT(R1,R2).NE.0) GO TO 750 +760 QUADRT(R1,R2)=3 +770 IF (STARS.EQ.0) GO TO 800 + DO 790 L=1,STARS +780 R1=8.*RAN(XXX)+1. + R2=8.*RAN(XXX)+1. + IF (QUADRT(R1,R2).NE.0) GO TO 780 +790 QUADRT(R1,R2)=4 +800 DO 820 R1=1,8 + L=0 + DO 810 R2=1,8 +810 L=8*L+QUADRT(R1,R2) +820 LOCATE(R1,I,J)=L +830 CONTINUE + LQUADR=0 +C C +C MOVE THE ENTERPRISE INTO A NEW QUADRANT +C +131 DO 900 I=1,9 + KLING1(I,1)=0 + KLING1(I,2)=0 +900 KLING2(I)=0 + L=0 + DO 860 I=1,8 + IF (LQUADR.EQ.0) GO TO 855 + M=0 + DO 850 J=1,8 +850 M=8*M+QUADRT(I,J) + LOCATE(I,LQUADR,LQUADC)=M +855 M=LOCATE(I,QUADRW,QUADCL) + DO 860 J=1,8 + R1=9-J + R2=M/8 + QUADRT(I,R1)=M-8*R2 + CLOAK(I,J)=1 + IF (QUADRT(I,R1).NE.2.AND.QUADRT(I,R1).NE.6) GO TO 860 + L=L+1 + KLING1(L,1)=I + KLING1(L,2)=R1 + KLING2(L)=KLGMAX + IF (QUADRT(I,R1).EQ.6) CLOAK(I,R1)=0 +860 M=R2 + M=GALAXY(QUADRW,QUADCL) + ENEMYS=M/100 + M=M-100*ENEMYS + BASES=M/10 + STARS=M-10*BASES + IF (L.EQ.ENEMYS) GO TO 870 +865 WRITE (NOUT,950) L, ENEMYS,GALAXY(QUADRW,QUADCL), + $QUADRW,QUADCL,FLAGSH(1),FLAGSH(2),FLAGSH(3) +C SOME ENEMIES IN THIS QUADRANT HAVE DISAPPEARED +950 FORMAT(' PROGRAM ERROR 950. L = ',I3,' ENEMYS = ',I3 + $/' GALAXY(QUADRW,QUADCL) = ',I4,' QUADRW = ',I3, + $' QUADCL = ',I3/' FLAGSH = ',I3,2X,I3,2X,I3) + GO TO 99999 +870 SECTRW=8.*RAN(XXX)+1. + SECTCL=8.*RAN(XXX)+1. + IF (QUADRT(SECTRW,SECTCL).NE.0) GO TO 870 + QUADRT(SECTRW,SECTCL)=1 + IF (FLAGSH(1).NE.QUADRW.OR.FLAGSH(2).NE.QUADCL) GO TO 875 + IF (ENEMYS.EQ.0) GO TO 865 + FLAGSH(3)=RAN(XXX)*ENEMYS+1 + KLING2(FLAGSH(3))=2*KLGMAX +875 CALL SB171(1) + LQUADR=QUADRW + LQUADC=QUADCL +162 COMAND=-1 + PRTY=0 + IF (ENEMYS.NE.0) CALL SB585 + IF (ENERGY.LE.0) GO TO 619 +161 SENFLG=1 + IF (SHOMOD.EQ.0.AND.(SENFST.EQ.1.OR.LONMOD.EQ.1)) GO TO 163 + IF (LONMOD.EQ.0) GO TO 363 + IF (STAMOD.EQ.0) GO TO 220 + GO TO 236 +C C +C PERFORM SHORT RANGE SENSOR SCAN +C +163 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + KNOWN(QUADRW,QUADCL)=1 +169 IF (DAMAGE(2).GE.0) GO TO 196 + WRITE (NOUT,191) +191 FORMAT(' *** SHORT RANGE SENSORS ARE OUT ***') + IF (BOARD.EQ.0) GO TO 215 + WRITE (NOUT,195) QUADRW,QUADCL +195 FORMAT(' SHUTTLECRAFT SHORT RANGE SENSOR SCAN FOR QUADRANT ', + $I2,',',I2/' ---------------') + GO TO 198 +196 WRITE (NOUT,197) QUADRW, QUADCL +197 FORMAT (' SHORT RANGE SENSOR SCAN FOR QUADRANT ',I2,',',I2/ + $' ---------------') +198 DO 217 I=1,8 + DO 212 J=1,8 + LINE(J)=6.*RAN(XXX)+1. + IF (DAMAGE(2).NE.0.AND.RAN(XXX).GE..98) GO TO 212 + LINE(J)=QUADRT(I,J)+1 + IF (LINE(J).EQ.6) LINE(J)=5 + IF (LINE(J).EQ.7) LINE(J)=3 + IF (FLAGSH(1).EQ.QUADRW.AND.FLAGSH(2).EQ.QUADCL.AND. + $KLING1(FLAGSH(3),1).EQ.I.AND.KLING1(FLAGSH(3),2).EQ.J) LINE(J)=6 + LINE(J)=(LINE(J)-1)*CLOAK(I,J)+1 +212 CONTINUE + WRITE (NOUT,211) (QDOL(LINE(J)),J=1,8) +211 FORMAT(1X,8(A1,1X)) +217 CONTINUE + WRITE (NOUT,218) +218 FORMAT(' ---------------') +215 CONTINUE + IF (SENFLG.EQ.1.AND.LONMOD.EQ.0.AND.SENFST.EQ.1) GO TO 363 + IF (STAMOD.EQ.0.AND.SENFLG.EQ.1) GO TO 222 + GO TO 236 +C C +C REPORT ON THE ENTERPRISE'S STATUS +C +220 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DAMAGE(11).EQ.0) GO TO 222 + WRITE (NOUT,1410) + GO TO 236 +222 WRITE (NOUT,221)CURDAT +221 FORMAT(' STARDATE ',I4) + WRITE (NOUT,223) CDOL +223 FORMAT(' CONDITION ',2A5) + WRITE (NOUT,225) QUADRW,QUADCL +225 FORMAT(' QUADRANT ',I2,',',I2) + WRITE (NOUT,227) SECTRW,SECTCL +227 FORMAT(' SECTOR ',I2,',',I1) + WRITE (NOUT,229) ENERGY +229 FORMAT(' ENERGY ',I4) + WRITE (NOUT,231) TORPS, PROBES +231 FORMAT(' PHOTON TORPEDOES ',I2,' /SCANNER PROBES ',I1) + L=AVADAT+BEGDAT-CURDAT + WRITE (NOUT,233) TOTENE,L +233 FORMAT(' KLINGONS LEFT ',I3,' /STARDATES LEFT ',I4) + IF (DEFLCT.GT.0) WRITE (NOUT,235) DEFLCT +235 FORMAT(' DEFLECTOR POWER ',I4) + GO TO 236 +C C +C CHECK FOR PRIORITY DISTRESS SIGNALS +C +236 IF (RAN(XXX).LT..912445.OR.BOARD.NE.0.OR.BEGDAT+10.LT.CURDAT) + $ GO TO 237 + WRITE (NOUT,167) +167 FORMAT(' SHUTTLECRAFT SIGNALS HAVE BEEN RECEIVED FROM THE ', + $'GALILEO') + SHUSIG=1 +237 SENFLG=0 + IF (PRTY.EQ.2) PRTY=1 + IF (PRTY.NE.3.OR.RAN(XXX).GE..10) GO TO 164 + WRITE (NOUT,165) +165 FORMAT('0PRIORITY DISTRESS SIGNAL CANCELED') + PRTY=0 +164 IF (DAMAGE(1).NE.0) GO TO 257 + IF (PRTY.EQ.1) GO TO 245 + IF (TOTENE.EQ.ENEMYS.OR.RAN(XXX).LT..97) GO TO 257 +239 PTYROW=GALSIZ*RAN(XXX)+1. + PTYCOL=GALSIZ*RAN(XXX)+1. + IF (GALAXY(PTYROW,PTYCOL).LT.100.OR.(PTYCOL.EQ.QUADCL.AND. + $PTYROW.EQ.QUADRW)) GO TO 239 + I=GALAXY(PTYROW,PTYCOL)/100 + PRTY=1 + IF (I.GT.4) GO TO 241 + PRTY=3 + IF (I.EQ.1) GO TO 241 + PRTY=(7-I)/2.+RAN(XXX) + IF (I.EQ.2.OR.I.EQ.4) GO TO 241 + PRTY=3.*RAN(XXX)+1. +241 WRITE (NOUT,242) PRTY +242 FORMAT(' PRIORITY ',I1,' DISTRESS SIGNAL FROM '$) + R1=RAN(XXX)*32.+1. + R1=2*R1-1 + WRITE (NOUT,243) LDOL(R1),LDOL(R1+1),PTYROW,PTYCOL +243 FORMAT('+',2A5,' IN QUADRANT ',I2,',',I2/) + IF (PRTY.NE.1) GO TO 257 +245 DELTAY=QUADRW-PTYROW + DELTAX=PTYCOL-QUADCL + WARP=SQRT(DELTAY*DELTAY+DELTAX*DELTAX) + WRITE (NOUT,246) +246 FORMAT(' COURSE LAID AS:'/) + WRITE (NOUT,248) WARP +248 FORMAT(' WARP FACTOR: ',F4.1) + DELTAX=QUADRW-PTYROW + DELTAY=PTYCOL-QUADCL + COURSE=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY) + IF (COURSE.LT.0) COURSE=COURSE+360 +255 WRITE (NOUT,254) COURSE +254 FORMAT(' COURSE: ',I3) + GO TO 302 +257 CONTINUE +C C +C COMMAND DISPATCHER +C + LSTCOM=COMAND +256 WRITE (NOUT,258) +258 FORMAT(' COMMAND?',$) + READ (NIN,259,ERR=265) COMAND +259 FORMAT(I) + IF (COMAND.LT.0) GO TO 263 + IF (COMAND.GT.20) GO TO 265 +261 FORMAT(' ACKNOWLEDGED') + L=COMAND+1 + GO TO (282,163,363,384,420,482,497,509,530,541,544,561, + $564,902,1105,1205,1305,1405,220,619,3100),L +265 WRITE (NOUT,262) +262 FORMAT(' ILLEGAL COMMAND. (ENTER -1 FOR HELP)') + GO TO 256 +263 WRITE (NOUT,264) +264 FORMAT(/' ::: COMMANDS :::'// + $' <0 = LIST THE COMMANDS(0)'/ + $' 0 = ACTIVATE WARP ENGINES(2-12)*'/ + $' 1 = PERFORM SHORT RANGE SENSOR SCAN(1)'/ + $' 2 = PERFORM LONG RANGE SENSOR SCAN(1)'/ + $' 3 = FIRE PHASERS(1)*'/ + $' 4 = FIRE A PHOTON TORPEDO(1)*'/ + $' 5 = OBTAIN DAMAGE CONTROL REPORT(1)'/ + $' 6 = ACTIVATE DEFLECTORS(1)'/ + $' 7 = OPEN COMMUNICATIONS(1)*'/ + $' 8 = ENERGIZE TRANSPORTER(1)*') + WRITE (NOUT,3000) +3000 FORMAT(' 9 = DROP DEFLECTORS(1)*'/ + $' 10 = ACTIVATE TRACTOR BEAMS(1)'/ + $' 11 = FIRE TORPEDO SPREAD(1)*'/ + $' 12 = OBTAIN COMPUTER GALAXY MAP(1)'/ + $' 13 = RESET SENSOR MODES(0)'/ + $' 14 = LAUNCH SUPER LONG RANGE SENSOR PROBE(1)'/ + $' 15 = SAVE GAME(0)'/ + $' 16 = RESTORE PREVIOUS GAME(0)'/ + $' 17 = QUESTION THE BATTLE COMPUTER(1)'/ + $' 18 = REPORT ENTERPRISE SITUATION(1)'/ + $' 19 = SURRENDER!(0)'/ + $' 20 = CANCEL PRIORITY 3 DISTRESS SIGNAL(1)'// + $' NUMBER IN PARENTHESES IS # OF STARDATES COMMAND USES.'/ + $' AN * INDICATES KLINGONS MAY FIRE AFTER COMMAND USE.'/ + $' -1 WITHIN A COMMAND WILL CANCEL IT.'/ + $' COURSE FOR 0, 4, 11, AND 14 IS IN CLOCKWISE DEGREES'/ + $' WITH 0 DEGREES BEING NORTH'/) + GO TO 236 +C +C +C CANCEL PRIORITY 3 DISTRESS SIGNALS +C +3100 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (PRTY.EQ.3) GO TO 3110 + WRITE (NOUT,3105) +3105 FORMAT (' NO PRIORITY 3 DISTRESS SIGNAL ACTIVE.') + GO TO 236 +3110 WRITE (NOUT,3115) +3115 FORMAT (' PRIORITY 3 DISTRESS SIGNAL CANCELED.') + PRTY=0 + GO TO 236 +C C +C ACTIVATE WARP ENGINES +C +282 PRTY=MIN0(1,PRTY) + IF (PRTY.GT.0) GO TO 245 + IF (LSTCOM.EQ.17) GO TO 287 +284 WRITE (NOUT,285) +285 FORMAT(' COURSE (0-359)?',$) + READ (NIN,259,ERR=284) ENGINE + IF (ENGINE.LT.0) GO TO 236 + IF (ENGINE.GT.359) GO TO 284 +289 WRITE (NOUT,290) +290 FORMAT(' WARP FACTOR (0.-20.)?',$) + READ (NIN,286,ERR=289) WARP +286 FORMAT(F) + IF (WARP.LE.0.) GO TO 236 +287 IF (WARP.GT.20.) GO TO 284 + IF (LSTCOM.EQ.17.AND.SHOMOD.EQ.1.AND.LONMOD.EQ.1) + $WRITE (NOUT,261) + IF (DAMAGE(1).EQ.0.OR.WARP.LT..31) GO TO 302 + WRITE (NOUT,297) +297 FORMAT(' WARP ENGINES ARE DAMAGED. MAXIMUM SPEED = WARP .3') + GO TO 284 +302 IF (ENEMYS.EQ.0) GO TO 305 + CALL SB585 + IF (ENERGY.LE.0) GO TO 619 +305 DO 307 I=1,11 +307 DAMAGE(I)=AMIN1(DAMAGE(I)+1.,0.) + N=WARP*8. + ENERGY=MIN0(STENEG,ENERGY-2*N) + CURDAT=CURDAT+2 + IF (WARP.GE.1.) CURDAT=CURDAT+(WARP+1.)/2. + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + QUADRT(SECTRW,SECTCL)=0 + IF (PRTY.EQ.1) GO TO 360 + YYY=ENGINE*PIE/180. + DELTAX=SIN(YYY) + DELTAY=-COS(YYY) + X=SECTRW + Y=SECTCL + DO 353 I=1,N + X=X+DELTAY + Y=Y+DELTAX + L=X+.5 + M=Y+.5 + IF (L.LT.1.OR.L.GT.8.OR.M.LT.1.OR.M.GT.8) GO TO 358 + IF (QUADRT(L,M).EQ.0) GO TO 353 + WRITE (NOUT,349) L,M +349 FORMAT(' ENTERPRISE BLOCKED BY OBJECT AT SECTOR ',I1,',',I1) + X=X-DELTAY + Y=Y-DELTAX + GO TO 354 +353 CONTINUE +354 SECTRW=X+.5 + SECTCL=Y+.5 + QUADRT(SECTRW,SECTCL)=1 + CALL SB171(1) + IF (ENEMYS.NE.0) CALL SB585 + IF (ENERGY.LE.0) GO TO 619 + GO TO 161 +358 IF (RAN(XXX).GT..03.OR.DAMAGE(1).LT.0.) GO TO 309 + QUADRW=GALSIZ*RAN(XXX)+1. + QUADCL=GALSIZ*RAN(XXX)+1. + WRITE (NOUT,310) QUADRW,QUADCL +310 FORMAT(' *** SPACE WARP, ENTERPRISE THROWN OFF COURSE ***'/ + $' NOW IN QUADRANT ',I2,',',I2) + QUADRT(SECTRW,SECTCL)=0 + CURDAT=CURDAT+2+5*RAN(XXX) + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + GO TO 131 +309 IF (RAN(XXX).GT..3) GO TO 330 + R1=11.5*RAN(XXX) + IF (R1.EQ.0) R1=2 + YYY=(AVADAT/10.)/STTOTE + YYY=ATAN(YYY)/1.8+.07 + L=BEGDAT+AVADAT-CURDAT + IF (RAN(XXX).GT.YYY.OR.FLOAT(L)/AVADAT.LT..15) GO TO 318 + YYY=AMIN1(RAN(XXX)*2.*L/(10.*TOTENE)+1.,6.) + DAMAGE(R1)=AMAX1(DAMAGE(R1)-YYY,-10.) + WRITE (NOUT,315) +315 FORMAT(' *** SPACE STORM, ',$) + WRITE (NOUT,316) (DAMSTR(I,R1),I=1,3) +316 FORMAT('+',3A5,' DAMAGED ***') + GO TO 335 +318 CALL SB320 +330 IF (RAN(XXX).GT..03) GO TO 335 + L=BEGDAT+AVADAT-CURDAT + I=(L/4+2)*RAN(XXX)+1 + IF (RAN(XXX).GT..6) I=-I + WRITE (NOUT,331) I +331 FORMAT (' *** TIME WARP OF ',I3,' STARDATES ***') + CURDAT=CURDAT+I + L=BEGDAT+AVADAT-CURDAT + WRITE (NOUT,333) L +333 FORMAT (1X,I3,' STARDATES NOW LEFT') +335 DEFLCT=0 + TRNFLG=0 + COMSIG=0 + SHUSIG=0 + R2=DELTAX*WARP*16. + R1=DELTAY*WARP*16. + L=QUADRW*16+SECTRW*2-1 + M=QUADCL*16+SECTCL*2-1 + L=MAX0(16,MIN0(16*GALSIZ+15,L+R1)) + M=MAX0(16,MIN0(16*GALSIZ+15,M+R2)) + QUADRW=L/16 + QUADCL=M/16 + GO TO 131 +360 QUADRW=PTYROW + QUADCL=PTYCOL + GO TO 131 +C C +C PERFORM LONG RANGE SENSOR SCAN +C +363 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DAMAGE(3).EQ.0.) GO TO 367 + WRITE (NOUT,365) +365 FORMAT(' LONG RANGE SENSORS ARE INOPERABLE') + GO TO 383 +367 WRITE (NOUT,366) QUADRW,QUADCL +366 FORMAT(' LONG RANGE SENSOR SCAN FOR QUADRANT ',I2,',',I2) +368 WRITE (NOUT,218) + IIL=QUADRW-1 + IIH=QUADRW+1 + JJL=QUADCL-1 + JJH=QUADCL+1 + DO 382 I=IIL,IIH + LONG(1)=0 + LONG(2)=0 + LONG(3)=0 + IF (I.LT.1.OR.I.GT.GALSIZ) GO TO 378 + DO 379 J=JJL,JJH + IF (J.LT.1.OR.J.GT.GALSIZ) GO TO 379 + LONG(J-QUADCL+2)=GALAXY(I,J) + KNOWN(I,J)=1 +379 CONTINUE +378 WRITE (NOUT,380) LONG +380 FORMAT(1X,I3,' : ',I3,' : ',I3) + WRITE (NOUT,218) +382 CONTINUE +383 IF (SENFLG.EQ.1.AND.SHOMOD.EQ.0.AND.SENFST.EQ.2) GO TO 163 + IF (SENFLG.EQ.1.AND.STAMOD.EQ.0) GO TO 222 + GO TO 236 +C C +C FIRE PHASERS +C +384 IF (DAMAGE(4).EQ.0..AND.DAMAGE(11).EQ.0.) GO TO 388 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + WRITE (NOUT,386) +386 FORMAT(' PHASERS ARE NOT OPERATIONAL') + GO TO 236 +388 WRITE (NOUT,387)ENERGY +387 FORMAT(' PHASERS LOCKED ON TARGET(S). ENERGY AVAILABLE = ', + $I4) + IF (LSTCOM.EQ.17.AND.PFLAG.EQ.1) GO TO 392 +391 WRITE (NOUT,389) +389 FORMAT(' NUMBER OF UNITS TO FIRE?',$) + READ (NIN,259,ERR=391) N + IF (N.LE.0) GO TO 236 +392 LSTCOM=-1 + IF (ENERGY.LE.N) GO TO 388 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (ENEMYS.EQ.0) GO TO 419 + X=0. + DO 390 I=1,9 + IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 390 + DELTAX=KLING1(I,1)-SECTRW + DELTAY=SECTCL-KLING1(I,2) + X=X+SQRT(DELTAY*DELTAY+DELTAX*DELTAX) +390 CONTINUE + IF (X.EQ.0.) GO TO 419 + IF (CDOL(1).NE.DOCKED) ENERGY=ENERGY-N + IF (CDOL(1).EQ.DOCKED) EUSED=EUSED+N + X=N/X + DO 416 I=1,9 + IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 416 + L=KLING1(I,1) + M=KLING1(I,2) + LOSS=X*(2.+RAN(XXX)) + KLING2(I)=KLING2(I)-LOSS + WRITE (NOUT,407) LOSS +407 FORMAT(1X,I4,' UNIT HIT ON KLINGON AT SECTOR ',$) + IF (CLOAK(L,M).EQ.0) GO TO 411 + WRITE (NOUT,409) L,M +409 FORMAT('+',I1,',',I1) + GO TO 412 +411 WRITE (NOUT,410) +410 FORMAT('+UNKNOWN') +412 WRITE (NOUT,413) KLING2(I) +413 FORMAT(' (',I4,' LEFT)') + IF (KLING2(I).GT.0) GO TO 416 + WRITE (NOUT,578) L,M +578 FORMAT(' KLINGON AT SECTOR ',I1,',',I1,' DESTROYED!') + ENEMYS=ENEMYS-1 + TOTENE=TOTENE-1 + QUADRT(L,M)=0 + IF (FLAGSH(1).EQ.QUADRW.AND.FLAGSH(2).EQ.QUADCL.AND. + $KLING1(FLAGSH(3),1).EQ.L.AND.KLING1(FLAGSH(3),2).EQ.M) + $FLAGSH(1)=0 + CLOAK(L,M)=1 + CALL SB171(0) +416 CONTINUE + GALAXY(QUADRW,QUADCL)=ENEMYS*100+BASES*10+STARS + IF (TOTENE.EQ.0) GO TO 626 + IF (ENEMYS.GT.0) CALL SB585 +418 IF (ENERGY.LE.0) GO TO 619 + GO TO 236 +419 WRITE (NOUT,415) +415 FORMAT(' NO KLINGONS HIT') + GO TO 236 +C C +C FIRE PHOTON TORPEDOES +C +420 IF (DAMAGE(5).EQ.0.) GO TO 424 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + WRITE (NOUT,422) +422 FORMAT(' PHOTON TUBES ARE NOT OPERATIONAL') + GO TO 236 +424 IF (TORPS.GT.0) GO TO 428 + WRITE (NOUT,425) +425 FORMAT(' ALL PHOTON TORPEDOES EXPENDED') + IF (COMAND.EQ.11) GO TO 476 + GO TO 236 +428 IF (COMAND.EQ.11) GO TO 432 + IF (LSTCOM.EQ.17.AND.TFLAG.EQ.1) GO TO 435 +427 WRITE (NOUT,429) +429 FORMAT(' TORPEDO COURSE (0-359)?',$) + READ (NIN,259,ERR=427) COURSE + GO TO 435 +432 COURSE=MOD(COURSE+45,360) + COUNT=COUNT+1 + IF (COUNT.GT.MAXTRP) GO TO 476 + WRITE (NOUT,434) COURSE +434 FORMAT(' COURSE: ',I3/) +435 IF (COURSE.LT.0) GO TO 236 + IF (COURSE.GT.359) GO TO 427 + IF (CDOL(1).NE.DOCKED) TORPS=TORPS-1 + IF (CDOL(1).EQ.DOCKED) PUSED=PUSED+1 + L=0 + CALL TRACK(COURSE,1,N,L,M) + IF (N.EQ.0) GO TO 474 + IF (N.NE.2.AND.N.NE.6) GO TO 460 + WRITE (NOUT,451) +451 FORMAT(/' *** KLINGON DESTROYED ***') + ENEMYS=ENEMYS-1 + TOTENE=TOTENE-1 + IF (TOTENE.EQ.0) GO TO 626 + DO 457 I=1,9 + IF (L.EQ.KLING1(I,1).AND.M.EQ.KLING1(I,2)) GO TO 458 +457 CONTINUE + WRITE (NOUT,456) +C NON-KLINGON KILLED. ?? +456 FORMAT(/' PROGRAM ERROR 456.') + GO TO 865 +458 KLING2(I)=0 + CLOAK(L,M)=1 + IF (FLAGSH(1).EQ.QUADRW.AND.FLAGSH(2).EQ.QUADCL.AND. + $FLAGSH(3).EQ.I) FLAGSH(1)=0 + CALL SB171(0) + GO TO 471 +460 IF (N.LT.4) GO TO 468 + IF (N.EQ.4) GO TO 465 + WRITE (NOUT,462) +462 FORMAT(/' STAR DESTROYED') + STARS=STARS-1 + GO TO 471 +465 WRITE (NOUT,466) +466 FORMAT(/' TORPEDO ABSORBED') + QUADRT(L,M)=5 + GO TO 475 +468 IF (N.EQ.3) GO TO 470 + WRITE (NOUT,469) +469 FORMAT(/' PROGRAM ERROR 469') + GO TO 99999 +470 WRITE (NOUT,467) +467 FORMAT(1X) + WRITE (NOUT,464) +464 FORMAT(/' *** STARBASE DESTROYED ... CONGRATULATIONS ***') + QUADRT(L,M)=0 + CALL SB171(0) + BASES=BASES-1 +471 QUADRT(L,M)=0 + GALAXY(QUADRW,QUADCL)=ENEMYS*100+BASES*10+STARS + GO TO 475 +474 WRITE (NOUT,473) +473 FORMAT(/' TORPEDO MISSED') +475 IF (COMAND.EQ.11) GO TO 420 +476 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (ENEMYS.NE.0) CALL SB585 + IF (ENERGY.LE.0) GO TO 619 + GO TO 236 +C C +C OBTAIN DAMAGE CONTROL REPORT +C +482 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DAMAGE(6).EQ.0.) GO TO 486 + WRITE (NOUT,484) +484 FORMAT(' DAMAGE CONTROL REPORT IS NOT AVAILABLE') + GO TO 236 +486 WRITE (NOUT,487) +487 FORMAT(/' DAMAGED'/' DEVICE STATE OF REPAIR') + L=0 + DO 492 I=1,11 + IF (DAMAGE(I).EQ.0.) GO TO 492 + WRITE (NOUT,491) (DAMSTR(J,I),J=1,3),DAMAGE(I) +491 FORMAT(1X,3A5,7X,F10.4) + L=1 +492 CONTINUE + IF (L.EQ.1) GO TO 495 + WRITE (NOUT,494) +494 FORMAT(' NONE') +495 WRITE (NOUT,467) + GO TO 236 +C C +C ACTIVATE DEFLECTORS +C +497 IF (DEFLCT.LT.4000) GO TO 498 + WRITE (NOUT,506) +506 FORMAT (' DEFLECTORS AT MAXIMUM STRENGTH') +504 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + GO TO 236 +498 IF (DAMAGE(7).EQ.0.) GO TO 501 + WRITE (NOUT,499) +499 FORMAT(' DEFLECTORS DAMAGED') + GO TO 504 +501 IF (CDOL(1).EQ.DOCKED) GO TO 525 + WRITE (NOUT,500) ENERGY +500 FORMAT(' ENERGY AVAILABLE = ',I4) +502 WRITE (NOUT,503) +503 FORMAT(' NUMBER OF UNITS TO DEFLECTORS?',$) + READ (NIN,259,ERR=502) S6 + IF (S6.LT.0) GO TO 236 + IF (DEFLCT+2*S6.LE.4000) GO TO 508 + S6=(4000-DEFLCT)/2 + WRITE (NOUT,507) S6 +507 FORMAT (' MAXIMUM AMOUNT ',I4) + GO TO 502 +508 IF (S6.GT.ENERGY) GO TO 501 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + DEFLCT=DEFLCT+2*S6 + ENERGY=ENERGY-S6 + WRITE (NOUT,505) DEFLCT,ENERGY +505 FORMAT (' DEFLECTOR POWER NOW = ',I4, + $', ENERGY UNITS LEFT = ',I4) + GO TO 525 +C C +C ATTEMPT COMMUNICATIONS +C +509 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DAMAGE(8).EQ.0.) GO TO 513 + WRITE (NOUT,511) +511 FORMAT(' COMMUNICATIONS OUT') + GO TO 236 +513 K4=0 + K5=0 + DO 518 I=1,9 + IF (KLING2(I).LE.0) GO TO 518 + K5=K5+KLING2(I) + K4=K4+1 +518 CONTINUE + IF (K4.EQ.0) GO TO 521 + IF (COMFLG.EQ.1) GO TO 520 + IF (K5/K4.LT.100..AND..3.LT.RAN(XXX)) GO TO 527 +520 I=RAN(XXX)*4. + WRITE (NOUT,3260) + IF (I.EQ.0) WRITE (NOUT,3270) + IF (I.EQ.1) WRITE (NOUT,3280) + IF (I.EQ.2) WRITE (NOUT,3290) + IF (I.EQ.3) WRITE (NOUT,3300) + GO TO 523 +521 WRITE (NOUT,522) +522 FORMAT(' NO KLINGONS CAN HEAR YOU') +523 COMFLG=1 +524 IF (ENEMYS.NE.0) CALL SB585 +525 IF (ENERGY.LE.0) GO TO 619 + GO TO 236 +527 WRITE (NOUT,528) +528 FORMAT(' TRUCE ACCEPTED') + CALL SB320 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + GO TO 236 +3260 FORMAT (' RESPONSE FROM KLINGON COMMANDER:') +3270 FORMAT (' NOT ON YOUR LIFE!') +3280 FORMAT (' A TRUCE?... NEVER!!!') +3290 FORMAT (' DO NOT INSULT THE KLINGON EMPIRE WITH ', + $'YOUR FAKE TRUCES!') +3300 FORMAT (' NO!, A KLINGON ALWAYS FIGHTS TO THE DEATH.') +C C +C TRANSPORT TORPEDOES FROM STARBASE +C +530 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DEFLCT.NE.0.OR.DAMAGE(2).NE.0..OR.DAMAGE(9).NE.0..OR. + $MOD(GALAXY(QUADRW,QUADCL),100).LT.10.OR.TORPS.GE.10) GO TO 532 + IF (TRNFLG.EQ.0) GO TO 537 + WRITE (NOUT,535) +535 FORMAT(' TRANSPORTER AVAILABLE ONLY ONCE PER', + $' STAY IN QUADRANT.') + GO TO 236 +532 WRITE (NOUT,533) +533 FORMAT(' TRANSPORTATIONS FROM STARBASE IMPOSSIBLE BECAUSE') + IF (DEFLCT.NE.0) WRITE (NOUT,3210) + IF (DAMAGE(2).NE.0) WRITE (NOUT,3220) + IF (DAMAGE(9).NE.0) WRITE (NOUT,3230) + IF (MOD(GALAXY(QUADRW,QUADCL),100).LT.10) WRITE (NOUT,3240) + IF (TORPS.GE.10) WRITE (NOUT,3250) + GO TO 236 +537 TORPS=TORPS+(10-TORPS)*RAN(XXX)+1 + WRITE (NOUT,538) TORPS +538 FORMAT(' PHOTON TORPEDOES NOW NUMBER ',I2) + TRNFLG=1 + GO TO 524 +3210 FORMAT (' DEFLECTORS ARE UP') +3220 FORMAT (' S. R. SENSORS NOT OPERATIONAL') +3230 FORMAT (' TRANSPORTER IS OUT') +3240 FORMAT (' NO STARBASE IN QUADRANT') +3250 FORMAT (' # OF PHOTON TORPEDOES ALREADY 10') +C C +C DROP DEFLECTORS +C +541 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + WRITE (NOUT,261) + DEFLCT=DEFLCT/4 + ENERGY=ENERGY+DEFLCT + WRITE (NOUT,542) DEFLCT,ENERGY +542 FORMAT (' GAIN OF ',I4, + $' ENERGY UNITS WHICH NOW TOTALS ',I4,' UNITS.') + DEFLCT=0 + GO TO 524 +C C +C ACTIVATE TRACTOR BEAMS +C +544 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DAMAGE(10).EQ.0.) GO TO 548 + WRITE (NOUT,546) +546 FORMAT(' TRACTOR BEAMS DAMAGED') + GO TO 236 +548 IF (SHUSIG.NE.0) GO TO 552 + WRITE (NOUT,549) +549 FORMAT(' SHUTTLECRAFT SIGNALS HAVE NOT BEEN RECEIVED FROM THIS ' + $/' QUADRANT THIS STARDATE.') + GO TO 236 +552 LOSS=400.*RAN(X) + IF (LOSS.LT.ENERGY.AND.SHUSIG.NE.2) GO TO 555 + WRITE (NOUT,554) +554 FORMAT(' ENERGY TOO LOW FOR TRACTOR BEAM USE') + SHUSIG=2 + GO TO 236 +555 IF (RAN(XXX).GE..2) GO TO 557 + WRITE (NOUT,556) +556 FORMAT (' SHUTTLECRAFT GALILEO LOST DUE TO TRACTOR BEAM FAILURE.') + GO TO 236 +557 IF (CDOL(1).EQ.DOCKED) EUSED=EUSED+LOSS + IF (CDOL(1).NE.DOCKED) ENERGY=ENERGY-LOSS + BOARD=1 + WRITE (NOUT,559) +559 FORMAT(' SHUTTLECRAFT GALILEO SAFELY ABOARD THE ENTERPRISE') + GO TO 236 +C C +C FIRE TORPEDO SPREAD +C +561 IF (LSTCOM.EQ.17.AND.SFLAG.EQ.1) GO TO 568 + WRITE (NOUT,562) +562 FORMAT(' FIRST TORPEDO COURSE?(0-359)',$) + READ (NIN,259,ERR=561) ANGLE + IF (ANGLE.LT.0) GO TO 236 + IF (ANGLE.GT.359) GO TO 561 +563 WRITE (NOUT,560) +560 FORMAT(' HOW MANY TORPEDOES ARE TO BE FIRED?(1-8)',$) + READ (NIN,259,ERR=563) MAXTRP + IF (MAXTRP.LT.1) GO TO 236 + IF (MAXTRP.GT.8) GO TO 563 +568 COURSE=ANGLE-45 + COUNT=0 + GO TO 420 +C C +C OBTAIN COMPUTER GALAXY MAP +C +564 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (DAMAGE(11).EQ.0.) GO TO 567 + WRITE (NOUT,1410) + GO TO 236 +567 WRITE (NOUT,565) +565 FORMAT(/' KNOWN GALAXY APPEARS AS SHOWN:'/ + $6X,'(ENTERPRISE INDICATED BY "*" AT RIGHT)'//) + DO 576 I=1,GALSIZ + DO 574 J=1,GALSIZ + L=KNOWN(I,J)*GALAXY(I,J) + IF (L.GE.0) GO TO 566 + L=9*(GALAXY(I,J)/100)-GALAXY(I,J)/10 +566 IF (QUADRW.EQ.I.AND.QUADCL.EQ.J) GO TO 572 + IF (KNOWN(I,J).NE.0) GO TO 570 + WRITE (NOUT,569) +569 FORMAT(' ...',2X,$) + GO TO 574 +570 WRITE (NOUT,571) L +571 FORMAT(' ',I3,2X,$) + GO TO 574 +572 WRITE (NOUT,573) L +573 FORMAT(' ',I3,'* ',$) +574 CONTINUE + WRITE (NOUT,575) +575 FORMAT(1X) +576 CONTINUE + GO TO 236 +C C +C WIN +C +626 WINS=WINS+1 + L=CURDAT-BEGDAT + X3=(CURDAT-BEGDAT-1)/1.5 + WRITE (NOUT,627) CURDAT,STTOTE,L +627 FORMAT (' IT IS STARDATE ',I4,'.'/ + $' THE LAST KLINGON BATTLE CRUISER HAS BEEN DESTROYED.'/ + $' THE FEDERATION HAS BEEN SAVED.'/ + $1X,I3,' KLINGONS IN ',I3,' STARDATES.') + GO TO 663 +C +C LOSE +C +619 WRITE (NOUT,620) CURDAT, TOTENE +620 FORMAT(' IT IS STARDATE ',I4/ + $' THE ENTERPRISE HAS BEEN DESTROYED -'/ + $' THE FEDERATION WILL BE CONQUERED.'/ + $' THERE ARE STILL ',I3,' KLINGON BATTLE CRUISERS.'/ + $' YOU ARE DEAD.') + X3=STTOTE*(CURDAT-BEGDAT-1)/(STTOTE-TOTENE+1) +663 IF (X3.LT.0.5) X3=.5 + GAMES=GAMES+1 + X2=(STTOTE-TOTENE)*GALSIZ*1000./X3 + TEMP=X2-1000. + IF (TEMP.GT.0.0) X2=X2/(SQRT(TEMP/1000.+1.)) + IF (TEMP.LT.0.0) X2=X2*(SQRT(-TEMP/1000.+1.)) + EUSED=EUSED+STENEG-ENERGY + PUSED=PUSED+STTORP-TORPS + WRITE (NOUT,600) EUSED,PUSED,BUSED +600 FORMAT (' YOU USED ',I5,' ENERGY UNITS, ',I2, + $' TORPEDOES, AND ',I2,' STOPS AT STARBASES.') + RESUSD=1.3/SQRT((EUSED+150.*PUSED+300.)/((STTOTE- + $TOTENE+1)*600.)) + REUSED=REUSED/SQRT(SQRT((BUSED+1)*8./(STTOTE+10))) + RESUSD=RESUSD*(SQRT(GALSIZ/10.)) + WRITE (NOUT,602) RESUSD,GALSIZ,GALSIZ +602 FORMAT (' RESOURCE UTILIZATION FACTOR ',F4.2, + $' IN A ',I2,' BY ',I2,' GALAXY.') + X=X2*RESUSD + WRITE (NOUT,645) X +645 FORMAT (' YOUR RATING FOR THIS BATTLE IS ',F6.1) + X=(8.5*RATING+1.5*X)/10. + IF (X.GE.2200) X=X-(X-2200.)/2. + WRITE (NOUT,644) X +644 FORMAT (' YOUR CUMULATIVE RATING IS ',F6.1) + I=X/100. + J=RATING/100. + RATING=X + IF (I.LT.5) I=4 + IF (I.GE.10) I=I/2+5 + I=I-3 + IF (J.LT.5) J=4 + IF (J.GE.10) J=J/2+5 + J=J-3 + IF (J.GT.12) J=12 + IF (I.GT.12) I=12 + IF (I.EQ.J) GO TO 675 + IF (I.LT.J) WRITE (NOUT,671) + IF (I.GT.J) WRITE (NOUT,672) +671 FORMAT (' YOUR HAVE BEEN DEMOTED TO ',$) +672 FORMAT (' YOU HAVE BEEN PROMOTED TO ',$) + WRITE (NOUT,673) (RANKS(J,I), J=1,3) +673 FORMAT ('+',5A5) +675 DECODE (5,677,TIMES) HR1,MIN1 +677 FORMAT (I2,1X,I2) + TT=TT-(HR1+MIN1/60.) + CALL TIME(TIMEF) + DECODE (5,677,TIMEF) HR2,MIN1 + TT=TT+HR2+MIN1/60. + IF (HR2.LT.HR1) TT=TT+12. + WRITE (NOUT,678) TIMEF,TT +678 FORMAT (' IT IS NOW ',A5,'. YOU HAVE SPENT ', + $F4.2,' HOURS PLAYING STARTREK!') + WRITE (NOUT,664) +664 FORMAT(' DO YOU WANT TO PLAY AGAIN?(Y OR N)',$) + READ (NIN,665,ERR=675) CCC +665 FORMAT(A1) + IF (CCC.EQ.YES) GO TO 85 + IF (CCC.NE.NO) GO TO 675 + GALSIZ=0 + IF (FILE) GO TO 1205 +681 WRITE (NOUT,680) +680 FORMAT (' WOULD YOU LIKE TO SAVE YOUR BATTLE RECORD? ',$) + READ (NIN,665,ERR=681) CCC + IF (CCC.EQ.YES) GO TO 1205 + IF (CCC.NE.NO) GO TO 681 +669 WRITE (NOUT,670) WINS,GAMES +670 FORMAT (' YOU HAVE WON ',I3,' OUT OF ',I3,' BATTLES.'/) + STOP +9000 FORMAT (' STOP ON PROGRAM ERROR'/) +99999 WRITE (NOUT,9000) + STOP +C C +C RESET SENSOR MODES +C +902 WRITE (NOUT,905) +905 FORMAT(' SHORT RANGE MODE? (AUTOMATIC=0, MANUAL=1)',$) + READ (NIN,259,ERR=902) SHO2 + IF (SHO2.LT.0) GO TO 236 + SHOMOD=SHO2 + IF (SHOMOD.NE.0.AND.SHOMOD.NE.1) GO TO 902 +910 WRITE (NOUT,915) +915 FORMAT(' LONG RANGE MODE?',$) + READ (NIN,259,ERR=910) LONMOD + IF (LONMOD.NE.0.AND.LONMOD.NE.1) GO TO 910 +917 WRITE (NOUT,918) +918 FORMAT (' STATUS REPORT?',$) + READ (NIN,259,ERR=917) STAMOD + IF (STAMOD.NE.0.AND.STAMOD.NE.1) GO TO 917 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (SHOMOD.NE.0.OR.LONMOD.NE.0) GO TO 236 +920 WRITE (NOUT,925) +925 FORMAT(' WHICH SENSOR FIRST? (SHORT=1, LONG=2)',$) + READ (NIN,259,ERR=920) SENFST + IF (SENFST.NE.1.AND.SENFST.NE.2) GO TO 920 + GO TO 236 +C C +C LAUNCH SUPER LONG RANGE SENSOR PROBE +C +1105 IF (PROBES.GT.0) GO TO 1115 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + WRITE (NOUT,1110) +1110 FORMAT(' NO MORE PROBES') + GO TO 236 +1115 IF (LSTCOM.EQ.17) GO TO 1123 + WRITE (NOUT,1120) +1120 FORMAT(' PROBE COURSE (0-359)?',$) + READ (NIN,259,ERR=1115) ENGINE + IF (ENGINE.LT.0) GO TO 236 + IF (ENGINE.GT.359) GO TO 1115 +1123 CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + YYY=ENGINE*PIE/180. + DELTAX=SIN(YYY)/2. + DELTAY=-COS(YYY)/2. + X=QUADRW + Y=QUADCL + PROBES=PROBES-1 + WRITE (NOUT,1125) +1125 FORMAT(' PROBE TRACK: ') + L=QUADRW + M=QUADCL +1130 X=X+DELTAY + Y=Y+DELTAX + IF (L.EQ.IFIX(X+.5).AND.M.EQ.IFIX(Y+.5)) GO TO 1130 + L=X+.5 + M=Y+.5 + IF (L.LT.1.OR.L.GT.GALSIZ.OR.M.LT.1.OR.M.GT.GALSIZ) GO TO 1160 + WRITE (NOUT,1135) L,M +1135 FORMAT(' QUADRANT ',I2,',',I2,2X,$) + I=GALAXY(L,M) + J=I/100 + J=I/10-9*J + WRITE (NOUT,1140) J +1140 FORMAT('+',I2,' OBJECTS SIGHTED') + IF (KNOWN(L,M).EQ.0) KNOWN(L,M)=-1 + GO TO 1130 +1160 WRITE (NOUT,1165) +1165 FORMAT(' PROBE OUT OF RANGE') + GO TO 236 +C C +C SAVE THE GAME +C +1205 IF (FILE) GO TO 1210 +1206 WRITE (NOUT,1250) +1250 FORMAT(' FILE NAME? (1 TO 5 CHARACTERS) ',$) + READ (NIN,1260) NAME +1260 FORMAT(A5) + IF (NAME.EQ.BNAME) GO TO 236 + FILE=.TRUE. +1210 IF (SAVRES(0,NAME)) GO TO 669 + GO TO 669 +C +C +C RESTORE AN OLD GAME +C +1305 IF (FILE) GO TO 1330 + WRITE (NOUT,1250) + READ (NIN,1260) NAME + IF (NAME.EQ.BNAME) GO TO 236 + IF (SAVRES(1,NAME)) GO TO 1320 + WRITE (NOUT,1310) +1310 FORMAT (' I/O TROUBLE.') + GO TO 236 +1320 FILE=.TRUE. + I=RATING/100. + IF (I.LT.5) I=4 + IF (I.GE.10) I=I/2+5 + I=I-3 + IF (I.GT.12) I=12 + WRITE (NOUT,1311) RATING,(RANKS(J,I),J=1,3) +1311 FORMAT (' YOUR INCOMING RATING IS ',F6.1/ + $' YOUR RANK: ',5A5) + IF (GALSIZ.EQ.0) GO TO 85 + CALL TIME(TIMES) + GO TO 222 +C +1330 WRITE (NOUT,1335) +1335 FORMAT (' YOUR BATTLE RECORD IS ALREADY LOADED.') + GO TO 236 +C C +C QUESTION THE BATTLE COMPUTER +C +1405 IF (DAMAGE(11).EQ.0.) GO TO 1415 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + WRITE (NOUT,1410) +1410 FORMAT(' BATTLE COMPUTER IS NOT OPERATIONAL') + COMAND=-1 + GO TO 236 +1415 TFLAG=0 + PFLAG=0 + SFLAG=0 + WRITE (NOUT,1420) +1420 FORMAT (' TARGET QUADRANT: ',$) + READ (NIN,1425,ERR=1415) R1,R2 +1425 FORMAT(2I) + IF (R1.LT.0) GO TO 1480 + CURDAT=CURDAT+1 + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + IF (R1.GE.1.AND.R1.LE.14.AND.R2.GE.1.AND.R2.LE.14) GO TO 1441 +1440 IF (DAMAGE(5).GE.0..AND.TORPS.NE.0) TFLAG=1 +1431 WRITE (NOUT,1435) +1435 FORMAT('+TARGET SECTOR: ',$) + READ (NIN,1425,ERR=1431) R1,R2 + IF (R1.LT.0) GO TO 1480 + IF (R1.LT.1.OR.R1.GT.8.OR.R2.LT.1.OR.R2.GT.8) GO TO 1431 +1437 DELTAX=SECTRW-R1 + DELTAY=R2-SECTCL + COURSE=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY) + IF (COURSE.LT.0) COURSE=COURSE+360 + WARP=(SQRT(DELTAY*DELTAY+DELTAX*DELTAX)+(2-SQRT(2.)/2))/8. + L=R1 + M=R2 + CALL TRACK(COURSE,0,N,L,M) + IF ((L.NE.R1.OR.M.NE.R2).AND.DAMAGE(2).GE.0) GO TO 1426 + WRITE (NOUT,1452) COURSE,WARP +1452 FORMAT ('+COURSE= ',I3,10X'WARP= ',F4.1/) + ENGINE=COURSE +1443 X=0. + V5=0 + JJ=0 + DO 1445 I=1,9 + IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 1445 + V5=MAX0(V5,KLING2(I)) + DELTAY=KLING1(I,2)-SECTCL + DELTAX=SECTRW-KLING1(I,1) + X=X+SQRT(DELTAY*DELTAY+DELTAX*DELTAX) + JJ=JJ+1 +1445 CONTINUE + IF (JJ.EQ.0.OR.DAMAGE(4).LT.0.) GO TO 1451 + N=MAX0(5,IFIX(V5*X/2.5)) + IF (ENERGY.LE.N) GO TO 1451 + N=N+10 + PFLAG=1 + WRITE (NOUT,1450) N +1450 FORMAT('+AVERAGE ENERGY TO PHASERS = ',I5/) +1451 IF (DAMAGE(2).LT.0..OR.TORPS.EQ.0.OR.DAMAGE(5).LT.0. + $.OR.JJ.LT.2) GO TO 236 + MAXKIL=0 + MAXSTR=0 + MAXTRP=0 + FSTANG=0 + DO 1455 I=1,9 + IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 1455 + DELTAX=SECTRW-KLING1(I,1) + DELTAY=KLING1(I,2)-SECTCL + CALL WIDTH(DELTAX,DELTAY,ANGMIN,ANGMAX) + DO 1467 ANG1=ANGMIN,ANGMAX + ANGLE=MOD(ANG1,360) + CALL CHECK(ANGLE,CNTKIL,KILTRP,STRKIL) + IF (CNTKIL.LT.MAXKIL) GO TO 1467 + IF (CNTKIL.GT.MAXKIL) GO TO 1470 + IF (KILTRP.GT.MAXTRP) GO TO 1467 + IF (KILTRP.LT.MAXTRP) GO TO 1470 + IF (STRKIL.LE.MAXSTR) GO TO 1467 +1470 MAXKIL=CNTKIL + MAXSTR=STRKIL + MAXTRP=KILTRP + FSTANG=ANGLE +1490 CONTINUE +1467 CONTINUE +1455 CONTINUE + IF (MAXKIL.LT.2) GO TO 236 + ANGLE=FSTANG + SFLAG=1 + WRITE (NOUT,1475) MAXTRP, ANGLE, MAXKIL, MAXSTR +1475 FORMAT('+A SPREAD OF ',I1,' TORPEDOES FIRED AT ',I3, + $' DEGREES'/' WILL HIT ',I1,' KLINGONS AND ',I1,' STARS.'/) + IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619 + GO TO 236 +1480 COMAND=-1 + GO TO 236 +C +1441 FSTANG=-1 + MINWRP=12. + DELTAY=R2-QUADCL+(4.-SECTCL)/8. + DELTAX=QUADRW-R1+(SECTRW-4.)/8. + IF (DELTAX.EQ.0..AND.DELTAY.EQ.0.) GO TO 1440 + IF (DAMAGE(2).LT.0.) GO TO 1449 + CALL WIDTH(DELTAX,DELTAY,ANGMIN,ANGMAX) + DELTAX=R2-QUADCL+(1.-2*SECTCL)/16. + DELTAY=R1-QUADRW+(1.-2*SECTRW)/16. + DO 1446 ANG1=ANGMIN,ANGMAX + COURSE=MOD(ANG1,360) + L=0 + CALL TRACK(COURSE,0,N,L,M) + IF ((L.GE.1.AND.L.LE.8).AND.(M.GE.1.AND.M.LE.8)) GO TO 1446 + YYY=COURSE*PIE/180. + X=SIN(YYY) + Y=-COS(YYY) + IF (X.NE.0.) GO TO 1460 + IF (R2.NE.QUADCL) GO TO 1446 + XWARP=0. + GO TO 1461 +1460 XWARP=AMIN1(DELTAX/X,(DELTAX+15./16.)/X) +1461 IF (Y.NE.0.) GO TO 1462 + IF (QUADRW.NE.R1) GO TO 1446 + YWARP=0. + GO TO 1463 +1462 YWARP=AMIN1(DELTAY/Y,(DELTAY+15./16.)/Y) +1463 WARP=AMAX1(XWARP,YWARP) + IF (.NOT.(((WARP*X.GE.DELTAX.AND.WARP*X.LT.(DELTAX+1)) + $.OR.(WARP*X.GE.(DELTAX+1).AND.WARP*X.LT.DELTAX)) + $.AND.((WARP*Y.GE.DELTAY.AND.WARP*Y.LT.(DELTAY+1)) + $.OR.(WARP*Y.GE.(DELTAY+1).AND.WARP*Y.LT.DELTAY)))) + $GO TO 1446 + IF (WARP.GE.MINWRP) GO TO 1446 + MINWRP=WARP + FSTANG=MOD(COURSE,360) +1446 CONTINUE + IF (FSTANG.GE.0) GO TO 1442 + WRITE (NOUT,1448) +1448 FORMAT('+NO UNBLOCKED COURSE TO THAT QUADRANT') + GO TO 1480 +1426 WRITE (NOUT,1427) +1427 FORMAT('+NO UNBLOCKED COURSE TO THAT SECTOR') + GO TO 1480 +C +1449 FSTANG=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY) + MINWRP=SQRT(DELTAX*DELTAX+DELTAY*DELTAY) +1442 WARP=MINWRP + ENGINE=FSTANG + WRITE (NOUT,1452) ENGINE, WARP + GO TO 236 + END +C C +C COMPUTE DAMAGE DONE BY A KLINGON ATACK +C + SUBROUTINE SB585 + IMPLICIT INTEGER(A-Z) + REAL SQRT,RAN,XXX,DAMAGE,FLOAT,ATAN2,PIE,SIGN, + $DELTAX,DELTAY,TT,RATING + DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11), + $KLING1(9,2),KNOWN(14,14),CLOAK(8,8), + $KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2), + $MESSGE(4,3,3),DAMSTR(3,11),FLAGSH(3) + COMMON DAMSTR + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + DATA DOCKED/'DOCKE'/ + DATA PIE/3.1415926/ + DATA NIN,NOUT/5,5/ + DATA MESSGE/'ENTER','PRISE',' WILL',' DIE.', + $'SURRE','NDER ','OR DI','E! ', + $'GOODB','YE EN','TERPR','ISE. ', + $'GOT Y','OU CO','RNERE','D. ', + $'HAVE ','YOU H','AD EN','OUGH?', + $'LAST ','CHANC','E!!!!',' ', + $'YOURE',' GOIN','G TO ','DIE! ', + $'SURRE','NDER!',' ',' ', + $'SWEET',' DREA','MS. ',' '/ + EN=ENERGY + Q=1 + IF (CDOL(1).NE.DOCKED) Q=0 + VV5=0 + DO 617 I=1,9 + HITVAL(I)=0 + IF (KLING2(I).LE.0) GO TO 617 + DELTAX=SECTRW-KLING1(I,1) + DELTAY=KLING1(I,2)-SECTCL + COURSE=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY) + IF (COURSE.LT.0) COURSE=COURSE+360 + V5=1 + L=0 + CALL TRACK(COURSE,0,N,L,M) + IF (L.NE.KLING1(I,1).OR.M.NE.KLING1(I,2).OR. + $(N.NE.2.AND.N.NE.6)) V5=0 + VV5=VV5+V5 + LOSS=V5*KLING2(I)*(2.+RAN(XXX))/ + $SQRT(FLOAT(L-SECTRW)**2+FLOAT(M-SECTCL)**2) + HITVAL(I)=V5 + L=KLING1(I,1) + M=KLING1(I,2) + CLOAK(L,M)=CLOAK(L,M)*V5 + IF (Q.EQ.1.OR.V5.EQ.0) GO TO 617 + WRITE (NOUT,601) LOSS +601 FORMAT(1X,I4, + $' UNIT HIT ON ENTERPRISE FROM KLINGON AT SECTOR ',$) + IF (CLOAK(L,M).EQ.0) GO TO 605 + WRITE (NOUT,604) L,M +604 FORMAT('+',I1,',',I1) + GO TO 608 +605 WRITE (NOUT,607) +607 FORMAT('+UNKNOWN') +608 IF (DEFLCT.LE.0) GO TO 615 + DEFLCT=DEFLCT-LOSS + IF (DEFLCT.LE.0) GO TO 618 + WRITE (NOUT,610) DEFLCT +610 FORMAT(' POWER LEFT IN DEFLECTORS = ',I4) + GO TO 617 +618 WRITE (NOUT,612) +612 FORMAT(' DEFLECTORS DESTROYED') + LOSS=500-DEFLCT + DEFLCT=0 + DAMAGE(7)=-50. +615 ENERGY=ENERGY-LOSS + EUSED=EUSED-LOSS + WRITE (NOUT,616) ENERGY +616 FORMAT(' (',I4,' LEFT)') +617 CONTINUE + IF (RAN(XXX).GT..03) GO TO 2010 + LOSS=300.*RAN(XXX) + WRITE (NOUT,2020) LOSS +2020 FORMAT(1X,I4, + $' UNIT HIT ON ENTERPRISE FROM KLINGON SPACE MINE') + IF (DEFLCT.LE.0) GO TO 2030 + DEFLCT=DEFLCT-LOSS + WRITE (NOUT,610) DEFLCT + IF (DEFLCT.GE.0) GO TO 2010 + WRITE (NOUT,612) + LOSS=500-DEFLCT + DEFLCT=0 + DAMAGE(7)=-50. +2030 ENERGY=ENERGY-LOSS + EUSED=EUSED-LOSS + WRITE (NOUT,616) ENERGY +2010 IF (VV5.EQ.0) RETURN + IF (ENERGY.LE.100) GO TO 3025 + IF (DAMAGE(4).LT.0) GO TO 3010 + IF (ENERGY.GE.1000) GO TO 2040 +3010 IF (DAMAGE(5).LT.0) GO TO 3020 + IF (TORPS.GE.5) GO TO 2040 +3020 IF (EN.EQ.ENERGY) GO TO 2040 +3025 IF (Q.NE.0) GO TO 2040 + IF (ENERGY.LE.0) GO TO 2040 + IF (DAMAGE(1).LT.0.OR.DAMAGE(11).LT.0) GO TO 3030 + IF (RAN(XXX).GE..6) GO TO 2050 +3030 IMESS=IMESS+1 + IF (IMESS.EQ.4) IMESS=3 + TEMP=RAN(XXX) + K=1 + IF (TEMP.GE..333) K=2 + IF (TEMP.GE..666) K=3 + WRITE (NOUT,2012) +2012 FORMAT(1X,' MESSAGE FROM KLINGON COMMANDER:') + WRITE (NOUT,2014) (MESSGE(J,IMESS,K),J=1,4) +2014 FORMAT (1X,4A5) + GO TO 2050 +2040 IMESS=0 +2050 IF (RAN(XXX).GT..07.OR.DEFLCT.GT.0.OR.Q.NE.0) GO TO 2060 + IF (LOSS+LOSS*RAN(XXX).LT.100) GO TO 2060 + R1=11.5*RAN(XXX) + L=(BEGDAT+AVADAT-CURDAT)*2 + YYY=AMIN1(RAN(XXX)*L/(10.*TOTENE)+FLOAT(LOSS/300)+1.,6.) + DAMAGE(R1)=AMAX1(DAMAGE(R1)-YYY,-10.) + WRITE (NOUT,2055) (DAMSTR(I,R1),I=1,3) +2055 FORMAT (' *** ',3A5,' DAMAGED ***') +2060 IF (Q.EQ.0) RETURN + WRITE (NOUT,589) +589 FORMAT(' STARBASE SHIELDS PROTECT THE ENTERPRISE') + RETURN + END +C C +C DECLARE A TRUCE AND EFFECT REPAIRS +C + SUBROUTINE SB320 + IMPLICIT INTEGER(A-Z) + REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING + DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11), + $KLING1(9,2),KNOWN(14,14),CLOAK(8,8),DAMSTR(3,11), + $KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2), + $FLAGSH(3) + COMMON DAMSTR + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + DATA NIN,NOUT/5,5/ + DO 350 I=1,11 + IF (DAMAGE(I).NE.0) GO TO 355 +350 CONTINUE + GO TO 4500 +355 WRITE (NOUT,320) +320 FORMAT(' *** EMERGENCY REPAIRS EFFECTED ***') + DO 323 I=1,11 + IF (DAMAGE(I).EQ.0.) GO TO 323 + DAMAGE(I)=AMIN1(DAMAGE(I)+RAN(XXX)*6.+1.,0.) + WRITE (NOUT,327) (DAMSTR(J,I),J=1,3) +327 FORMAT(1X,3A5,' STATE OF REPAIR IMPROVED ***') +323 CONTINUE +4500 DO 332 I=1,9 + IF (KLING2(I).LE.0) GO TO 332 + KLING2(I)=200 +332 CONTINUE + IF (FLAGSH(1).NE.QUADRW.OR.FLAGSH(2).NE.QUADCL) RETURN + KLING2(FLAGSH(3))=400 + RETURN + END +C C +C SET UP CONDITION OF ENTERPRISE +C + SUBROUTINE SB171(IFLAG) + IMPLICIT INTEGER(A-Z) + REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING + DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11), + $KLING1(9,2),KNOWN(14,14),CLOAK(8,8), + $KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2),GREEN(2), + $AMBER(2),RED(2),DOCKED(2),FLAGSH(3) + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + DATA DOCKED/'DOCKE','D'/ + DATA GREEN/'GREEN',' '/ + DATA AMBER/'AMBER',' '/ + DATA RED/'RED',' '/ + IIL=MAX0(SECTRW-1,1) + IIH=MIN0(SECTRW+1,8) + JJL=MAX0(SECTCL-1,1) + JJH=MIN0(SECTCL+1,8) + DO 179 I=IIL,IIH + DO 179 J=JJL,JJH + IF (QUADRT(I,J).NE.3) GO TO 179 + CDOL(1)=DOCKED(1) + CDOL(2)=DOCKED(2) + EUSED=EUSED+STENEG-ENERGY + PUSED=PUSED+STTORP-TORPS + IF (COMAND.EQ.0) BUSED=BUSED+1 + ENERGY=STENEG + TORPS=STTORP + IF (IFLAG.EQ.0) GO TO 187 + DO 175 K=1,11 +175 IF (DAMAGE(K).LT.0.) DAMAGE(K)=AMIN1(DAMAGE(K)+1.,0.) + GO TO 187 +179 CONTINUE + IF (ENEMYS.GT.0) GO TO 184 + IF (ENERGY.LT.IFIX(STENEG*.4)) GO TO 186 + CDOL(1)=GREEN(1) + CDOL(2)=GREEN(2) + GO TO 187 +184 CDOL(1)=RED(1) + CDOL(2)=RED(2) + GO TO 187 +186 CDOL(1)=AMBER(1) + CDOL(2)=AMBER(2) +187 RETURN + END +C +C +C 0 IF X.GE.Y, 1 IF X.LT.Y +C + FUNCTION XLTY(X,Y) + INTEGER XLTY + REAL X,Y + XLTY=0 + IF (X.LT.Y) XLTY=1 + RETURN + END +C +C +C FIGURE MAXIMUM ACCEPTANCE ANGLE TO A SECTOR +C + SUBROUTINE WIDTH(DELTAX,DELTAY,ANGMIN,ANGMAX) + IMPLICIT INTEGER(A-Z) + REAL ATAN2,SIGN,PI,DELTAX,DELTAY,DELTA1,DELTA2,ROUND + DATA PI/3.1415926/ + DELTA1=SIGN(.5,DELTAX) + DELTA2=SIGN(.5,DELTAY) + ANGMIN=ROUND(180.*ATAN2(DELTAY-DELTA1,DELTAX+DELTA2)/PI) + ANGMAX=ROUND(180.*ATAN2(DELTAY+DELTA1,DELTAX-DELTA2)/PI) + ANGMIN=MOD(ANGMIN,360) + ANGMAX=MOD(ANGMAX,360) + IF (ANGMAX.LT.ANGMIN) ANGMAX=ANGMAX+360 + RETURN + END +C +C +C ROUND A REAL NUMBER +C + REAL FUNCTION ROUND(VAL) + ROUND=VAL+SIGN(.5,VAL) + RETURN + END +C +C +C DO A REAL "MOD" +C + INTEGER FUNCTION MOD(NUM,MDLS) + IMPLICIT INTEGER(A-Z) + MOD=NUM-(NUM/MDLS)*MDLS + IF (MOD.LT.0) MOD=MOD+MDLS + RETURN + END +C +C DO ALL THE WORK OF SAVING FILES +C + LOGICAL FUNCTION SAVRES(INOUT,NAME) + IMPLICIT INTEGER(A-Z) + REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING + DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11), + $KLING1(9,2),KNOWN(14,14),CLOAK(8,8), + $KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2),GREEN(2), + $AMBER(2),RED(2),DOCKED(2),FLAGSH(3) + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + SAVRES=.FALSE. + IF (INOUT.EQ.1) GO TO 100 + CALL OFILE(21,NAME) + WRITE (21) CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + ENDFILE 21 + GO TO 999 +100 CALL IFILE(21,NAME) + READ(21,ERR=1000) CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH +999 SAVRES=.TRUE. +1000 RETURN + END +C C +C TRACE OUT A PATH +C + SUBROUTINE TRACK(COURSE,IFLAG,N,JJ,KK) + IMPLICIT INTEGER(A-Z) + REAL FLOAT,X,Y,COS,SIN,YYY,SQRT,AMIN1,ATAN2,PIE, + $DELTAX,DELTAY,TT,RATING + DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11), + $KLING1(9,2),KNOWN(14,14),CLOAK(8,8),KLING2(9), + $LOCATE(8,14,14),HITVAL(9),CDOL(2),FLAGSH(3) + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + DATA PIE/3.1415926/ + DATA NIN,NOUT/5,5/ + N=0 + YYY=COURSE*PIE/180. + DELTAX=SIN(YYY)/2. + DELTAY=-COS(YYY)/2. + X=SECTRW + Y=SECTCL + IF (IFLAG.EQ.1) WRITE (NOUT,442) +442 FORMAT(' TORPEDO TRACK: ',$) + L=SECTRW + M=SECTCL +443 X=X+DELTAY + Y=Y+DELTAX + IF (L.EQ.IFIX(X+.5).AND.M.EQ.IFIX(Y+.5)) GO TO 443 + L=X+.5 + M=Y+.5 + IF (L.LT.1.OR.L.GT.8.OR.M.LT.1.OR.M.GT.8) GO TO 474 + IF (IFLAG.EQ.1) WRITE (NOUT,446) L,M +446 FORMAT('+',I1,',',I1,2X,$) + N=QUADRT(L,M) + IF (L.EQ.JJ.AND.M.EQ.KK) GO TO 474 + IF (N.EQ.0) GO TO 443 + JJ=L + KK=M +474 RETURN + END +C C +C SEE WHAT DAMAGE A SPRAY OF TORPS CAN DO +C + SUBROUTINE CHECK(ANGLE,CNTKIL,KILTRP,STRKIL) + IMPLICIT INTEGER(A-Z) + REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING + DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),KLING1(9,2), + $KNOWN(14,14),CLOAK(8,8),KLING2(9),LOCATE(8,14,14), + $HITVAL(9),CDOL(2),FLAGSH(3) + COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL, + $ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1, + $KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY, + $BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP, + $KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE, + $PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW, + $PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD, + $EUSED,PUSED,BUSED,FLAGSH + DATA NIN,NOUT/5,5/ + CNTKIL=0 + CNTSTR=0 +C KILTRP IS A COUNT OF THE NUMBER OF TORPEDOES REQUIRED TO KILL +C CNTKIL KLINGONS. + KILTRP=0 +C STRKIL COUNTS THE NUMBER OF STARS THAT WILL BE HIT BY KILTRP +C TORPEDOES. + STRKIL=0 +C KILTRP=CNTKIL+STRKIL+MISSES + DO 60 J=1,8 + IF (TORPS.LT.J) GO TO 59 + K=MOD(ANGLE+45*(J-1),360) + IF (J.EQ.1) GO TO 65 + LL=0 + CALL TRACK(K,0,II,LL,MM) + IF (LL.EQ.L.AND.MM.EQ.M) GO TO 60 + L=LL + M=MM + MM=II + GO TO 66 +C +65 L=0 + CALL TRACK(K,0,MM,L,M) + IF (MM.LE.0.AND.J.EQ.1) GO TO 59 +66 IF (MM.LE.0) GO TO 60 + IF (MM.EQ.2) GO TO 53 + IF (MM.EQ.3) GO TO 59 + IF (MM.GE.4) GO TO 56 + WRITE (NOUT,57)MM +57 FORMAT(' PROGRAM ERROR 57. MM = ',I2//) + STOP +56 IF (MM.NE.6) CNTSTR=CNTSTR+1 + GO TO 60 +53 IF (J.NE.8) GO TO 54 + LL=0 + CALL TRACK(ANGLE,0,II,LL,MM) + IF (LL.EQ.L.AND.MM.EQ.M) GO TO 60 +54 CNTKIL=CNTKIL+1 + KILTRP=J + STRKIL=CNTSTR +60 CONTINUE +59 RETURN + END +C \ No newline at end of file