daily pastebin goal
95%
SHARE
TWEET

Animatron6-6: A-code Language Interpreter

djsfantasi Apr 28th, 2012 155 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #Include Once "windows.bi"
  2. #include Once "win/mmsystem.bi"
  3. #Include Once "mynetwin.bi"
  4. '               ===========================================================================
  5. '               ===========================================================================
  6. ' Animatron.bas - a program to implement a scripting language to control an
  7. '                                               animatronic figure (i.e., Peter Penguin) via an SSC-32
  8. '                                               servo controller. The scripting language has been named acode
  9. '                                               for animatronic code, and implements the functions defined herein.
  10. '       v3.x    Basic functions (previous versions were development/beta releases)
  11. '       v4.x    Added random move selection, as well as random pauses.
  12. '       v5.x    Added the capability to be controlled from a network connection
  13. '                       plus features such as using a script as a macro in addition to a sub-process
  14. '                       (e.g. player). Started to implement a wait command so that network commands
  15. '                       could stop execution or override playing scripts.
  16. '       v6.x    Restructured to include a next address in the script list, to simplify the
  17. '                       processing of calling/playing subscripts and to provide the structure for
  18. '                       a network command to override the execution of other scripts playing.
  19. '  v6.2  Added "OneOnly" command; modified interpretation and processing of "Sync"
  20. '                       commands.
  21. ' v6.3  Added ServerCreate thread, to allow reconnection of network connection.
  22. ' v6.4  Corrected bug in Say function.
  23. ' v6.5  Added SAY network command
  24. ' v6.6  Added ActionLoop command, to sequentilly loop through a group of commands
  25. '                       each time a script is called.
  26. '
  27. '               ===========================================================================
  28. '               ===========================================================================
  29.  
  30. Declare Function FindIt (array() As String, What As String) As Integer
  31. Declare Function DisplayStep (i As Integer, j As Integer) As String
  32. Declare Function NextStep(myStep As Integer) As Integer
  33. Declare Sub ServerThread(byval as any ptr)
  34. Declare Sub ServerCreate(byval as any ptr)
  35.  
  36.  
  37. ReDim MoveDescription(0) As String ' Move lookup table: description of move, e.g. "Move Eyes Left"
  38. ReDim MoveCommand(0) As String ' actual servo move command, e.g. "#0P2000 #1P2000 T100"
  39. Dim MoveIndex As Integer =0 ' array index of Move arrays
  40.  
  41. ReDim LabelDescription(0) As String     ' Label lookup table; name of label or script
  42. ReDim LabelScriptIndex(0) As Integer ' index to step after label in script arrays
  43. Dim LabelIndex As Integer =0 ' array index for Label arrays
  44.  
  45. ReDim PlayerStep(0) As Integer          ' Player properties: index to step in script to execute next
  46. ReDim As Double PlayerEndWait(0)                ' array of time before next command is issued, by player
  47. PlayerEndWait(0)=0
  48. Dim As Double SoundEndWait=0                    ' timer value before next check of ADC for voice/sound input, ~12ms from last test.
  49. Dim Player As Integer =0
  50.  
  51. ReDim ScriptAction(0) As Integer        ' Script properties: action to take
  52. ReDim ScriptDescription(0) As Integer ' Index to servo move table
  53. ReDim ScriptOption(0) As Integer ' value for action, i.e. pause length after command is issued
  54. ReDim ScriptStack(0) As Integer ' stack for saved script addresses (could be used for other purposes)
  55. Dim ScriptStep As Integer =0, MainScript As Integer =0, EndMain As Integer =0
  56. Dim Shared AdjustStep As Integer =1
  57. Dim ErrorFound As Integer =0, WaitName As Integer =0
  58.  
  59. ' Properties for executing a random move from a selection of 'n' commands
  60. ' also, can be used for other non-linear execution plans for a script.
  61. 'Const NoAdjustStepAction = 1 ' constant values to indicate the state of processing a random move
  62. 'Const InRandomSelection  = 2
  63. 'Const AdjustStepAction   = 3
  64. 'ReDim As Integer AdjustStep(0) ' state variable for adjusting the step
  65.                                                                                                                           ' while processing a random move
  66. Dim As Integer Selections ' variable to store the possible number of random moves from which to select
  67. Dim As Integer minPause, maxPause, timePause
  68. Randomize
  69.  
  70. ReDim SyncPoints(0) As ULongInt ' flags for sync points; bit encoded by associated players
  71. Dim SyncPointStatus As ULongInt =0
  72. Dim SyncPointIndex As Integer =0
  73.  
  74. Dim IndexPlayers As Integer = 0, MaxPlayers As Integer =0
  75. Dim ScriptIndex As Integer  = 0,  NotDone    As Integer =-1 ' script player definitions
  76.  
  77. 'Speech variables
  78. Dim As String dat, ssc32cmd, PW, lastPW="000"
  79. Dim As Integer level
  80. Dim soundFile As String
  81.  
  82. 'Control variables
  83. Dim As String ControlKey
  84. Dim SingleStep As Integer = 0
  85. Const PauseKey="\"
  86. Const As String cr=Chr(13), lf =Chr(10),  esc=Chr(27)
  87. Const As String crlf=cr+lf
  88.  
  89. 'SSC-32 constants
  90. Const scbase="#3P"
  91. Const qs = "VA" + cr
  92.  
  93. ' Network control variables
  94. type CLIENT
  95.   as FDSOCKET hClient
  96.   as Any ptr  hThread
  97.   as integer  blnExit
  98. end type  
  99. Dim As Integer i
  100. Dim As String netMessage
  101. Dim As Any Pointer ServerProcess
  102. ' Shared variables for the server thread
  103. dim shared as CLIENT  Clients
  104. dim shared as Integer ClientsConnected
  105. ' Shared message definitions
  106. Dim Shared As Integer MsgReady=0, serverReady=0
  107. Dim Shared As ZString Ptr myMessage
  108.  
  109. ' Prepare Show
  110. Dim CommPort As String  ' serial port connected to servo controller (SSC-32)
  111. Dim Animatron As String ' name of file containing mapping between move descriptions and SSC-32 commands
  112. Dim ShowName As String  ' name of file containing a script for a given "show"
  113. Const dfltCommPort = "com5:"
  114. Const dfltMoves = "peter.csv"
  115. Const dfltScript = "PeterLive5.csv"
  116.  
  117. ' connection to servo controller (SSC-32)
  118. Print "Comm port [";dfltCommPort;"]: ";
  119. Input CommPort
  120. If CommPort = "" Then CommPort = dfltCommPort
  121.  
  122. ' short description to servo controller (SSC-32) commands mappings
  123. Print "Character/Move file name [";dfltMoves;"]:";
  124. Input Animatron
  125. If Animatron = "" Then Animatron = dfltMoves
  126. Open Animatron For Input As #1
  127.  
  128. ' script file
  129. Print "Show file name [";dfltScript;"]: ";
  130. Input ShowName
  131. If ShowName = "" Then ShowName = dfltScript
  132.  
  133.  
  134. '               ===========================================================================
  135. '               ===========================================================================
  136. '               Define Moves (lookup table)
  137. '               ===========================================================================
  138. '               ===========================================================================
  139.  
  140. ' read in short description and corresponding SSC-32 command
  141. Dim Move As String , CtrlrCmd As String
  142. Do While Not Eof(1)And ErrorFound =0
  143.         Input #1, Move, CtrlrCmd
  144.         If UCase(Move) = "END" Then Exit Do  
  145.         MoveIndex += 1
  146.         ReDim Preserve MoveDescription(MoveIndex)As String, MoveCommand(MoveIndex)As String
  147.         MoveDescription(MoveIndex) = UCase(Move)
  148.         MoveCommand(MoveIndex) = CtrlrCmd+cr           
  149. Loop
  150. Close #1
  151.  
  152.  
  153.  
  154. '               ===========================================================================
  155. '               ===========================================================================
  156. '               Define Script(s)
  157. '               ===========================================================================
  158. '               ===========================================================================
  159.  
  160. Open ShowName For Input As #1
  161.  
  162. Dim Action As String, Description As String, OptionValue As Integer, LocalIndex As Integer
  163. Const PlayMove As Integer        =0 ' send commands to SSC-32
  164. Const PlayScript As Integer =1 ' execute script in parallel; script must be defined in same file
  165. Const StartScript As Integer=2 ' define new script; main script MUST be last in file
  166. Const EndScript As Integer  =3 ' end of script routine definition
  167. Const JumpTo As Integer          =4 ' "goto" command; label MUST exist (is not checked for)
  168. Const Label As Integer           =5 ' definition of label used in "JumpTo" command
  169. Const SyncPoint As Integer  =6 ' definition of scripts which will synchronize with other script(s)
  170. Const EndSync As Integer         =7 ' definition of step in script at which to wait for synchronization
  171. Const ScriptPause As Integer=8 ' "Pause" or "Delay" command; pauses execution for n milliseconds
  172. Const Say As Integer=9 ' play external sound file; will cause servo defined in "scbase" (e.g. mouth servo) to synchronize to sound
  173. Const RandomMove As Integer=10 ' Randomly perform on of the following 'n' actions; n is the option value
  174. Const RandomPause As Integer=11 ' Pause some random time between the two times specified on the command
  175. Const CallScript As Integer=12 ' Call a script rather than running it in parallel in its own player
  176. Const EndWait As Integer=13  ' network command to clear pauses in execution at a "NetWait" point; not used in scripts
  177. Const NetWait As Integer=14  ' Define a point in script at which a network command can cause a pause in execution
  178. Const OneOnly As Integer=15  ' define a command that will exit a script if it is already running in a separate player.
  179. Const ActionSeq As Integer=16 ' loop sequentially through command group in a script.
  180.  
  181.  
  182. Do While Not Eof(1) And ErrorFound =0
  183.         Input #1, Action, Description, OptionValue
  184.         Print Action, Description, OptionValue
  185.         If Left(Action,1)=":" Then Action=":" ' special case of a commented line
  186.        
  187.         Select Case UCase(Action)
  188.                
  189.                 Case ":"
  190.                        
  191.                 Case "PLAYMOVE"
  192.                         ScriptStep +=1
  193.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  194.                         ScriptAction(ScriptStep) = PlayMove
  195.                         LocalIndex = FindIt(MoveDescription(), Description)
  196.                         If LocalIndex < 0 Then
  197.                                 Print "Cannot find move ";Description
  198.                                 ErrorFound=1
  199.                                 Exit Do
  200.                         Else
  201.                                 ScriptDescription(ScriptStep) = LocalIndex
  202.                         EndIf
  203.                         ScriptOption(ScriptStep) = OptionValue
  204.                         ScriptStack(ScriptStep)=NextStep(ScriptStep)
  205.                
  206.                 Case "STARTSCRIPT", "LABEL"
  207.                         LabelIndex +=1
  208.                         ReDim Preserve LabelDescription(LabelIndex) As String, LabelScriptIndex(LabelIndex)As Integer
  209.                         LabelDescription(LabelIndex) = Description
  210.                         LabelScriptIndex(LabelIndex)=ScriptStep+1
  211.                         If UCase(Action) = "STARTSCRIPT" Then MainScript=ScriptStep+1
  212.                        
  213.                 Case "PLAYSCRIPT"
  214.                         ScriptStep+=1
  215.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  216.                         ScriptAction(ScriptStep)=PlayScript
  217.                         LocalIndex = FindIt(LabelDescription(), Description)
  218.                         If LocalIndex < 0 Then
  219.                                 Print "Cannot find script ";Description
  220.                                 ErrorFound=2
  221.                                 Exit Do
  222.                         Else
  223.                                 ScriptDescription(ScriptStep) = LabelScriptIndex(LocalIndex)
  224.                                 ScriptOption(ScriptStep) = OptionValue
  225.                                 ScriptStack(ScriptStep)=NextStep(ScriptStep)
  226.                         EndIf
  227.                
  228.                 Case "CALLSCRIPT", "JUMPTO"
  229.                         ScriptStep+=1
  230.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  231.                         If UCase(Action) = "CALLSCRIPT" Then
  232.                                 ScriptAction(ScriptStep)=CallScript
  233.                         Else
  234.                                 ScriptAction(ScriptStep)=JumpTo
  235.                         EndIf
  236.                         LocalIndex = FindIt(LabelDescription(), Description)
  237.                         If LocalIndex < 0 Then
  238.                                 Print "Cannot find script or label ";Description
  239.                                 ErrorFound=2
  240.                                 Exit Do
  241.                         Else
  242.                                 ScriptDescription(ScriptStep) = LabelScriptIndex(LocalIndex)
  243.                                 ScriptOption(ScriptStep) = OptionValue
  244.                                 ScriptStack(ScriptStep)=NextStep(ScriptStep)
  245.                         EndIf
  246.  
  247.                 Case "SAY"
  248.                         ScriptStep +=1
  249.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  250.                         LocalIndex=FindIt(LabelDescription(),Description)
  251.                         If LocalIndex < 0 Then
  252.                                 LabelIndex =UBound(LabelScriptIndex)+1
  253.                                 LocalIndex=LabelIndex
  254.                                 ReDim Preserve LabelDescription(LabelIndex) As String, LabelScriptIndex(LabelIndex)As Integer
  255.                                 LabelDescription(LocalIndex) = Description
  256.                                 LabelScriptIndex(LocalIndex)=0
  257.                         End If
  258.                         ScriptAction(ScriptStep)=Say
  259.                         ScriptDescription(ScriptStep)=LocalIndex
  260.                         ScriptOption(ScriptStep)=OptionValue
  261.                         ScriptStack(ScriptStep)=NextStep(ScriptStep)
  262.  
  263.                 Case "ENDSCRIPT"
  264.                         ScriptStep +=1
  265.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  266.                         ScriptAction(ScriptStep) = EndScript
  267.                         ScriptOption(ScriptStep) = 0
  268.                         ScriptStack(ScriptStep)=0
  269.                         EndMain=ScriptStep
  270.                        
  271.                 Case "RANDOMPAUSE"
  272.                         ScriptStep +=1
  273.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  274.                         ScriptAction(ScriptStep) = RandomPause
  275.                         minPause=Val(Description)
  276.                         maxPause=OptionValue
  277.                         If minPause > maxPause Then Swap minPause, maxPause
  278.                         ScriptDescription(ScriptStep)=minPause
  279.                         ScriptOption(ScriptStep)=maxPause
  280.                         ScriptStack(ScriptStep)=NextStep(ScriptStep)
  281.                        
  282.                 Case "SCRIPTPAUSE", "RANDOMMOVE"
  283.                         ScriptStep+=1
  284.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer  
  285.                         If  UCase(Action)="RANDOMMOVE" Then
  286.                                 ScriptAction(ScriptStep)=RandomMove
  287.                                 AdjustStep=OptionValue+1
  288.                         Else
  289.                                 ScriptAction(ScriptStep)=ScriptPause
  290.                                 OptionValue=Val(Description)
  291.                         EndIf
  292.                         ScriptDescription(ScriptStep)=OptionValue
  293.                         ScriptOption(ScriptStep)=OptionValue
  294.                         ScriptStack(ScriptStep)=NextStep(ScriptStep)
  295.  
  296.                 Case "SYNCPOINT", "ENDSYNC", "ONEONLY"
  297.                         ScriptStep+=1
  298.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer  
  299.                         If UCase(Action)="SYNCPOINT" Then
  300.                                 ScriptAction(ScriptStep)=SyncPoint
  301.                         ElseIf UCase(Action)="ENDSYNC" Then
  302.                                 ScriptAction(ScriptStep)=EndSync
  303.                         Else
  304.                                 ScriptAction(ScriptStep)=OneOnly
  305.                         EndIf
  306.                         LocalIndex=FindIt(LabelDescription(),Description)
  307.                         If LocalIndex < 0 Then
  308.                                 LabelIndex =UBound(LabelScriptIndex)+1
  309.                                 LocalIndex=LabelIndex
  310.                                 SyncPointIndex+=1
  311.                                 ReDim Preserve LabelDescription(LabelIndex) As String, LabelScriptIndex(LabelIndex)As Integer
  312.                                 LabelDescription(LabelIndex) = Description
  313.                                 LabelScriptIndex(LabelIndex)=SyncPointIndex
  314.                         EndIf
  315.                         ScriptDescription(ScriptStep)=LabelScriptIndex(LocalIndex)
  316.                         ScriptOption(ScriptStep)=0
  317.                         ScriptStack(ScriptStep)=NextStep(ScriptStep)
  318.  
  319.                 Case "NETWAIT"
  320.                         LocalIndex=FindIt(LabelDescription(),Description)
  321.                         If LocalIndex < 0 Then
  322.                                 LabelIndex +=1
  323.                                 LocalIndex=LabelIndex
  324.                                 ReDim Preserve LabelDescription(LabelIndex) As String, LabelScriptIndex(LabelIndex)As Integer
  325.                                 LabelDescription(LocalIndex) = Description
  326.                                 LabelScriptIndex(LocalIndex)=-ScriptStep
  327.                         EndIf
  328.                         ScriptStep+=1
  329.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer  
  330.                         ScriptAction(ScriptStep)=NetWait
  331.                         ScriptDescription(ScriptStep)=LabelScriptIndex(LocalIndex)
  332.                         ScriptOption(ScriptStep)=ScriptStep
  333.                         ScriptStack(ScriptStep)=NextStep(ScriptStep)
  334.  
  335.                 Case "ACTIONSEQ"
  336.                         ScriptStep +=1
  337.                         ReDim Preserve ScriptAction(ScriptStep) As Integer, ScriptDescription(ScriptStep) As Integer, ScriptOption(ScriptStep) As Integer, ScriptStack(ScriptStep) As Integer
  338.                         AdjustStep=OptionValue
  339.                         ScriptAction(ScriptStep) = ActionSeq
  340.                         ScriptDescription(ScriptStep)=ScriptStep+1
  341.                         ScriptOption(ScriptStep) = ScriptStep+OptionValue
  342.                         ScriptStack(ScriptStep)=ScriptStep+1
  343.                        
  344.                 Case Else
  345.                         Print "Unrecognized script command  ";chr(34);Action;chr(34)
  346.                         ErrorFound=4
  347.                         Sleep
  348.                         Exit Do                        
  349.  
  350.         End Select
  351. Loop
  352.  
  353. Close #1
  354. If ErrorFound Then End ErrorFound
  355.  
  356.  
  357. '               ===========================================================================
  358. '               ===========================================================================
  359. '               Execute processed Script(s)
  360. '               ===========================================================================
  361. '               ===========================================================================
  362.  
  363. If timeBeginPeriod( 1 ) = TIMERR_NOCANDO Then
  364.   Print "Specified period is out of range"
  365.   ErrorFound=3
  366. End If
  367. If ErrorFound Then End ErrorFound
  368.  
  369. Open Com CommPort+" 115200,N,8,1,BIN,CD,CS,DS,RS" For Binary As #1
  370. If Err Then
  371.         Print "Could not open ";CommPort
  372. EndIf
  373.  
  374. ' initialize sound subsystem
  375. Put #1,,qs
  376. Sleep 12
  377. dat=Input$(Loc(1),#1)
  378.  
  379. ' define first step
  380. MaxPlayers=0
  381. ControlKey=""
  382. PlayerStep(MaxPlayers) = MainScript
  383. ReDim SyncPoints(SyncPointIndex) As ULongInt
  384.  
  385. Print "Starting to play script at ";Mainscript
  386. Print UBound(ScriptAction);" steps in script"
  387. Print
  388. Print "Press any key to start";
  389. Sleep
  390. ControlKey=InKey
  391. Print ""
  392. Print "Press <\> key to pause, <Any> key to resume,"
  393. Print "<Enter> to enter/leave single step mode,"
  394. Print "<Space> to step through script,"
  395. Print "<Esc> key to stop execution and leave the program."
  396.         Print "3..."
  397.         Sleep 1000
  398.         Print "2..."
  399.         Sleep 1000
  400.         Print "1..."
  401.         Sleep 1000
  402.         Print "!"
  403.         ControlKey="x"
  404.  
  405.         Do While ControlKey <> ""
  406.                 ControlKey=InKey
  407.                 Sleep 1
  408.         Loop
  409.  
  410. ' Create Network server
  411. ServerProcess=ThreadCreate(@ServerCreate)
  412.  
  413. Do While NotDone ' "NotDone" is true until the main script executes an "EndScript" command
  414.  
  415.  
  416. ' Check and process any network messages received
  417.         If serverReady And MsgReady Then
  418.                 netMessage=*myMessage
  419.                 MsgReady=0
  420.                 i =InStr(netMessage,",")
  421.                 Action=UCase(Left(netMessage,i-1))
  422.                 netMessage=Mid(netMessage,i+1,Len(netMessage))
  423.                 i=InStr(netMessage,",")
  424.                 Description=Left(netMessage,i-1)
  425.                 OptionValue=Val(Mid(netMessage,i+1))
  426.                 Select Case Action
  427.                         Case "PM"
  428.                                         MoveIndex = FindIt(MoveDescription(), Description)
  429.                                         If MoveIndex < 0 Then
  430.                                                 Print "Network Command:  Cannot find move ";Description
  431.                                         Else
  432.                                                 Print "Network Command:  ";MoveDescription(MoveIndex),MoveCommand(MoveIndex)
  433.                                                 Put #1,,MoveCommand(MoveIndex)
  434.                                         EndIf
  435.                
  436.                         Case "PS"
  437.                                         LocalIndex = FindIt(LabelDescription(), Description)
  438.                                         If LocalIndex < 0 Then
  439.                                                 Print "Network Command:  Cannot find script or label ";Description
  440.                                         Else
  441.                                                 ScriptIndex = LabelScriptIndex(LocalIndex)
  442.                                                 IndexPlayers=1
  443.                                                 Do While IndexPlayers <= MaxPlayers
  444.                                                         If PlayerStep(IndexPlayers)=0 Then Exit Do
  445.                                                         IndexPlayers+=1
  446.                                                 Loop
  447.                                                 If IndexPlayers>MaxPlayers Then
  448.                                                         MaxPlayers+=1
  449.                                                         ReDim Preserve PlayerStep(MaxPlayers) As Integer, PlayerEndWait(MaxPlayers) As Double
  450.                                                 EndIf
  451.                                                 PlayerStep(IndexPlayers)=ScriptIndex
  452.                                                 PlayerEndWait(IndexPlayers)=0
  453.                                                 Print "Network command:  Starting script on Player ";IndexPlayers
  454.                                         EndIf
  455.  
  456.                         Case "NW", "EW"
  457.                                 ' search for Label name; save "WaitName" (not found; handle like PS)
  458.                                 LocalIndex=FindIt(LabelDescription(), Description)
  459.                                 If LocalIndex < 0 Then
  460.                                                 Print "Network Command:  Cannot find script or label ";Description
  461.                                         Else
  462.                                                 WaitName = LabelScriptIndex(LocalIndex)
  463.                                                 LocalIndex=-WaitName
  464.                                                 While LocalIndex <= UBound(ScriptAction)
  465.                                                         If (ScriptAction(LocalIndex)=NetWait)And (ScriptDescription(LocalIndex) = WaitName) Then
  466.                                                                 Swap ScriptOption(LocalIndex), ScriptStack(LocalIndex)
  467.                                                         EndIf
  468.                                                         LocalIndex+=1
  469.                                                 Wend
  470.                                         ' search through script; if "WaitName" matches, swap option & Stack
  471.                                 EndIf
  472.                                
  473.                         Case "SAY"
  474.                                 LocalIndex=FindIt(LabelDescription(), Description)
  475.                                 If LocalIndex <=0 Then
  476.                                                 Print "Network Command:  Cannot find file ";Description
  477.                                 Else
  478.                                         soundFile=LabelDescription(LocalIndex)
  479.                                         Print "Network Command:  Saying ";soundFile
  480.                                         PlaySound(soundFile, NULL, SND_ASYNC Or SND_FILENAME)
  481.                                 End If
  482.  
  483.                         Case Else
  484.                                 Print "Network Command:  Cannot find requested action ";Action
  485.                                
  486.                 End Select
  487.         EndIf
  488.  
  489.         For Player=0 To MaxPlayers ' "Player = 0" is the main script
  490.  
  491.                 ' Pause/Single Step script on request
  492.                 ControlKey=InKey
  493.                 If ControlKey = PauseKey Then
  494.                         Print "Script paused per request; writing debug data"
  495.                         Open "ADebug.txt" For Output As #2
  496.                         For LocalIndex=0 To UBound(ScriptAction)
  497.                                 Print #2, Using "###] #### #### #### ####";LocalIndex,ScriptAction(LocalIndex),ScriptDescription(LocalIndex),ScriptOption(LocalIndex),ScriptStack(LocalIndex)
  498.                         Next
  499.                         Print #2,""
  500.                         For LocalIndex=0 To UBound(LabelDescription)
  501.                                 Print #2, Using "###] ####  ";LocalIndex,LabelScriptIndex(LocalIndex);
  502.                                 Print #2, LabelDescription(LocalIndex)
  503.                         Next
  504.                         Print #2,""
  505.                         For i=0 To maxplayers
  506.                                 Print #2, Using " ###";PlayerStep(i);
  507.                                 Next
  508.                         Print #2,""
  509.                         Close #2
  510.                         Sleep
  511.                         Print "Continuing..."
  512.                 ElseIf ControlKey = cr Then
  513.                         SingleStep = Not SingleStep
  514.                 ElseIf ControlKey = Esc Then
  515.                         NotDone=0
  516.                         Exit For
  517.                 EndIf
  518.  
  519.  
  520.  
  521. ' Speech processing ...
  522.                 If (SoundEndWait-Timer <0) Then
  523.                         dat = Input$(Loc(1), #1)
  524.  
  525.                         If dat = "" Then
  526.                                 ' Print "No data"
  527.                         Else
  528.                                 level = Asc(dat)
  529.                                 ' Print "Level ";level
  530.                                 Select Case level
  531.                                         Case 0 To 12
  532.                                                 PW="600"
  533.                                         Case 13 To 25
  534.                                                 PW="700"
  535.                                         Case 25 To 255
  536.                                                 PW="800"
  537.                                 End Select
  538.                                 If (PW<>lastPW)  Then
  539.                                         ssc32cmd=scbase+PW+cr
  540.                                         'Print "Command = ";ssc32cmd
  541.                                         Put #1,, ssc32cmd
  542.                                 EndIf
  543.                                 lastPW = PW
  544.                         End If
  545.  
  546.                         Put #1,,qs
  547.                         SoundEndWait=Timer+.012
  548.                 EndIf
  549.                
  550.                
  551.                 If ((PlayerEndWait(Player)-Timer)< 0) And (PlayerStep(Player)<>0) Then
  552.                         If SingleStep Then
  553.                                 Print "Single ";
  554.                                 Sleep
  555.                         EndIf
  556.  
  557.                         PlayerEndWait(Player)=0
  558.                         ScriptStep=PlayerStep(Player)
  559.                         Select Case ScriptAction(ScriptStep)
  560.                                
  561.                                 Case PlayMove
  562.                                         MoveIndex=ScriptDescription(ScriptStep)
  563.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  ";MoveDescription(MoveIndex),MoveCommand(MoveIndex)
  564.                                         Put #1,,MoveCommand(MoveIndex)
  565.                                         PlayerEndWait(Player)=Timer+ScriptOption(ScriptStep)/1000
  566.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  567.  
  568.                                 Case ScriptPause
  569.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  ";
  570.                                         Print Using "Pause ##.###";(ScriptOption(ScriptStep)/1000)
  571.                                         PlayerEndWait(Player)=Timer+ScriptOption(ScriptStep)/1000
  572.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  573.  
  574.                                 Case RandomPause
  575.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  ";
  576.                                         minPause=ScriptDescription(ScriptStep)
  577.                                         maxPause=ScriptOption(ScriptStep)
  578.                                         timePause=Int(Rnd()*(maxPause-minPause)+minPause)/1000
  579.                                         Print Using "Pause ##.###";timePause
  580.                                         PlayerEndWait(Player)=Timer+timePause
  581.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  582.  
  583.                                 Case CallScript
  584.                                         ' look for the end of the script
  585.                                         LocalIndex=ScriptDescription(ScriptStep)
  586.                                         While LocalIndex <= UBound(ScriptAction)
  587.                                                 If ScriptAction(LocalIndex) = EndScript Then Exit While
  588.                                                 LocalIndex+=1
  589.                                         Wend
  590.                                         If LocalIndex > UBound(ScriptAction) Then
  591.                                                 Print "Cannot find end of script..."
  592.                                                 Exit Do
  593.                                         EndIf
  594.                                         ' set the option value in the EndScript to point to the next step
  595.                                         ScriptStack(LocalIndex)=ScriptStack(ScriptStep)
  596.                                         PlayerStep(Player)=ScriptDescription(ScriptStep)
  597.                                         PlayerEndWait(Player)=Timer+ScriptOption(ScriptStep)/1000
  598.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Calling script"
  599.                                        
  600.                                 Case PlayScript
  601.                                         IndexPlayers=1
  602.                                         Do While IndexPlayers <= MaxPlayers
  603.                                                 If PlayerStep(IndexPlayers)=0 Then Exit Do
  604.                                                 IndexPlayers+=1
  605.                                         Loop
  606.                                         If IndexPlayers>MaxPlayers Then
  607.                                                 MaxPlayers+=1
  608.                                                 ReDim Preserve PlayerStep(MaxPlayers) As Integer, PlayerEndWait(MaxPlayers) As Double
  609.                                                 If Player > 63 Then
  610.                                                         Print "Too many simultaneous Players...";Player
  611.                                                         Exit Do
  612.                                                 EndIf
  613.                                         EndIf
  614.                                         PlayerStep(IndexPlayers)=ScriptDescription(ScriptStep)
  615.                                         PlayerEndWait(IndexPlayers)=0
  616.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  617.                                         PlayerEndWait(Player)=Timer+ScriptOption(ScriptStep)/1000
  618.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Starting script on Player ";IndexPlayers
  619.                                        
  620.                                 Case EndScript
  621.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  622.                                         ScriptStack(ScriptStep) = 0
  623.                                         NotDone = (ScriptStep<>EndMain) ' main script has ended
  624.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Script has completed on ";Player
  625.  
  626.                                 Case JumpTo
  627.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Jump to";ScriptDescription(ScriptStep)
  628.                                         PlayerStep(Player)=ScriptDescription(ScriptStep)
  629.                                        
  630.                                 Case SyncPoint
  631.                                         SyncPointIndex=ScriptDescription(ScriptStep)
  632.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Defining synchronization point ";SyncPointIndex
  633.                                         SyncPoints(SyncPointIndex)=SyncPoints(SyncPointIndex) Or (2^Player)
  634.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  635.  
  636.                                 Case EndSync
  637.                                         SyncPointIndex=ScriptDescription(ScriptStep)
  638.                                         SyncPointStatus= SyncPoints(SyncPointIndex) And (Not 2^Player)
  639.                                         If SyncPointStatus <> SyncPoints(SyncPointIndex) Then
  640.                                                 Print "Step ";DisplayStep(Player,ScriptStep);":  Sync'ing to";SyncPointIndex;"  [";SyncPoints(SyncPointIndex);"]"
  641.                                         EndIf
  642.                                         SyncPoints(SyncPointIndex)= SyncPointStatus
  643.                                         If SyncPoints(SyncPointIndex) = 0 Then
  644.                                                 PlayerStep(Player)=ScriptStack(ScriptStep)
  645.                                         EndIf
  646.  
  647.                                 Case OneOnly
  648.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Running single instance of script on ";Player
  649.                                         ' complete step processing at first execution, to set end of script index
  650.                                         If ScriptOption(ScriptStep)=0 Then
  651.                                                 LocalIndex=ScriptStep+1
  652.                                                 Do
  653.                                                         If ScriptAction(LocalIndex)=EndSync Then Exit Do
  654.                                                         LocalIndex+=1
  655.                                                 Loop Until LocalIndex >UBound(ScriptAction)
  656.                                                 If LocalIndex > UBound(ScriptAction) Then
  657.                                                         Print "Cannot find end of script syncronization"
  658.                                                         Exit Do
  659.                                                 Else
  660.                                                         ScriptOption(ScriptStep)=LocalIndex
  661.                                                 EndIf                                  
  662.                                         EndIf
  663.                                         ' check to see if there are any other instances of this script running
  664.                                         SyncPointIndex=ScriptDescription(ScriptStep)
  665.                                         SyncPointStatus= SyncPoints(SyncPointIndex) And (Not 2^Player)
  666.                                         If SyncPointStatus=0 Then
  667.                                                 PlayerStep(Player)=ScriptStack(ScriptStep) ' none, go to next step
  668.                                         Else
  669.                                                 PlayerStep(Player)=ScriptOption(ScriptStep)' found instance, go to end of script
  670.                                         EndIf
  671.  
  672.                                 Case RandomMove
  673.                                         Selections=ScriptDescription(ScriptStep)
  674.                                         MoveIndex=Int(Rnd()*Selections)+1 ' calculate offset to selected command in script
  675.                                         PlayerStep(Player)=ScriptStep+MoveIndex
  676.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  RandomMove ";MoveIndex;" of";Selections
  677.                                
  678.                                 Case ActionSeq
  679.                                         LocalIndex=ScriptStack(ScriptStep)
  680.                                         Print "Step ";DisplayStep(Player,ScriptStep);": Executing step ";LocalIndex;" of sequence"
  681.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  682.                                         LocalIndex+=1
  683.                                         If LocalIndex > ScriptOption(ScriptStep) Then LocalIndex=ScriptDescription(ScriptStep)
  684.                                         ScriptStack(ScriptStep)=LocalIndex
  685.  
  686.                                 Case Say
  687.                                         soundFile=LabelDescription(ScriptDescription(ScriptStep))
  688.                                         Print "Step ";DisplayStep(Player,ScriptStep);":  Saying ";soundFile
  689.                                         PlaySound(soundFile, NULL, SND_ASYNC Or SND_FILENAME)
  690.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  691.                                        
  692.                                 Case NetWait
  693.                                         PlayerStep(Player)=ScriptStack(ScriptStep)
  694.                                
  695.                         End Select
  696.                 EndIf
  697.                
  698.         Next
  699.         Sleep 1
  700. Loop
  701.  
  702. timeEndPeriod( 1 )
  703. Print "Press any key to finish";
  704. Print
  705. Sleep
  706.  
  707. End
  708.  
  709. Function FindIt (AnArray() As String, What As String) As Integer
  710.         Dim i As Integer, myWhat As String
  711.         myWhat=UCase(what)
  712.         For i=0 To UBound(AnArray)
  713.                 If UCase(AnArray(i)) = myWhat Then Exit For
  714.         Next
  715.         If i > ubound(AnArray) Then i=-16384
  716.         Return i
  717. End Function
  718.  
  719. Function DisplayStep(i As Integer, j As Integer) As String
  720.         Dim Display_Number As String =""
  721.         Display_Number = Right("  " & Str(i),2) & "-"+Left(Str(j) & "   ",3)
  722.         Return Display_Number
  723. End Function
  724. Function NextStep(myStep As Integer) As Integer
  725.         Dim where As Integer
  726.         where = myStep + AdjustStep
  727.         If AdjustStep > 1 Then AdjustStep-=1
  728.         Return where
  729. End Function
  730. Sub ServerThread(byval lpany as any ptr)
  731.   Dim as integer localreturn,index=cast(integer,lpAny)
  732.   Dim As String msg,RecvdMessage
  733. '  thread started for client
  734.   Clients.blnExit=0
  735.   while Clients.blnExit=0
  736.     localreturn=NetReceiveString(Clients.hClient,msg)
  737.     if localreturn<1 then
  738.       Clients.blnExit=1
  739.     Else
  740. '     thread: got a message " & msg
  741.       if instr(msg,esc) Then
  742.         msg="exit"&crlf
  743.         localreturn=NetSendString(Clients.hClient,msg)
  744.         Clients.blnExit=1
  745.       ElseIf InStr(msg,cr) Then
  746. '      thread: send ok
  747.         msg="ok"&crlf
  748.         localreturn=NetSendString(Clients.hClient,msg)
  749.         myMessage=StrPtr(RecvdMessage)
  750.         MsgReady=-1
  751.         While MsgReady
  752.                 Sleep 1
  753.         Wend
  754.         RecvdMessage=""
  755.       Else
  756.                         RecvdMessage=RecvdMessage+msg
  757.       End If
  758.     End If  
  759.   wend
  760. ' thread end for client
  761.   NetClose Clients.hClient
  762.   Clients.hClient=0
  763. end sub
  764. Sub ServerCreate(ByVal mpany As Any Ptr)
  765.  
  766. ' Client data type
  767. ' Server definitions
  768. Dim as FDSOCKET     hServer
  769. dim as SOCKADDR_IN  Server,Client
  770. dim as integer      ret,addrsize
  771.  
  772. Do
  773.         hServer=NetSocket(AF_INET,SOCK_STREAM,0)
  774.        
  775.         If hServer<0 Then  
  776.                 Print "Network server: error create socket!"
  777.                 Beep :Sleep :end 1
  778.         End If
  779.         Server.sin_family=AF_INET
  780.         Server.sin_port  =build_port(2310)
  781.         Server.sin_addr  =INADDR_ANY
  782.         ret=NetBind(hServer,@Server,sizeof(SOCKADDR_IN))
  783.         If ret<0 then
  784.                 Print "Network server: error binding to port!"
  785.                 beep:sleep:end 1
  786.         End If
  787.         ret=NetListen(hServer,3)
  788.         If ret<0 then
  789.                 Print "Network server: error listening!"
  790.                 beep:sleep:end 1
  791.         End if
  792.         Print "Network server: wait on connection"
  793.         addrsize=sizeof(SOCKADDR_IN)
  794.         ret=NetAccept(hServer,@Client,@addrsize)
  795.         If ret>-1 then
  796. '               Print "Network server: accept"
  797.            Clients.hClient=ret
  798.            Clients.hThread=ThreadCreate(@ServerThread)
  799.                 Print "Network server: connection"
  800.                 serverReady=-1
  801.         Else
  802.             Print "Network server: error accept!"
  803.             serverReady=0
  804.         End If
  805.        
  806.         If Clients.hThread<>0 then
  807. '               ? "server: wait on thread"
  808.                 ThreadWait(Clients.hThread)
  809.         End if
  810.         Sleep 100
  811.         Print "Network server: close!"
  812.         NetClose hServer
  813.  
  814. Loop
  815.  
  816. End Sub
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top