NAIL v1.5

Yes, hashing algorithms are optimised for specific kinds of distribution, and the birthday paradox holds for random events.

In the Soundex world, the collisions happen when the first few syllables of words sound alike. On a severely constrained system, this can be an acceptable failure mode, as it is a familiar one for spoken English in general.

It encourages acoustically distinct verbs and nouns, which are generally a good idea. And it has the bonus side effect that a player may be able to mostly type phonetically, like the signs in Planetfall, and still win the game.

I ran some experiments, and found that the hashing algorithm produces less clashes when the initial value is set to the length of the word (rather than zero).

With this change, my game went from 4 clashes to 0, another game went from 6 clashes to 2. None of my test cases (around 8 or so) increased the minimum number of clashes.

2 Likes

I had thought that starting with 0 had to be a mistake, or there was another step in the algorithm. As written, the first character is just ignored. Starting with 1 would make sense, or the length as you suggest. Perhaps even better would be a large (15 bit) prime.

checksum = 0
for each character of the word:
  checksum = (k * checksum) AND $7FFF
  checksum = (checksum + ZSCII_CODE) AND $7FFF

I’m no expert on hash functions, but some ideas to try if you are getting too many collisions (and it doesn’t sound like you are):

  • The first AND is unnecessary and can surely be removed.
  • The second AND might be better if it was instead a MOD operation using a large prime (ex $7FED).
  • A weakness of all sequences like this it that their low bits don’t change much. XOR is the usual go to for disrupting all the bits, but we don’t have that in Z-Code (though it does only take 4 instructions). Maybe instead you could swap the bytes through some shifts (which would take 3 instructions).

Nope. (I guess that was a typo)

Also using a prime modulo would normally work well, but the Z-machine does only 16-bit multiplication, losing the top bits.

Good factors typically have a mix of high and low bits set, which means both low and high bits are affected.

I have published the source code of SchoolAdventure, written using NAIL. I have also updated the game to Release 3.

The game homepage is at SchoolAdventure

Maybe there’s a better place for this, but here’s some more Infocom game dictionary word dumps.

Again, these are from the source code, not the game file. So they’re not truncated at six characters. I’m looking in <BUZZ>, <DIRECTIONS>, <SYNONYM>, <SYNTAX> directives, as well as (SYNONYM), (ADJECTIVE), and (PSEUDO) properties.

Zork 1

