Sub RenderScreen(ByVal tilex As Integer, ByVal tiley As Integer, ByVal PixelOffsetX As Integer, ByVal PixelOffsetY As Integer)
'**************************************************************
'Author: Aaron Perkins
'Last Modify Date: 8/14/2007
'Last modified by: Juan Martín Sotuyo Dodero (Maraxus)
'Renders everything to the viewport
'**************************************************************
Dim Y As Long 'Keeps track of where on map we are
Dim X As Long 'Keeps track of where on map we are
Dim screenminY As Integer 'Start Y pos on current screen
Dim screenmaxY As Integer 'End Y pos on current screen
Dim screenminX As Integer 'Start X pos on current screen
Dim screenmaxX As Integer 'End X pos on current screen
Dim minY As Integer 'Start Y pos on current map
Dim maxY As Integer 'End Y pos on current map
Dim minX As Integer 'Start X pos on current map
Dim maxX As Integer 'End X pos on current map
Dim ScreenX As Integer 'Keeps track of where to place tile on screen
Dim ScreenY As Integer 'Keeps track of where to place tile on screen
Dim minXOffset As Integer
Dim minYOffset As Integer
Dim PixelOffsetXTemp As Integer 'For centering grhs
Dim PixelOffsetYTemp As Integer 'For centering grhs
Dim ElapsedTime As Single
Dim Techos(0 To 3) As Long
ElapsedTime = Engine_ElapsedTime()
'Figure out Ends and Starts of screen
screenminY = tiley - HalfWindowTileHeight
screenmaxY = tiley + HalfWindowTileHeight
screenminX = tilex - HalfWindowTileWidth
screenmaxX = tilex + HalfWindowTileWidth
minY = screenminY - TileBufferSize
maxY = screenmaxY + TileBufferSize
minX = screenminX - TileBufferSize
maxX = screenmaxX + TileBufferSize
'Make sure mins and maxs are allways in map bounds
If minY < XMinMapSize Then
minYOffset = YMinMapSize - minY
minY = YMinMapSize
End If
If maxY > YMaxMapSize Then maxY = YMaxMapSize
If minX < XMinMapSize Then
minXOffset = XMinMapSize - minX
minX = XMinMapSize
End If
If maxX > XMaxMapSize Then maxX = XMaxMapSize
'If we can, we render around the view area to make it smoother
If screenminY > YMinMapSize Then
screenminY = screenminY - 1
Else
screenminY = 1
ScreenY = 1
End If
If screenmaxY < YMaxMapSize Then screenmaxY = screenmaxY + 1
If screenminX > XMinMapSize Then
screenminX = screenminX - 1
Else
screenminX = 1
ScreenX = 1
End If
'If screenminY < 1 Then screenminY = 1
'If screenminX < 1 Then screenminX = 1
'If screenmaxY > 100 Then screenmaxY = 100
'If screenmaxX > 100 Then screenmaxX = 100
'If minY < 1 Then minY = 1
'If minX < 1 Then minX = 1
'If maxY > 100 Then maxY = 100
'If maxX > 100 Then maxX = 100
If screenmaxX < XMaxMapSize Then screenmaxX = screenmaxX + 1
RoofAlphaCalculate Techos
ParticleOffsetX = (Engine_PixelPosX(screenminX) - PixelOffsetX)
ParticleOffsetY = (Engine_PixelPosY(screenminY) - PixelOffsetY)
'<----- Layer 1, 2 ----->
For Y = screenminY To screenmaxY
For X = screenminX To screenmaxX
If Map_InBounds(X, Y) Then
'Layer 1
Call Draw_Grh(MapData(X, Y).Graphic(1), _
(ScreenX - 1) * 32 + PixelOffsetX, _
(ScreenY - 1) * 32 + PixelOffsetY, _
0, MapData(X, Y).light_value(), 1, X, Y)
'Layer 2
If MapData(X, Y).Graphic(2).GrhIndex <> 0 Then
Call Draw_Grh(MapData(X, Y).Graphic(2), _
(ScreenX - 1) * 32 + PixelOffsetX, _
(ScreenY - 1) * 32 + PixelOffsetY, _
0, MapData(X, Y).light_value(), 0, X, Y)
End If
End If
ScreenX = ScreenX + 1
Next X
ScreenX = ScreenX - X + screenminX
ScreenY = ScreenY + 1
Next Y
'<----- Layer Obj, Char, 3 ----->
ScreenY = minYOffset - TileBufferSize
For Y = minY To maxY
ScreenX = minXOffset - TileBufferSize
For X = minX To maxX
PixelOffsetXTemp = ScreenX * 32 + PixelOffsetX
PixelOffsetYTemp = ScreenY * 32 + PixelOffsetY
If Map_InBounds(X, Y) Then
With MapData(X, Y)
'Object Layer
If .ObjGrh.GrhIndex <> 0 Then
Call Draw_Grh(.ObjGrh, PixelOffsetXTemp, PixelOffsetYTemp, 1, MapData(X, Y).light_value(), 1, X, Y)
End If
'Char layer
If .CharIndex <> 0 Then
Call CharRender(.CharIndex, PixelOffsetXTemp, PixelOffsetYTemp)
End If
'Layer 3
If .Graphic(3).GrhIndex <> 0 Then
If .Graphic(3).GrhIndex = 735 Or .Graphic(3).GrhIndex >= 6994 And .Graphic(3).GrhIndex <= 7002 Then
If Abs(UserPos.X - X) < 4 And (Abs(UserPos.Y - Y)) < 4 Then
Call Draw_Grh(.Graphic(3), PixelOffsetXTemp, PixelOffsetYTemp, 1, MapData(X, Y).light_value(), 1, X, Y, True)
Else 'NORMAL
Call Draw_Grh(.Graphic(3), PixelOffsetXTemp, PixelOffsetYTemp, 1, MapData(X, Y).light_value(), 1, X, Y)
End If
Else 'NORMAL
Call Draw_Grh(.Graphic(3), PixelOffsetXTemp, PixelOffsetYTemp, 1, MapData(X, Y).light_value(), 1, X, Y)
End If
End If
End With
End If
ScreenX = ScreenX + 1
Next X
ScreenY = ScreenY + 1
Next Y
'<----- Layer 4 ----->
ScreenY = minYOffset - TileBufferSize
For Y = minY To maxY
ScreenX = minXOffset - TileBufferSize
For X = minX To maxX
If Map_InBounds(X, Y) Then
'If Abs(MouseTileX - X) < 1 And (Abs(MouseTileY - Y)) < 1 And Settings.NombreItems And MapData(X, Y).OBJInfo.Name <> "" Then
'Engine_Draw_Box ScreenX * 32 + PixelOffsetX, ScreenY * 32 + PixelOffsetY, Fonts_Render_String_Width(MapData(X, Y).OBJInfo.Name, Settings.Engine_Font) + 1, Fuentes(Settings.Engine_Font).CharactersHeight, D3DColorARGB(100, 0, 0, 0)
'Fonts_Render_String MapData(X, Y).OBJInfo.Name, ScreenX * 32 + PixelOffsetX, ScreenY * 32 + PixelOffsetY, D3DColorARGB(100, 255, 255, 255), Settings.Engine_Font
'End If
'Layer 4
If Not bTecho Then
If MapData(X, Y).Graphic(4).GrhIndex Then
Call Draw_Grh(MapData(X, Y).Graphic(4), _
ScreenX * 32 + PixelOffsetX, _
ScreenY * 32 + PixelOffsetY, _
1, Techos, 1, X, Y)
End If
Else
If MapData(X, Y).Graphic(4).GrhIndex Then
Call Draw_Grh(MapData(X, Y).Graphic(4), _
ScreenX * 32 + PixelOffsetX, _
ScreenY * 32 + PixelOffsetY, _
1, Techos, 1, X, Y)
End If
End If
End If
ScreenX = ScreenX + 1
Next X
ScreenY = ScreenY + 1
Next Y
'Weather Update & Render
Call Engine_Weather_Update
'Effects Update
Call Effect_UpdateAll
If ClientSetup.ProyectileEngine = True Then
Dim J As Integer
If LastProjectile > 0 Then
For J = 1 To LastProjectile
If ProjectileList(J).Grh.GrhIndex Then
Dim Angle As Single
'Update the position
Angle = DegreeToRadian * Engine_GetAngle(ProjectileList(J).X, ProjectileList(J).Y, ProjectileList(J).tX, ProjectileList(J).tY)
ProjectileList(J).X = ProjectileList(J).X + (Sin(Angle) * ElapsedTime * 0.63)
ProjectileList(J).Y = ProjectileList(J).Y - (Cos(Angle) * ElapsedTime * 0.63)
'Update the rotation
If ProjectileList(J).RotateSpeed > 0 Then
ProjectileList(J).Rotate = ProjectileList(J).Rotate + (ProjectileList(J).RotateSpeed * ElapsedTime * 0.01)
Do While ProjectileList(J).Rotate > 360
ProjectileList(J).Rotate = ProjectileList(J).Rotate - 360
Loop
End If
'Draw if within range
X = ((-minX - 1) * 32) + ProjectileList(J).X + PixelOffsetX + ((10 - TileBufferSize) * 32) - 288 + ProjectileList(J).OffsetX
Y = ((-minY - 1) * 32) + ProjectileList(J).Y + PixelOffsetY + ((10 - TileBufferSize) * 32) - 288 + ProjectileList(J).OffsetY
If Y >= -32 Then
If Y <= (ScreenHeight + 32) Then
If X >= -32 Then
If X <= (ScreenWidth + 32) Then
If ProjectileList(J).Rotate = 0 Then
Draw_Grh ProjectileList(J).Grh, X, Y, 0, MapData(50, 50).light_value(), 0, 50, 50, True, 0
Else
Draw_Grh ProjectileList(J).Grh, X, Y, 0, MapData(50, 50).light_value(), 0, 50, 50, True, ProjectileList(J).Rotate
End If
End If
End If
End If
End If
End If
Next J
'Check if it is close enough to the target to remove
For J = 1 To LastProjectile
If ProjectileList(J).Grh.GrhIndex Then
If Abs(ProjectileList(J).X - ProjectileList(J).tX) < 20 Then
If Abs(ProjectileList(J).Y - ProjectileList(J).tY) < 20 Then
Engine_Projectile_Erase J
End If
End If
End If
Next J
End If
End If
' Set Offsets
LastOffsetX = ParticleOffsetX
LastOffsetY = ParticleOffsetY
If ClientSetup.PartyMembers Then Call Draw_Party_Members
Call RenderCount
If MostrarFPS = True Then
Call MostrarFPSS
End If
End Sub