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>
265 lines
10 KiB
QBasic
265 lines
10 KiB
QBasic
Attribute VB_Name = "modD3D"
|
|
Option Explicit
|
|
|
|
Public dx As New DirectX8
|
|
|
|
Public gfDrawRoomText As Boolean
|
|
Public glScreenWidth As Long
|
|
Public glScreenHeight As Long
|
|
|
|
'Extra misc vars
|
|
Public gfWireFrame As Boolean
|
|
|
|
Public Sub Render()
|
|
|
|
Dim lCount As Long
|
|
|
|
On Error Resume Next
|
|
If g_dev Is Nothing Then Exit Sub
|
|
|
|
' Clear the backbuffer to a black color
|
|
g_dev.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H0&, 1#, 0
|
|
|
|
' Setup the world, view, and projection matrices
|
|
SetupMatrices
|
|
|
|
' Begin the scene
|
|
g_dev.BeginScene
|
|
|
|
'Draw everything in either a solid fillmode, or wireframe
|
|
If gfWireFrame Then
|
|
g_dev.SetRenderState D3DRS_FILLMODE, D3DFILL_WIREFRAME
|
|
Else
|
|
g_dev.SetRenderState D3DRS_FILLMODE, D3DFILL_SOLID
|
|
End If
|
|
|
|
'Render the room
|
|
goRoom.Render g_dev
|
|
|
|
'Render the table
|
|
goTable.Render g_dev
|
|
|
|
'Now Paddle (0)
|
|
goPaddle(0).Render g_dev
|
|
|
|
'Now Paddle (1)
|
|
goPaddle(1).Render g_dev
|
|
|
|
'And finally the puck
|
|
goPuck.Render g_dev
|
|
'Now lets draw whatever text we need
|
|
|
|
'We can draw text (don't draw text if we're currently fading)
|
|
If Not goFade.AmFading Then
|
|
goTextLittle.BeginText
|
|
If gfGameCanBeStarted Then
|
|
'If the game can be started, then draw the scores at the top of the screen
|
|
If gfMultiplayer Then
|
|
If glMyPaddleID = 0 Then
|
|
goTextLittle.DrawText gsUserName & ":" & glPlayerScore(0), 10, 5, &HFFFFFF00
|
|
Else
|
|
goTextLittle.DrawText "Opponent:" & glPlayerScore(0), 10, 5, &HFFFFFFFF
|
|
End If
|
|
If glMyPaddleID = 1 Then
|
|
goTextLittle.DrawText gsUserName & ":" & glPlayerScore(1), glScreenWidth - 75, 5, &HFFFFFF00
|
|
Else
|
|
goTextLittle.DrawText "Opponent:" & glPlayerScore(1), glScreenWidth - 75, 5, &HFFFFFFFF
|
|
End If
|
|
Else
|
|
goTextLittle.DrawText "Player:" & glPlayerScore(0), 10, 5, &HFFFFFF00
|
|
goTextLittle.DrawText "Computer:" & glPlayerScore(1), glScreenWidth - 75, 5, &HFFFFFFFF
|
|
End If
|
|
Else
|
|
'The game can't be started yet (only in multiplayer) Let the host know
|
|
goTextLittle.DrawText "Waiting for the game to be started...", (glScreenWidth / 2) - 50, 5, &HFFFFFFFF
|
|
End If
|
|
'Here is a little helper text letting the user know to press Space
|
|
'to launch the puck (will show up after 3 seconds, and stay on for 10 seconds)
|
|
If (timeGetTime - glTimePuckScored > glDefaultDelayTime) And gfScored And Not gfGameOver And ((timeGetTime - glTimePuckScored < glDefaultDelayTimeGone + glDefaultDelayTime)) Then
|
|
goPuck.DefaultStartPosition
|
|
goPuck.Spinning = True
|
|
goTextLittle.DrawText "Press <Space> to launch puck...", (glScreenWidth / 2) - 50, 25, &HFF0000FF
|
|
End If
|
|
|
|
'Here is a little helper text letting the user know to press F1
|
|
'to turn of the room (will show up after 3 seconds, and stay on for 10 seconds)
|
|
If (gfDrawRoomText And goRoom.DrawRoom) And (timeGetTime - glTimeNoRoom < glDefaultDelayTimeGone) Then
|
|
goPuck.DefaultStartPosition
|
|
goPuck.Spinning = True
|
|
goTextLittle.DrawText "You can press F1 to turn off the drawing " & vbCrLf & " of the room, which will increase performance.", -15, glScreenHeight - 50, &HFFFF00FF
|
|
End If
|
|
If gfGameOver And ((timeGetTime - glTimeGameOver) > glDefaultDelayTime) And ((timeGetTime - glTimeGameOver < glDefaultDelayTimeGone + glDefaultDelayTime)) Then
|
|
goTextLittle.DrawText "Press F3 to restart...", (glScreenWidth / 2) - 50, 25, &HFF0000FF
|
|
End If
|
|
goTextLittle.EndText
|
|
goTextBig.BeginText
|
|
If gfGameOver Then
|
|
If gfMultiplayer Then
|
|
If glPlayerScore(glMyPaddleID) > glPlayerScore(Abs(glMyPaddleID - 1)) Then
|
|
goTextBig.DrawText "Game over!!" & vbCrLf & "You win!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
|
|
Else
|
|
goTextBig.DrawText "Game over!!" & vbCrLf & "You lose!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
|
|
End If
|
|
Else
|
|
If glPlayerScore(0) > glPlayerScore(1) Then
|
|
goTextBig.DrawText "Game over!!" & vbCrLf & "You win!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
|
|
Else
|
|
goTextBig.DrawText "Game over!!" & vbCrLf & "You lose!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
|
|
End If
|
|
End If
|
|
End If
|
|
If gfMultiplayer And gfNoSendData Then 'We've been disconnected sometime, notify the user
|
|
goTextBig.DrawText "The connection with the other" & vbCrLf & "system was lost.", 5, (glScreenHeight / 2) - (glScreenHeight / 4), &HFFFFFF00
|
|
End If
|
|
goTextBig.EndText
|
|
End If
|
|
' End the scene
|
|
g_dev.EndScene
|
|
' Present the backbuffer contents to the front buffer (screen)
|
|
D3DUtil_PresentAll 0
|
|
|
|
End Sub
|
|
|
|
Public Sub SetupMatrices()
|
|
|
|
Dim matView As D3DMATRIX
|
|
|
|
D3DXMatrixLookAtLH matView, goCamera.Position, vec3(0#, 0#, 0#), vec3(0#, 1#, 0#)
|
|
g_dev.SetTransform D3DTS_VIEW, matView
|
|
|
|
Dim matProj As D3DMATRIX
|
|
D3DXMatrixPerspectiveFovLH matProj, g_pi / 4, 1, 1, 110
|
|
g_dev.SetTransform D3DTS_PROJECTION, matProj
|
|
|
|
End Sub
|
|
|
|
Public Sub RestoreDeviceObjects()
|
|
|
|
' Set miscellaneous render states
|
|
With g_dev
|
|
' Set world transform
|
|
Dim matWorld As D3DMATRIX
|
|
D3DXMatrixIdentity matWorld
|
|
.SetTransform D3DTS_WORLD, matWorld
|
|
' Set the projection matrix
|
|
Dim matProj As D3DMATRIX
|
|
Dim fAspect As Single
|
|
fAspect = 1
|
|
D3DXMatrixPerspectiveFovLH matProj, g_pi / 3, fAspect, 1, 1000
|
|
.SetTransform D3DTS_PROJECTION, matProj
|
|
|
|
.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
|
|
.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE
|
|
.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
|
|
.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR
|
|
.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
|
|
.SetTextureStageState 1, D3DTSS_MINFILTER, D3DTEXF_LINEAR
|
|
.SetTextureStageState 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
|
|
|
|
' Set default render states
|
|
.SetRenderState D3DRS_DITHERENABLE, 1 'True
|
|
.SetRenderState D3DRS_SPECULARENABLE, 0 'False
|
|
.SetRenderState D3DRS_ZENABLE, 1 'True
|
|
.SetRenderState D3DRS_NORMALIZENORMALS, 1 'True
|
|
|
|
End With
|
|
|
|
Set goTextBig = Nothing
|
|
Set goTextLittle = Nothing
|
|
|
|
'Now create a new text object
|
|
Set goTextLittle = New cText
|
|
goTextLittle.InitText g_d3dx, g_dev, "Times New Roman", 8, True
|
|
Set goTextBig = New cText
|
|
goTextBig.InitText g_d3dx, g_dev, "Times New Roman", 18, True
|
|
|
|
End Sub
|
|
|
|
Public Sub InitDefaultLights(Optional ByVal lNumLights As Long = 2, Optional ByVal fFullAmbiantOnly As Boolean = False)
|
|
With g_dev
|
|
' Set ambient light
|
|
.SetRenderState D3DRS_AMBIENT, &HFFFFFFFF
|
|
goFade.AmbientColor = &HFFFFFFFF
|
|
goFade.MaxAmbientColor = goFade.AmbientColor
|
|
If fFullAmbiantOnly Then Exit Sub
|
|
If lNumLights < 1 Then Exit Sub 'Nothing to do
|
|
|
|
' Set ambient light
|
|
'We will slowly lower the ambient light as each new light gets added
|
|
.SetRenderState D3DRS_AMBIENT, &HFFBBBBBB
|
|
goFade.AmbientColor = &HFFBBBBBB
|
|
' Turn on lighting
|
|
.SetRenderState D3DRS_LIGHTING, 1
|
|
|
|
'Turn on two lights one on each end of the table
|
|
Dim light As D3DLIGHT8
|
|
|
|
If lNumLights > 0 Then
|
|
With light
|
|
.Type = D3DLIGHT_DIRECTIONAL
|
|
.diffuse.r = 0
|
|
.diffuse.g = 0
|
|
.diffuse.b = 0
|
|
.Direction.x = 0
|
|
.Direction.y = -10
|
|
.Direction.z = 0
|
|
.Range = 100000#
|
|
.Position.x = 0
|
|
.Position.y = 3
|
|
.Position.z = 0
|
|
End With
|
|
goFade.LightColor(0) = light
|
|
|
|
.SetLight 0, light 'let d3d know about the light
|
|
.LightEnable 0, 1 'turn it on
|
|
goFade.NumLight = 0
|
|
End If
|
|
|
|
|
|
If lNumLights > 1 Then
|
|
.SetRenderState D3DRS_AMBIENT, &HFFAAAAAA
|
|
goFade.AmbientColor = &HFFAAAAAA
|
|
'Now turn on the second light if we can
|
|
With light
|
|
.Type = D3DLIGHT_DIRECTIONAL
|
|
.Direction.x = 15
|
|
.Direction.y = -10
|
|
.Direction.z = -15
|
|
.Range = 1000#
|
|
.Position.x = -15
|
|
.Position.y = 10
|
|
.Position.z = 15
|
|
End With
|
|
goFade.LightColor(1) = light
|
|
|
|
.SetLight 1, light 'let d3d know about the light
|
|
.LightEnable 1, 1 'turn it on
|
|
goFade.NumLight = 1
|
|
End If
|
|
|
|
|
|
If lNumLights > 3 Then
|
|
.SetRenderState D3DRS_AMBIENT, 0
|
|
goFade.AmbientColor = 0
|
|
'Now turn on the third light if we can
|
|
With light
|
|
.Type = D3DLIGHT_DIRECTIONAL
|
|
.Direction.x = -15
|
|
.Direction.y = 10
|
|
.Direction.z = 15
|
|
.Range = 1000#
|
|
.Position.x = 15
|
|
.Position.y = -10
|
|
.Position.z = -15
|
|
End With
|
|
goFade.LightColor(2) = light
|
|
|
|
.SetLight 2, light 'let d3d know about the light
|
|
.LightEnable 2, 1 'turn it on
|
|
goFade.NumLight = 2
|
|
End If
|
|
End With
|
|
goFade.MaxAmbientColor = goFade.AmbientColor
|
|
|
|
End Sub
|