Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
504 lines
17 KiB
Plaintext
504 lines
17 KiB
Plaintext
VERSION 5.00
|
|
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
|
|
Begin VB.Form frmEffects
|
|
BorderStyle = 1 'Fixed Single
|
|
Caption = "Audio Effects using DirectSound Buffers"
|
|
ClientHeight = 4965
|
|
ClientLeft = 45
|
|
ClientTop = 330
|
|
ClientWidth = 4740
|
|
Icon = "frmFX.frx":0000
|
|
LinkTopic = "Form1"
|
|
MaxButton = 0 'False
|
|
ScaleHeight = 4965
|
|
ScaleWidth = 4740
|
|
StartUpPosition = 3 'Windows Default
|
|
Begin VB.Timer tmrUpdate
|
|
Interval = 50
|
|
Left = 6180
|
|
Top = 1620
|
|
End
|
|
Begin VB.CheckBox chkLoop
|
|
Caption = "Loop Sound"
|
|
Height = 315
|
|
Left = 840
|
|
TabIndex = 7
|
|
Top = 4500
|
|
Width = 1455
|
|
End
|
|
Begin VB.CommandButton cmdStop
|
|
Caption = "&Stop"
|
|
Height = 375
|
|
Left = 3600
|
|
TabIndex = 6
|
|
Top = 4500
|
|
Width = 1095
|
|
End
|
|
Begin VB.CommandButton cmdPlay
|
|
Caption = "&Play"
|
|
Height = 375
|
|
Left = 2400
|
|
TabIndex = 5
|
|
Top = 4500
|
|
Width = 1095
|
|
End
|
|
Begin VB.Frame fraEffects
|
|
Caption = "Effects Information"
|
|
Height = 3615
|
|
Left = 120
|
|
TabIndex = 1
|
|
Top = 780
|
|
Width = 4515
|
|
Begin VB.CommandButton cmdApply
|
|
Caption = "Apply Effects"
|
|
Height = 315
|
|
Left = 2460
|
|
TabIndex = 12
|
|
Top = 3180
|
|
Width = 1875
|
|
End
|
|
Begin VB.CommandButton cmdRemove
|
|
Height = 285
|
|
Left = 2400
|
|
MaskColor = &H000000FF&
|
|
Picture = "frmFX.frx":0442
|
|
Style = 1 'Graphical
|
|
TabIndex = 11
|
|
Top = 1920
|
|
UseMaskColor = -1 'True
|
|
Width = 315
|
|
End
|
|
Begin VB.CommandButton cmdAdd
|
|
Height = 285
|
|
Left = 2040
|
|
MaskColor = &H000000FF&
|
|
Picture = "frmFX.frx":0984
|
|
Style = 1 'Graphical
|
|
TabIndex = 10
|
|
Top = 1920
|
|
UseMaskColor = -1 'True
|
|
Width = 315
|
|
End
|
|
Begin VB.ListBox lstUse
|
|
Height = 840
|
|
Left = 120
|
|
TabIndex = 9
|
|
Top = 2220
|
|
Width = 4275
|
|
End
|
|
Begin VB.ListBox lstAvail
|
|
Height = 840
|
|
ItemData = "frmFX.frx":0EC6
|
|
Left = 120
|
|
List = "frmFX.frx":0EE2
|
|
TabIndex = 8
|
|
Top = 1020
|
|
Width = 4275
|
|
End
|
|
Begin VB.TextBox txtFile
|
|
Height = 285
|
|
Left = 120
|
|
Locked = -1 'True
|
|
TabIndex = 3
|
|
Text = "No file loaded..."
|
|
Top = 480
|
|
Width = 3975
|
|
End
|
|
Begin VB.CommandButton cmdBrowse
|
|
Caption = "..."
|
|
Height = 285
|
|
Left = 4140
|
|
TabIndex = 2
|
|
ToolTipText = "Open a new audio file..."
|
|
Top = 480
|
|
Width = 315
|
|
End
|
|
Begin VB.Label lbl
|
|
BackStyle = 0 'Transparent
|
|
Caption = "Available Effects"
|
|
Height = 195
|
|
Index = 3
|
|
Left = 120
|
|
TabIndex = 15
|
|
Top = 780
|
|
Width = 1215
|
|
End
|
|
Begin VB.Label lbl
|
|
BackStyle = 0 'Transparent
|
|
Caption = "Effects in use"
|
|
Height = 195
|
|
Index = 2
|
|
Left = 120
|
|
TabIndex = 14
|
|
Top = 1980
|
|
Width = 1215
|
|
End
|
|
Begin VB.Label lbl
|
|
BackStyle = 0 'Transparent
|
|
Caption = "Available Effects"
|
|
Height = 195
|
|
Index = 1
|
|
Left = 180
|
|
TabIndex = 13
|
|
Top = 600
|
|
Width = 1215
|
|
End
|
|
Begin VB.Label lbl
|
|
BackStyle = 0 'Transparent
|
|
Caption = "Currently loaded sound file:"
|
|
Height = 195
|
|
Index = 0
|
|
Left = 120
|
|
TabIndex = 4
|
|
Top = 240
|
|
Width = 4515
|
|
End
|
|
End
|
|
Begin MSComDlg.CommonDialog cdlOpen
|
|
Left = 300
|
|
Top = 3720
|
|
_ExtentX = 847
|
|
_ExtentY = 847
|
|
_Version = 393216
|
|
End
|
|
Begin VB.Label lbl
|
|
BackStyle = 0 'Transparent
|
|
Caption = "Audio Effects using Defered loading DirectSoundBuffers. This allows you to check the status of effects before playing."
|
|
Height = 615
|
|
Index = 4
|
|
Left = 660
|
|
TabIndex = 0
|
|
Top = 60
|
|
Width = 3195
|
|
End
|
|
Begin VB.Image Image1
|
|
Height = 480
|
|
Left = 120
|
|
Picture = "frmFX.frx":0F33
|
|
Top = 180
|
|
Width = 480
|
|
End
|
|
End
|
|
Attribute VB_Name = "frmEffects"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = False
|
|
Attribute VB_PredeclaredId = True
|
|
Attribute VB_Exposed = False
|
|
Option Explicit
|
|
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
'
|
|
' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
|
|
'
|
|
' File: frmFX.frm
|
|
'
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
'API declare for windows folder
|
|
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
|
|
|
|
Private Const mlMaxEffects As Long = 20
|
|
'Private declares for our DirectX objects
|
|
Private dx As DirectX8
|
|
Private ds As DirectSound8
|
|
Private dsb As DirectSoundSecondaryBuffer8
|
|
Private mlEffectKey As Long
|
|
|
|
Private Sub cmdAdd_Click()
|
|
If lstAvail.ListIndex = -1 Then 'Nothing is selected
|
|
MsgBox "Please select an available effect before attempting to add it.", vbOKOnly Or vbInformation, "Nothing selected."
|
|
Exit Sub
|
|
End If
|
|
If lstUse.ListCount >= mlMaxEffects Then
|
|
MsgBox "You cannot add more than " & CStr(mlMaxEffects) & " effects in this sample.", vbOKOnly Or vbInformation, "No more effects."
|
|
Exit Sub
|
|
End If
|
|
'Add this item to our list of effects
|
|
lstUse.AddItem lstAvail.List(lstAvail.ListIndex) & " - Unallocated"
|
|
End Sub
|
|
|
|
Private Sub cmdApply_Click()
|
|
On Local Error GoTo NoFX
|
|
Dim DSEffects() As DSEFFECTDESC
|
|
Dim lResults() As Long
|
|
Dim lTempEffect As Long
|
|
Dim lCount As Long
|
|
|
|
'Do we have a sound buffer
|
|
If dsb Is Nothing Then
|
|
MsgBox "You must first load a wave file into a sound buffer before you can apply effects to it.", vbOKOnly Or vbInformation, "No buffer"
|
|
Exit Sub
|
|
End If
|
|
'Yup, now is there a sound already playing?
|
|
If (dsb.GetStatus And DSBSTATUS_PLAYING) = DSBSTATUS_PLAYING Then
|
|
MsgBox "Stop the currently playing sound before adding effects.", vbOKOnly Or vbInformation, "Sound is playing"
|
|
Exit Sub
|
|
End If
|
|
'Yes we do, do we have effects selected?
|
|
If lstUse.ListCount = 0 Then
|
|
If MsgBox("Do you want to turn off effects for this buffer?", vbYesNo Or vbQuestion, "No effects") = vbYes Then
|
|
'Calling SetFX with a count of 0 removes the effects from the buffer
|
|
dsb.SetFX 0, DSEffects, lResults
|
|
Exit Sub
|
|
Else
|
|
MsgBox "You must first select some effects to use.", vbOKOnly Or vbInformation, "No effects"
|
|
Exit Sub
|
|
End If
|
|
End If
|
|
'Ok, let's apply our effects info here
|
|
|
|
'First get an array of effects structs the right size
|
|
ReDim DSEffects(lstUse.ListCount - 1)
|
|
ReDim lResults(lstUse.ListCount - 1)
|
|
|
|
For lCount = 0 To lstUse.ListCount - 1
|
|
Select Case Left$(LCase(lstUse.List(lCount)), InStr(lstUse.List(lCount), " ") - 1)
|
|
Case "distortion"
|
|
lTempEffect = lTempEffect + (lCount + &H10)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_DISTORTION
|
|
Case "echo"
|
|
lTempEffect = lTempEffect + (lCount + &H20)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_ECHO
|
|
Case "chorus"
|
|
lTempEffect = lTempEffect + (lCount + &H40)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_CHORUS
|
|
Case "flanger"
|
|
lTempEffect = lTempEffect + (lCount + &H80)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_FLANGER
|
|
Case "compressor"
|
|
lTempEffect = lTempEffect + (lCount + &H100)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_COMPRESSOR
|
|
Case "gargle"
|
|
lTempEffect = lTempEffect + (lCount + &H200)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_GARGLE
|
|
Case "parameq"
|
|
lTempEffect = lTempEffect + (lCount + &H400)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_PARAMEQ
|
|
Case "wavesreverb"
|
|
lTempEffect = lTempEffect + (lCount + &H800)
|
|
DSEffects(lCount).guidDSFXClass = DSFX_STANDARD_WAVES_REVERB
|
|
End Select
|
|
Next
|
|
If mlEffectKey <> lTempEffect Then 'They don't match, set the fx.
|
|
dsb.SetFX lstUse.ListCount, DSEffects, lResults
|
|
'Now we can acquire the resources needed for these effects.
|
|
dsb.AcquireResources 0, lResults
|
|
Dim sNewItem As String
|
|
For lCount = 0 To lstUse.ListCount - 1
|
|
sNewItem = Left$(lstUse.List(lCount), InStr(lstUse.List(lCount), " ") - 1)
|
|
Select Case lResults(lCount)
|
|
Case DSFXR_FAILED
|
|
lstUse.List(lCount) = sNewItem & " - Failed"
|
|
Case DSFXR_LOCHARDWARE
|
|
lstUse.List(lCount) = sNewItem & " - Hardware"
|
|
Case DSFXR_LOCSOFTWARE
|
|
lstUse.List(lCount) = sNewItem & " - Software"
|
|
Case DSFXR_UNALLOCATED
|
|
lstUse.List(lCount) = sNewItem & " - Unallocated"
|
|
Case DSFXR_UNKNOWN
|
|
lstUse.List(lCount) = sNewItem & " - Unknown"
|
|
Case DSFXR_PRESENT
|
|
lstUse.List(lCount) = sNewItem & " - Present"
|
|
End Select
|
|
Next
|
|
End If
|
|
mlEffectKey = lTempEffect
|
|
Exit Sub
|
|
|
|
NoFX:
|
|
MsgBox "This set of effects could not be set on this audio file.", vbOKOnly Or vbInformation, "Cannot set"
|
|
End Sub
|
|
|
|
Private Sub cmdBrowse_Click()
|
|
Static sCurDir As String
|
|
Dim desc As DSBUFFERDESC
|
|
|
|
'We want to open a file now
|
|
cdlOpen.flags = cdlOFNHideReadOnly Or cdlOFNFileMustExist
|
|
cdlOpen.Filter = "Wave Files (*.wav)|*.wav"
|
|
cdlOpen.FileName = vbNullString
|
|
If sCurDir = vbNullString Then
|
|
'Set the init folder to \windows\media if it exists. If not, set it to the \windows folder
|
|
Dim sWindir As String
|
|
sWindir = Space$(255)
|
|
If GetWindowsDirectory(sWindir, 255) = 0 Then
|
|
'We couldn't get the windows folder for some reason, use the c:\
|
|
cdlOpen.InitDir = "C:\"
|
|
Else
|
|
Dim sMedia As String
|
|
sWindir = Left$(sWindir, InStr(sWindir, Chr$(0)) - 1)
|
|
If Right$(sWindir, 1) = "\" Then
|
|
sMedia = sWindir & "Media"
|
|
Else
|
|
sMedia = sWindir & "\Media"
|
|
End If
|
|
'We are trying to find the windows\media directory. If it
|
|
'doesn't exist, then use the windows folder as a default
|
|
If Dir$(sMedia, vbDirectory) <> vbNullString Then
|
|
cdlOpen.InitDir = sMedia
|
|
Else
|
|
cdlOpen.InitDir = sWindir
|
|
End If
|
|
End If
|
|
Else
|
|
'No need to move folders. Stay where they picked the last file
|
|
cdlOpen.InitDir = sCurDir
|
|
End If
|
|
On Local Error GoTo ClickedCancel
|
|
cdlOpen.CancelError = True
|
|
cdlOpen.ShowOpen ' Display the Open dialog box
|
|
|
|
'Save the current information
|
|
sCurDir = GetFolder(cdlOpen.FileName)
|
|
|
|
On Local Error GoTo NoLoadSegment
|
|
'Before we load the buffer stop one if it's playing
|
|
If Not (dsb Is Nothing) Then If dsb.GetStatus = DSBSTATUS_PLAYING Then dsb.Stop
|
|
'We need to set the CTRLFX flag so we can control the effects on this object
|
|
'We pass the LOCDEFER flag so we can acquire the
|
|
'resources for the effects before we play them
|
|
desc.lFlags = DSBCAPS_CTRLFX Or DSBCAPS_LOCDEFER
|
|
'Now let's load the segment
|
|
Set dsb = ds.CreateSoundBufferFromFile(cdlOpen.FileName, desc)
|
|
mlEffectKey = 0
|
|
txtFile.Text = cdlOpen.FileName
|
|
|
|
Exit Sub
|
|
NoLoadSegment:
|
|
If Err.Number = DSERR_BUFFERTOOSMALL Then 'This buffer isn't big enough to control effects on
|
|
MsgBox "This file isn't long enough to control effects. Please choose a longer audio file.", vbOKOnly Or vbCritical, "Couldn't load"
|
|
Else 'Some other error
|
|
MsgBox "Couldn't load this file", vbOKOnly Or vbCritical, "Couldn't load"
|
|
End If
|
|
ClickedCancel:
|
|
End Sub
|
|
|
|
Private Sub cmdPlay_Click()
|
|
If dsb Is Nothing Then
|
|
MsgBox "You must first load a wave file into a sound buffer before you can play it.", vbOKOnly Or vbInformation, "No buffer"
|
|
Exit Sub
|
|
End If
|
|
dsb.Play chkLoop.Value
|
|
EnablePlayUI False
|
|
End Sub
|
|
|
|
Private Sub cmdRemove_Click()
|
|
If lstUse.ListIndex = -1 Then 'Nothing is selected
|
|
MsgBox "Please select an effect that's being used before attempting to remove it.", vbOKOnly Or vbInformation, "Nothing selected."
|
|
Exit Sub
|
|
End If
|
|
'Add this item to our list of effects
|
|
lstUse.RemoveItem lstUse.ListIndex
|
|
End Sub
|
|
|
|
Private Sub cmdSave_Click()
|
|
On Error GoTo ClickedCancel
|
|
With cdlOpen
|
|
.InitDir = GetFolder(txtFile.Text)
|
|
.FileName = txtFile.Text
|
|
.CancelError = True
|
|
.ShowSave
|
|
dsb.SaveToFile .FileName
|
|
End With
|
|
Exit Sub
|
|
|
|
ClickedCancel:
|
|
End Sub
|
|
|
|
Private Sub cmdStop_Click()
|
|
If dsb Is Nothing Then
|
|
MsgBox "You must first load a wave file into a sound buffer before you can stop it.", vbOKOnly Or vbInformation, "No buffer"
|
|
Exit Sub
|
|
End If
|
|
dsb.Stop
|
|
'Stop doesn't reset the current position
|
|
dsb.SetCurrentPosition 0
|
|
EnablePlayUI True
|
|
End Sub
|
|
|
|
Private Sub Form_Load()
|
|
EnablePlayUI True
|
|
InitDSound
|
|
End Sub
|
|
|
|
Private Sub Form_Unload(Cancel As Integer)
|
|
CleanupDSound
|
|
End Sub
|
|
|
|
Private Sub InitDSound()
|
|
|
|
On Error GoTo FailedInit
|
|
Set dx = New DirectX8
|
|
'Create our default DirectSound object
|
|
Set ds = dx.DirectSoundCreate(vbNullString)
|
|
ds.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL
|
|
Exit Sub
|
|
|
|
FailedInit:
|
|
MsgBox "Could not initialize DirectSound." & vbCrLf & "This sample will exit.", vbOKOnly Or vbInformation, "Exiting..."
|
|
Unload Me
|
|
|
|
End Sub
|
|
|
|
Private Sub CleanupDSound()
|
|
'Let's clean up now
|
|
If Not dsb Is Nothing Then
|
|
'iF we are playing our file, stop it
|
|
If dsb.GetStatus = DSBSTATUS_PLAYING Then dsb.Stop
|
|
'Destroy our objects
|
|
Set dsb = Nothing
|
|
End If
|
|
Set ds = Nothing
|
|
Set dx = Nothing
|
|
End Sub
|
|
|
|
Private Function GetFolder(ByVal sFile As String) As String
|
|
Dim lCount As Long
|
|
|
|
For lCount = Len(sFile) To 1 Step -1
|
|
If Mid$(sFile, lCount, 1) = "\" Then
|
|
GetFolder = Left$(sFile, lCount)
|
|
Exit Function
|
|
End If
|
|
Next
|
|
GetFolder = vbNullString
|
|
End Function
|
|
|
|
Private Sub lstAvail_DblClick()
|
|
'Double clicking should be the same as clicking the 'Add' button
|
|
cmdAdd_Click
|
|
End Sub
|
|
|
|
Private Sub lstUse_DblClick()
|
|
'Double clicking should be the same as clicking the 'Remove' button
|
|
cmdRemove_Click
|
|
End Sub
|
|
|
|
Private Sub EnablePlayUI(ByVal fEnable As Boolean)
|
|
On Error Resume Next
|
|
If fEnable Then
|
|
chkLoop.Enabled = True
|
|
cmdPlay.Enabled = True
|
|
cmdStop.Enabled = False
|
|
cmdBrowse.Enabled = True
|
|
cmdPlay.SetFocus
|
|
Else
|
|
chkLoop.Enabled = False
|
|
cmdPlay.Enabled = False
|
|
cmdStop.Enabled = True
|
|
cmdBrowse.Enabled = False
|
|
cmdStop.SetFocus
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub tmrUpdate_Timer()
|
|
If Not (dsb Is Nothing) Then
|
|
If (dsb.GetStatus And DSBSTATUS_PLAYING) <> DSBSTATUS_PLAYING Then
|
|
If cmdPlay.Enabled = False Then
|
|
EnablePlayUI True
|
|
End If
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
|