ChrisIverson ChrisIverson Jan 30, 2008 - "Code debugging."

This is actually Noble D. Bell's Text Adventure Engine, with slight modifications by me. I am posting it here for accessibility purposes.

[[code format="vb"]]' **********************************************************************************************************************
' * TEXT ADVENTURE ENGINE                                                                                              *
' * RELEASE 1.0.0  - FREEWARE                                                                                          *
' * BY NOBLE D. BELL (http://www.noblebell.com)                                                                        *
' *                                                                                                                    *
' * NOTICE:                                                                                                            *
' * You are free to use this text game engine for any use. The author, Noble D. Bell, is not responsible in any way    *
' * for the use or misuse of this engine. If you do make changes or modifications to the code I require that you email *
' * me the revised code.                                                                                               *
' **********************************************************************************************************************

' REVISIONS:
'   * February 5, 2006 - OFFICIAL RELEASE 1.0.0

' TO DO:
'   * Add: LIGHT / EXTINGUISH commands for using a light source
'   * Program: LEARN / CAST for magic spells


' ======================================================================================================================
' PROGRAM STARTS HERE
' ======================================================================================================================
    ' Every LB'er should know what this is for.
    NOMAINWIN

    ' Setup the Window that will be used to play the game.
    GOSUB [Setup.GUI]


    ' Setup global variables for True/False
    GLOBAL TRUE,FALSE
    TRUE = 1
    FALSE = 0

    ' Setup global variables that will be used throughout the game.
    ' score - the current score for the player, turns - the number of turns the player has taken
    ' rm - the current room the player is in, maxinventory - the total number of items the player can pack
    ' inventorycount - the total number of items the player is carrying, OK - used as a flag
    ' maxhits - the max number of damage a player can take, hits - the total points of damage the player has taken
    ' defense - the number needed to hit a player, offense - the amount of damage a player can inflict
    ' gold - the amount of money the player has, maxmp - the total amount of magic the player can wield
    ' mp - the total amount of magic the player has left, armor$ - the type of armor the player is wearing
    ' weapon$ - the type of weapon the player is wielding, encounter - flag indicating a current battle
    ' lantern - a flag indicating if the lantern is on or off, needlight - a flag indicating if an area is dark or not
    ' noun - the number of the selected noun, verb - the number of the selected verb
    ' gametitle$ - the title of your game, gamedescription - the description of your game, crlf$ - carriage return/linefeed

    GLOBAL score,turns,maxscore,rm,maxinventory,inventorycount,OK
    GLOBAL maxhits,hits,defense,offense,gold,maxmp,mp,armor$,weapon$
    GLOBAL encounter,lantern,needlight,noun,verb
    GLOBAL gametitle$,gamedescription$,crlf$

    ' Special game variables and arrays
    ' rooms$(100) - This contains the description for each room in the game upto 100 rooms.
    ' roomProperties(100, 2) - Determines if the room is available for teleporting.
    ' exits(100,15) - This contains the visible exits in each room
    ' help$(100) - This contains some help or a clue for a particular room in the game.
    ' objects$(100) - Contains a list of objects the player can interact with in the game upto 100.
    ' objectproperties(100,7) - Contains a list of different properties about an object in the game.
    ' commands$(24) - Contains a list of commands (verbs) that are used in the game.
    ' objectdescriptions$(100) - Contains a list of descriptions about each object in the game.
    '
    ' exits parameters:
    '   1 - North, 2 - East, 3 - South, 4 - West, 5 - Up, 6 - Down : Holds connecting room number. Has 0 if not an exit.
    '   7 - 12 are flags for each exit. (See example for use)
    '   13 - 15 are not used at present time
    '
    ' object properties parameters:
    '   1 - the room location the object resides in.
    '   2 - tells if the object is takeable (TRUE,FALSE)
    '   3 - if the object is a monster tells how many hitpoints it has
    '   4 - if the object is a monster tells how hard it is to hit it (1-20)
    '   5 - if the object is a monster tells how much damage it can inflict (4,6,8,10,12,20)
    '   6 - special flag
    '   7 - Object is a source of Light(lantern, e.g.)

    ' room properties:
    '   1 - Room can be teleported to. Values: 0 - Not Visited 1 - Visted, able to TP 2 - Never TP
    '   2 - Room needs light


    DIM rooms$(100),exits(100,15),help$(100),commands$(27)
    DIM objects$(100),objectproperties(100,7),objectdescriptions$(100)
    DIM roomProperties(100, 2)

    ' Assign the crlf$ with the ascii characters that represent a carriage return and a linefeed.
    crlf$ = chr$(13)+chr$(10)


    ' Initialize everything and begin
    GOSUB [Setup.General]
    GOSUB [Setup.Rooms]
    GOSUB [Setup.Objects]
    GOSUB [Begin]

    GOSUB [FleshRoom]
    GOTO [Display]


