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>
269 lines
8.8 KiB
OpenEdge ABL
269 lines
8.8 KiB
OpenEdge ABL
VERSION 1.0 CLASS
|
|
BEGIN
|
|
MultiUse = -1 'True
|
|
Persistable = 0 'NotPersistable
|
|
DataBindingBehavior = 0 'vbNone
|
|
DataSourceBehavior = 0 'vbNone
|
|
MTSTransactionMode = 0 'NotAnMTSObject
|
|
END
|
|
Attribute VB_Name = "cPaddle"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = True
|
|
Attribute VB_PredeclaredId = False
|
|
Attribute VB_Exposed = False
|
|
Option Explicit
|
|
|
|
'Here we will encapsulate all of the code needed for the Paddle
|
|
'Local variables for the properties of the Paddle
|
|
Private moPosition As D3DVECTOR 'Current position of the Paddle
|
|
Private moVelocity As D3DVECTOR 'Current velocity of the Paddle
|
|
Private moLastPosition As D3DVECTOR 'Last position of the Paddle
|
|
Private moPaddle As CD3DFrame 'D3D Mesh for the Paddle
|
|
Private mlPaddleTime As Long 'Last time the Paddle was updated
|
|
Private mlTransparantPaddle As Boolean
|
|
Public LastVelocityTick As Long 'Last time the paddle's velocity changed
|
|
Public PaddleID As Long
|
|
|
|
'Position property
|
|
Public Property Let Position(oPos As D3DVECTOR)
|
|
moPosition = oPos
|
|
End Property
|
|
|
|
Public Property Get Position() As D3DVECTOR
|
|
Position = moPosition
|
|
End Property
|
|
|
|
'Velocity property
|
|
Public Property Let Velocity(oVel As D3DVECTOR)
|
|
moVelocity = oVel
|
|
End Property
|
|
|
|
Public Property Get Velocity() As D3DVECTOR
|
|
Velocity = moVelocity
|
|
End Property
|
|
|
|
'LastPosition prop
|
|
Public Property Let LastPosition(oLastPos As D3DVECTOR)
|
|
moLastPosition = oLastPos
|
|
End Property
|
|
|
|
Public Property Get LastPosition() As D3DVECTOR
|
|
LastPosition = moLastPosition
|
|
End Property
|
|
|
|
'Transparent property
|
|
Public Property Let Transparent(ByVal fTrans As Boolean)
|
|
Dim oMesh As CD3DMesh, oMaterial As D3DMATERIAL8
|
|
Dim lNumMaterial As Long, lCount As Long
|
|
|
|
mlTransparantPaddle = fTrans
|
|
'now set the property
|
|
Set oMesh = moPaddle.FindChildObject("paddle", 0)
|
|
lNumMaterial = oMesh.GetMaterialCount
|
|
For lCount = 0 To lNumMaterial - 1
|
|
oMaterial = oMesh.GetMaterial(lCount)
|
|
If fTrans Then
|
|
oMaterial.diffuse.a = 0.5
|
|
Else
|
|
oMaterial.diffuse.a = 1
|
|
End If
|
|
oMesh.SetMaterial lCount, oMaterial
|
|
Next
|
|
End Property
|
|
|
|
Public Property Get Transparent() As Boolean
|
|
Transparent = mlTransparantPaddle
|
|
End Property
|
|
|
|
'Methods
|
|
Public Sub Init(ByVal sMedia As String, sFile As String)
|
|
Set moPaddle = D3DUtil_LoadFromFile(AddDirSep(sMedia) & sFile, Nothing, Nothing)
|
|
End Sub
|
|
|
|
Public Sub UpdateTime()
|
|
mlPaddleTime = timeGetTime
|
|
End Sub
|
|
|
|
Public Sub UpdatePosition()
|
|
Dim RealVelocity As D3DVECTOR
|
|
|
|
'Here we will update the position of the paddle
|
|
'and move it based on the velocity assigned.
|
|
If mlPaddleTime = 0 Then mlPaddleTime = timeGetTime
|
|
'First calculate the 'real' velocity (based on the time)
|
|
RealVelocity.X = ((timeGetTime - mlPaddleTime) / 100) * moVelocity.X
|
|
RealVelocity.Y = ((timeGetTime - mlPaddleTime) / 100) * moVelocity.Y
|
|
RealVelocity.z = ((timeGetTime - mlPaddleTime) / 100) * moVelocity.z
|
|
'Let's save our current position
|
|
moLastPosition = moPosition
|
|
|
|
moPosition.X = moPosition.X + RealVelocity.X
|
|
moPosition.Y = moPosition.Y + RealVelocity.Y
|
|
moPosition.z = moPosition.z + RealVelocity.z
|
|
|
|
mlPaddleTime = timeGetTime
|
|
End Sub
|
|
|
|
Public Sub Render(dev As Direct3DDevice8)
|
|
Dim matPaddle As D3DMATRIX
|
|
|
|
D3DXMatrixIdentity matPaddle
|
|
D3DXMatrixTranslation matPaddle, moPosition.X, moPosition.Y, moPosition.z
|
|
moPaddle.SetMatrix matPaddle
|
|
moPaddle.Render dev
|
|
End Sub
|
|
|
|
Public Sub CleanupFrame()
|
|
Set moPaddle = Nothing
|
|
End Sub
|
|
|
|
Public Sub EnsureReality(oldPos As D3DVECTOR, oPuck As cPuck)
|
|
Dim vecDif As D3DVECTOR, nDistance As Single
|
|
Dim vNewVel As D3DVECTOR, nVel As Single
|
|
Dim fMovePaddle As Boolean
|
|
|
|
'We do *not* want to go 'inside' the puck, don't let it happen
|
|
D3DXVec3Subtract vecDif, oPuck.Position, moPosition
|
|
nDistance = D3DXVec3Length(vecDif)
|
|
If nDistance < (gnPuckRadius + gnPaddleRadius) Then
|
|
'Ok, we are within the puck, now who should move? The puck or the paddle?
|
|
With moPosition
|
|
fMovePaddle = False
|
|
If .z < (gnFarWallEdge + (gnPaddleRadius + gnPuckRadius)) Then
|
|
fMovePaddle = True
|
|
End If
|
|
If .z > (gnNearWallEdge - (gnPaddleRadius + gnPuckRadius)) Then
|
|
fMovePaddle = True
|
|
End If
|
|
If .X < (gnSideRightWallEdge + (gnPaddleRadius + gnPuckRadius)) Then
|
|
fMovePaddle = True
|
|
End If
|
|
If .X > (gnSideLeftWallEdge - (gnPaddleRadius + gnPuckRadius)) Then
|
|
fMovePaddle = True
|
|
End If
|
|
End With
|
|
|
|
If fMovePaddle Then
|
|
'Move the paddle back out so it's not hitting the puck
|
|
Dim vDir As D3DVECTOR, vScale As D3DVECTOR, vPaddleVel As D3DVECTOR
|
|
Dim vPaddleDif As D3DVECTOR
|
|
|
|
D3DXVec3Subtract vPaddleDif, oPuck.Position, moPosition
|
|
D3DXVec3Subtract vPaddleVel, oldPos, moPosition
|
|
'Get the direction vector by normalizing the pucks velocity
|
|
D3DXVec3Normalize vDir, vPaddleVel
|
|
'Scale the length of the two vectors, plus a little more.
|
|
D3DXVec3Scale vScale, vDir, D3DXVec3Length(vPaddleDif) '(gnPaddleRadius / 4)
|
|
'Move the paddle to it's new location
|
|
D3DXVec3Add moPosition, oldPos, vScale
|
|
'Else We can ignore the case of the puck needing to move because that will
|
|
'happen in checkcollisions call for the puck
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Public Sub DoComputerAI(oPuck As cPuck)
|
|
|
|
Dim vOldPos As D3DVECTOR
|
|
Dim nTempX As Single, nTempZ As Single
|
|
|
|
'We'll create a simplistic AI opponent
|
|
vOldPos = moPosition
|
|
'Let's just set the velocity of the paddle
|
|
moLastPosition = moPosition
|
|
With moPosition
|
|
If Abs(oPuck.Position.X > .X) Then
|
|
nTempX = Min(oPuck.Velocity.X, gnComputerMaximumVelocity)
|
|
Else
|
|
nTempX = Min(oPuck.Velocity.X, -gnComputerMaximumVelocity)
|
|
End If
|
|
If Abs(oPuck.Position.z - .z) > Abs(oPuck.LastPosition.z - .z) Then
|
|
nTempZ = gnComputerMaximumVelocity
|
|
Else
|
|
nTempZ = -gnComputerMaximumVelocity
|
|
End If
|
|
End With
|
|
moVelocity = vec3(nTempX, 0, nTempZ)
|
|
'If the puck is in *front* of the paddle, just move the paddle directly backwards
|
|
If moPosition.z < oPuck.Position.z Then
|
|
moVelocity = vec3(0, 0, gnComputerMaximumVelocity)
|
|
End If
|
|
UpdatePosition
|
|
EnsureReality vOldPos, oPuck
|
|
|
|
With moPosition
|
|
nTempX = .X
|
|
nTempZ = .z
|
|
If PaddleID = 0 Then
|
|
If nTempZ > -(gnPaddleRadius * 1.5) Then
|
|
nTempZ = -(gnPaddleRadius * 1.5)
|
|
ElseIf nTempZ < (gnFarWallEdge + (gnPaddleRadius)) Then
|
|
nTempZ = (gnFarWallEdge + (gnPaddleRadius))
|
|
End If
|
|
Else
|
|
If nTempZ > (gnNearWallEdge - (gnPaddleRadius)) Then
|
|
nTempZ = (gnNearWallEdge - (gnPaddleRadius))
|
|
ElseIf nTempZ < (gnPaddleRadius * 1.5) Then
|
|
nTempZ = (gnPaddleRadius * 1.5)
|
|
End If
|
|
End If
|
|
If nTempX < (gnSideRightWallEdge + (gnPaddleRadius)) Then
|
|
nTempX = (gnSideRightWallEdge + (gnPaddleRadius))
|
|
End If
|
|
If nTempX > (gnSideLeftWallEdge - (gnPaddleRadius)) Then
|
|
nTempX = (gnSideLeftWallEdge - (gnPaddleRadius))
|
|
End If
|
|
moPosition = vec3(nTempX, moPosition.Y, nTempZ)
|
|
End With
|
|
End Sub
|
|
|
|
Public Function FadeMesh(FadeInterval As Single) As Boolean
|
|
Dim lNumMaterial As Long
|
|
Dim lCount As Long
|
|
Dim oMaterial As D3DMATERIAL8
|
|
Dim fDoneFading As Boolean
|
|
Dim oMesh As CD3DMesh
|
|
Dim nInternalInterval As Single
|
|
Static lFadeTime As Long
|
|
|
|
nInternalInterval = FadeInterval
|
|
If lFadeTime = 0 Then
|
|
lFadeTime = timeGetTime
|
|
Exit Function 'We'll do the fade next render pass
|
|
End If
|
|
nInternalInterval = (((timeGetTime - lFadeTime) / 1000000) * nInternalInterval)
|
|
|
|
Set oMesh = moPaddle.FindChildObject("paddle", 0)
|
|
fDoneFading = True
|
|
lNumMaterial = oMesh.GetMaterialCount
|
|
For lCount = 0 To lNumMaterial - 1
|
|
oMaterial = oMesh.GetMaterial(lCount)
|
|
If nInternalInterval > 0 And oMaterial.diffuse.a <= 1 Then
|
|
oMaterial.diffuse.a = oMaterial.diffuse.a + nInternalInterval
|
|
fDoneFading = False
|
|
ElseIf nInternalInterval < 0 And oMaterial.diffuse.a >= -1 Then
|
|
oMaterial.diffuse.a = oMaterial.diffuse.a + nInternalInterval
|
|
fDoneFading = False
|
|
End If
|
|
oMesh.SetMaterial lCount, oMaterial
|
|
Next
|
|
FadeMesh = fDoneFading
|
|
End Function
|
|
|
|
Private Sub Class_Initialize()
|
|
Set moPaddle = Nothing
|
|
End Sub
|
|
|
|
Private Sub Class_Terminate()
|
|
Set moPaddle = Nothing
|
|
End Sub
|
|
|
|
Private Function Min(ByVal nVal As Single, nVal2 As Single) As Single
|
|
If Abs(nVal) < Abs(nVal2) Then
|
|
Min = nVal
|
|
Else
|
|
Min = nVal2
|
|
End If
|
|
End Function
|
|
|