" $ , . A ACROSS ACTIVATE ADVENTURER ADVERTISEMENT AGAIN AIR AIR-PUMP ALL ALTAR AN ANCIENT AND ANSWER ANTIQUE APPLY AROUND ART ASK AT ATTACH ATTACK AVIATOR AWAKE AWAY AX AXE BACK BAG BANISH BAR BARE BARF BARROW BASKET BAT BATHE BAUBLE BEAUTI BEETLE BEGONE BEHIND BELL BELOW BENEATH BIRD BIRDS BITE BLACK BLADE BLAST BLESSINGS BLOCK BLOODY BLOW BLUE BOARD BOARDED BOARDS BOAT BODIES BODY BOLT BONES BOOK BOOKLET BOOKS BOTTLE BOX BRACELET BRANCH BRANDISH BRASS BREAK BREATH BRIEF BROKEN BROWN BRUSH BUBBLE BUG BUOY BURN BURNED BURNING BUT BUTTON CAGE CANARY CANDLES CANVAS CARPET CARRY CARVED CASE CASKET CAST CATCH CHAIN CHALICE CHANT CHASE CHASM CHEST CHESTS CHIMNEY CHOMP CHUCK CHUTE CLEAN CLEAR CLIFF CLIFFS CLIMB CLOCKWORK CLOSE CLOVE COAL COFFIN COIL COINS COLONI COME COMMAND CONSUME CONTAINER CONTROL COUNT COVER CRACK CRAWLWAY CRETIN CROSS CRYSTAL CUP CURSE CUT CYCLOPS D DAM DAMAGE DAMN DARK DEAD DEFLATE DERANGED DESCRIBE DESTROY DIAGNOSE DIAMOND DIG DINNER DIRT DISEMBARK DISENCHANT DISPATCH DIVE DOME DONATE DOOR DOUSE DOWN DRINK DRIP DRIVE DRIVER DROP DRYER DUMBWAITER DUSTY E EAST EAT ECHO EGG EGYPTIAN ELONGATED ELVISH EMERALD ENAMELED ENCHANT ENCRUSTED ENGRAVINGS ENORMOUS ENTER EVIL EXAMINE EXCEPT EXIT EXORCISE EXQUISITE EXTINGUISH EYE FALL FANTASIZE FASTEN FCD#3 FEAR FEEBLE FEED FEEL FENCE FERMENT FIENDS FIERCE FIGHT FIGURINE FILCH FILL FIND FINE FINEPRINT FIREPROOF FIX FLAMING FLATHEAD FLIP FLOAT FLOOR FLUORESCE FOLLOW FOOBAR FOOD FOOTPAD FOR FORBIDDING FORCE FORD FOREST FORK FREE FREEZE FRIGID FROBOZZ FROM FRONT FROTZ FRY FUCK FUDGE FUMBLE G GARLIC GAS GATE GATES GAZE GET GHOSTS GIANT GIVE GLAMDRING GLASS GLUE GO GOLD GOLDEN GOTHIC GRAB GRACES GRANITE GRATE GRATING GREASE GREEN GROUND GROUP GRUE GUIDE GUIDEBOOKS GUNK H2O HAND HAND-HELD HANDS HATCH HEAD HEAP HELLO HEMLOCKS HEMP HER HERE HI HIDE HIM HIT HOLD HOP HOT HOUSE HUGE HUNGRY HURL HURT I IGNITE IMBIBE IMPASSABLE IN INCANT INCINERATE INFLAT INJURE INSCRIPTION INSERT INSIDE INTNUM INTO INVENTORY INVISIBLE IS IT IVORY JADE JEWEL JEWELED JEWELS JUMP KEY KICK KILL KISS KITCHEN KNIFE KNIVES KNOCK L LABEL LADDER LAKE LAMP LAND LANTERN LARGE LAUNCH LEAF LEAFLET LEAK LEAN LEAP LEATHER LEAVE LEAVES LEDGE LETTERING LID LIFT LIGHT LIQUID LIQUIFY LISTEN LOCK LONG LOOK LOSE LOWER LOWERED LUBRICATE LUNCH LUNGS LURKING MACHINE MAGIC MAIL MAILBOX MAKE MAN MANGLED MANUAL MAP MARBLE MASSIVE MATCH MATCHBOOK MATCHES MATERIAL ME MELT METAL MIRROR MOLEST MONSTER MOUNTAIN MOUTH MOVE MUMBLE MURDER MYSELF N NAIL NAILS NARROW NASTY NE NEST NO NORTH NORTHE NORTHWEST NUT NW ODOR ODYSSEUS OF OFF OFFER OIL OLD ON ONE ONTO OPEN ORCRIST ORIENTAL OUT OVER OVERBOARD OWN OWNERS OZMOO PAGE PAINT PAINTING PAIR PANEL PAPER PARCHMENT PASSAGE PASTE PAT PATCH PATH PDP10 PEAL PEDESTAL PEPPER PERSON PET PICK PIECE PIERCE PILE PINES PIPE PLACE PLASTIC PLATINUM PLAY PLUG PLUGH POKE POSEIDON POT POUR PRAY PRAYER PRESS PRINT PROCEED PULL PUMP PUNCTURE PURSUE PUSH PUT Q QUANTITY QUIT RAFT RAIL RAILING RAINBOW RAISE RAMP RANGE RAP RAPE READ RED REFLECTION RELEASE REMAINS REMOVE REPAIR REPENT REPLY RESTART RESTORE RICKETY RING RIVER ROBBER ROCKY ROLL ROPE RUB RUG RUN RUSTY S SACK SAILOR SAND SANDWICH SAPPHIRE SAVE SAY SCARAB SCEPTER SCEPTRE SCORE SCREAM SCREW SCREWDRIVER SCRIPT SE SEARCH SEAWORTHY SECURE SEE SEEDY SEEK SELF SEND SET SHADY SHAKE SHARP SHEER SHIT SHOUT SHOVEL SHUT SIGH SILENT SILVER SINISTER SIT SKELETON SKIM SKIP SKULL SLAG SLAY SLICE SLIDE SMALL SMASH SMELL SMELLY SNIFF SOLID SONG SONGBIRD SOUTH SOUTHE SOUTHWEST SPILL SPIN SPIRITS SPRAY SQUEEZE STAB STAIRCASE STAIRS STAIRWAY STAND STARE STARTLE STAY STEEP STEP STEPS STILETTO STONE STORM STRANGE STREAM STRIKE STUFF SUPER SUPERBRIEF SURPRISE SURROUNDING SUSPICIOUS SW SWALLOW SWIM SWING SWITCH SWORD TABLE TAKE TALK TAN TASTE TAUNT TEETH TELL TEMPLE THE THEM THEN THIEF THIEFS THROUGH THROW THRU THRUST TIE TIMBERS TO TOMB TOOL TOOLCHESTS TOOLS TOOTH TORCH TOSS TOUCH TOUR TRAIL TRAP TRAP-DOOR TRAPDOOR TREASURE TREE TREES TRIDENT TROLL TROPHY TRUNK TUBE TUG TURN TWISTING U ULYSSES UNATTACH UNDER UNDERNEATH UNFASTEN UNHOOK UNLOCK UNRUSTY UNSCRIPT UNTIE UP USELESS USING VALVE VAMPIRE VERBOSE VERIFY VERSION VICIOUS VISCOUS VITREOUS W WADE WAIT WAKE WALK WALL WALLS WATER WAVE WEAR WEST WHAT WHATS WHERE WHITE WIN WIND WINDING WINDOW WINNAGE WISH WITH WOODEN WRENCH WRITING XYZZY Y YANK YELL YELLOW YES Z ZORK ZORKMID ZZMGCK