' **********************************************************************************************************************
' * WAIT FOR THE USER TO DO SOMETHING.                                                                                 *
' **********************************************************************************************************************
[EventLoop]
    #m.txtCommand, ""
    #m.txtCommand, "!setfocus"
    Wait

' **********************************************************************************************************************
' * THE PARSER - BREAKS DOWN THE COMMAND INTO A VERB + NOUN COMBINATION.                                               *
' **********************************************************************************************************************
[Parser]
    turns = turns + 1                       ' add one to the turns variable.
    #m.txtCommand, "!contents? command$";   ' get what the user typed into the command text box.
    command$ = upper$(command$)             ' convert what the user typed to upper case text.
    verb$ = ""                              ' clear the noun and verb strings to nil.
    noun$ = ""
    verb$ = WORD$(command$,1)               ' using lb's word$ get the verb part of the command and put it in verb$.
    noun$ = WORD$(command$,2)               ' using lb's word$ get the noun part of the command and put it in noun$.
    verb  = 0                               ' set the verb and noun id's to 0.
    noun  = 0

    Gosub [Parser.Verb]                     ' check to see if the verb the user typed is one that we understand.
    Return                                  ' return to calling module.

[Parser.Verb]                               ' see if the verb the user typed is one that we understand and if it is
    for x = 1 to 27                         ' then assign it it's action value (place in the array). if it is not then
        if verb$ = commands$(x) then        ' set the verb id to 0 meaning not known.
            verb=x
            exit for
        end if
    next x

    if verb = 0 then                        ' the verb is not known so tell the user to try again.
        txt$ = "I don't understand that command. Try saying it a different way please."
        Return
    end if

    select case verb                        ' the verb is known so let's act on it and see what we need to do with it.
        case 1      ' North
            if exits(rm,1)<>0 then
                GOSUB [Logic]
                if OK=TRUE then
                    rm=exits(rm,1)
                    GOSUB [FleshRoom]
                end if
            else
                txt$ = "You cannot go that direction."
            end if

        case 2      ' East
            if exits(rm,2)<>0 then
                GOSUB [Logic]
                if OK=TRUE then
                    rm=exits(rm,2)
                    GOSUB [FleshRoom]
                end if
            else
                txt$ = "You cannot go that direction."
            end if

        case 3      ' South
            if exits(rm,3)<>0 then
                GOSUB [Logic]
                if OK=TRUE then
                    rm=exits(rm,3)
                    GOSUB [FleshRoom]
                end if
            else
                txt$ = "You cannot go that direction."
            end if

        case 4      ' West
            if exits(rm,4)<>0 then
                GOSUB [Logic]
                if OK=TRUE then
                    rm=exits(rm,4)
                    GOSUB [FleshRoom]
                end if
            else
                txt$ = "You cannot go that direction."
            end if

        case 5      ' Up
            if exits(rm,5)<>0 then
                GOSUB [Logic]
                if OK=TRUE then
                    rm=exits(rm,5)
                    GOSUB [FleshRoom]
                end if
            else
                txt$ = "You cannot go that direction."
            end if

        case 6      ' Down
            if exits(rm,6)<>0 then
                GOSUB [Logic]
                if OK=TRUE then
                    rm=exits(rm,6)
                    GOSUB [FleshRoom]
                end if
            else
                txt$ = "You cannot go that direction."
            end if

        case 7      ' Save
            if encounter = TRUE then
                txt$ = "You cannot save a game during an encounter."
            else
                open "gamedata.dat" for output as #1
                print #1,score
                print #1,turns
                print #1,rm
                print #1,inventorycount
                print #1,hits
                print #1,defense
                print #1,offense
                print #1,gold
                print #1,mp
                print #1,armor$
                print #1,weapon$
                for x=1 to 100
                    for y=1 to 7
                        print #1,objectproperties(x,y)
                    next y
                next x
                for x=1 to 100
                    for y=1 to 15
                        print #1,exits(x,y)
                    next y
                next x
                for x=1 to 100
                    for y = 1 to 2
                        print #1, roomProperties(x, y)
                    next y
                next x
                print #1,lantern
                close #1
                txt$ = "Game saved."
            end if

        case 8      ' Load
            if encounter = TRUE then
                txt$ = "You cannot load a game during an encounter."
            else
                dim info$(10, 10)
                if fileExists(DefaultDir$, "gamedata.dat") then
                    open "gamedata.dat" for input as #1
                    input #1,score
                    input #1,turns
                    input #1,rm
                    input #1,inventorycount
                    input #1,hits
                    input #1,defense
                    input #1,offense
                    input #1,gold
                    input #1,mp
                    input #1,armor$
                    input #1,weapon$
                    for x=1 to 100
                        for y=1 to 7
                            input #1,objectproperties(x,y)
                        next y
                    next x
                    for x=1 to 100
                        for y=1 to 15
                            input #1,exits(x,y)
                        next y
                    next x
                    for x=1 to 100
                        for y = 1 to 2
                            input #1, roomProperties(x, y)
                        next y
                    next x
                    input #1,lantern
                    close #1
                    txt$ = "Game loaded."
                else
                    txt$ = "You don't have a game saved. Save one first."
                end if
            end if

        case 9      ' Look
            #m.txtView, ""
            GOSUB [FleshRoom]

        case 10     ' Inventory
            txt$ = "You are carrying the following items:"+chr$(13)+chr$(10)
            tmp = 0
            for x = 1 to 100
                if objectproperties(x,1)=0 then
                    if objects$(x)<>"" then
                        txt$ = txt$ + objects$(x)+chr$(13)+chr$(10)
                        tmp = 1
                    end if
                end if
            next x
            if tmp = 0 then txt$ = txt$ + "Nothing."

        case 11     ' Score
            txt$ = "Your score is " + str$(score) + " out of " + str$(maxscore) + " in " + str$(turns) + " turns."+chr$(13)+chr$(10)
            txt$ = txt$ + "You have " + str$(hits) + "/" + str$(maxhits) + " hit points." + chr$(13)+chr$(10)
            txt$ = txt$ + "You have " + str$(mp) + "/" + str$(maxmp) + " magic points." + chr$(13)+chr$(10)
            txt$ = txt$ + "You can inflict upto " + str$(offense) + " points of damage."+chr$(13)+chr$(10)
            txt$ = txt$ + "Your defense is " + str$(defense) + "."+chr$(13)+chr$(10)
            txt$ = txt$ + "You have " + str$(gold) + " gold."+chr$(13)+chr$(10)
            txt$ = txt$ + "You are wearing " + armor$ + " armor."+chr$(13)+chr$(10)
            txt$ = txt$ + "You are wielding " + weapon$ + "."

        case 12     ' Inspect
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)=0 or objectproperties(noun,1)=rm then
                    txt$ = objectdescriptions$(noun)
                    GOSUB [Logic]
                else
                    txt$ = "You don't see that here."
                end if
            end if

        case 13     ' Use
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)<>0 then
                    txt$ = "You don't have that."
                else
                    GOSUB [Logic]
                end if
            end if

        case 14     ' Take
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)<>rm then
                    txt$ = "You don't see that here."
                    return
                end if
                if objectproperties(noun,1)=0 then
                    txt$ = "You already have that."
                    return
                end if
                if objectproperties(noun,2)=FALSE then
                    txt$ = "You cannot take that."
                    return
                end if
                if inventorycount+1 > maxinventory then
                    txt$ = "You cannot carry that, you are too heavy."
                    return
                end if
                objectproperties(noun,1)=0
                txt$ = "Taken."
                inventorycount = inventorycount + 1
            end if

        case 15     ' Drop
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)=0 then
                    objectproperties(noun,1)=rm
                    txt$ = "Dropped."
                    inventorycount = inventorycount - 1
                else
                    txt$ = "You don't have that."
                end if
            end if

        case 16     ' Fight
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)=rm then
                    if objectproperties(noun,3)=0 then
                        txt$ = "That is harmless. Why would you want to fight that?"
                    else
                        GOSUB [Battle]
                    end if
                else
                    txt$ = "You don't see that here."
                end if
            end if

        case 17     ' Quit
            GOTO [Quit]

        case 18     ' Help
            txt$ = help$(rm)

        case 19     ' Arm
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)<>0 then
                    txt$="You don't have that."
                    return
                end if
                if objects$(noun)=weapon$ then
                    txt$="You are already wielding that."
                    return
                end if
                weapon$ = objects$(noun)
                offense = objectproperties(noun,5)
                txt$ = "You are now wielding a " + weapon$ + "."
            end if

        case 20     ' UnArm
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)<>0 then
                    txt$="You don't have that."
                    return
                end if
                if objects$(noun)<>weapon$ then
                    txt$="You are not wielding that."
                    return
                end if
                weapon$ = "hands"
                offense=4
                txt$ = "You are now wielding " + weapon$ + "."
            end if

        case 21     ' Wear
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)<>0 then
                    txt$="You don't have that."
                    return
                end if
                if objects$(noun)=armor$ then
                    txt$="You are already wearing that."
                    return
                end if
                armor$ = objects$(noun)
                defense = objectproperties(noun,4)
                txt$ = "You are now wearing " + armor$ + " armor."
            end if
        case 22     ' Remove
            GOSUB [Parser.Noun]
            if noun <> 0 then
                if objectproperties(noun,1)<>0 then
                    txt$="You don't have that."
                    return
                end if
                if objects$(noun)<>armor$ then
                    txt$="You are not wearing that."
                    return
                end if
                armor$ = "Cloth"
                defense = 9
                txt$ = "You are now wearing " + armor$ + " armor."
            end if
        case 23     ' Learn
            txt$ = "Not used in this adventure."
        case 24     ' Cast
            txt$ = "Not used in this adventure."
        case 25     'Teleport
            GOSUB [Logic]
            If OK=TRUE and TOK = TRUE then
                rm = val(noun$)
                gosub [FleshRoom]
            Else
                txt$ = "Cannot TELEPORT there."
            End If
        case 26     'Light
            GOSUB [Parser.Noun]
            If objectproperties(x, 7) = 1 then
                If lantern then
                    txt$ = "You already have something lit!"
                Else
                    lantern = 1
                    txt$ = "You have lit the ";objects$(x)
                End If
            Else
                txt$ = "That cannot be lit."
            End If
        case 27     'Extinguish
            GOSUB [Parser.Noun]
            If objectproperties(x, 7) = 1 then
                If lantern then
                    lantern = 0
                    txt$ = "The ";objects$(x);" was put out."
                Else
                    txt$ = "The ";objects$(x);" is not lit."
                End If
            Else
                txt$ = "That cannot be extinguished."
            End If

    End Select

    Return

