'===========================================================================
' Subject: THE WOODS (TEXT RPG STYLE) GAME    Date: 06-20-97 (06:20)       
'  Author: Kurt Kuzba                         Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: DEMOS.ABC
'===========================================================================
'_|_|_|   THEWOODS.BAS
'_|_|_|   A simple game to demonstrate some basic principles.
'_|_|_|   No warrantee or guarantee given or implied.
'_|_|_|   PUBLIC DOMAIN   by Kurt Kuzba.  (6/19/1997)
TYPE character: Pname AS STRING * 32: hits AS LONG
   magic AS LONG: strength AS LONG: gold AS LONG
   Weapon AS INTEGER: experience AS LONG: END TYPE
DIM SHARED Player AS character, Enemy AS character
RANDOMIZE TIMER
SCREEN 0: WIDTH 80, 25: COLOR 9,0: CLS: LOCATE 3
LOCATE , 10: PRINT "Your goal is to gain 2,000 experience."
LOCATE , 10: PRINT "Upon doing this, you will have won.   "
LOCATE , 10: PRINT "It will NOT, however, be easy.        "
LOCATE , 10: PRINT "You will meet many malevolent forces. "
COLOR 11 : LOCATE 14, 1: INPUT "What is your name? ", plyr$
IF plyr$ > "" THEN
   DO: Player.Pname = plyr$: Player.hits = 30: Player.magic = 0
      Player.strength = 0: Player.gold = 100: Player.Weapon = 0
      Player.experience = 0: Gameplay
      PRINT : PRINT "Would you like to play again (YN)? ";
      DO: k$ = UCASE$(INKEY$): LOOP WHILE INSTR(" YN", k$) < 2
      PRINT k$: LOOP WHILE k$ = "Y"
END IF
PRINT : PRINT "Goodbye, then...": PRINT "Hit any key to continue."
WHILE INKEY$ > "": WEND: WHILE INKEY$ = "": WEND: SYSTEM
SUB Armory : DIM price(1 TO 8) AS INTEGER
   price(1) = 75: price(2) = 200: price(3) = 400: price(4) = 600
   price(5) = 900: price(6) = 1500: price(7) = 2500: price(8) = 4000
   DO: COLOR 10, 0: PRINT
      PRINT " Would you like to Sell or Buy a weapon (S/B/Q)? ";
      DO: k% = INSTR(" SBQ" + CHR$(13), UCASE$(INKEY$))
      LOOP WHILE k% < 2
      PRINT MID$(" SBQQ", k%, 1): PRINT
      SELECT CASE k%
         CASE 2: money% = Player.Weapon * 30
            IF money% = 0 THEN
               PRINT " You cannot sell your hands here, friend!"
            ELSE
               PRINT " I will give you"; money%; "gold for your ";
               PRINT Weapon$(Player.Weapon)
               PRINT " Is it a deal (Y/N)? ";
               DO: k% = INSTR(" YN", UCASE$(INKEY$))
               LOOP WHILE k% < 2
               PRINT MID$(" YN", k%, 1): PRINT
               IF k% = 2 THEN
                  Player.gold = Player.gold + money%
                  Player.Weapon = 0
               END IF
            END IF
         CASE 3: PRINT "--==**[  PRICES  ]**==--"
            FOR t% = 1 TO 8: PRINT STR$(t%); "->";
               PRINT LEFT$(STR$(price(t%)) + "    ", 6);
               PRINT Weapon$(t%): NEXT
            PRINT " Hit ENTER to buy nothing"
            PRINT " You have"; Player.gold; "gold."
            PRINT "Which would you buy (1-8)? ";
            DO: k% = INSTR(" 12345678" + CHR$(13), UCASE$(INKEY$))
            LOOP WHILE k% < 2
            k% = k% - 1: PRINT MID$("12345678", k%, 1)
            IF k% < 9 THEN
               money% = k% * 90
               IF money% > Player.gold THEN
                  PRINT " You can not afford "; Weapon$(k%)
               ELSE
                  PRINT " Sold! I hope that "; Weapon$(k%)
                  PRINT " will serve you well."
                  Player.gold = Player.gold - money%
                  Player.Weapon = k%
               END IF
            END IF
         CASE 4, 5: EXIT SUB
      END SELECT
   LOOP: END SUB