Zork 2

" $ , . A ABOUT ACROSS ACTIVATE ADVENTURER AGAIN AIM AIR ALEMBIC ALL AN AND ANIMAL ANSWER ANTIQUE APPLY AQUARIUM ARBOR AROUND ART ASK AT ATTACH ATTACK AWAKE AWAY BABY BACK BAG BALL BALLOON BANISH BANK BARE BARF BARRED BASEBALL BASKET BAT BATHE BEAUTIFUL BEGONE BEHIND BELOW BENCH BENEATH BILLS BITE BLACK BLADE BLAST BLESS BLESSINGS BLOCK BLOW BLUE BOARD BOOK BOOKS BOTTLE BOX BRAIDED BRANDISH BRASS BREAK BREATH BRICK BRIDGE BRIEF BROCHURE BROKEN BRUSH BUCKET BUG BURN BUSH BUT BUTTON C3PO CABINET CAGE CAKE CAKES CAN CANDIED CANDLES CANDY CARD CARRY CASE CAST CATCH CERBERUS CHALK CHANT CHASE CHASM CHEST CHINA CHOMP CHUCK CIRCLE CLAY CLEAN CLEAR CLIMB CLOSE CLOTH CLUB COBWEBBED COIL COIN COLD COLLAR COME COMMAND COMPASS CONSUME COUNT COVER CRACK CRAWLWAY CRETIN CROSS CROWN CRYPT CRYSTAL CUBE CURSE CURTAIN CUT D DAMAGE DAMN DARK DEAD DEBUG DEEP DEFLATE DEGREE DELICATE DEMON DENTED DESCRIBE DESTROY DEVIL DIAGNOSE DIAMOND DIG DIMLY DIPLOMA DIRT DISEMBARK DISENCHANT DISPATCH DIVE DJINN DOG DONATE DOOR DOUSE DOWN DRAGON DRINK DRIVE DROP DULL DUSTY E EAST EASTERN EAT ECHO ELVISH ENCHANT ENORMOUS ENTER ETCHINGS EXAMINE EXCEPT EXIT EXORCISE EXTINGUISH F FALL FANCY FANTASIZE FASTEN FEAR FEEBLE FEED FEEL FENCE FERMENT FIERCE FIGHT FILCH FILL FIND FIREPROOF FIX FLASK FLATHEAD FLIP FLOAT FLOOR FLOWING FLUORESCE FOLLOW FOOBAR FOOTPAD FOR FORBIDDING FORD FOREST FREE FREEZE FROBOZZ FROM FROSTED FROTZ FRY FUCK FUDGE FUMBLE FUSE G GAUDY GAZE GAZEBO GENIE GET GIANT GIVE GLACIER GLAMDRING GLASS GLOSSY GLOWING GLUE GNOME GO GOLD GRAB GRACES GRASSHOPPERS GRAVE GREASE GREAT GREEN GROUND GRUE GUARDIAN H2O HAND HANDS HANDSOME HATCH HEAD HEADED HEADS HEAVY HEDGE HEDGES HELLO HER HERE HI HIDE HIM HIT HOLD HOLE HOMUNCULI HOOK HOP HOUND HUGE HUNGRY HURL HURT I ICE ICING ICY IGNITE IMBIBE IN INCANT INCINERATE INFLAT INJURE INSERT INSIDE INSTRUCTIONS INTNUM INTO INVENTORY IRON IS IT JUMP KEEPER KEY KEYHOLE KICK KILL KISS KNIVES KNOCK KREBF L LABEL LADY LAMP LAND LANTERN LARGE LAUNCH LEAK LEAN LEAP LEATHER LEAVE LETTER LID LIFT LIGHT LIQUID LIQUIFY LISTEN LITTLE LIZARD LOCK LONG LOOK LOSE LOWER LUBRICATE LUNGS LURKING MAGIC MAGICIAN MAKE MAN MANGLED MANY MARBLE MASS MAT MATCH MATCHBOOK MATCHES ME MELT MENHIR METAL MOBY MOLEST MONEY MONSTER MORTAR MOSS MOSSES MOUTH MOVE MUMBLE MURDER MYSELF N NARROW NASTY NE NEAT NECKLACE NEWS NEWSPAPER NICKED NO NORTH NORTHE NORTHWEST NOTE NW OAK OBLONG OBSIDIAN ODYSSEUS OF OFF OFFER OIL OLD ON ONE ONTO OPEN OPENER ORANGE ORCRIST OUT OVER OWL OZMOO PACKAGE PAINTING PAIR PALANTIR PAPER PASSAGE PAT PATCH PATH PEAL PEARL PEARLS PENTAGRAM PERFECT PESTLE PET PHOSPHORESCENT PICK PIECE PIERCE PLACE PLACEM PLAY PLUG PLUGH POINT POKE POLE POLES POOL PORTRAIT POST POSTS POT POUR PRAY PRESS PRICELESS PRINCESS PROCEED PULL PUMP PUNCTURE PURPLE PURSUE PUSH PUT Q QUANTITY QUIT R2D2 RACK RAISE RAP RAPE RARE RAVINE READ RECEPTACLE RED RELEASE REMOVE REPAIR REPELLENT REPENT REPLY RESTART RESTORE RIBBON RICKETY RIDDLE RING ROBBY ROBOT ROCK ROLL ROPE ROSE ROSES ROTTEN ROUND RUB RUBY RUN RUSTY S SAFE SAILOR SAND SAPPHIRE SATIN SAVE SAY SCORE SCREAM SCRIPT SE SEA SEARCH SECRET SECURE SEE SEEK SELF SEND SERPENT SET SHAKE SHIMMERING SHIT SHOUT SHUT SIGH SILENT SINISTER SIT SKIM SKIP SLAY SLICE SLIDE SLOT SMALL SMASH SMAUG SMELL SMOKY SNAKE SNIFF SOLID SORCEROR SOUTH SOUTHE SOUTHWEST SPHERE SPILL SPIN SPRAY SQUARE SQUEEZE STAB STACK STAIRCASE STAIRS STAIRWAY STALACTITE STALAGMITE STAMP STAND STANDS STAR STARE STARTLE STATUETTE STAY STEEL STEEP STEP STEPS STONE STRADIVARIUS STRANGE STREAM STRIKE STRING STRUCTURE STUFF SUPER SUPERBRIEF SURPRISE SW SWALLOW SWIM SWING SWORD SWORDS TABLE TAKE TALK TASTE TAUNT TEA TEAPOT TEARS TELL TEMPLE THE THEM THEN THIN THREE THROUGH THROW THRU THRUST TIE TO TOMB TOSS TOUCH TRAIL TREASURE TRIANGULAR TROPHY TRUNK TUG TUNNEL TURN U ULYSSES UNATTACH UNDER UNDERNEATH UNFASTEN UNHOOK UNICORN UNLOCK UNSCRIPT UNTIE UP USED USING VAULT VELLUM VELVET VERBOSE VERIFY VERSION VIOLIN VOLCANO W WADE WAIT WAKE WALK WALL WAND WANDS WARNING WATER WAVE WAX WEAR WELL WEST WESTERN WHAT WHATS WHERE WHITE WICKER WIN WIND WINDING WINDOW WINNAGE WIRE WISH WITH WIZARD WOMAN WOODEN WORK WORKBENCH WORM WORN XYZZY Y YANK YELL YES YOUNG Z ZORK ZORKMID ZURICH ZZMGCK

