Small Basic Game Programming - Separation Between Data And Procedure

Last week, I introduced a text adventure game.  If I expand the game story of that manner as in the program, the program will have a lot of If statements and Goto statements.   Today, I will introduce rewritten program with less If and Goto statements.  The updated version is published as FCD758-1,

Main

Main part of this program became very simple.

 1.' Text Adventure 0.2
 2.' Program ID FCD758-1
 3.Init()
 4.Game()
 5.' end of program

Initialization for Scenario Data

This data is like a main program of the previous text adventure program introduced last week.  So, this data is a kind of script language.  The grammar of this scenario data is:

  • A line started with " " (space) is displayed as a text.
  • A line ended with ":" (colon)  is treated as a label targeted by jump control statements.
  • A line started with "->" is treated as a jump (like Goto) control statement.  A jump with single label is non conditional.  A jump with several labels is conditional.
  • A line other than above and has "," (comma) is displayed as options and prompts user selection.

Game scenario ends at scenario[21] (line 32).  But for testing, I added scenario[22] (line 33) to loop back to the top.

  6.Sub Init
  7.  scenario[1] = "stage_0:"
  8.  scenario[2] = " You're at a fork in the road."
  9.  scenario[3] = " Which way do you go?"
 10.  scenario[4] = "LEFT,RIGHT,STAY"
 11.  scenario[5] = "-> stage_1_1,stage_1_2,stage_1_3,stage_0"
 12.   
 13.  scenario[6] = "stage_1_1:"
 14.  scenario[7] = " Good choice, you find some money. :)"
 15.  scenario[8] = " Have a nice day."
 16.  scenario[9] = "-> end"
 17.   
 18.  scenario[10] = "stage_1_2:"
 19.  scenario[11] = " You're at a stairs."
 20.  scenario[12] = " Which way do you go?"
 21.  scenario[13] = "UP,BACK"
 22.  scenario[14] = "-> stage_2,stage_0,stage_1_2"
 23.   
 24.  scenario[15] = "stage_1_3:"
 25.  scenario[16] = " Nothing happend."
 26.  scenario[17] = " "
 27.  scenario[18] = "-> stage_0"
 28.   
 29.  scenario[19] = "stage_2:"
 30.  scenario[20] = " Hard choice. But, good luck!"
 31.   
 32.  scenario[21] = "end:"
 33.  scenario[22] = "-> stage_0"
 34.  nScenario = Array.GetItemCount(scenario)
 35.  pScenario = 1
 36.EndSub

Parsing and Executing the Scenario

Subroutine Game parses the scenario and execute each statement.

 37.Sub Game
 38.  While pScenario <= nScenario
 39.    line = scenario[pScenario]
 40.    If Text.StartsWith(line, " ") Then
 41.      TextWindow.WriteLine(Text.GetSubTextToEnd(line, 2))
 42.      pScenario = pScenario + 1
 43.    ElseIf Text.EndsWith(line, ":") Then
 44.      pScenario = pScenario + 1
 45.    ElseIf Text.StartsWith(line, "->") Then
 46.      id = 1
 47.      Jump()
 48.    ElseIf Text.IsSubText(line, ",") Then
 49.      choices = line
 50.      Choose()
 51.      TextWindow.WriteLine("")
 52.      If id = 0 Then
 53.        id = n + 1
 54.      EndIf
 55.      pScenario = pScenario + 1
 56.      line = scenario[pScenario]
 57.      Jump()
 58.    Else
 59.      msg = "Unknown scenario: line " + pScenario
 60.      Error()
 61.    EndIf
 62.  EndWhile
 63.EndSub

Processing for "->" Control Statement

"->" statement behaves as Goto statement if it has a single label.  But it has some labels, it behaves like ON GOTO statement in BASIC language.  If the previous line has options, label is selected as the selected option id (1, 2, ...).  If the choice is invalid then the last label is selected.

 64.Sub Jump
 65.  ' param id - choice
 66.  ' param line
 67.  ' work label - destination
 68.  len = Text.GetLength(line)
 69.  p = 3
 70.  While p <= len And Text.GetSubText(line, p, 1) = " "
 71.    p = p + 1
 72.  EndWhile
 73.  label = ""
 74.  For i = 1 To id
 75.    c = Text.GetIndexOf(Text.GetSubTextToEnd(line, p), ",")
 76.    If c = 0 Then
 77.      c = len - p + 2
 78.    EndIf
 79.    If i = id Then
 80.      label = Text.GetSubText(line, p, c - 1) + ":" 
 81.    Else
 82.      p = p + c
 83.      If len < p Then
 84.        msg = "Label shortage: line " + pScenario
 85.        Error()
 86.      EndIf
 87.    EndIf
 88.  EndFor
 89.  For p = 1 To nScenario
 90.    If scenario[p] = label Then
 91.      pScenario = p
 92.      Goto break
 93.    EndIf
 94.  EndFor
 95.  msg = "Label " + label + " not found: line " + pScenario
 96.  Error()
 97.  break:
 98.EndSub

Displaying Error

If the scenario has error, the program is not to be continued.  So, the program displays error and stops.

  99.Sub Error
 100.  TextWindow.ForegroundColor = "Red"
 101.  TextWindow.WriteLine(msg)
 102.  TextWindow.WriteLine("")
 103.  TextWindow.ForegroundColor = "Gray"
 104.  pScenario = nScenario + 1
 105.EndSub

And subroutine Choice is the same as the previous text adventure program.

With small change, the scenario can be read from a text file.  By today's update, procedures become simple.  But data (scenario) becomes little complex.  Because the scenario is a kind of script, it will be needed testing and debugging. 

For this program, there is room for improvement.  But I'm going to write about text window base game program with action next week.

Have a happy programming!