SUB FightMonster : level% = GetLevel%(Player.experience)
   MakeEnemy level%: menu% = 1
   WHILE (Player.hits > 0) AND (Enemy.hits > 0)
      COLOR 4, 0: PRINT
      IF menu% > 0 THEN
         PRINT " F-> Fight": PRINT " R-> Run Away"
         PRINT " S-> Surrender": PRINT " Y-> Your Stats"
         PRINT " V-> View Enemy"
      END IF
      COLOR 15, 0: PRINT Player.hits; : COLOR 5, 0: PRINT Player.Pname
      COLOR 15, 0: PRINT Enemy.hits; : COLOR 5, 0: PRINT Enemy.Pname
      COLOR 4, 0: PRINT " [ F : R : S : Y : V : ? ]=> ";
      DO: k% = INSTR(" FRSYV?", UCASE$(INKEY$)): LOOP WHILE k% < 2
      PRINT MID$(" FRSYV?", k%, 1)
      level% = GetLevel%(Player.experience)
      SELECT CASE k%
         CASE 2
            PlayerAtt! = 1 + Player.Weapon
            PlayerAtt! = PlayerAtt! * (1 + (Player.strength / 10))
            PlayerAtt! = 5 + (RND * PlayerAtt! * 5 * level%)
            PlayerDef! = 1 + (Player.strength / 100)
            EnemyAtt! = Enemy.Weapon * (1 + (Enemy.strength / 10))
            EnemyDef! = 1 + (Enemy.strength / 100)
            IF RND > .5 THEN
               PRINT " You move fast and hit first."
               hits% = PlayerAtt! / EnemyDef!
               IF hits% > Enemy.hits THEN hits% = Enemy.hits
               Enemy.hits = Enemy.hits - hits%
               PRINT " You hit for"; hits%; "points."
               Player.experience = Player.experience + hits%
               IF Enemy.hits > 0 THEN
                  hits% = EnemyAtt! / PlayerDef!
                  IF hits% > Player.hits THEN hits% = Player.hits
                  Player.hits = Player.hits - hits%
                  PRINT " You are hit for"; hits%; "points."
               END IF
            ELSE
               PRINT " You move slow and get hit first."
               hits% = EnemyAtt! / PlayerDef!
               IF hits% > Player.hits THEN hits% = Player.hits
               Player.hits = Player.hits - hits%
               PRINT " You are hit for"; hits%; "points."
               IF Player.hits > 0 THEN
                  hits% = PlayerAtt! / EnemyDef!
                  IF hits% > Enemy.hits THEN hits% = Enemy.hits
                  Enemy.hits = Enemy.hits - hits%
                  Player.experience = Player.experience + hits%
                  PRINT " You hit for"; hits%; "points."
               END IF
            END IF
            IF Enemy.hits = 0 THEN
               PRINT " You have defeated the "; Enemy.Pname
               Player.magic = Player.magic + Enemy.magic \ 10
               Player.gold = Player.gold + Enemy.gold
            END IF
            IF Player.hits = 0 THEN
               PRINT " You were defeated by a "; Enemy.Pname
            END IF
         CASE 3:
            PRINT " You manage to escape, but all your strength"
            PRINT " and magic are lost, and some experience points."
            Player.magic = 0: Player.strength = 0
            Player.experience = Player.experience * .9
            EXIT SUB
         CASE 4:
            PRINT " You give all your gold to the "; Enemy.Pname
            Player.gold = 0: EXIT SUB
         CASE 5: Stats Player
         CASE 6: Stats Enemy
         CASE 7: menu% = 1
      END SELECT: WEND: END SUB