Zork 3

" $ , . A ABYSS ACROSS ADVENTURER AGAIN ALGAE ALL AMULET AN AND ANSWER ANTIQUE APPLY AQUEDUCT ARCH ARMED AROUND ARROW ASK ASSORTED AT ATTACH ATTACK AWAKE AWAY BACK BANISH BAR BARE BARF BATHE BEACH BEAM BEGONE BEHIND BELOW BENEATH BITE BLACK BLADE BLAST BLESSINGS BLIND BLOCK BLOW BOARD BOAT BOOK BOTTOM BOULDER BRANDISH BRASS BREAD BREAK BRIEF BROKEN BRONZE BUG BURN BURNED BUT BUTTON CAGE CAN CARRY CARVED CARVIN CAST CELL CENTER CHAIR CHANNEL CHANT CHASE CHASM CHEST CHOMP CHUCK CLEFT CLIFF CLIMB CLOAK CLOAKED CLOSE COME COMPASS CONSOLE CONSUME CONTENTS COUNT COVER CPSLT CRAFT CRAWLWAY CRETIN CROSS CROWN CRYSTAL CURSE CUT D DAMAGE DAMN DANGLING DARK DEAD DEBRIS DEEP DEFLATE DESCRIBE DESTROY DEVICE DIAGNOSE DIAL DIG DISEMBARK DISPATCH DISPLAY DIVE DONATE DOOR DOUSE DOWN DRINK DRIVE DROP DRYER DUCT DUNGEON DUST E EARTH EAST EASTERN EAT ELVISH ENGRAV ENTER EXAMINE EXCEPT EXIT EXORCISE EXTINGUISH FASTEN FEED FEEL FIERY FIGHT FIGURE FILL FIND FISH FIX FLAMING FLATHEAD FLIP FLOOR FLUID FOLLOW FOOBAR FOR FORD FOREST FREE FRESH FRIEND FROM FROTZ G GAZE GET GIVE GLAMDRING GLUE GO GOLD GOLDEN GORGE GRAB GRACES GRAY GREASE GREAT GREY GRIP GROUND GRUE GUARD GUARDIAN GUARDS HAND HANDGRIP HANDS HEAVY HELLO HERE HI HIDE HIM HIT HOLD HOLE HOOD HOODED HOP HUNGRY HURL HURT I IGNITE IMBIBE IN INCANT INCINERATE INDICATOR INFLAT INJURE INSERT INSIDE INTDIR INTNUM INTO INVENTORY INVISIBLE IRON IS IT JAB JEWELLED JEWELS JUMP KEY KICK KILL KISS KNIFE KNOCK L LADDER LAKE LAMP LAND LANTERN LARGE LAUNCH LEAN LEAP LEAVE LEDGE LICHEN LIFT LIGHT LIQUID LIQUIFY LISTEN LOCK LOCKED LONG LOOK LORE LOSE LOWER LUBRICATE LURKING MACHINE MAGIC MAHOGANY MAKE MAN MANHOLE MARBLE MASSIVE MASTER ME MELT METAL MGCKJK MIRROR MIST MOLEST MOSS MOTORS MOVE MUMBLE MURDER MYSELF N NARROW NE NO NORTH NORTHE NORTHWEST NOTE NW OBJECT OCEAN ODOR OF OFF OFFER OFFICI OIL OLD ON ONE ONTO OPEN ORCRIST OUT OVER OZMOO PAIR PANEL PARAPET PASSAGE PAT PATCH PATH PEDESTAL PET PICK PIECE PIERCE PILE PINE PIPES PIT PLACE PLANT PLANTS PLAQUE PLAY PLUG PLUGH POINTED POKE POLE POST POTION POUR PRAY PRESS PRESSURIZER PROCEED PULL PUMP PURSUE PUSH PUT Q QUANTITY QUICKS QUIT RAISE RAP RAPE RAVINE READ RED REEDS RELEASE REMOVE RENDER REPAIR REPELLENT REPENT REPLY RESTART RESTORE RICKETY RING ROBOT ROCK ROCKS ROCKY ROLL ROPE ROSE ROUND ROYAL RUB RUBBLE RUN RUNES RUSTY S SAILOR SAND SAVE SAY SCEPTRE SCORE SCREAM SCRIPT SE SEAL SEARCH SEAT SECRET SECURE SEE SEEK SELF SEND SET SHADOW SHAKE SHARP SHINY SHIP SHORE SHORT SHOUT SHUT SICKLY SIGH SILENT SINISTER SIT SKIM SKIP SLAY SLICE SLIDE SLIT SLOT SMALL SMASH SMELL SMELLING SMOKY SNIFF SOUTH SOUTHE SOUTHWEST SPILL SPIN SPRAY SQUEEZE STAB STAFF STAIR STAIRCASE STAIRS STALAG STAND STARE STARTLE STATUE STAY STEEL STEEP STEP STEPS STONE STRANGE STRIKE STRUCTURE STUFF SUN SUNDIAL SUPER SUPERBRIEF SURFACE SURPRISE SW SWALLOW SWAMP SWEET SWIM SWING SWORD T-BAR TABLE TAKE TALK TALL TASTE TAUNT TELL TEMPORIZER TEXT THAT THE THEN THIN THIS THROUGH THROW THRUST TIE TIMBERS TIME TO TORCH TORCHE TOSS TOUCH TRAIL TREASU TREE TREES TUG TURN U UNATTACH UNDER UNDERNEATH UNFASTEN UNHOOK UNLOCK UNSCRIPT UNTIE UP USING VALUABLES VERBOSE VERIFY VERSION VIAL VIEWING VIKING VOICE VOICES W WADE WAIT WAKE WALK WALL WARNING WASHING WATER WATERF WAVE WAY WAYBREAD WEAR WEST WESTERN WHAT WHATS WHERE WHITE WIDE WIN WIND WINDING WINNAGE WIRES WITH WOMAN WOOD WOODEN XYZZY Y YELL YELLOW YES Z ZORK

