Public Class ScriptV2 Public Enum ScriptTypes As Integer Command = 100 [if] = 101 [when] = 102 [then] = 103 [else] = 104 [endif] = 105 [end] = 106 [select] = 107 [endwhen] = 108 [return] = 109 [endscript] = 110 [while] = 111 [endwhile] = 112 [exitwhile] = 113 Comment = 128 End Enum Public ScriptType As ScriptTypes Public Value As String = "" Public started As Boolean = False Public IsReady As Boolean = False Public CanContinue As Boolean = True Public RawScriptLine As String = "" Public Sub Initialize(ByVal scriptLine As String) Me.RawScriptLine = scriptLine Dim firstChar As String = scriptLine(0) Select Case firstChar Case "@" Me.ScriptType = ScriptTypes.Command Me.Value = scriptLine.Remove(0, 1) Case ":" Dim structureType As String = scriptLine.Remove(0, 1) If structureType.Contains(":") = True Then Me.Value = structureType.Remove(0, structureType.IndexOf(":") + 1) structureType = structureType.Remove(structureType.IndexOf(":")) End If Select Case structureType.ToLower() Case "if" Me.ScriptType = ScriptTypes.if Case "when" Me.ScriptType = ScriptTypes.when Case "then" Me.ScriptType = ScriptTypes.then Case "else" Me.ScriptType = ScriptTypes.else Case "endif" Me.ScriptType = ScriptTypes.endif Case "end" Me.ScriptType = ScriptTypes.end Case "select" Me.ScriptType = ScriptTypes.select Case "endwhen" Me.ScriptType = ScriptTypes.endwhen Case "return" Me.ScriptType = ScriptTypes.return Case "endscript" Me.ScriptType = ScriptTypes.endscript Case "while" Me.ScriptType = ScriptTypes.while Case "endwhile" Me.ScriptType = ScriptTypes.endwhile Case "exitwhile" Me.ScriptType = ScriptTypes.exitwhile Case Else LogIllegalLine(scriptLine) Me.IsReady = True End Select Me.CanContinue = True Case "#" Me.ScriptType = ScriptTypes.Comment Me.Value = scriptLine.Remove(0, 1) Me.CanContinue = True Case Else LogIllegalLine(scriptLine) Me.IsReady = True Me.CanContinue = True End Select End Sub Private Sub LogIllegalLine(ByVal scriptLine As String) Logger.Log(Logger.LogTypes.Message, "Illegal script line detected (" & scriptLine & ")") End Sub Public Sub EndScript(ByVal forceEnd As Boolean) ActionScript.ScriptLevelIndex -= 1 If ActionScript.ScriptLevelIndex = -1 Or forceEnd = True Then ActionScript.ScriptLevelIndex = -1 Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.Scripts.Clear() oS.ActionScript.reDelay = 1.0F Me.IsReady = True Screen.TextBox.reDelay = 1.0F ActionScript.TempInputDirection = -1 ActionScript.TempSpin = False End If End Sub Public Sub Update() Select Case Me.ScriptType Case ScriptTypes.Command Me.DoCommand() Case ScriptTypes.if Me.DoIf() Case ScriptTypes.then Me.IsReady = True Case ScriptTypes.else Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.ChooseIf(True) Me.IsReady = True Case ScriptTypes.endif Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.ChooseIf(True) Me.IsReady = True Case ScriptTypes.while Me.DoWhile() Case ScriptTypes.endwhile Me.IsReady = True Case ScriptTypes.exitwhile Me.DoExitWhile() Case ScriptTypes.select Me.DoSelect() Case ScriptTypes.when Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.Switch("") Me.IsReady = True Case ScriptTypes.endwhen Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.Switch("") Me.IsReady = True Case ScriptTypes.end Me.EndScript(False) Case ScriptTypes.endscript Me.EndScript(True) Case ScriptTypes.return Me.DoReturn() Me.EndScript(False) Case ScriptTypes.Comment Logger.Debug("ScriptV2.vb: #Comment: """ & Me.Value & """") Me.IsReady = True End Select End Sub Private Sub DoWhile() ' If T equals false, go straight to :endwhile and clear any existing while query, else initialize a while query that collects every single script line that gets executed starting with :while and ending with :endwhile. ' A exitwhile directly goes to :endwhile and clears the query. Dim T As Boolean = CheckCondition() If T = True Then ActionScript.CSL().WhileQuery.Clear() ActionScript.CSL().WhileQueryInitialized = True Else ActionScript.CSL().WhileQuery.Clear() ActionScript.CSL().WhileQueryInitialized = False ' Skip to endwhile: Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) While oS.ActionScript.Scripts.Count > 0 AndAlso oS.ActionScript.Scripts(0).ScriptV2.ScriptType <> ScriptTypes.endwhile oS.ActionScript.Scripts.RemoveAt(0) End While End If Me.IsReady = True End Sub Private Sub DoExitWhile() ActionScript.CSL().WhileQuery.Clear() ActionScript.CSL().WhileQueryInitialized = True ' Skip to endwhile: Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) While oS.ActionScript.Scripts.Count > 0 AndAlso oS.ActionScript.Scripts(0).ScriptV2.ScriptType <> ScriptTypes.endwhile oS.ActionScript.Scripts.RemoveAt(0) End While Me.IsReady = True End Sub Private Sub DoIf() Dim T As Boolean = CheckCondition() ActionScript.CSL().WaitingEndIf(ActionScript.CSL().IfIndex + 1) = False ActionScript.CSL().CanTriggerElse(ActionScript.CSL().IfIndex + 1) = False Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.ChooseIf(T) Me.IsReady = True End Sub Private Function CheckCondition() As Boolean Dim check As String = Value Dim T As Boolean = False Dim convertNextValue As Boolean = False Dim ors As New List(Of List(Of String)) Dim currentOr As New List(Of String) While check.Contains(" ") = True Or check.Contains(" ") = True If check.StartsWith(" ") = True Then check = check.Remove(0, " ".Length) ElseIf check.StartsWith(" ") = True Then Dim newOr As New List(Of String) newOr.AddRange(currentOr.ToArray()) ors.Add(newOr) currentOr = New List(Of String) check = check.Remove(0, " ".Length) Else If check.StartsWith("<") = True Then convertNextValue = True check = check.Remove(0, "".Length) End If Dim nextStop As Integer = 0 Dim andStop As Integer = -1 Dim orStop As Integer = -1 If check.Contains(" ") = True Then andStop = check.IndexOf(" ") End If If check.Contains(" ") = True Then orStop = check.IndexOf(" ") End If If andStop > -1 And orStop = -1 Then nextStop = andStop ElseIf orStop > -1 And andStop = -1 Then nextStop = orStop Else If andStop < orStop Then nextStop = andStop Else nextStop = orStop End If End If Dim newCheck As String = check.Remove(nextStop) If convertNextValue = True Then convertNextValue = False newCheck = "" & newCheck End If currentOr.Add(newCheck) check = check.Remove(0, nextStop) End If End While currentOr.Add(check) ors.Add(currentOr) Dim results As New List(Of Boolean) For Each checkOR As List(Of String) In ors Dim vT As Boolean = True For Each c As String In checkOR Dim b As Boolean = False If c.StartsWith("") = True Then c = c.Remove(0, "".Length) b = True End If Dim v As Boolean = ScriptVersion2.ScriptComparer.EvaluateScriptComparison(c) If b = True Then b = False v = Not v End If If v = False Then vT = False Exit For End If Next results.Add(vT) Next For Each result As Boolean In results If result = True Then T = True Exit For End If Next Return T End Function Private Sub DoSelect() ActionScript.CSL().WhenIndex += 1 Dim oS As OverworldScreen = CType(Core.CurrentScreen, OverworldScreen) oS.ActionScript.Switch(ScriptVersion2.ScriptComparer.EvaluateConstruct(Value)) Me.IsReady = True End Sub Private Sub DoCommand() ScriptVersion2.ScriptCommander.ExecuteCommand(Me, Me.Value) End Sub Public Shared TempReturn As String = "NULL" Private Sub DoReturn() TempReturn = ScriptVersion2.ScriptComparer.EvaluateConstruct(Me.Value).ToString() End Sub End Class