Skip to content
Snippets Groups Projects
Select Git revision
  • unknown-command-dedicated-print
  • next default protected
  • nomultiplayer-skinflag
  • quick-mapmusname-fix
  • sp-paste-clobber-fix
  • write-textmap-bruh
  • udmf-sector-fields
  • udmf-more-linedef-types
  • udmf-thing-types
  • udmf-executor-triggers
  • udmf-lighting
  • udmf-polyobjects
  • udmf-scrollers
  • udmf-plane-linedefs
  • udmf-fofs-mkii
  • colon-parenthesis
  • font_drawer
  • shockwave-action
  • pitch-roll
  • skin-set-fix
  • SRB2_release_2.2.10
  • SRB2_release_2.2.9
  • SRB2_release_2.2.8
  • SRB2_release_2.2.7
  • SRB2_release_2.2.6
  • SRB2_release_2.2.5
  • SRB2_release_2.2.4
  • SRB2_release_2.2.3
  • SRB2_release_2.2.2
  • SRB2_release_2.2.1
  • SRB2_release_2.2.0
  • SRB2_release_2.1.25
  • SRB2_release_2.1.24
  • SRB2_release_2.1.23
  • SRB2_release_2.1.22
  • SRB2_release_2.1.21
  • SRB2_release_2.1.20
  • SRB2_release_2.1.19
  • SRB2_release_2.1.18
  • td-release-v1.0.0
40 results

frmStateEdit.frm