1 Like
Deadline

" $ , . A ABOUT ACCUSE ACROSS AGAIN AGAINST AIR ALL ALLERGONE AN ANALYSE ANALYZE AND ANGUS ANSWER ANTIQUE APPLE APPLIANCE APPLY ARBOR ARE AROUND ARREST ASK ASPIRIN AT ATTACH ATTACK AWAKE BACK BALCONY BASIN BASKET BATH BATHE BATHROOM BATHTUB BAXTER BAY BEAUTIFUL BED BEDROOM BEHIND BENEATH BERRIE BERRY BITE BLACK BLIND BLOOD BLOODY BLOW BLUE BODY BOOK BOOKS BOOKSHELVES BOTTLE BOURBON BOWL BRAND BRANDISH BREAK BREAKFAST BREEZE BRIEF BRIEFLY BROKEN BRUSH BUG BUNCH BURN BUSH BUT BUTTON CABIN CABINET CALENDAR CALL CAN CANNED CANS CAREFULLY CARPET CARRY CARVED CASE CASSETTE CHAIR CHAIRS CHANDELIER CHASE CHECK CHEST CHINA CHUCK CIRCULAR CLEAN CLIMATE CLIMB CLOSE CLOSET COATES COBWEBS COLLAPSIBLE COLLECTION COMBINATION COMPACTOR CONCERT CONFRONT CONSUME CONVERSATION CORNERSTONE CORPSE COUCH COUCHES COUGH COUNT COUNTER COUPLE CREAM CRIME CROSS CRUMPLED CRYSTAL CUP CUPS CURRENT CURSE CUT D DAILY DAMAGE DAMN DECONG DEEP DESCRIBE DESK DESTROY DIAGNOSE DIAL DID DIG DINING DINNER DIRT DIRTY DISH DISHWASHER DISPATCH DISPOSAL DO DONATE DOOR DOORS DOUSE DOWN DOWNSTAIRS DRENCHED DRESSER DRIED DRINK DROP DUFFY DUM-KOF DUNBAR DUST E EAST EAT EBULLION END ENDING ENTER ENVELOPE EXAMINE EXCEPT EXECUTIVE EXIT EXTINGUISH FASTEN FATHER FEEL FENCE FIELDS FIGHT FILL FIND FINE FINGERPRINT FIREPL FIRST FLIP FLOWER FLUSH FOCUS FOLLOW FOOD FOODS FOR FORD FOUR FOUR- FOYER FRAGMENT FRAME FREE FROM FRONT FRUIT GARBAGE GARDEN GAZE GEAR GEORGE GET GILT GIVE GLASS GLASSES GO GOODBYE GRAPE GRASS GREEN GRIMY GROUND GROUP GUN HAMMER HAND HANDFUL HANDWR HANGING HARD HARDCOVER HATCH HAVE HE HELLO HER HERALD HERE HERRING HEY HI HIDDEN HIDE HIFI HIM HIT HOE HOLD HOLE HOLES HOP HOSE HOUSE HOW HURL HURT I IGNITE IMBIBE IN INCINERATE INJURE INQUIRE INSERT INSIDE INSPECTOR INTNUM INTO INVENTORY IS IT JAB JULY JUMP KICK KILL KILLING KISS KITCHEN KNOCK KNOW L LAB LABEL LADDER LAKE LAMP LARGE LAST LAWN LEAD LEAN LEAP LEAVE LEFT LESLIE LETTER LIBRARY LIFT LIGHT LINEN LINENS LIQUOR LISTEN LIVING LOBLO LOCK LOG LONG LOOK LOUNGE LOWER LUNCH MARBLE MARK MARSHALL MASTER MAYBE MCNABB ME MEAL MEDICINE MEETING MERGER METAL MINUTE MIRROR MISTER MOLEST MOTHER MOVE MR MRS MS MUD MUMBLE MURDER MUSIC MYSTERY N NAILPOLISH NE NEAR NEW NEWSPAPER NO NOON NORTH NORTHEAST NORTHWEST NOTE NOTEPAD NUMBER NW OAK OF OFF OFFER OLD OMNIDYNE ON ONE OPEN ORCHARD ORNATE OUT OVEN OVER PACKAGED PAD PAGE PAINTING PANTRY PAPER PAPERS PATH PEACH PEAL PEAR PEEK PEN PENCIL PERFORMANCE PHILHARMONIC PHONE PICK PICTURE PIECE PIERCE PILE PILLS PINK PISTOL PLACE PLANT PLANTS PLATE PLATES PLAY PLAYER POKE POLISH POOL PORCELAIN PORTRAITS POSTER POUR POWDER PRESENT PRESS PRIVATE PROBLEM PROCEED PROP PULL PURSUE PUSH PUT Q QUESTION QUICKLY QUIETLY QUIT RAILING RAISE RAKE RAP RAPE RAZOR READ RECEIVER RECORD RED REFRIGERATOR RELEASE REMOVE RENDEZVOUS REPLY REPORT RESTART RESTORE RIGHT RING ROBNER ROLL ROOM ROPE ROSE ROSES ROURKE RUB RUG RUN S SAFE SAUCER SAVE SAW SAY SCANDAL SCORE SCOTCH SCRIPT SE SEARCH SECOND SECRET SECTION SECURE SEEN SEND SERGEANT SEURAT SHADE SHAKE SHARD SHAVING SHE SHED SHEETS SHELF SHELVES SHOW SHOWER SHUT SIGH SILVER SINK SINKS SIT SKIM SKIP SLICE SLIDE SLIP SLOWLY SMASH SMELL SMOKING SNEEZO SNIFF SOFA SOGGY SOIL SOUTH SOUTHE SOUTHWEST SPACE SPADE SPILL SPOT SQUEEZE STACK STAIRS STAND STARE STARTLE STEREO STEVE STEVEN STIFF STONE STOVE STRANGLE STRIKE STUB STUFF SUBSTANCE SUGAR SUICIDE SUNLIGHT SUPER SUPERBRIEF SURPRISE SW SWALLOW SWIM SWING SYMPHONY SYRUP T TABLE TABLES TABLETS TAKE TALK TAPE TAPES TASTE TAUNT TEA TEACUP TELEPHONE TELL TEST THANK THANKS THE THEM THEN THERE THROUGH THROW THRUST TICKET TIE TIME TO TODAY TOILET TOOL TOOLS TOOTHPASTE TOP TOSS TOUCH TOWEL TOWELS TRASH TRAY TREE TREETOP TRESTLE TRYST TUB TUG TURN U UNATTACH UNDER UNDERNEATH UNFASTEN UNHOOK UNIT UNLOCK UNSCRIPT UNSPACE UNTIE UNTIL UP UPSTAIRS USE USING VERBOSE VERIFY VERSION VOLUME W WADE WAIT WAKE WALK WALL WALLS WARRANT WAS WASHER WASTEP WATCH WATER WAVE WEATHER WERE WEST WET WHAT WHATS WHEN WHERE WHITE WHO WHY WICKER WILL WIND WINDOW WIPE WITH WOOD WOODEN WRITE WRONG Y YELLOW YES YOU YOUR ZZKJLK