[Parser.Noun]                                       ' look to see if we understand what the object or noun is that the
    for x = 1 to 18                                 ' user entered. if we do understand it then assign it it's action
        if noun$ = objects$(x) then                 ' id (place in the array) otherwise assign the noun id a 0 meaning
            noun=x                                  ' we did not know that object.
            exit for
        end if
    next x

    if noun = 0 then
        txt$ = "I don't know what that is."
        Return
    end if

    Return

' **********************************************************************************************************************
' * USER TAPS OK OR HITS ENTER, ACT ON THEIR COMMANDS.                                                                 *
' **********************************************************************************************************************
[Okay]
    GOSUB [Parser]
    GOTO [Display]


' **********************************************************************************************************************
' * DISPLAY ACTION                                                                                                     *
' **********************************************************************************************************************
[Display]
    #m.txtView, "!contents? tmpTxt$";
    #m.txtView, ""
    'tmpTxt$=""
    tmpTxt$ = tmpTxt$ + chr$(13) + chr$(10)
    tmpTxt$ = tmpTxt$ + "> " + command$ + chr$(13) + chr$(10) + chr$(13) + chr$(10)
    tmpTxt$ = tmpTxt$ + txt$ + chr$(13) + chr$(10)

    if needlight = TRUE and lantern = FALSE then
        tmpTxt$ = "You cannot see anything. It is pitch black here."+chr$(13)+chr$(10)
    end if

    #m.txtView, "!setfocus"
    #m.txtView, tmpTxt$

   Call VerticalScroll hWnd(#m.txtView), _SB_BOTTOM             ' Thanks Janet!!!
    ' Call VerticalScroll hWnd(#main.textbox), _SB_TOP
    ' Call VerticalScroll hWnd(#main.textbox), _SB_PAGEDOWN
    ' Call VerticalScroll hWnd(#main.textbox), _SB_PAGEUP


    GOTO [EventLoop]

' **********************************************************************************************************************
' * DESCRIBE ROOM FOR DISPLAY ROUTINE                                                                                  *
' **********************************************************************************************************************
[FleshRoom]
    If roomProperties(rm, 1) = 0 then roomProperties(rm, 1) = 1   ' Allows TELEPORTING
    If not(lantern) AND roomProperties(rm, 2) then
        txt$ = "The darkness is so blinding you can't see your hand in front of your face."
        txt$ = txt$ + chr$(13) + chr$(10) + "If only you had a light source..." + chr$(13)+chr$(10)+chr$(13)+chr$(10)
    Else
        txt$=rooms$(rm)+chr$(13)+chr$(10)+chr$(13)+chr$(10)     ' Let the program display the room's contents and it's
    End If
    txt$ = txt$ + "Exits: "                                 ' visible exits along with the description.
    tmp = 0
    if exits(rm,1)<>0 then
        txt$ = txt$ + "North,"
        tmp=1
    end if
    if exits(rm,2)<>0 then
        txt$ = txt$ + "East,"
        tmp=1
    end if
    if exits(rm,3)<>0 then
        txt$ = txt$ + "South,"
        tmp=1
    end if
    if exits(rm,4)<>0 then
        txt$ = txt$ + "West,"
        tmp=1
    end if
    if exits(rm,5)<>0 then
        txt$ = txt$ + "Up,"
        tmp=1
    end if
    if exits(rm,6)<>0 then
        txt$ = txt$ + "Down,"
        tmp=1
    end if

    if right$(txt$,1)="," then
        txt$ = left$(txt$,len(txt$)-1)
    end if

    if tmp = 0 then txt$ = txt$ + "None"

    txt$ = txt$ + chr$(13)+chr$(10)+chr$(13)+chr$(10)
    txt$ = txt$ + "You also see: " +chr$(13)+chr$(10)
    tmp = 0
    for x=1 to 100
        if objectproperties(x,1)=rm then
            txt$ = txt$ + objects$(x)+chr$(13)+chr$(10)
            tmp=1
        end if
    next x
    if tmp = 0 then txt$=txt$+"Nothing"
    txt$ = txt$+chr$(13)+chr$(10)
    Return

' **********************************************************************************************************************
' * QUIT THE GAME                                                                                                      *
' **********************************************************************************************************************
[Quit]
    CONFIRM gametitle$+chr$(13)+"Are you sure you really want to quit?";answer$
    if answer$="no" then GOTO [EventLoop]


    txt$ = "Thank you for playing. I really hope that you had a wonderful and entertaining experience."+chr$(13)+chr$(10)
    txt$ = txt$ + "If you have any comments or questions then please visit my website at the following"+chr$(13)+chr$(10)
    txt$ = txt$ + "location:  http://www.noblebell.com"+chr$(13)+chr$(10)+chr$(13)+chr$(10)

    NOTICE gametitle$+chr$(13)+txt$

    Close #m
    END


' **********************************************************************************************************************
' * FUNCTIONS                                                                                                          *
' **********************************************************************************************************************

' Specify the number of sides on the die and the number of times to roll and the result will be returned.
FUNCTION RollDice(sides,times)
    tmp = 0
    FOR x = 1 to times
        tmp = tmp + int(rnd(1)*sides)+1
    NEXT x
    RollDice = tmp
END FUNCTION

' Checks to see if a file that is passed actually exists on the users directory path specified.
FUNCTION fileExists(path$, filename$)
  files path$, filename$, info$()
  fileExists = val(info$(0, 0))  'non zero is true
END FUNCTION

' Used to scroll to the bottom of the screen in the textbox.
SUB VerticalScroll handle, ScrollAmount
    Calldll #user32, "SendMessageA", _
    handle as Ulong, _
    _WM_VSCROLL as Long, _
    ScrollAmount as Long, _
    0 as Long, _
    result as Long
END SUB

' **********************************************************************************************************************
' * GUI SETUP                                                                                                          *
' **********************************************************************************************************************
[Setup.GUI]
    ForegroundColor$ = "black"
    BackgroundColor$ = "buttonface"
    TextboxColor$ = "white"
    TexteditorColor$ = "white"
    ComboboxColor$ = "white"
    ListboxColor$ = "white"


    WindowWidth = 792 : WindowHeight = 595
    UpperLeftX=int((DisplayWidth-WindowWidth)/2)
    UpperLeftY=int((DisplayHeight-WindowHeight)/2)

    textbox #m.txtView, 8, 10, 768, 515
    textbox #m.txtCommand, 8, 530, 672, 25
    stylebits #m.btnGo, _BS_MULTILINE, 0, 0, 0
    button #m.default, "GO", [Okay], UL, 688, 530, 88, 25

    stylebits #m.txtView, _ES_MULTILINE or _ES_READONLY or _WS_VSCROLL, _ES_AUTOHSCROLL , 0, 0

    open "TEXT ADVENTURE" for dialog as #m

    #m.txtView "!font arial 11"
    #m.txtCommand "!font arial 11 bold"
    #m.default "!font arial 11 bold"
    #m "trapclose [Quit]"
    #m.txtCommand, "!setfocus"

    Return


' **********************************************************************************************************************
' * GENERAL                                                                                                            *
' **********************************************************************************************************************
[Setup.General]
    ' assign starting values to certain variables
    score = 0 : maxscore = 500                  ' current score is 0 and the maximim score can be only 500
    turns = 0 : rm = 1                          ' total turns taken is 0 and the starting room location is 1
    maxinventory = 10 : inventorycount = 0      ' total items that can be carried at once is 10 and they are carrying 0

    maxhits = 25                                ' the total number of hits you can take before you die.
    hits = 25                                   ' you have 25 hits left before you die.
    defense = 9                                 ' (1-20) : 20-Easy to hit, 1-Near impossible to hit, 0-Can't hit!
    offense = 4                                 ' the amount of damage that can be caused (4,8,10,12,20)
    gold = 50                                   ' starting about of money the player has
    maxmp = 15                                  ' total magic points the player can spend
    mp = 15                                     ' total magic points the player has left to spend

    encounter = FALSE                           ' tells if the player is engaged in a battle (TRUE/FALSE)
    lantern = FALSE                             ' tells if the player's lantern is lit or not (TRUE/FALSE)
    needlight = FALSE                           ' tells if the room needs to have a light or not (TRUE/FALSE)
    noun = 0                                    ' noun action id
    verb = 0                                    ' verb action id
    OK = FALSE                                  ' flag (TRUE/FALSE)

    ' Using anything different from the items below they must be listed as a game object that the user can interact with.
    ' If the object is to be armor then you need to set the objectproperties defense parameter to the value you want.
    ' If the object is to be a weapon then you need to set the objectproperties damage parameter to the value you want.

    armor$="CLOTH"                              ' Starting armor the player is wearing.
    weapon$="HANDS"                             ' Starting weapon the player is using.


    ' Add the known commands to the commands$ array. Currently there are 24 known commands. The commands must be
    ' in UPPER case and only one word. You can add new commands by adding another element to the commands$ array
    ' with the command and then you will have to add the new element to the [Parser.Verb] module and also to the
    ' [Logic] module if needed.
    commands$(1)="NORTH":commands$(2)="EAST":commands$(3)="SOUTH":commands$(4)="WEST":commands$(5)="UP":commands$(6)="DOWN"
    commands$(7)="SAVE":commands$(8)="LOAD":commands$(9)="LOOK":commands$(10)="INVENTORY":commands$(11)="SCORE"
    commands$(12)="INSPECT":commands$(13)="USE":commands$(14)="TAKE":commands$(15)="DROP":commands$(16)="FIGHT"
    commands$(17)="QUIT":commands$(18)="HELP":commands$(19)="ARM":commands$(20)="UNARM":commands$(21)="WEAR":commands$(22)="REMOVE"
    commands$(23)="LEARN":commands$(24)="CAST":commands$(25)="TELEPORT":commands$(26)="LIGHT":commands$(27)="EXTINGUISH"

    Return

' **********************************************************************************************************************
' * ROOM DESCRIPTIONS, EXITS, ETC.                                                                                     *
' **********************************************************************************************************************
[Setup.Rooms]
    for x=1 to 100
        help$(x) = "Try working it out yourself a little longer."
    next x

    for x=1 to 100
        for y = 1 to 15
            exits(x,y)=0
        next y
    next x

    for x=1 to 100
        rooms$(x)=""
    next x

    rooms$(1) = "BOTTOM OF MOUNTAIN"+crlf$+crlf$
    rooms$(1) = rooms$(1) + "You are standing at the foot of what appears to be a really large mountain."+crlf$
    rooms$(1) = rooms$(1) + "The rocks are to steep and slimey to climb. There is however a little winding trail"+crlf$
    rooms$(1) = rooms$(1) + "that appears to be leading up into the mountain. There is a heavy mist in the air."

    rooms$(2) = "GAP IN THE PATH"+crlf$+crlf$
    rooms$(2) = rooms$(2) + "There is a small gap in the pathway here. It appears to be man-made. The air is starting"+crlf$
    rooms$(2) = rooms$(2) + "to become more chilled and thin. The mist from earlier has all but disapated."


    rooms$(3) = "MOUNTAIN PASS"+crlf$+crlf$
    rooms$(3) = rooms$(3) + "This is a leveled out area that looks to be a simple camp site. There is nothing useful here though."

    rooms$(4) = "HOLE IN MOUNTAIN SIDE"+crlf$+crlf$
    rooms$(4) = rooms$(4) + "There is an opening inside one of the large rocks here. It appears to be large enough"+crlf$
    rooms$(4) = rooms$(4) + "for a person to get inside. It is aweful dark looking in there and you can hear faint"+crlf$
    rooms$(4) = rooms$(4) + "sounds of dripping water in the distance."

    rooms$(5) = "SPLIT IN THE PATH"+crlf$+crlf$
    rooms$(5) = rooms$(5) + "The cavern that you are in seems to split into two different directions here."+crlf$
    rooms$(5) = rooms$(5) + "There is a strange wooden door on the north side of this passage and an opening"+crlf$
    rooms$(5) = rooms$(5) + "leading off into darkness toward the south."

    rooms$(6) = "LOST TOMB"+crlf$+crlf$
    rooms$(6) = rooms$(6) + "This is an oblong chamber where someone or something burries others. Everything is a mess"+crlf$
    rooms$(6) = rooms$(6) + "and all the tombs are open with nothing inside. Almost as if the contents were stolen."

    rooms$(7) = "WEST TOMB CHAMBER"+crlf$+crlf$
    rooms$(7) = rooms$(7) + "This area of the tomb is scattered with shrouds and busted open tombs."

    rooms$(8) = "EAST TOMB CHAMBER"+crlf$+crlf$
    rooms$(8) = rooms$(8) + "This area of the elongated tomb is covered with busted open tombs."

    rooms$(9) = "WEST OF RAVINE"+crlf$+crlf$
    rooms$(9) = rooms$(9) + "You are standing just to the west of a very large and deep ravine carved into the mountain"+crlf$
    rooms$(9) = rooms$(9) + "surface. It kind of looks like this is where bad things have taken place in the past."

    rooms$(10) = "EAST OF RAVINE"+crlf$+crlf$
    rooms$(10) = rooms$(10) + "The ravine is to the west of you. Things seem oddly different here. More so than normal."

    rooms$(11) = "BONE CHAMBER"+crlf$+crlf$
    rooms$(11) = rooms$(11) + "The floor in this area is completely covered in unidentifiable bones of all shapes and sizes."

    rooms$(12) = "SWIRLING POOL"+crlf$+crlf$
    rooms$(12) = rooms$(12) + "Standing in the center of this odd and fowl-smelling pool of liquid stands a very unique"+crlf$
    rooms$(12) = rooms$(12) + "statue.  There is a magical disturbance in the air.  Some spells may be affected."



    exits(1,1) = 2
    exits(2,1) = 3
    exits(2,3) = 1
    exits(2,2) = 4
    exits(3,3) = 2
    exits(4,4) = 2
    exits(4,2) = 5
    exits(5,4) = 4
    exits(5,3) = 6
    exits(5,1) = 9
    exits(5,7) = 1      'locked
    exits(6,1) = 5
    exits(6,2) = 8
    exits(6,4) = 7
    exits(7,2) = 6
    exits(8,4) = 6
    exits(9,2) = 10
    exits(9,3) = 5
    exits(9,8) = 1      ' ravine
    exits(10,1) = 12
    exits(10,3) = 11
    exits(10,4) = 9
    exits(11,1) = 10
    exits(12,3) = 10
    roomProperties(12, 1) = 2   'Can't TP to or from room 12
    roomProperties(12, 2) = 1    'Need light

    Return

' **********************************************************************************************************************
' * OBJECTS, OBJECT PROPERTIES, OBJECT DESCRIPTIONS                                                                    *
' **********************************************************************************************************************
[Setup.Objects]
    for x = 1 to 100
        objects$(x)=""
    next x

    objects$(1) = "ORC"
    objectproperties(1,1)=3
    objectproperties(1,2)=FALSE
    objectproperties(1,3)=6
    objectproperties(1,4)=8
    objectproperties(1,5)=4
    objectdescriptions$(1) = "A massive frame, pig-like head, pale green. Very unfriendly looking."

    objects$(2) = "SKELETON"
    objectproperties(2,1)=6
    objectproperties(2,2)=FALSE
    objectproperties(2,3)=4
    objectproperties(2,4)=9
    objectproperties(2,5)=4
    objectdescriptions$(2) = "An animated corpse of bones wielding a dagger."

    objects$(3) = "SWORD"
    objectproperties(3,1)=7
    objectproperties(3,2)=TRUE
    objectproperties(3,5)= 8
    objectdescriptions$(3) = "A short sword made of finely crafted steel with a jewel-enlaid hilt."

    objects$(4) = "ROPE"
    objectproperties(4,1)=7
    objectproperties(4,2)=TRUE
    objectdescriptions$(4) = "50' of coiled rope"

    objects$(5) = "KEY"
    objectproperties(5,1)=8
    objectproperties(5,2)=TRUE
    objectdescriptions$(5) = "A rusted-metal skeleton key. It might be used to unlock more than one door."

    objects$(6) = "STATUE"
    objectproperties(6,1)=12
    objectproperties(6,2)=FALSE
    objectdescriptions$(6) = "This is just a simple stone statue .. Wait!  You feel funny and appear to be feeling better."

    objects$(7) = "LANTERN"
    objectproperties(7, 1) = 1
    objectproperties(7, 2) = TRUE
    objectproperties(7, 7) = TRUE
    objectdescriptions$(7) = "A rather old lantern, but appears to work."






' **********************************************************************************************************************
' * GAME LOGIC BELOW                                                                                                   *
' **********************************************************************************************************************
[Logic]
    OK = TRUE
    TOK = TRUE

    ' Once a fight starts you cannot run from it. You must finish it.
    if encounter = TRUE then
        if verb=1 or verb=2 or verb=3 or verb=4 or verb=5 or verb=6 then
            txt$ = "You cannot run!"
            OK = FALSE
            return
        end if
    end if

    'Checks if you can TELEPORT to a room
    roomnum = val(noun$)
    If roomnum > 12 or roomnum < 1 then TOK = FALSE
    If roomProperties(roomnum, 1) = 0 or roomProperties(roomnum, 1) = 2 then TOK = FALSE
    If roomProperties(rm, 1) = 2 then TOK = FALSE

    ' Special things that happen in selected rooms.
    select case rm
        case 12
            if verb = 12 and noun = 6 then
                txt$ = objectdescriptions$(6)+crlf$
                txt$ = txt$ + "Poof! All your damage has been healed, and your magic restored."
                hits = maxhits
                mp = maxmp
            end if
        case 5
            if verb = 1 and exits(5,7)=1 then
                txt$ = "That doorway appears to be locked or something."
                OK=FALSE
            end if
            if verb = 1 and exits(5,7)=0 then
                OK=TRUE
            end if
            if verb = 13 and noun = 5 then
                exits(5,7)=0
                txt$ = "The door has been unlocked."
            else
                txt$ = "The door is locked."
            end if
        case 9
            if verb = 2 and exits(9,8)=1 then
                txt$ = "You can't jump that ravine. It is too wide."
                OK=FALSE
            end if
            if verb = 2 and exits(9,8)=0 then
                OK=TRUE
            end if
            if verb=13 and noun=4 then
                txt$ = "You string the rope through a hole in the ceiling so that you can swing across."
                exits(9,8)=0
            else
                txt$ = "You can't get across that way."
            end if
    end select

    Return


' **********************************************************************************************************************
' * THE BATTLE ENGINE                                                                                                  *
' **********************************************************************************************************************
[Battle]
    ' We are in a battle so we cannot load or save a game.
    encounter = TRUE

    txt$ = ""
    txt$ = txt$ + "You attack the " + objects$(noun) + " using your " + weapon$ + "..."+crlf$

    ' Player attacks the monster
    toHit = RollDice(20,1)
    if toHit <= objectproperties(noun,4) then
        toDamage = RollDice(offense,1)
        txt$ = txt$ + "You inflict " + str$(toDamage) + " points of damage on the " + objects$(noun)+"."+crlf$
        objectproperties(noun,3)=objectproperties(noun,3)-toDamage
        if objectproperties(noun,3) <= 0 then
            txt$ = txt$ + "You have slain the " + objects$(noun)+crlf$
            objectproperties(noun,1) = -1
            gp = RollDice(6,1) * 10
            txt$ = txt$ + "You have found " + str$(gp) + " gold coins."+crlf$+crlf$
            gold=gold+gp
            score = score + 5
            encounter = FALSE
            Return
        end if
    else
        txt$ = txt$ + "You miss the " + objects$(noun)+"!!"+crlf$
    end if

    ' Monster attacks the player
    txt$ = txt$ + "The " + objects$(noun) + " attacks you..."+crlf$
    toHit = RollDice(20,1)
    if toHit <= defense then
        toDamage = RollDice(objectproperties(noun,5),1)
        txt$=txt$+"The " + objects$(noun)+" inflicts " + str$(toDamage) + " points of damage on you."+crlf$
        hits=hits-toDamage
        if hits <=0 then
            txt$ = txt$ + "You have been slain!"+crlf$
            close #m
            end
        end if
    else
        txt$ = txt$ + "The " + objects$(noun) + ", misses you."+crlf$
    end if

    Return




' **********************************************************************************************************************
' * DISPLAY TITLE, INTRODUCTION, INSTRUCTIONS                                                                          *
' **********************************************************************************************************************
[Begin]
    gametitle$ = "Mysterious Caverns 1.00"

    gamedescription$ = ""



    txt$=""
    txt$ = txt$ + gametitle$+crlf$
    txt$ = txt$ + "By: Noble D. Bell"+crlf$+crlf$
    txt$ = txt$ + gamedescription$+crlf$+crlf$
    txt$ = txt$ + "To play this game you use text commands. The commands must be in the form of [verb][noun]. The"+crlf$
    txt$ = txt$ + "game understands 24 different commands and quite possibly several different nouns."+crlf$+crlf$
    txt$ = txt$ + "Here are the commands that can be used in this game:"+crlf$+crlf$
    for x=1 to 24
        txt$=txt$+commands$(x)+","
    next x
    txt$=left$(txt$,len(txt$)-1)
    txt$ = txt$+crlf$+crlf$
    txt$ = txt$ + "Just press [ENTER] to begin."

    'notice gametitle$+crlf$+txt$
    #m.txtView txt$
    #m.txtCommand "LOOK"
    wait

    Return

' ======================================================================================================================
' PROGRAM ENDS HERE
' ======================================================================================================================



[[code]]
[[user:thedarkfreak|1201499698]](Chris Iverson)