Blame
  • Forked from STJr / SRB2
    4077 commits behind the upstream repository.
    Alam Ed Arias's avatar
    Alam Ed Arias authored and Alam Arias committed
    b93cb1b6
    History
    frmStateEdit.frm 28.25 KiB
    VERSION 5.00
    Begin VB.Form frmStateEdit 
       Caption         =   "State Edit"
       ClientHeight    =   6750
       ClientLeft      =   60
       ClientTop       =   345
       ClientWidth     =   8970
       Icon            =   "frmStateEdit.frx":0000
       LinkTopic       =   "Form1"
       MaxButton       =   0   'False
       ScaleHeight     =   6750
       ScaleWidth      =   8970
       StartUpPosition =   3  'Windows Default
       Begin VB.TextBox lblVar2Desc 
          Height          =   495
          Left            =   4440
          Locked          =   -1  'True
          MultiLine       =   -1  'True
          ScrollBars      =   2  'Vertical
          TabIndex        =   25
          Top             =   3000
          Width           =   4455
       End
       Begin VB.TextBox lblVar1Desc 
          Height          =   495
          Left            =   4440
          Locked          =   -1  'True
          MultiLine       =   -1  'True
          ScrollBars      =   2  'Vertical
          TabIndex        =   24
          Top             =   2400
          Width           =   4455
       End
       Begin VB.TextBox lblActionDesc 
          Height          =   735
          Left            =   4440
          Locked          =   -1  'True
          MultiLine       =   -1  'True
          ScrollBars      =   2  'Vertical
          TabIndex        =   23
          Top             =   1560
          Width           =   4455
       End
       Begin VB.ListBox lstThings 
          Height          =   450
          ItemData        =   "frmStateEdit.frx":0442
          Left            =   7440
          List            =   "frmStateEdit.frx":0444
          TabIndex        =   22
          Top             =   6120
          Visible         =   0   'False
          Width           =   975
       End
       Begin VB.TextBox txtFuncVar2 
          Height          =   285
          Left            =   7200
          TabIndex        =   19
          Top             =   3600
          Width           =   1215
       End
       Begin VB.TextBox txtFuncVar1 
          Height          =   285
          Left            =   5520
          TabIndex        =   18
          Top             =   3600
          Width           =   1095
       End
       Begin VB.CommandButton cmdCopy 
          Caption         =   "&Copy state to..."
          Height          =   495
          Left            =   6120
          Style           =   1  'Graphical
          TabIndex        =   17
          Top             =   6120
          Width           =   1095
       End
       Begin VB.CommandButton cmdDelete 
          Caption         =   "&Delete State from SOC"
          Height          =   495
          Left            =   6120
          Style           =   1  'Graphical
          TabIndex        =   16
          Top             =   5520
          Width           =   1095
       End
       Begin VB.CommandButton cmdReload 
          Caption         =   "&Load Code Default"
          Height          =   495
          Left            =   4920
          Style           =   1  'Graphical
          TabIndex        =   15
          Top             =   5520
          Width           =   1095
       End
       Begin VB.CommandButton cmdSave 
          Caption         =   "&Save"
          Height          =   495
          Left            =   7320
          TabIndex        =   14
          Top             =   5520
          Width           =   1095
       End
       Begin VB.ComboBox cmbTranslucency 
          Height          =   315
          ItemData        =   "frmStateEdit.frx":0446
          Left            =   6720
          List            =   "frmStateEdit.frx":045C
          TabIndex        =   12
          Top             =   5040
          Width           =   1695
       End
       Begin VB.CheckBox chkFullbright 
          Caption         =   "Make sprite full-brightness (unaffected by lighting)"
          Height          =   495
          Left            =   6240
          TabIndex        =   11
          Top             =   4440
          Width           =   2175
       End
       Begin VB.ComboBox cmbNextstate 
          Height          =   315
          Left            =   6120
          TabIndex        =   9
          Top             =   3960
          Width           =   2295
       End
       Begin VB.ComboBox cmbAction 
          Height          =   315
          Left            =   6000
          TabIndex        =   7
          Top             =   1200
          Width           =   2295
       End
       Begin VB.TextBox txtTics 
          Height          =   285
          Left            =   7800
          TabIndex        =   5
          Top             =   720
          Width           =   495
       End
       Begin VB.TextBox txtFrame 
          Height          =   285
          Left            =   5880
          MaxLength       =   2
          TabIndex        =   3
          Top             =   720
          Width           =   495
       End
       Begin VB.ComboBox cmbSprite 
          Height          =   315
          Left            =   5880
          TabIndex        =   1
          Top             =   120
          Width           =   2415
       End
       Begin VB.ListBox lstStates 
          Height          =   6495
          Left            =   120
          TabIndex        =   0
          Top             =   120
          Width           =   4215
       End
       Begin VB.Label lblFuncVar2 
          Alignment       =   1  'Right Justify
          Caption         =   "Var2:"
          Height          =   255
          Left            =   6600
          TabIndex        =   21
          Top             =   3600
          Width           =   495
       End
       Begin VB.Label lblFuncVar1 
          Alignment       =   1  'Right Justify
          Caption         =   "Var1:"
          Height          =   255
          Left            =   4920
          TabIndex        =   20
          Top             =   3600
          Width           =   495
       End
       Begin VB.Label lblTranslucency 
          Alignment       =   1  'Right Justify
          Caption         =   "Translucency:"
          Height          =   255
          Left            =   5520
          TabIndex        =   13
          Top             =   5040
          Width           =   1095
       End
       Begin VB.Label lblNextstate 
          Alignment       =   1  'Right Justify
          Caption         =   "Next State:"
          Height          =   255
          Left            =   5160
          TabIndex        =   10
          Top             =   3960
          Width           =   855
       End
       Begin VB.Label lblAction 
          Alignment       =   1  'Right Justify
          Caption         =   "Function to Call:"
          Height          =   375
          Left            =   5040
          TabIndex        =   8
          Top             =   1080
          Width           =   855
       End
       Begin VB.Label lblTics 
          Alignment       =   1  'Right Justify
          Caption         =   "Tics (-1 for infinite duration):"
          Height          =   495
          Left            =   6480
          TabIndex        =   6
          Top             =   600
          Width           =   1215
       End
       Begin VB.Label lblFrame 
          Alignment       =   1  'Right Justify
          Caption         =   "Frame:"
          Height          =   255
          Left            =   5160
          TabIndex        =   4
          Top             =   720
          Width           =   615
       End
       Begin VB.Label lblSprite 
          Alignment       =   1  'Right Justify
          Caption         =   "Sprite:"
          Height          =   255
          Left            =   5160
          TabIndex        =   2
          Top             =   120
          Width           =   615
       End
    End
    Attribute VB_Name = "frmStateEdit"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option Explicit
    
    Private Sub cmbAction_Click()
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim index As Integer
        Dim ActionName As String
        
        ActionName = cmbAction.List(cmbAction.ListIndex)
        
        If cmbAction.ListIndex = 0 Then
            lblActionDesc.Text = ""
            lblVar1Desc.Text = ""
            lblVar2Desc.Text = ""
            Exit Sub
        End If
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("p_enemy.c", ForReading, False)
        
        Do While Not ts.AtEndOfStream
            line = ts.ReadLine
            
            If Mid(line, 4, 9) = "Function:" And InStr(line, ActionName) > 0 Then
                ts.ReadLine ' //
                line = ts.ReadLine ' // Description:
                index = InStr(line, ":")
                lblActionDesc.Text = Mid(line, index + 2, Len(line) - (index + 1))
                
                ts.ReadLine ' //
                line = ts.ReadLine ' // var1 =
                If InStr(line, "var1:") Then
                    lblVar1Desc.Text = Mid(line, 4, Len(line) - 3)
                    line = ts.ReadLine
                    Do While Left(line, 7) <> "// var2"
                        lblVar1Desc.Text = lblVar1Desc.Text & vbCrLf & TrimComplete(Mid(line, 4, Len(line) - 3))
                        line = ts.ReadLine
                    Loop
                Else
                    lblVar1Desc.Text = Mid(line, 4, Len(line) - 3)
                End If
                
                If Left(line, 7) <> "// var2" Then
                    line = ts.ReadLine ' // var2 =
                End If
                
                If InStr(line, "var2:") Then
                    lblVar2Desc.Text = Mid(line, 4, Len(line) - 3)
                    line = ts.ReadLine
                    Do While Len(line) > 4
                        lblVar2Desc.Text = lblVar2Desc.Text & vbCrLf & TrimComplete(Mid(line, 4, Len(line) - 3))
                        line = ts.ReadLine
                    Loop
                Else
                    lblVar2Desc.Text = Mid(line, 4, Len(line) - 3)
                End If
            End If
        Loop
        
        ts.Close
        Set myFSO = Nothing
    End Sub
    
    Private Sub cmdCopy_Click()
        Dim Response As String
        
        Response$ = InputBox("Copy state to #:", "Copy State")
        
        If Response = "" Then Exit Sub
        
        Response = TrimComplete(Response)
        
        Call WriteState(False, Val(Response))
        
        MsgBox "State copied to #" & Val(Response)
    End Sub
    
    Private Sub cmdDelete_Click()
        Call WriteState(True, lstStates.ListIndex)
    End Sub
    
    Private Sub cmdReload_Click()
        Call ClearForm
        
        If InStr(lstStates.List(lstStates.ListIndex), "S_FREESLOT") = 0 Then
            LoadStateInfo (lstStates.ListIndex)
        Else
            MsgBox "Free slots do not have a code default."
        End If
    End Sub
    
    Private Sub cmdSave_Click()
        If TrimComplete(txtFrame.Text) = "" And (chkFullbright.Value = 1 Or cmbTranslucency.ListIndex > 0) Then
            MsgBox "ERROR: Frame field required for fullbright/translucency."
            Exit Sub
        End If
        Call WriteState(False, lstStates.ListIndex)
    End Sub
    
    Private Sub Form_Load()
        Call Reload
        lstStates.ListIndex = 0
    End Sub
    
    Private Sub ClearForm()
        cmbNextstate.Text = ""
        cmbSprite.Text = ""
        txtFrame.Text = ""
        cmbAction.Text = ""
        txtFuncVar1.Text = ""
        txtFuncVar2.Text = ""
        lblActionDesc.Text = ""
        lblVar1Desc.Text = ""
        lblVar2Desc.Text = ""
        chkFullbright.Value = False
        cmbTranslucency.ListIndex = 0
    End Sub
    
    Private Sub Reload()
        LoadStates
        LoadSprites
        LoadActions
    End Sub
    
    Private Sub LoadStates()
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim number As Integer
        Dim startclip As Integer, endclip As Integer
        Dim addstring As String
        Dim numfreeslots As Integer, i As Integer
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("info.h", ForReading, False)
        
        Do While InStr(ts.ReadLine, "Object states (don't modify this comment!)") = 0
        Loop
        
        ts.SkipLine ' typedef enum
        ts.SkipLine ' {
        
        line = ts.ReadLine
        number = 0
        
        lstStates.Clear
        
        Do While InStr(line, "S_FIRSTFREESLOT") = 0
            startclip = InStr(line, "S_")
            If InStr(line, "S_") <> 0 Then
                endclip = InStr(line, ",")
                line = Mid(line, startclip, endclip - startclip)
                addstring = number & " - " & line
                lstStates.AddItem addstring
                cmbNextstate.AddItem addstring
                number = number + 1
            End If
            line = ts.ReadLine
        Loop
        
        ts.Close
        
        'Populate the free slots!
        Set ts = myFSO.OpenTextFile("info.h", ForReading, False)
    
        line = ts.ReadLine
        Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0
            line = ts.ReadLine
        Loop
        
        startclip = InStr(line, "SLOTS ") + 6
        numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1)) * 6
    
        For i = 1 To numfreeslots
            addstring = number & " - " & "S_FREESLOT" & i
            lstStates.AddItem addstring
            cmbNextstate.AddItem addstring
            number = number + 1
        Next
    
        ts.Close
        Set myFSO = Nothing
    End Sub
    
    Private Sub LoadSprites()
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim number As Integer
        Dim startclip As Integer, endclip As Integer
        Dim addstring As String
        Dim numfreeslots As Integer, i As Integer
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("info.h", ForReading, False)
        
        Do While InStr(ts.ReadLine, "Hey, moron! If you change this table, don't forget about") = 0
        Loop
        
        ts.SkipLine ' typedef enum
        ts.SkipLine ' {
        
        line = ts.ReadLine
        number = 0
        
        cmbSprite.Clear
        
        Do While InStr(line, "SPR_FIRSTFREESLOT") = 0
            startclip = InStr(line, "SPR_")
            If InStr(line, "SPR_") <> 0 Then
                endclip = InStr(line, ",")
                line = Mid(line, startclip, endclip - startclip)
                addstring = number & " - " & line
                cmbSprite.AddItem addstring
                number = number + 1
            End If
            line = ts.ReadLine
        Loop
        
        ts.Close
        
        'Populate the free slots!
        Set ts = myFSO.OpenTextFile("info.h", ForReading, False)
    
        line = ts.ReadLine
        Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0
            line = ts.ReadLine
        Loop
        
        startclip = InStr(line, "SLOTS ") + 6
        numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1))
    
        For i = 1 To numfreeslots
            If i < 10 Then
                addstring = number & " - " & "SPR_F00" & i & " (Free slot)"
            ElseIf i < 100 Then
                addstring = number & " - " & "SPR_F0" & i & " (Free slot)"
            Else
                addstring = number & " - " & "SPR_F" & i & " (Free slot)"
            End If
            
            cmbSprite.AddItem addstring
            number = number + 1
        Next
    
        ts.Close
    
        Set myFSO = Nothing
    End Sub
    
    Private Sub LoadActions()
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim number As Integer
        Dim startclip As Integer, endclip As Integer
        Dim addstring As String
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("dehacked.c", ForReading, False)
        
        Do While InStr(ts.ReadLine, "actionpointer_t actionpointers[]") = 0
        Loop
        
        ts.SkipLine ' {
        
        line = ts.ReadLine
        number = 0
        
        cmbAction.Clear
        
        cmbAction.AddItem "None"
        
        Do While InStr(line, "NULL") = 0
            startclip = InStr(line, "A_")
            If InStr(line, "A_") <> 0 Then
                endclip = InStr(line, "}")
                line = Mid(line, startclip, endclip - startclip)
                cmbAction.AddItem line
                number = number + 1
            End If
            line = ts.ReadLine
        Loop
        
        ts.Close
        Set myFSO = Nothing
    End Sub
    
    Private Sub lstStates_Click()
        Call ClearForm
    
        If InStr(lstStates.List(lstStates.ListIndex), "S_FREESLOT") = 0 Then
            LoadStateInfo (lstStates.ListIndex)
        End If
        
        LoadSOCStateInfo (lstStates.ListIndex)
    End Sub
    
    Private Sub LoadSOCStateInfo(StateNum As Integer)
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim word As String
        Dim word2 As String
        Dim frameNum As Long
        
        Set ts = myFSO.OpenTextFile(SOCFile, ForReading, False)
        
    SOCLoad:
        Do While Not ts.AtEndOfStream
            line = ts.ReadLine
            
            If Left(line, 1) = "#" Then GoTo SOCLoad
            
            If Left(line, 1) = vbCrLf Then GoTo SOCLoad
            
            If Len(line) < 1 Then GoTo SOCLoad
            
            word = FirstToken(line)
            word2 = SecondToken(line)
            
            If UCase(word) = "FRAME" And Val(word2) = StateNum Then
                Do While Len(line) > 0 And Not ts.AtEndOfStream
                    line = ts.ReadLine
                    word = UCase(FirstToken(line))
                    word2 = UCase(SecondTokenEqual(line))
                        
                    If word = "SPRITENUMBER" Then
                        cmbSprite.ListIndex = Val(word2)
                    ElseIf word = "SPRITESUBNUMBER" Then
                        frameNum = Val(word2)
                        
                        If frameNum >= 327680 Then ' 5 << 16
                            cmbTranslucency.ListIndex = 5
                            frameNum = frameNum And Not 327680
                        ElseIf frameNum >= 262144 Then ' 4 << 16
                            cmbTranslucency.ListIndex = 4
                            frameNum = frameNum And Not 262144
                        ElseIf frameNum >= 196608 Then ' 3 << 16
                            cmbTranslucency.ListIndex = 3
                            frameNum = frameNum And Not 196608
                        ElseIf frameNum >= 131072 Then ' 2 << 16
                            cmbTranslucency.ListIndex = 2
                            frameNum = frameNum And Not 131072
                        ElseIf frameNum >= 65536 Then ' 1 << 16
                            cmbTranslucency.ListIndex = 1
                            frameNum = frameNum And Not 65536
                        End If
                        
                        If frameNum >= 32768 Then
                            chkFullbright.Value = 1
                            frameNum = frameNum And Not 32768
                        Else
                            chkFullbright.Value = 0
                        End If
                        
                        txtFrame.Text = frameNum
                    ElseIf word = "DURATION" Then
                        txtTics.Text = Val(word2)
                    ElseIf word = "NEXT" Then
                        cmbNextstate.ListIndex = Val(word2)
                    ElseIf word = "ACTION" Then
                        Call FindComboIndex(cmbAction, UCase(SecondToken(line)))
                    ElseIf word = "VAR1" Then
                        txtFuncVar1.Text = Val(word2)
                    ElseIf word = "VAR2" Then
                        txtFuncVar2.Text = Val(word2)
                    ElseIf Len(line) > 0 And Left(line, 1) <> "#" Then
                        MsgBox "Error in SOC!" & vbCrLf & "Unknown line: " & line
                    End If
                Loop
                Exit Do
            End If
        Loop
        
        ts.Close
        Set myFSO = Nothing
    End Sub
    
    Private Sub LoadStateInfo(StateNum As Integer)
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim number As Integer
        Dim startclip As Integer, endclip As Integer
        Dim token As String
        Dim frame As Long
        Dim templine As String
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("info.c", ForReading, False)
        
        Do While InStr(ts.ReadLine, "Keep this comment directly above S_NULL") = 0
        Loop
        
        number = 0
        
        Do While number <> StateNum
            Do While InStr(ts.ReadLine, "SPR_") = 0
            Loop
            number = number + 1
        Loop
        
        Do While InStr(line, "SPR_") = 0
            line = ts.ReadLine
        Loop
        
        startclip = InStr(line, "SPR_")
        line = Mid(line, startclip, Len(line) - startclip)
        endclip = InStr(line, ",") - 1
        token = Left(line, endclip)
        Call FindComboIndex(cmbSprite, token)
        
        startclip = InStr(line, ",") + 1
        line = TrimComplete(Mid(line, startclip, Len(line) - startclip))
        endclip = InStr(line, ",") - 1
        frame = Val(Left(line, endclip))
        
        If frame >= 32768 Then
            chkFullbright.Value = 1
            frame = frame - 32768
        Else
            chkFullbright.Value = 0
        End If
            
        txtFrame.Text = frame
        
        cmbTranslucency.ListIndex = 0
        
        startclip = InStr(line, ",") + 1
        line = TrimComplete(Mid(line, startclip, Len(line) - startclip))
        endclip = InStr(line, ",") - 1
        txtTics.Text = Val(Left(line, endclip))
        
        startclip = InStr(line, "{") + 1
        line = TrimComplete(Mid(line, startclip, Len(line) - startclip))
        endclip = InStr(line, "}") - 1
        cmbAction.Text = TrimComplete(Left(line, endclip))
        If cmbAction.Text = "NULL" Then cmbAction.Text = "None"
    
        startclip = InStr(line, ",") + 1
        line = TrimComplete(Mid(line, startclip, Len(line) - startclip))
        endclip = InStr(line, ",") - 1
        templine = Left(line, endclip)
        
        templine = TrimComplete(templine)
        'Check for *FRACUNIT values
        endclip = InStr(templine, "*FRACUNIT")
        If endclip <> 0 Then
            templine = Left(templine, endclip - 1)
            templine = Val(templine) * 65536
        End If
        'Check for crazy-odd MT_ usage
        endclip = InStr(templine, "MT_")
        If endclip <> 0 Then
            templine = FindThingNum(templine) & " - " & templine
        End If
        'Check for crazy-odd pw_ usage
        endclip = InStr(templine, "pw_")
        If endclip <> 0 Then
            templine = FindPowerNum(templine) & " - " & templine
        End If
        txtFuncVar1.Text = templine
        
        startclip = InStr(line, ",") + 1
        line = TrimComplete(Mid(line, startclip, Len(line) - startclip))
        endclip = InStr(line, ",") - 1
        templine = Left(line, endclip)
        
        templine = TrimComplete(templine)
        'Check for *FRACUNIT values
        endclip = InStr(templine, "*FRACUNIT")
        If endclip <> 0 Then
            templine = Left(templine, endclip - 1)
            templine = Val(templine) * 65536
        End If
        'Check for crazy-odd MT_ usage
        endclip = InStr(templine, "MT_")
        If endclip <> 0 Then
            templine = FindThingNum(templine) & " - " & templine
        End If
        'Check for crazy-odd pw_ usage
        endclip = InStr(templine, "pw_")
        If endclip <> 0 Then
            templine = FindPowerNum(templine) & " - " & templine
        End If
        txtFuncVar2.Text = templine
        
        startclip = InStr(line, ",") + 1
        line = TrimComplete(Mid(line, startclip, Len(line) - startclip))
        endclip = InStr(line, "}") - 1
        Call FindComboIndex(cmbNextstate, TrimComplete(Left(line, endclip)))
        
        ts.Close
        Set myFSO = Nothing
    End Sub
    
    Private Sub FindComboIndex(ByRef Box As ComboBox, line As String)
        Dim i As Integer
        
        For i = 0 To Box.ListCount
            If InStr(UCase(Box.List(i)), UCase(line)) Then
                Box.ListIndex = i
                Exit For
            End If
        Next
    End Sub
    
    Private Sub WriteState(Remove As Boolean, num As Integer)
        Dim myFSOSource As New Scripting.FileSystemObject
        Dim tsSource As TextStream
        Dim myFSOTarget As New Scripting.FileSystemObject
        Dim tsTarget As TextStream
        Dim line As String
        Dim word As String
        Dim word2 As String
        Dim flags As Long
        Dim statefound As Boolean
        
        statefound = False
        
        Set tsSource = myFSOSource.OpenTextFile(SOCFile, ForReading, False)
        Set tsTarget = myFSOTarget.OpenTextFile(SOCTemp, ForWriting, True)
        
        Do While Not tsSource.AtEndOfStream
            line = tsSource.ReadLine
            word = UCase(FirstToken(line))
            word2 = UCase(SecondToken(line))
    
            'If the current sound exists in the SOC, delete it.
            If word = "FRAME" And Val(word2) = num Then
                statefound = True
                Do While Len(TrimComplete(tsSource.ReadLine)) > 0 And Not (tsSource.AtEndOfStream)
                Loop
            Else
                tsTarget.WriteLine line
            End If
        Loop
        
        tsSource.Close
        Set myFSOSource = Nothing
        
        If Remove = False Then
            If line <> "" Then tsTarget.WriteLine ""
        
            tsTarget.WriteLine "FRAME " & num
            cmbSprite.Text = TrimComplete(cmbSprite.Text)
            txtFrame.Text = TrimComplete(txtFrame.Text)
            txtTics.Text = TrimComplete(txtTics.Text)
            cmbAction.Text = TrimComplete(cmbAction.Text)
            txtFuncVar1.Text = TrimComplete(txtFuncVar1.Text)
            txtFuncVar2.Text = TrimComplete(txtFuncVar2.Text)
            cmbNextstate.Text = TrimComplete(cmbNextstate.Text)
            cmbTranslucency.Text = TrimComplete(cmbTranslucency.Text)
            
            If cmbSprite.Text <> "" Then tsTarget.WriteLine "SPRITENUMBER = " & cmbSprite.ListIndex
            
            flags = Val(txtFrame.Text)
            If chkFullbright.Value = 1 Then flags = flags + 32768
            
            ' Grrr VB doesn't have bitshifts!!
            If cmbTranslucency.Text <> "" Then
                flags = flags + cmbTranslucency.ListIndex * 65536
            End If
            
            If txtFrame.Text <> "" Then tsTarget.WriteLine "SPRITESUBNUMBER = " & flags
            If txtTics.Text <> "" Then tsTarget.WriteLine "DURATION = " & Val(txtTics.Text)
            If cmbNextstate.Text <> "" Then tsTarget.WriteLine "NEXT = " & cmbNextstate.ListIndex
            If cmbAction.Text <> "" Then tsTarget.WriteLine "ACTION " & cmbAction.Text
            If txtFuncVar1.Text <> "" Then tsTarget.WriteLine "VAR1 = " & Val(txtFuncVar1.Text)
            If txtFuncVar2.Text <> "" Then tsTarget.WriteLine "VAR2 = " & Val(txtFuncVar2.Text)
        End If
        
        tsTarget.Close
        Set myFSOTarget = Nothing
        
        FileCopy SOCTemp, SOCFile
        
        Kill SOCTemp
        
        If Remove = True Then
            If statefound = True Then
                MsgBox "State removed from SOC."
            Else
                MsgBox "State not found in SOC."
            End If
        Else
            MsgBox "State Saved."
        End If
    End Sub
    
    Private Sub LoadThings()
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim number As Integer
        Dim startclip As Integer, endclip As Integer
        Dim numfreeslots As Integer, i As Integer
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("info.h", ForReading, False)
        
        Do While InStr(ts.ReadLine, "Little flag for SOC editor (don't change this comment!)") = 0
        Loop
        
        ts.SkipLine ' typedef enum
        ts.SkipLine ' {
        
        line = ts.ReadLine
        number = 0
        
        lstThings.Clear
        
        Do While InStr(line, "MT_FIRSTFREESLOT") = 0
            startclip = InStr(line, "MT_")
            If InStr(line, "MT_") <> 0 Then
                endclip = InStr(line, ",")
                line = Mid(line, startclip, endclip - startclip)
                lstThings.AddItem number & " - " & line
                number = number + 1
            End If
            line = ts.ReadLine
        Loop
        
        ts.Close
        
        'Populate the free slots!
        Set ts = myFSO.OpenTextFile("info.h", ForReading, False)
    
        line = ts.ReadLine
        Do While InStr(line, "#define NUMMOBJFREESLOTS") = 0
            line = ts.ReadLine
        Loop
        
        startclip = InStr(line, "SLOTS ") + 6
        numfreeslots = Val(Mid(line, startclip, Len(line) - startclip + 1))
    
        For i = 1 To numfreeslots
            lstThings.AddItem number & " - " & "MT_FREESLOT" & i
            number = number + 1
        Next
    
        ts.Close
        Set myFSO = Nothing
    End Sub
    
    Private Function FindThingNum(ThingName As String) As Integer
        Dim i As Integer
        Dim temp As String
        Dim startpoint As Integer
        Dim endpoint As Integer
        
        lstThings.Clear
        LoadThings
        
        For i = 0 To lstThings.ListCount - 1
            temp = lstThings.List(i)
            startpoint = InStr(temp, "-") + 2
            endpoint = Len(temp) - startpoint + 1
            temp = Mid(temp, startpoint, endpoint)
            If temp = ThingName Then
                FindThingNum = Val(lstThings.List(i))
                Exit For
            End If
        Next
    End Function
    
    Private Function FindPowerNum(PowerName As String) As Integer
        Dim myFSO As New Scripting.FileSystemObject
        Dim ts As TextStream
        Dim line As String
        Dim number As Integer
        Dim startclip As Integer
        
        ChDir SourcePath
        Set ts = myFSO.OpenTextFile("d_player.h", ForReading, False)
        
        Do While InStr(ts.ReadLine, "Player powers. (don't edit this comment)") = 0
        Loop
        
        ts.SkipLine ' typedef enum
        ts.SkipLine ' {
        
        line = ts.ReadLine
        number = 0
        
        Do While InStr(line, "NUMPOWERS") = 0
            startclip = InStr(line, PowerName)
            If startclip <> 0 Then
                FindPowerNum = number
                Exit Do
            End If
            number = number + 1
            line = ts.ReadLine
        Loop
        
        ts.Close
        Set myFSO = Nothing
    End Function