Starcross

" $ , . A AB40 ACCESS ACROSS ADVENTURER AFFIRMATIVE AFT AGAIN AGAINST AIM AIRLOCK ALARM ALIEN ALIENS ALL AN AND ANGLE ANOMALY ANSWER ANT APPARATUS APPLY ARE AROUND ARTIFACT ASK AT ATTACH ATTACK AUDIO AWAKE AX01 AX32 AX71 AX87 BACK BALL BARE BARREL BARS BASKET BATHE BEAM BED BEHIND BELL BELT BESNAP BIN BITE BLACK BLAST BLIND BLOCK BLOW BLUE BOARD BODY BOTH BOX BOXES BRANDISH BREAK BRIEF BROWN BUBBLE BUCKLE BULKHEAD BUMP BUMPS BUNK BUREAU BURN BUT BUTTON CAGE CAGES CANCEL CARD CARRY CARTON CCW CENTER CERAMIC CERES CHART CHASE CHEWED CHIEF CHIEFS CHIEFTAIN CHILD CHUCK CLEAR CLIMB CLOSE COLUMN COMPUTER CONFIRM CONIFER CONSOLE CONTROL COT COUCH COURSE COVER CRASH CROSS CRYSTAL CURSE CW CYCAD D DAMAGE DAMN DEAD DEBRIS DESCRIBE DESTROY DETACH DETECTOR DIAGNOSE DIAL DIALS DIG DIRT DISEMBARK DISK DISKS DISPATCH DOCK DON DONATE DOOR DOWN DRINK DRIVE DROP E EARTH EAST EAT EIGHTH ELEVATION EMPTY ENERGY ENORMOUS ENTER ENUNCIATOR EQUALS EXAMINE EXCEPT EXIT F FALL FASTEN FEED FEEL FETISH FIELD FIFTH FIGHT FIND FIRE FIRST FIX FLIP FLOOR FLY FOLLOW FOR FORCE FORE FOREWARD FORMIDABLE FORWARD FOURTH FRAGMENT FREE FROM FRONT FRUITS GARBAGE GAUGES GAZE GESTURE GET GIANT GIVE GLASS GLOBE GLUE GO GOLD GOOD GRAIN GRASS GREEN GREY GRIN GROUND GRUE GUN GURTHARK HAND HANDHOLD HANDS HATCH HELLO HERD HEXAGON HI HIM HIT HOLD HOLE HOLOGRAPHIC HOOK HOP HUGE HUNGRY HUNTER HURL HURT HUT HUTS I IMAGE IMBIBE IN INDICATORS INJURE INNER INSERT INSIDE INSTRUMENTS INTERCEPT INTNUM INTO INVENTORY IS IT JAB JUMP JUNK KEY KICK KILL KISS KNOB KNOBS KNOCK L LADDER LAND LARGE LASER LAST LAUNCH LAY LEAP LEAVE LEAVES LIBRARY LIE LIFT LIGHT LIGHTS LINE LISTEN LOCK LONG LOOK LOWER LURKING MAINTENANCE MAP MARS MASS ME METAL MGCKJK MISSION MODEL MOLEST MOUSE MOVE MUD MURDER MY MYSELF N NAVIGATIONAL NEGATIVE NEST NEW NINTH NO NORTH OBJECT OF OFF OFFER ON ONE OPEN OUR OUT OUTER OUTPUT OVER P PAIR PALISADE PANEL PAT PATCH PET PHI PICK PIECE PINK PLACE PLANET PLANT PLANTERS PLAY PLAYER PLOT PLUG POCKET POINT POKE PORT PORTHOLE POWER PRESS PRESSURE PROCEED PROGRAM PROJECTOR PROTRUSION PULL PURPLE PURSUE PUSH PUT Q QUIT R RACK RAINBOW RAISE RANGE RAP RAPE RAT RAT-ANT RAY RAYGUN REACH READ READOUT RECEPTACLE RECLINE RECORDER RED REGISTRATION RELEASE RELIEF REMOVE RENDEZVOUS REPAIR REPLY REPORT REPTILE RESTART RESTORE ROD RODS ROPE RUB RUMMAGE RUN S SAFETY SAVE SAY SB SCORCHED SCORE SCREAM SCREEN SCRIPT SCULPTURE SEARCH SEAT SEATBELT SECOND SECURE SEE SEEK SELF SET SEVENTH SHAKE SHIP SHOOT SHOUT SHRUB SHUT SIFT SIGN SILENT SILVER SINISTER SIT SITUATION SIXTH SKELETON SKIM SKIP SLAY SLIDE SLOT SMALL SMASH SMASHED SMELL SMILE SMOKED SMOOTH SNIFF SOLAR SORT SOUTH SPACE SPACES SPEAR SPEARS SPHERE SPIDER SPOT SQUARE STAB STAIRS STAIRWAY STAND STARBOARD STARCROSS STARE STARTLE STATUS STEP STEPS STRIKE STUFF SUIT SUPER SUPERBRIEF SURFACE SURPRISE SWALLOW SWEEPER SWIM SWITCH SYMBOL SYSTEM TAKE TALK TAPE TAPES TASTE TATTERED TELL TENTH THAT THE THEN THETA THIN THIRD THIS THROUGH THROW TIE TINY TO TOSS TOTEMS TOUCH TRANSLATOR TRASH TRAY TREE TUG TURN U UM08 UM12 UM24 UM28 UM31 UM52 UM70 UM91 UNATTACH UNBUCKLE UNDER UNFASTEN UNHOOK UNICORN UNLOCK UNSCRIPT UNTIE UP US75 USING VCR VERBOSE VERIFY VERSION VIDEO VIEW VIEWPORT VIOLET VISOR W WADE WAIT WAKE WALK WALL WAVE WE WEAR WEASEL WEST WHAT WHATS WHERE WHITE WIFE WINDOW WITH WOOD Y YELL YELLOW YES ZAP ZORK