SUB Gameplay : menu% = 1: Stats Player
   DO
      IF Player.hits > 0 THEN
         PRINT
         IF menu% > 0 THEN
            COLOR 15, 0: PRINT " W->  Woods": PRINT " H->  Healer"
            PRINT " A->  Armory": PRINT " S->  Your Stats"
            PRINT " Q->  Quit Game"
         END IF: COLOR 11, 0: LOCATE , , 0: menu% = 0
         PRINT " [ W : H : A : S : Q : ? ]=> ";
         DO: k% = INSTR(" WHASQ?", UCASE$(INKEY$)): LOOP WHILE k% < 2
         PRINT MID$(" WHASQ", k%, 1)
         SELECT CASE k%
            CASE 2: Woods
            CASE 3: Healer
            CASE 4: Armory
            CASE 5: Stats Player
            CASE 6: PRINT : PRINT "Leave the Woods (YN)? ";
               DO: k$ = UCASE$(INKEY$)
               LOOP WHILE INSTR(" YN", k$) < 2
               PRINT k$: IF k$ = "Y" THEN EXIT DO
            CASE 7: menu% = 1
         END SELECT
      ELSE
         IF Player.experience < 2000 THEN
            PRINT "Sorry... You have perished in battle."
            FOR t% = 200 TO 150 STEP -1: SOUND t%, .1: NEXT
         ELSE
            PRINT "You have defeated all enemies! You WIN!!"
            FOR t% = 100 TO 999 STEP 10: SOUND t%, .03: NEXT
            FOR t% = 1000 TO 500 STEP -10: SOUND t%, .03: NEXT
         END IF: PRINT "You had"; Player.experience; "points."
         EXIT DO
      END IF: LOOP: END SUB
FUNCTION GetLevel% (e&)
   SELECT CASE e&
      CASE IS < 100: level% = 1
      CASE 101 TO 500: level% = 2
      CASE ELSE: level% = 3
   END SELECT: GetLevel% = level%: END FUNCTION
SUB Healer : Totalhits% = Player.experience \ 10 + 30
   ToHeal% = Totalhits% - Player.hits
   IF ToHeal% <= 0 THEN
      PRINT " You do not require healing!"; CHR$(7)
   ELSE
      PRINT " Each point costs 3 gold to heal."
      PRINT " You can afford to heal"; Player.gold \ 3; "hit points."
      PRINT " You need to heal"; ToHeal%
      INPUT " How many would you heal? ", heal%
      IF heal% > ToHeal% THEN heal% = ToHeal%
      IF heal% > (Player.gold \ 3) THEN heal% = Player.gold \ 3
      Player.hits = Player.hits + heal%
      Player.gold = Player.gold - (heal% * 3)
      PRINT " I have healed you for"; heal%; "hit points."
   END IF: END SUB
SUB MakeEnemy (l%) : DIM EN(1 TO 3) AS STRING, EP(1 TO 3) AS STRING
   EP(1) = "Ferocious ": EP(2) = "Snarling ": EP(3) = "Evil "
   SELECT CASE l%
      CASE 1: EN(1) = "Squirrel": EN(2) = "Bunny": EN(3) = "Hedgehog"
      CASE 2: EN(1) = "Bear": EN(2) = "Boar": EN(3) = "Troll"
      CASE 3: EN(1) = "Demon": EN(2) = "Dragon": EN(3) = "Wizard"
   END SELECT
   Enemy.Pname = EP(l%) + EN(RND * 2 + 1)
   Enemy.hits = ((RND * 10 + 20) * l%)
   Enemy.magic = ((RND * 10 + 10) * l%)
   Enemy.strength = ((RND * 10 + 10) * l%)
   Enemy.gold = ((RND * 100 + 100) * l%)
   Enemy.Weapon = (RND * 2 + l% * 2): END SUB

SUB Stats (P AS character) : COLOR 15, 0: PRINT
   COLOR 15, 1: PRINT " Name       : "; P.Pname;
   COLOR 15, 0: PRINT : COLOR 15, 1: PRINT " Hits       :";
   PRINT LEFT$(STR$(P.hits) + SPACE$(32), 33);
   COLOR 15, 0: PRINT : COLOR 15, 1: PRINT " Magic      :";
   PRINT LEFT$(STR$(P.magic) + SPACE$(32), 33);
   COLOR 15, 0: PRINT : COLOR 15, 1: PRINT " Strength   :";
   PRINT LEFT$(STR$(P.strength) + SPACE$(32), 33);
   COLOR 15, 0: PRINT : COLOR 15, 1: PRINT " Gold       :";
   PRINT LEFT$(STR$(P.gold) + SPACE$(32), 33);
   COLOR 15, 0: PRINT : COLOR 15, 1: PRINT " Weapon     : ";
   PRINT LEFT$(Weapon$(P.Weapon) + SPACE$(32), 32);
   COLOR 15, 0: PRINT : COLOR 15, 1: PRINT " Experience :";
   PRINT LEFT$(STR$(P.experience) + SPACE$(32), 33);
   COLOR 15, 0: PRINT : END SUB
