Post Stastics
- This post has 3202 words.
- Estimated read time is 15.25 minute(s).
Exploring the World of Textual Games
Textual games, such as text adventures, have long been cherished by enthusiasts for their immersive storytelling and engaging gameplay mechanics. These games, often characterized by their reliance on textual descriptions and player input, offer a unique gaming experience that stimulates imagination and problem-solving skills.
The presented text adventure game, aptly named "The Quest," encapsulates the essence of this genre. Through a series of commands and responses, players are transported into a world of mystery and discovery, where every decision shapes the outcome of their adventure.
Getting Started
Before delving into the intricacies of the game, it's essential to set the stage. Upon initialization, the game clears the screen and initializes various arrays and flags necessary for gameplay. This preparatory phase ensures a seamless gaming experience from the outset.
Navigating the World
Central to any text adventure is the parser, responsible for interpreting player commands. Players can interact with the game world by issuing commands such as "GO," "GET," "DROP," "LOOK," and more. These commands trigger specific routines within the game, enabling players to explore, collect items, solve puzzles, and progress through the narrative.
Immersive Descriptions
One of the hallmarks of textual games is their ability to paint vivid imagery through descriptive text. Each room is accompanied by a detailed description, allowing players to visualize their surroundings and immerse themselves in the game world fully.
Unraveling the Mystery
As players navigate through "The Quest," they unravel the mysteries left behind by their eccentric uncle. The game's storyline unfolds gradually, with each interaction and discovery revealing new clues and challenges. From deciphering diary entries to uncovering hidden treasures, every twist and turn keeps players engaged and eager to uncover the next secret.
The Journey Continues
As with any adventure, the journey in "The Quest" is as important as the destination. With each decision, players forge their path and shape their destiny. Whether they emerge victorious with the coveted magic ruby or succumb to the perils of the unknown, the adventure promises an unforgettable experience.
The game I present here comes from one of my early Christopher Lampton books: "How to Create Adventure Games", Publisher: A Computer-awareness first book, Franklin Watts New York I London | Toronto | Sydney 1986, ISBN: 0-531-10119-3, Copyright 1986 Christopher Lampton.
Christopher Lampton published many books in the area of computer science and children's stories. His computer books range from simple Introduction to BASIC, and other computer languages, to Linear Algebra and How to build flight simulators. Every one of his books is worth a good read and you can still learn much from his books though, they are admittedly, somewhat dated. This book is available on archive.org and many sites focused on BASIC programming and retro-computing.
Since I'm using QB64 and it can easily handle long variable names without eating up all my RAM (which was an issue on the systems this game was written for), I have made some modifications to the code to make it more readable and maintainable. The changes do not effect the way the game operates, only its readability. The changes are simple search and replacement of variable names like OB() to Objects and OB$() to ObjectNames(), and R, to CurrentRoom, etc. Almost all variables have been renamed to make the code easier to read and grok.
1 Rem ** THE QUEST ** 2 Rem ** 3 Rem ** An adventure game 4 Rem 10 Rem Put a statement here to clear the screen. If you are using a Radio Shack Model I, III, or 4, add a CLEAR statement. (See text.) 19 Clear 20 NumberOfRooms = 19: NumberOfObjects = 17: NumberOfDirections = 6: NumberOfItem = 5 30 Dim RoomNames$(NumberOfRooms) 31 Dim ObjectNumbers(NumberOfObjects) 32 Dim ObjectNames$(NumberOfObjects) 33 Dim ItemTags$(NumberOfObjects) 34 Dim MapArray(NumberOfRooms, NumberOfDirections) 40 Print "Please stand by. . . . ": Print: Print 50 GoSub 25000: GoSub 26000: GoSub 27000: Rem initialize arrays 60 CurrentRoom = 1: CurrentItem = 0: SaltFlag = 0: FormulaFlag = 0: MixtureFlag = 1: GloveFlag = 0 70 GoSub 30000: Rem Execute introductory sequence, if any. 80 Rem Put a statement here to clear the screen. 90 GoSub 700: GoSub 500: GoSub 600 91 Rem 92 Rem *** PARSER 99 Rem 100 Print: CM$ = "": Input "WHAT NOW"; CM$: If CM$ = "" Then 100 110 C = 0: CurrentVerb$ = "": CurrentNoun$ = "" 120 C = C + 1: If C > Len(CM$) Then 150 130 W$ = Mid$(CM$, C, 1): If W$ = " " Then 150 140 CurrentVerb$ = CurrentVerb$ + W$: GoTo 120 150 C = C + 1: If C > Len(CM$) Then 180 160 W$ = Mid$(CM$, C, 1): If W$ = " " Then 180 170 CurrentNoun$ = CurrentNoun$ + W$: GoTo 150 180 If CurrentVerb$ = "" Then 100 190 If Len(CurrentVerb$) > 3 Then CurrentVerb$ = Left$(CurrentVerb$, 3) 200 If Len(CurrentNoun$) > 3 Then CurrentNoun$ = Left$(CurrentNoun$, 3) 210 If CurrentNoun$ = "SHA" Then CurrentNoun$ = "SAL" 220 If CurrentNoun$ = "FOR" Then CurrentNoun$ = "BOT" 259 Rem 290 Rem 480 GoTo 2000: Rem Execute verb routines. 490 Rem 491 Rem *** DISPLAY DIRECTIONS 496 Rem 500 Print "YOU CAN GO: "; 510 For I = 0 To 5 520 If MapArray(CurrentRoom, I) > 0 Then Print DirectionNames$(I); " "; 530 Next I 540 Print 550 Return 590 Rem 596 Rem *** DISPLAY OBJECTS IN CURRENT ROOM 600 Print "YOU CAN SEE: " 610 ObjectExistsFlag = 0: For I = 0 To NumberOfObjects - 1 620 If (ObjectNumbers(I) And 127) = CurrentRoom Then Print " "; ObjectNames$(I): ObjectExistsFlag = 1 630 Next I 640 If ObjectExistsFlag = 0 Then Print " NOTHING OF INTEREST" 650 Return 690 Rem 691 Rem *** DISPLAY ROOM DESCRIPTION 696 Rem 700 Print: Print "YOU ARE "; RoomNames$(CurrentRoom) 710 Return 999 Rem *** REMOVE ITEM FROM INVENTORY AND PLACE IN CURRENT ROOM 1000 If NumberOfObjects = 0 Then Return 1010 For I = 0 To NumberOfObjects - 1 1020 If ItemTags$(I) = CurrentNoun$ Then ObjectExistsFlag = 1: ObjectRoomNumber = ObjectNumbers(I): GoTo 1050 1030 Next I 1040 ObjectExistsFlag = 0: Return 1050 ObjectRoomNumber = ObjectNumbers(I): If ObjectRoomNumber > 127 Then ObjectRoomNumber = ObjectRoomNumber - 128 1060 Return 1904 Rem 1994 Rem =========================================== 1995 Rem * VERB ROUTINES * 1996 Rem =========================================== 1997 Rem 1998 Rem Routine for the verb 'GO'. 1999 Rem 2000 If CurrentVerb$ <> "GO" Then 2500 2010 If CurrentNoun$ = "NOR" Then DirectionIndex = 0: GoTo 2400 2020 If CurrentNoun$ = "SOU" Then DirectionIndex = 1: GoTo 2400 2030 If CurrentNoun$ = "EAS" Then DirectionIndex = 2: GoTo 2400 2040 If CurrentNoun$ = "WES" Then DirectionIndex = 3: GoTo 2400 2050 If CurrentNoun$ = "UP" Then DirectionIndex = 4: GoTo 2400 2060 If CurrentNoun$ = "DOW" Then DirectionIndex = 5: GoTo 2400 2070 If CurrentNoun$ = "BOA" And ObjectNumbers(11) = CurrentRoom + 128 Then CurrentRoom = 13: GoTo 90 2390 Print "YOU CAN'T GO THERE!": GoTo 100 2391 Rem 2399 Rem 2400 If MapArray(CurrentRoom, DirectionIndex) > 0 And MapArray(CurrentRoom, DirectionIndex) < 128 Then CurrentRoom = MapArray(CurrentRoom, DirectionIndex): GoTo 90 2409 Rem 2410 If MapArray(CurrentRoom, DirectionIndex) = 128 Then Print "THE GUARD WON'T LET YOU!": GoTo 100 2480 GoTo 2390 2490 Rem 2499 Rem *** 'GET' ROUTINE 2500 If CurrentVerb$ <> "GET" And CurrentVerb$ <> "TAK" Then 2600 2510 GoSub 1000 2520 If ObjectExistsFlag = 0 Then Print "YOU CAN'T GET THAT!": GoTo 100 2530 If ObjectRoomNumber = -1 Then Print "YOU ALREADY HAVE IT!": GoTo 100 2540 If ObjectNumbers(I) > 127 Then Print "YOU CAN'T GET THAT!": GoTo 100 2550 If ObjectRoomNumber <> CurrentRoom Then Print "THAT'S NOT HERE!": GoTo 100 2570 If CurrentItem > NumberOfItem Then Print "YOU CAN'T CARRY ANY MORE,": GoTo 100 2575 If CurrentRoom = 18 And CurrentNoun$ = "RUB" Then Print "CONGRATULATIONS! YOU'VE WON!": GoTo 3430 2580 CurrentItem = CurrentItem + 1: ObjectNumbers(I) = -1: Print "TAKEN,": GoTo 100 2599 Rem *** 'DROP' ROUTINE 2600 If CurrentVerb$ <> "DRO" And CurrentVerb$ <> "THR" Then 2700 2610 GoSub 1000 2620 If ObjectExistsFlag = 0 Or ObjectRoomNumber <> -1 Then Print "YOU DON'T HAVE THAT!": GoTo 100 2650 CurrentItem = CurrentItem - 1: ObjectNumbers(I) = CurrentRoom: Print "DROPPED,": GoTo 100 2699 Rem *** 'INVENTORY' ROUTINE 2700 If CurrentVerb$ <> "INV" And CurrentVerb$ <> "I" Then 2800 2710 ObjectExistsFlag = 0: Print "YOU ARE CARRYING:" 2720 For I = 0 To NumberOfObjects - 1 2730 If ObjectNumbers(I) = -1 Then Print " "; ObjectNames$(I): ObjectExistsFlag = 1 2740 Next I 2750 If ObjectExistsFlag = 0 Then Print " NOTHING" 2760 GoTo 100 2798 Rem 2799 Rem *** 'LOOK' ROUTINE 2800 If CurrentVerb$ <> "LOO" And CurrentVerb$ <> "L" Then 2900 2810 If CurrentNoun$ <> "" Then 2910 2820 GoTo 90 2899 Rem *** 'EXAMINE' ROUTINE 2900 If CurrentVerb$ <> "EXA" Then 3400 2910 If CurrentNoun$ <> "GRO" Then 2940 2920 If CurrentRoom <> 6 Then Print "IT LOOKS LIKE GROUND!": GoTo 100 2930 Print "IT LOOKS LIKE SOMETHING'S BURIED HERE.": GoTo 100 2940 Rem 3000 GoSub 1000 3010 If ObjectRoomNumber <> CurrentRoom And ObjectRoomNumber <> -1 Then Print "IT'S NOT HERE!": GoTo 100 3020 If CurrentNoun$ = "BOT" Then Print "THERE'S SOMETHING WRITTEN ON IT!": GoTo 100 3030 If CurrentNoun$ = "CAS" Then Print "THERE'S A JEWEL INSIDE!": GoTo 100 3040 If CurrentNoun$ = "BAR" Then Print "IT'S FILLED WITH RAINWATER.": GoTo 100 3390 Print "YOU SEE NOTHING UNUSUAL.": GoTo 100 3399 Rem *** 'QUIT'Routine, REquires no Noun 3400 If CurrentVerb$ <> "QUI" Then 3500 3410 Print "ARE YOU SURE YOU WANT TO QUIT (YIN)";: Input QU$ 3420 If QU$ = "N" Then GoTo 100 3430 Print "WOULD YOU LIKE TO PLAY AGAIN (YIN)";: Input QU$ 3440 If QU$ = "Y" Then Run 3450 If QU$ = "N" Then End 3460 GoTo 3430 3499 Rem *** 'READ' ROUTINE 3500 If CurrentVerb$ <> "REA" Then 3700 3510 If CurrentNoun$ <> "DIA" Then 3560 3520 If ObjectNumbers(0) <> CurrentRoom And ObjectNumbers(0) <> -1 Then Print "THERE'S NO DIARY HERE!": GoTo 100 3530 Print "IT SAYS: 'ADD SODIUM CHLORIDE PLUS THE" 3540 Print "FORMULA TO RAINWATER, TO REACH THE" 3550 Print "OTHER WORLD.' ": GoTo 100 3560 If CurrentNoun$ <> "DIC" Then 3590 3570 If ObjectNumbers(4) <> CurrentRoom And ObjectNumbers(4) <> -1 Then Print "YOU DON'T SEE A DICTIONARY!": GoTo 100 3580 Print "IT SAYS: SODIUM CHLORIDE IS": Print "COMMON TABLE SALT.": GoTo 100 3590 If CurrentNoun$ <> "80T" Then 3620 3600 If ObjectNumbers(6) <> CurrentRoom And ObjectNumbers(6) <> -1 Then Print "THERE'S NO B0TTLE HERE!": GoTo 100 3610 Print "IT READS: 'SECRET FORMULA'.": GoTo 100 3620 Rem 3690 Print "YOU CAN'T READ THAT!": GoTo 100 3699 Rem *** 'OPEN' ROUTINE 3700 If CurrentVerb$ <> "OPE" Then 3900 3710 If CurrentNoun$ <> "BOX" Then 3740 3720 If ObjectNumbers(1) <> CurrentRoom And ObjectNumbers(1) <> -1 Then Print "THERE'S NO BOX HERE!": GoTo 100 3730 ObjectNumbers(6) = CurrentRoom: Print "SOMETHING FELL OUT!": GoTo 100 3740 If CurrentNoun$ <> "CAB" Then 3770 3750 If CurrentRoom <> 2 Then Print "THERE'S NO CA81NET HERE!": GoTo 100 3760 Print "THERE'S SOMETHING INSIDE!": ObjectNumbers(3) = 2: GoTo 100 3770 If CurrentNoun$ <> "CAS" Then 3820 3780 If CurrentRoom <> 18 Then Print "THERE'S NO CASE HERE!": GoTo 100 3790 If GloveFlag <> 1 Then Print "THE CASE IS ELECTRIFIED!": GoTo 100 3800 Print "THE GLOVES INSULATE AGAINST THE" 3810 Print "ELECTRICITY! THE CASE OPENS!" 3820 ObjectNumbers(15) = 18: GoTo 100 3890 Print "YOU CAN'T OPEN THAT!": GoTo 100 3899 Rem *** 'POUR' ROUTINE 3900 If CurrentVerb$ <> "POU" Then 4100 3910 If CurrentNoun$ <> "SAL" Then 3960 3920 If ObjectNumbers(3) <> CurrentRoom And ObjectNumbers(3) <> -1 Then Print "YOU DON'T HAVE THE SALT!": GoTo 100 3930 If SaltFlag = 1 Then Print "THE SHAKER IS EMPTY!": GoTo 100 3940 If CurrentRoom = 5 Then MixtureFlag = MixtureFlag + 1 3950 SaltFlag = 1: Print "POURED!": GoTo 4010 3960 If CurrentNoun$ <> "BOT" Then Print "YOU CAN'T POUR THAT!": GoTo 100 3970 If ObjectNumbers(6) <> CurrentRoom And ObjectNumbers(3) <> -1 Then Print "YOU DON'T HAVE THE BOTTLE!": GoTo 100 3980 If FormulaFlag = 1 Then Print "THE BOTTLE IS EMPTY!": GoTo 100 3990 If CurrentRoom = 5 Then MixtureFlag = MixtureFlag + 1 4000 FormulaFlag = 1: Print "POURED!" 4010 If MixtureFlag < 3 Then 100 4020 Print "THERE IS AN EXPLOSION!" 4030 Print "EVERYTHING GOES BLACK!" 4040 Print "SUDDENLY YOU ARE . . . " 4050 Print " . . . SOMEWHERE ELSE!" 4060 CurrentRoom = 6: GoTo 90 4099 Rem *** 'CLIMB' ROUTINE 4100 If CurrentVerb$ <> "CLI" Then 4300 4110 If CurrentNoun$ <> "TRE" Then 4140 4120 If CurrentRoom <> 7 Then Print "THERE'S NO TREE HERE!": GoTo 100 4130 Print "YOU CAN'T REACH THE BRANCHES!": GoTo 100 4140 If CurrentNoun$ <> "LAD" Then 4280 4145 If ObjectNumbers(7) <> CurrentRoom And ObjectNumbers(7) <> -1 Then Print "YOU DON'T HAVE THE LADDER!": GoTo 100 4150 If CurrentRoom <> 7 Then 4180 4160 Print "THE LADDER SINKS UNDER YOUR WEIGHT!" 4170 Print "IT DISAPPEARS INTO THE GROUND!": ObjectNumbers(7) = 0: GoTo 100 4180 Print "WHATEVER FOR?": GoTo 100 4280 Print "IT WON'T DO ANY GOOD.": GoTo 100 4299 Rem *** 'JUMP' ROUTINE 4300 If CurrentVerb$ <> "JUM" Then 4400 4310 If CurrentRoom <> 7 And CurrentRoom <> 8 Then Print "WHEE! THAT WAS FUN!": GoTo 100 4315 If CurrentRoom = 8 Then 4350 4320 Print "YOU GRAB THE LOWEST BRANCH OF THE" 4330 Print "TREE AND PULL YOURSELF UP . . . . " 4340 CurrentRoom = 8: GoTo 90 4350 Print "YOU GRAB A HIGHER BRANCH ON THE" 4360 Print "TREE AND PULL YOURSELF UP." 4370 CurrentRoom = 19: GoTo 90 4399 Rem *** 'DIG' ROUTINE 4400 If CurrentVerb$ <> "DIG" Then 4500 4410 If CurrentNoun$ <> "HOL" And CurrentNoun$ <> "GRO" And CurrentNoun$ <> "" Then Print "YOU CAN'T DIG THAT!": GoTo 100 4415 If ObjectNumbers(8) <> CurrentRoom And ObjectNumbers(8) <> -1 Then Print "YOU DON'T HAVE A SHOVEL!": GoTo 100 4420 If CurrentRoom <> 6 Then Print "YOU DON'T FIND ANYTHING.": GoTo 100 4430 If ObjectNumbers(10) <> 0 Then Print "THERE'S NOTHING ELSE THERE!": GoTo 100 4440 Print "THERE'S SOMETHING THERE!": ObjectNumbers(10) = 6: GoTo 100 4499 Rem *** 'ROW' ROUTINE 4500 If CurrentVerb$ <> "ROW" Then 4600 4510 If CurrentNoun$ <> "BOA" And CurrentNoun$ <> "" Then Print "HOW CAN YOU ROW THAT?": GoTo 100 4520 If CurrentRoom <> 13 Then Print "YOU'RE NOT IN THE BOAT!": GoTo 100 4530 Print "YOU DON'T HAVE AN OAR!": GoTo 100 4599 Rem *** 'WAVE" ROUTINE 4600 If CurrentVerb$ <> "WAV" Then 4700 4610 If CurrentNoun$ <> "FAN" Then Print "YOU CAN'T WAVE THAT!": GoTo 100 4615 If ObjectNumbers(12) <> CurrentRoom And ObjectNumbers(12) <> -1 Then Print "YOU DON'T HAVE THE FAN!": GoTo 100 4620 If CurrentRoom <> 13 Then Print "YOU FEEL A REFRESHING BREEZE!": GoTo 100 4630 Print "A POWERFUL BREEZE PROPELS THE BOAT" 4640 Print "TO THE OPPOSITE SHORE!" 4650 If ObjectNumbers(11) = 140 Then ObjectNumbers(11) = 142: GoTo 100 4660 ObjectNumbers(11) = 140: GoTo 100 4699 Rem *** 'LEAVE' OR 'EXIT' ROUTINE 4700 If CurrentVerb$ <> "LEA" And CurrentVerb$ <> "EXI" Then 4800 4710 If CurrentRoom <> 13 Then Print "PLEASE GIVE A DIRECTION!": GoTo 100 4720 If CurrentNoun$ <> "BOA" And CurrentNoun$ <> "" Then Print "HUH?": GoTo 100 4730 CurrentRoom = ObjectNumbers(11) - 128: GoTo 90 4799 Rem *** 'FIGHT' ROUTINE 4800 If CurrentVerb$ <> "FIG" Then 4900 4810 If CurrentNoun$ = "" Then Print "WHOM DO YOU WANT TO FIGHT?": GoTo 100 4820 If CurrentNoun$ <> "GUA" Then Print "YOU CAN'T FIGHT HIM!": GoTo 100 4830 If CurrentRoom <> 16 Then Print "THERE'S NO GUARD HERE!": GoTo 100 4840 If ObjectNumbers(10) <> -1 Then Print "YOU DON'T HAVE A WEAPON!": GoTo 100 4850 Print "THE GUARD, NOTICING YOUR SWORD," 4860 Print "WISELY RETREATS INTO THE CASTLE." 4870 MapArray(16, 0) = 17: ObjectNumbers(13) = 0: GoTo 100 4899 Rem *** 'WEAR' ROUTINE 4900 If CurrentVerb$ <> "WEA" Then 5000 4910 If CurrentNoun$ <> "GLO" Then Print "YOU CAN'T WEAR THAT!": GoTo 100 4920 If ObjectNumbers(16) <> CurrentRoom And ObjectNumbers(16) <> -1 Then Print "YOU DON'T HAVE THE GLOVES.": GoTo 100 4930 Print "YOU ARE NOW WEARING THE GLOVES.": GloveFlag = 1: GoTo 100 4999 Rem *** DONT KNOW HOW TO DO THAT ROUTINE 5000 Rem 24900 Print "I DON'T KNOW HOW TO DO THAT": GoTo 100 24980 Rem ================================================= 24981 Rem * DATA LOADING ROUTINES * 24982 Rem ================================================= 24990 Rem 24991 Rem The following routine reads the MapArrayp data into 24992 Rem the MapArrayp array, MapArray(ROOM, DIRECTION). 24993 Rem 25000 If NumberOfRooms = 0 Then Return 25010 DirectionNames$(0) = "NORTH": DirectionNames$(1) = "SOUTH": DirectionNames$(2) = "EAST" 25020 DirectionNames$(3) = "WEST": DirectionNames$(4) = "UP": DirectionNames$(5) = "DOWN" 25030 For I = 1 To NumberOfRooms 25040 For J = 0 To NumberOfDirections - 1 25050 Read MapArray(I, J) 25060 Next J 25070 Next I 25080 Return 25099 Rem *** ROOM DIRECTION DATA (Adjacent Rooms) 25100 Data 4,3,2,0,0,0: Rem LIVING ROOM 25110 Data 0,0,0,1,0,0: Rem KITCHEN 25120 Data 1,0,0,0,0,0: Rem LIBRARY 25130 Data 0,1,0,5,0,0: Rem FRONT YARD 25140 Data 0,0,4,0,0,0: Rem GARAGE 25150 Data 9,7,0,0,0,0: Rem OPEN FIELD 25160 Data 6,0,0,0,0,0: Rem EDGE OF FOREST 25170 Data 0,0,0,0,0,7: Rem BRANCH OF TREE 25180 Data 0,6,10,0,0,0: Rem LONG, WINDING ROAD (1) 25190 Data 11,0,0,9,0,0: Rem LONG, WINDING ROAD (2) 25200 Data 0,10,0,12,0,0: Rem LONG, WINDING ROAD (3) 25210 Data 0,0,11,0,0,0: Rem SOUTH BANK OF RIVER 25220 Data 0,0,0,0,0,0: Rem BOAT 25230 Data 15,0,0,0,0,0: Rem NORTH BANK OF RIVER 25240 Data 16,14,0,0,0,0: Rem WELL-TRAVELED ROAD 25250 Data 128,15,0,0,0,0: Rem SOUTH OF CASTLE 25260 Data 0,0,0,0,18,0: Rem NARROW HALL 25270 Data 0,0,0,0,0,17: Rem LARGE HALL 25280 Data 0,0,0,0,0,8: Rem TOP OF TREE 25900 Rem 25910 Rem The following subroutine reads the object data 25920 Rem into the three object arrays, ObjectNumbers(X), ObjectNames$(X), and 25930 Rem 02$(X). 25940 Rem 26000 If NumberOfObjects = 0 Then Return 26010 For I = 0 To NumberOfObjects - 1 26020 Read ObjectNames$(I), ItemTags$(I), ObjectNumbers(I) 26030 Next I 26040 Return 26099 Rem *** Object Data 26100 Data AN OLD DIARY,DIA,1: Rem OBJECT #0 26110 Data A SMALL BOX,BOX,1: Rem OBJECT #1 26120 Data CABINET,CAB,130: Rem OBJECT #2 26130 Data A SALT SHAKER,SAL,0: Rem OBJECT #3 26140 Data A DICTIONARY,DIC,3: Rem OBJECT #4 26150 Data WOODEN BARREL,BAR,133: Rem OBJECT #5 26160 Data A SMALL BOTTLE,BOT,0: Rem OBJECT #6 26170 Data A LADDER,LAD,4: Rem OBJECT #7 26180 Data A SHOVEL,SHO,5: Rem OBJECT #8 26190 Data A TREE,TRE,135: Rem OBJECT #9 26200 Data A GOLDEN SWORD,SWO,0: Rem OBJECT #10 26210 Data A WOODEN BOAT,BOA,140: Rem OBJECT #11 26220 Data A MAGIC FAN,FAN,8: Rem OBJECT #12 26230 Data A NASTY-LOOKING GUARD,GUA,144: Rem OBJECT #13 26240 Data A GLASS CASE,CAS,146: Rem OBJECT #14 26250 Data A GLOWING RUBY,RUB,0: Rem OBJECT #15 26260 Data A PAIR OF RUBBER GLOVES,GLO,19: Rem OBJECT #17 26990 Rem 26999 Rem *** ROOM DISCRIPTION 27000 RoomNames$(1) = "IN YOUR LIVING ROOM." 27010 RoomNames$(2) = "IN THE KITCHEN." 27020 RoomNames$(3) = "IN THE LIBRARY." 27030 RoomNames$(4) = "IN THE FRONT YARD." 27040 RoomNames$(5) = "IN THE GARAGE." 27050 RoomNames$(6) = "IN AN OPEN FIELD." 27060 RoomNames$(7) = "AT THE EDGE OF A FOREST." 27070 RoomNames$(8) = "ON A BRANCH OF A TREE." 27080 RoomNames$(9) = "ON A LONG, WINDING ROAD." 27090 RoomNames$(10) = "ON A LONG, WINDING ROAD." 27100 RoomNames$(11) = "ON A LONG, WINDING ROAD." 27110 RoomNames$(12) = "ON THE SOUTH BANK OF A RIVER." 27120 RoomNames$(13) = "INSIDE THE WOODEN BOAT." 27130 RoomNames$(14) = "ON THE NORTH BANK OF A RIVER." 27140 RoomNames$(15) = "ON A WELL-TRAVELED ROAD." 27150 RoomNames$(16) = "IN FRONT OF A LARGE CASTLE." 27160 RoomNames$(17) = "IN A NARROW HALL." 27170 RoomNames$(18) = "IN A LARGE HALL." 27180 RoomNames$(19) = "ON THE TOP OF A TREE." 29900 Return 29990 Rem 29999 Rem *** INTRODUCTION ROUTINE 30000 Print "ALL YOUR LIFE YOU HAD HEARD THE STORIES" 30010 Print "ABOUT YOUR CRAZY UNCLE SIMON. HE WAS AN" 30020 Print "INVENTOR, WHO KEPT DISAPPEARING FOR" 30030 Print "LONG PERIODS OF TIME, NEVER TELLING" 30040 Print "ANYONE WHERE HE HAD BEEN." 30050 Print 30060 Print "YOU NEVER BELIEVED THE STORIES, BUT" 30070 Print "WHEN YOUR UNCLE DIED AND LEFT YOU HIS" 30080 Print "DIARY, YOU LEARNED THAT THEY WERE TRUE." 30090 Print "YOUR UNCLE HAD DISCOVERED A MAGIC" 30100 Print "LAND, AND A SECRET FORMULA THAT COULD" 30110 Print "TAKE HIM THERE. IN THAT LAND WAS A" 30120 Print "MAGIC RUBY, AND HIS DIARY CONTAINED" 30130 Print "THE INSTRUCTIONS FOR GOING THERE TO" 30140 Print "FIND IT." 30150 Input A 31999 Return
This code could be further enhanced if it used functions. However, I wanted to keep this code as close as possible to its original form. If you read the book, it gives a detailed description of how it works, so I wont go into that here. I present the code here only for review and to allow others to type it in and learn from it.
I will soon be publishing an article on creating text adventure games (as they were called when I learned to code) A.K.A. Interactive Fiction, using a small extensible python framework. Until then, download and install QB64 and type this program in (or copy and paste the source code above) and play the game. The book will be helpful but give it a go before reading the book.
The Art of Game Design
Behind every captivating text adventure lies a meticulously crafted design that balances gameplay mechanics, narrative depth, and player engagement. Let's delve deeper into the design principles underpinning "The Quest" and explore how they contribute to the game's immersive experience.
Structural Foundation
At the core of "The Quest" lies a robust structural foundation that encompasses various elements essential for gameplay. From defining the number of rooms and objects to mapping out directions and item interactions, meticulous attention to detail ensures coherence and consistency throughout the game world.
Player Agency
Central to the design philosophy of "The Quest" is the concept of player agency – the ability for players to shape the outcome of their adventure through meaningful choices and actions. By providing a diverse range of verbs and nouns for interaction, the game empowers players to express their creativity and problem-solving skills.
Dynamic Storytelling
Textual games excel in delivering dynamic storytelling experiences that adapt to player input and decisions. Through carefully crafted descriptions, dialogues, and plot twists, "The Quest" captivates players with its immersive narrative, keeping them invested in the unfolding story from start to finish.
Puzzle Design
Puzzles play a crucial role in text adventures, serving as both obstacles to overcome and gateways to new discoveries. The puzzles in "The Quest" are designed to challenge players' logic and lateral thinking, rewarding ingenuity and perseverance with satisfying solutions and narrative progression.
Player Feedback and Guidance
Effective player feedback is essential for guiding players through the game world and providing clarity on their actions' consequences. Whether through descriptive room descriptions, informative error messages, or subtle hints, "The Quest" ensures that players always feel supported and encouraged on their journey.
Balancing Challenge and Accessibility
A well-designed text adventure strikes a delicate balance between challenge and accessibility, catering to both seasoned adventurers and newcomers to the genre. Through intuitive controls, gradual difficulty curves, and optional hints, "The Quest" welcomes players of all skill levels to embark on their quest with confidence.
Community Engagement
The longevity of a text adventure often relies on its ability to foster a vibrant community of players who share their experiences, strategies, and fan creations. By embracing player-generated content, such as custom puzzles, mods, and fan fiction, "The Quest" cultivates a sense of camaraderie and creativity among its player base.
Continual Iteration and Improvement
Even the most finely crafted games can benefit from ongoing iteration and improvement based on player feedback and emerging trends. Through regular updates, patches, and expansions, "The Quest" evolves alongside its player community, ensuring that the adventure remains fresh and captivating for years to come.
In conclusion, textual games like "The Quest" offer a captivating blend of storytelling, exploration, and problem-solving. By embracing the power of words, these games ignite the imagination and challenge players to embark on epic adventures from the comfort of their own screens.