1 Like

I’m generating these with GitHub - visible-zorking/visiterp: Instrumented interpreter for ZIL games · GitHub using commands like

python3 visiterp/pyana/parse.py --game zork1-r88-s840726 -z gamesrc/zork1.zil --showdict

However, I wouldn’t try it on any Infocom source that isn’t already in the Visible Zorker pipeline. Every new game I tackle has some parsing quirks.

Thank you so much for these! I’m processing them now.

I seem to be missing any words containing single quotes, e.g. Zork 1 should have “bird’s”. It’s not a big problem, but I was wondering.

Hm, should it? The source (r88) has (ADJECTIVE BIRDS) in a few places, but no attempt at an apostrophe.

The nonalphabetic words are $VERIFY, ., ,, ", H2O, PDP10, FCD#3, and a couple of hyphenated words like AIR-PUMP.

(And, as we recall, PDP10 and FCD#3 are compiled wrong in r88 – no stop bit – and cannot be validly parsed.)

Hm, my list splits up $ and VERIFY. That’s a bug. Not sure how that happened.

Oh sorry! It was only in the file containing my attempt at guessing what words the game actually wants to recognize, from the 6-character version of all dictionary words.

There’s no apostrophe in the dictionary of Zork 1 R88.

I have just released v1.3. This is mainly a structural change, which makes NAIL work more like a proper library, as the files nail.h and parser.h are now located in a lib folder, and the game author shouldn’t have to edit them at all. The file grammar.inf, holding all grammar and action routines, is still located in the game folder, and the game author has to edit this file when adding or changing grammar.

Read the release notes, to learn what you need to know when upgrading.

3 Likes

Version 1.4 is out. It has a number of bugfixes.

Also, build_dictionary.rb now accepts arguments for which range of values you want to try as the factor for the checksum algorithm. E.g. if you’ve worked a while on your project, and it’s clear that no factor lower than 515 will do, you can add “-s 515” when calling build_dictionary.rb, to speed up the build process.

How slow is the code determining the factor?

My C code handling 4500 words (an extreme test case) takes just over 3 seconds on an old computer.

It’s pretty slow.

On my somewhat modern medium-spec laptop (11th gen i5, max turbo frequency 4.4 GHz), testing 1000 different factors for Trinity (2122 words) takes 4.1s. This is using a single thread, and it gives up testing a factor as soon as it has seen enough collisions to decide this factor won’t be a winner. All in all, it calculates 2.1M checksums in this run, so ~512K checksums per second.

Ah, looking at the numbers, I suddenly realized I must have removed the mechanism of aborting the calculations for a factor when it’s clear it’s not a winner.

I put it back in, and now it does 1.6M checksum calculations in 2.9s instead.

It may help to lowercase the words separately (outside of calcChk2), and the check for weird characters too.

Plus paring down other work done in the inner loop, e.g. the regex match in there for certain symbols.

Thanks, that’s right!

Actually, I can convert each word to an integer array once and for all, before starting to test factors.

(I added another idea just before your reply)