SUB UseMagic : COLOR 12, 0: PRINT : PRINT : menu% = 1
   DO
      IF menu% <> 0 THEN
         PRINT " H-> Healing Spell   (4 magic)"
         PRINT " S-> Strength Spell  (9 magic)"
         PRINT " Q-> Quit this menu"
      END IF: PRINT " You have"; Player.magic; "spell points."
      menu% = 0: PRINT " [ H : S : Q : ? ]=> ";
      DO: k% = INSTR(" HSQ?" + CHR$(13), UCASE$(INKEY$))
      LOOP WHILE k% < 2: PRINT MID$(" CST?", k%, 1): PRINT
      SELECT CASE k%
         CASE 2
            IF Player.magic < 4 THEN
               PRINT " You haven't the magic!"
            ELSE
               m% = 1 + RND * 9
               Player.magic = Player.magic - 4
               Player.hits = Player.hits + m%
               PRINT " Your spell yields"; m%; "hits."
            END IF
         CASE 3
            IF Player.magic < 9 THEN
               PRINT " You haven't the magic!"
            ELSE
               m% = 1 + RND * 9
               Player.magic = Player.magic - 9
               Player.strength = Player.strength + m%
               PRINT " Your spell yields"; m%; "strength."
            END IF
         CASE 4, 6: EXIT SUB
         CASE 5: menu% = 1
      END SELECT: LOOP: END SUB
SUB WalkInWoods
   SELECT CASE (RND * 99)
      CASE 0 TO 9: Player.gold = Player.gold + 1
         COLOR 14, 0: PRINT "You found a piece of gold!"
      CASE 10 TO 19: Player.magic = Player.magic + 1
         COLOR 13, 0: PRINT "A faerie gives you one magic!"
      CASE 20 TO 29: m% = 1 + RND * 9
         Player.hits = Player.hits + m%
         COLOR 9, 0: PRINT "A friendly Elf heals"; m%; "hit";
         IF m% = 1 THEN PRINT "!":  ELSE PRINT "s!"
      CASE 30 TO 89
         COLOR 6, 0: PRINT "The path continues before you."
      CASE ELSE: FightMonster
   END SELECT: END SUB
FUNCTION Weapon$ (w%)
   SELECT CASE w%
      CASE 0: Weapon$ = "Your Bare Hands"
      CASE 1: Weapon$ = "A Stick"
      CASE 2: Weapon$ = "A Quarterstaff"
      CASE 3: Weapon$ = "A Small Knife"
      CASE 4: Weapon$ = "A Big Knife"
      CASE 5: Weapon$ = "A Machete"
      CASE 6: Weapon$ = "A Shortsword"
      CASE 7: Weapon$ = "A Longsword"
      CASE 8: Weapon$ = "A Two-Handed Sword"
   END SELECT: END FUNCTION
SUB Woods : menu% = 1
   DO: level% = GetLevel%(Player.experience)
      IF Player.experience > 2000 THEN Player.hits = 0
      COLOR 2, 0: PRINT : IF Player.hits = 0 THEN EXIT SUB
      IF menu% <> 0 THEN
         PRINT " C-> Continue": PRINT " T-> Go to Town"
         PRINT " S-> Cast a Spell": PRINT " Y-> Your Stats"
      END IF: menu% = 0: PRINT " [ C : S : T : Y : ? ]=> ";
      DO: k% = INSTR(" CTSY?", UCASE$(INKEY$)): LOOP WHILE k% < 2
      PRINT MID$(" CSTY?", k%, 1)
      SELECT CASE k%
         CASE 2: WalkInWoods
         CASE 3: EXIT SUB
         CASE 4: UseMagic
         CASE 5: Stats Player
         CASE 6: menu% = 1
      END SELECT: LOOP: END SUB
