2016-09-19 03:26:44 +02:00
Public Class OverworldCamera
2016-09-07 18:50:38 +02:00
Inherits Camera
#Region "Fields"
Public oldX , oldY As Single
Private _thirdPerson As Boolean = False
2019-01-13 18:06:43 +01:00
Public _canToggleThirdPerson As Boolean = True
2016-09-07 18:50:38 +02:00
Private _playerFacing As Integer = 0 'relative to the world, 0 means the player faces north, the camera might face in a different direction.
Private _freeCameraMode As Boolean = False
Private _cPosition As Vector3 = Vector3 . Zero 'Actual camera position.
Private _isFixed As Boolean = False
Private _aimDirection As Integer = - 1 'The direction the camera is aiming to face.
2021-10-13 20:18:26 +02:00
Public _debugWalk As Boolean
2016-09-07 18:50:38 +02:00
Private _bobbingTemp As Single = 0F
Private _tempDirectionPressed As Integer = - 1
Private _tempAmountOfSteps As Integer = 0 'Temp value to store what amount of steps have been walked.
Private _waitForThirdPersonTurning As Integer = 0
Private _notPressedThirdPersonDirectionButton As Integer = 0
Private _scrollSpeed As Single = 0F
Private _scrollDirection As Integer = 1
2022-06-11 15:01:16 +02:00
Public _moved As Single = 0F
2022-09-29 21:27:44 +02:00
Public PreventMovement As Boolean = False
2016-09-07 18:50:38 +02:00
Public LastStepPosition As Vector3 = New Vector3 ( 0 , - 2 , 0 )
Public YawLocked As Boolean = False
Public ThirdPersonOffset As Vector3 = New Vector3 ( 0F , 0 . 3F , 1 . 5F )
2022-09-16 17:56:30 +02:00
Public IsSliding As Boolean = False
2016-09-07 18:50:38 +02:00
2019-01-11 19:58:43 +01:00
'Debug variables
Public oldDate As Date = Date . Now
2016-09-07 18:50:38 +02:00
#End Region
#Region "Properties"
''' <summary>
''' Usually true, but if the player walks against an entitity that forces him to move up, set this to false so that the visual/audio feedback of walking against something don't appear.
''' </summary>
Public Property DidWalkAgainst ( ) As Boolean
Get
Return _didWalkAgainst
End Get
Set ( value As Boolean )
_didWalkAgainst = value
End Set
End Property
Public Overrides ReadOnly Property IsMoving ( ) As Boolean
Get
Return _moved > 0F
End Get
End Property
Public ReadOnly Property FreeCameraMode ( ) As Boolean
Get
Return _freeCameraMode
End Get
End Property
Public ReadOnly Property ThirdPerson ( ) As Boolean
Get
Return _thirdPerson
End Get
End Property
2017-08-04 10:29:56 +02:00
Public Overrides ReadOnly Property CPosition ( ) As Vector3
2016-09-07 18:50:38 +02:00
Get
Return _cPosition
End Get
End Property
Public Property Fixed ( ) As Boolean
Get
Return _isFixed
End Get
Set ( value As Boolean )
_isFixed = value
End Set
End Property
#End Region
#Region "CameraFocus"
Public Enum CameraFocusTypes
Player
NPC
Entity
End Enum
Private _cameraFocusType As CameraFocusTypes = CameraFocusTypes . Player
Private _cameraFocusID As Integer = - 1 'For NPC: NPCID; For Entity: EntityID
Public Property CameraFocusType ( ) As CameraFocusTypes
Get
Return _cameraFocusType
End Get
Set ( value As CameraFocusTypes )
_cameraFocusType = value
If _thirdPerson = True Then
SetThirdPerson ( True , False )
UpdateThirdPersonCamera ( )
End If
End Set
End Property
Public Property CameraFocusID ( ) As Integer
Get
Return _cameraFocusID
End Get
Set ( value As Integer )
_cameraFocusID = value
If _thirdPerson = True Then
SetThirdPerson ( True , False )
UpdateThirdPersonCamera ( )
End If
End Set
End Property
Public Sub SetupFocus ( ByVal FocusType As CameraFocusTypes , ByVal ID As Integer )
_cameraFocusType = FocusType
_cameraFocusID = ID
If _thirdPerson = True Then
SetThirdPerson ( True , False )
UpdateThirdPersonCamera ( )
End If
End Sub
#End Region
''' <summary>
''' If the camera is pointing straight north, east, south or west.
''' </summary>
Public Function IsPointingToNormalDirection ( ) As Boolean
Return ( Yaw = 0F Or Yaw = MathHelper . Pi * 0 . 5F Or Yaw = MathHelper . Pi Or Yaw = MathHelper . Pi * 1 . 5F )
End Function
Public Sub SetAimDirection ( ByVal direction As Integer )
_aimDirection = direction
End Sub
Public Sub New ( )
MyBase . New ( " Overworld " )
Position = Core . Player . startPosition
_thirdPerson = Core . Player . startThirdPerson
RotationSpeed = CSng ( Core . Player . startRotationSpeed / 10000 )
FOV = Core . Player . startFOV
Yaw = Core . Player . startRotation
_freeCameraMode = Core . Player . startFreeCameraMode
Pitch = 0 . 0F
CreateProjectionMatrix ( )
UpdateViewMatrix ( )
UpdateFrustum ( )
End Sub
Private Sub CreateProjectionMatrix ( )
Projection = Matrix . CreatePerspectiveFieldOfView ( MathHelper . ToRadians ( FOV ) , GraphicsDevice . Viewport . AspectRatio , 0 . 01 , FarPlane )
End Sub
#Region "Update"
Public Overrides Sub Update ( )
2021-10-13 20:18:26 +02:00
2022-06-06 13:51:51 +02:00
If GameController . IS_DEBUG_ACTIVE = True Or Core . Player . SandBoxMode = True Then
If KeyBoardHandler . KeyPressed ( KeyBindings . DebugWalkKey ) = True Then
_debugWalk = Not _debugWalk
End If
2021-10-13 20:18:26 +02:00
End If
If KeyBoardHandler . KeyPressed ( KeyBindings . RunKey ) = True Or ControllerHandler . ButtonPressed ( Buttons . B ) = True Then
If Screen . Level . Riding = False And Screen . Level . Surfing = False And Core . Player . Inventory . HasRunningShoes = True Then
Core . Player . RunToggled = Not Core . Player . RunToggled
End If
End If
2016-09-07 18:50:38 +02:00
Ray = CreateRay ( )
PlayerMovement ( )
ScrollThirdPersonCamera ( )
LockCamera ( )
CheckEntities ( )
AimCamera ( )
ControlCamera ( )
UpdateThirdPersonCamera ( )
SetSpeed ( )
ControlThirdPersonCamera ( )
UpdateViewMatrix ( )
UpdateFrustum ( )
ResetCursor ( )
End Sub
'Control camera with the cursor:
Private Sub ControlCamera ( )
Dim mState As MouseState = Mouse . GetState ( )
Dim gState As GamePadState = GamePad . GetState ( PlayerIndex . One )
2019-01-11 19:58:43 +01:00
Dim text As String = " "
2016-09-07 18:50:38 +02:00
Dim dx As Single = mState . X - oldX
If gState . ThumbSticks . Right . X <> 0 . 0F And Core . GameOptions . GamePadEnabled = True Then
dx = gState . ThumbSticks . Right . X * 50 . 0F
End If
Dim dy As Single = mState . Y - oldY
If gState . ThumbSticks . Right . Y <> 0 . 0F And Core . GameOptions . GamePadEnabled = True Then
2022-11-01 17:37:38 +01:00
dy = gState . ThumbSticks . Right . Y * 35 . 0F * - 1 . 0F
2016-09-07 18:50:38 +02:00
End If
2019-01-11 19:58:43 +01:00
If _isFixed = False AndAlso ( dx <> 0 OrElse dy <> 0 ) Then
2016-09-07 18:50:38 +02:00
If CurrentScreen . Identification = Screen . Identifications . OverworldScreen Then
Dim OS As OverworldScreen = CType ( CurrentScreen , OverworldScreen )
If _freeCameraMode = True And OS . ActionScript . IsReady = True Then
If YawLocked = False Then
Yaw += - RotationSpeed * 0 . 75F * dx
End If
End If
End If
Pitch += - RotationSpeed * dy
2019-01-11 19:58:43 +01:00
'text = " (Moving)"
2016-09-07 18:50:38 +02:00
End If
2019-01-11 19:58:43 +01:00
'Dim interval As TimeSpan
'interval = Date.Now - oldDate
'Logger.Debug("ControlCamera: " & interval.Milliseconds.ToString & " ms" & text)
'oldDate = Date.Now
2016-09-07 18:50:38 +02:00
ClampYaw ( )
ClampPitch ( )
End Sub
Private Sub LockCamera ( )
If CurrentScreen . Identification = Screen . Identifications . OverworldScreen Then
Dim OS As OverworldScreen = CType ( CurrentScreen , OverworldScreen )
If OS . ActionScript . IsReady = True Then
If ( KeyBoardHandler . KeyPressed ( KeyBindings . CameraLockKey ) = True Or ControllerHandler . ButtonPressed ( Buttons . RightStick ) ) = True And _moved = 0 . 0F And YawLocked = False Then
_freeCameraMode = Not _freeCameraMode
If _freeCameraMode = False Then
Core . GameMessage . ShowMessage ( Localization . GetString ( " game_message_free_camera_off " ) , 12 , FontManager . MainFont , Color . White )
Else
Core . GameMessage . ShowMessage ( Localization . GetString ( " game_message_free_camera_on " ) , 12 , FontManager . MainFont , Color . White )
End If
End If
End If
End If
End Sub
Private Sub ScrollThirdPersonCamera ( )
If _isFixed = False Then
If Controls . Down ( True , False , True , False , False , False ) = True Then
If _scrollSpeed = 0 . 0F Or _scrollDirection <> 1 Then
_scrollSpeed = 0 . 01F
End If
_scrollDirection = 1
_scrollSpeed += _scrollSpeed . Clamp ( 0 , 0 . 01 )
End If
2022-11-01 17:37:38 +01:00
If ControllerHandler . ButtonDown ( Buttons . LeftTrigger ) = True Then
If _scrollSpeed = 0 . 0F Or _scrollDirection <> 1 Then
_scrollSpeed = 0 . 002F
End If
2016-09-07 18:50:38 +02:00
2022-11-01 17:37:38 +01:00
_scrollDirection = 1
_scrollSpeed += _scrollSpeed . Clamp ( 0 , 0 . 002F )
End If
2016-09-07 18:50:38 +02:00
If Controls . Up ( True , False , True , False , False , False ) = True Then
If _scrollSpeed = 0 . 0F Or _scrollDirection <> - 1 Then
_scrollSpeed = 0 . 01F
End If
_scrollDirection = - 1
_scrollSpeed += _scrollSpeed . Clamp ( 0 , 0 . 01 )
End If
2022-11-01 17:37:38 +01:00
If ControllerHandler . ButtonDown ( Buttons . RightTrigger ) = True Then
If _scrollSpeed = 0 . 0F Or _scrollDirection <> - 1 Then
_scrollSpeed = 0 . 002F
End If
_scrollDirection = - 1
_scrollSpeed += _scrollSpeed . Clamp ( 0 , 0 . 002F )
End If
2016-09-07 18:50:38 +02:00
_scrollSpeed = _scrollSpeed . Clamp ( 0 , 0 . 08 )
If _scrollSpeed > 0 . 0F Then
ThirdPersonOffset . Y += _scrollSpeed * _scrollDirection
ThirdPersonOffset . Z += _scrollSpeed * _scrollDirection
If GameController . IS_DEBUG_ACTIVE = False And Core . Player . SandBoxMode = False Then
ThirdPersonOffset . Y = ThirdPersonOffset . Y . Clamp ( 0 , 1 . 32F )
ThirdPersonOffset . Z = ThirdPersonOffset . Z . Clamp ( - 0 . 1 , 2 . 7F )
End If
_scrollSpeed -= 0 . 001F
If _scrollSpeed <= 0 . 0F Then
_scrollSpeed = 0 . 0F
End If
End If
End If
End Sub
Public Sub UpdateThirdPersonCamera ( )
If _isFixed = False Then
2022-11-02 10:42:30 +01:00
If PreventMovement = False AndAlso KeyBoardHandler . KeyPressed ( KeyBindings . PerspectiveSwitchKey ) = True Or ControllerHandler . ButtonPressed ( Buttons . LeftShoulder ) = True Then
2016-09-07 18:50:38 +02:00
Dim actionscriptReady As Boolean = True
If CurrentScreen . Identification = Screen . Identifications . OverworldScreen Then
actionscriptReady = CType ( CurrentScreen , OverworldScreen ) . ActionScript . IsReady
End If
2019-01-13 18:06:43 +01:00
If actionscriptReady = True And _canToggleThirdPerson Then
2016-09-07 18:50:38 +02:00
SetThirdPerson ( Not _thirdPerson , True )
End If
End If
Dim usePosition As Vector3 = Position
Select Case _cameraFocusType
Case CameraFocusTypes . Entity
Dim entList = ( From ent As Entity In Screen . Level . Entities Select ent Where ent . ID = _cameraFocusID )
If entList . Count ( ) > 0 Then
usePosition = entList ( 0 ) . Position
usePosition . Y += 0 . 1F
End If
Case CameraFocusTypes . NPC
Dim entList = ( From ent As Entity In Screen . Level . Entities Select ent Where ent . GetType ( ) = GetType ( NPC ) AndAlso CType ( ent , NPC ) . NPCID = _cameraFocusID )
If entList . Count ( ) > 0 Then
usePosition = entList ( 0 ) . Position
usePosition . Y += 0 . 1F
End If
End Select
If _thirdPerson = True Then
Dim rotationMatrix As Matrix = Matrix . CreateRotationY ( Yaw )
Dim offset As Vector3 = ThirdPersonOffset
Dim transformedOffset As Vector3 = Vector3 . Transform ( offset , rotationMatrix )
Dim diff As Vector3 = _cPosition - ( usePosition + transformedOffset )
For Each p As Particle In ( From ent In Screen . Level . Entities Where ent . GetType ( ) = GetType ( Particle ) Select ent )
p . MoveWithCamera ( diff )
Next
_cPosition = usePosition + transformedOffset
Else
_cPosition = usePosition
End If
End If
End Sub
Public Sub SetThirdPerson ( ByVal isThirdPerson As Boolean , ByVal showMessage As Boolean )
If _thirdPerson <> isThirdPerson Then
If isThirdPerson = True And _thirdPerson = False Then
_playerFacing = GetFacingDirection ( )
End If
_thirdPerson = isThirdPerson
ThirdPersonOffset = New Vector3 ( 0F , 0 . 3F , 1 . 5F )
If _thirdPerson = True Then
Screen . Level . OwnPlayer . Opacity = 1 . 0F
If showMessage = True Then
Core . GameMessage . ShowMessage ( Localization . GetString ( " game_message_third_person_on " ) , 12 , FontManager . MainFont , Color . White )
End If
Else
2022-09-19 15:49:14 +02:00
Yaw = GetAimYawFromDirection ( GetFacingDirection ( ) )
2016-09-07 18:50:38 +02:00
If showMessage = True Then
Core . GameMessage . ShowMessage ( Localization . GetString ( " game_message_third_person_off " ) , 12 , FontManager . MainFont , Color . White )
End If
End If
End If
End Sub
Public Sub UpdateFrustum ( )
Dim rotation As Matrix = Matrix . CreateRotationX ( Pitch ) * Matrix . CreateRotationY ( Yaw )
Dim fPosition As New Vector3 ( _cPosition . X , _cPosition . Y + GetBobbing ( ) , _cPosition . Z )
Dim transformed As Vector3 = Vector3 . Transform ( New Vector3 ( 0 , 0 , - 1 ) , rotation )
Dim lookAt As Vector3 = fPosition + transformed
BoundingFrustum = New BoundingFrustum ( Matrix . CreateLookAt ( fPosition , lookAt , Vector3 . Up ) * Projection )
End Sub
Public Sub UpdateViewMatrix ( )
Dim rotation As Matrix = Matrix . CreateRotationX ( Pitch ) * Matrix . CreateRotationY ( Yaw )
Dim transformed As Vector3 = Vector3 . Transform ( New Vector3 ( 0 , 0 , - 1 ) , rotation )
Dim lookAt As Vector3 = New Vector3 ( _cPosition . X , _cPosition . Y + GetBobbing ( ) , _cPosition . Z ) + transformed
View = Matrix . CreateLookAt ( _cPosition , lookAt , Vector3 . Up )
End Sub
Public Sub ResetCursor ( )
If GameInstance . IsActive = True Then
2019-01-11 20:22:01 +01:00
' Only reset the mouse position when it's "close" to the border of the client rect
Dim horizontalCutoff = windowSize . Width / 10 . 0F
Dim verticalCutoff = windowSize . Height / 10 . 0F
Dim mousePos = Mouse . GetState ( ) . Position . ToVector2 ( )
If mousePos . X <= horizontalCutoff OrElse
mousePos . X >= windowSize . Width - horizontalCutoff OrElse
mousePos . Y <= verticalCutoff OrElse
mousePos . Y >= windowSize . Height - verticalCutoff Then
Mouse . SetPosition ( CInt ( windowSize . Width / 2 ) , CInt ( windowSize . Height / 2 ) )
oldX = CInt ( windowSize . Width / 2 )
oldY = CInt ( windowSize . Height / 2 )
Else
oldX = mousePos . X
oldY = mousePos . Y
End If
2016-09-07 18:50:38 +02:00
End If
End Sub
#End Region
#Region "CameraMethods"
Private Sub SetSpeed ( )
2022-04-03 21:04:25 +02:00
If CurrentScreen . Identification = Screen . Identifications . OverworldScreen AndAlso CType ( CurrentScreen , OverworldScreen ) . ActionScript . IsReady = True Then
2016-09-07 18:50:38 +02:00
If Screen . Level . Riding = True Then
Speed = 0 . 08F
2022-04-19 11:49:17 +02:00
ElseIf Screen . Level . Surfing = True Then
Speed = 0 . 04F
ElseIf Core . Player . IsRunning ( ) = True Then
Speed = 0 . 06F
2016-09-07 18:50:38 +02:00
Else
Speed = 0 . 04F
End If
End If
Screen . Level . OverworldPokemon . MoveSpeed = Speed
End Sub
Private Function CreateRay ( ) As Ray
Dim centerX As Integer = CInt ( windowSize . Width / 2 )
Dim centerY As Integer = CInt ( windowSize . Height / 2 )
Dim nearSource As Vector3 = New Vector3 ( centerX , centerY , 0 )
Dim farSource As Vector3 = New Vector3 ( centerX , centerY , 1 )
Dim nearPoint As Vector3 = GraphicsDevice . Viewport . Unproject ( nearSource , Projection , View , Matrix . Identity )
Dim farPoint As Vector3 = GraphicsDevice . Viewport . Unproject ( farSource , Projection , View , Matrix . Identity )
Dim direction As Vector3 = farPoint - nearPoint
direction . Normalize ( )
Return New Ray ( nearPoint , direction )
End Function
'Aims the camera to the set aim.
Public Sub AimCamera ( )
If _aimDirection > - 1 And Turning = True Then
Dim yawAim As Single = GetAimYawFromDirection ( _aimDirection )
Dim clockwise As Boolean = True
If Yaw >= 0F And Yaw < MathHelper . Pi * 0 . 5F Then
Select Case _aimDirection
Case 0
clockwise = True
Case 1
clockwise = False
Case 2
clockwise = False
Case 3
clockwise = True
yawAim -= MathHelper . TwoPi
End Select
ElseIf Yaw >= MathHelper . Pi * 0 . 5F And Yaw < MathHelper . Pi Then
Select Case _aimDirection
Case 0
clockwise = True
Case 1
clockwise = True
Case 2
clockwise = False
Case 3
clockwise = False
End Select
ElseIf Yaw >= MathHelper . Pi And Yaw < MathHelper . Pi * 1 . 5F Then
Select Case _aimDirection
Case 0
clockwise = False
yawAim += MathHelper . TwoPi
Case 1
clockwise = True
Case 2
clockwise = True
Case 3
clockwise = False
End Select
ElseIf Yaw >= MathHelper . Pi * 1 . 5F And Yaw < MathHelper . TwoPi Then
Select Case _aimDirection
Case 0
clockwise = False
yawAim += MathHelper . TwoPi
Case 1
clockwise = False
yawAim += MathHelper . TwoPi
Case 2
clockwise = True
Case 3
clockwise = True
End Select
End If
If clockwise = True Then
ClampYaw ( )
2021-09-25 19:57:08 +02:00
Yaw -= RotationSpeed * 40 . 0F
2016-09-07 18:50:38 +02:00
If Yaw <= yawAim Then
Turning = False
_aimDirection = - 1
Yaw = yawAim
ClampYaw ( )
End If
Else
ClampYaw ( )
2021-09-25 19:57:08 +02:00
Yaw += RotationSpeed * 40 . 0F
2016-09-07 18:50:38 +02:00
If Yaw >= yawAim Then
Turning = False
_aimDirection = - 1
Yaw = yawAim
ClampYaw ( )
End If
End If
End If
End Sub
Private Sub ClampYaw ( )
While Yaw < 0F
Yaw += MathHelper . TwoPi
End While
While Yaw >= MathHelper . TwoPi
Yaw -= MathHelper . TwoPi
End While
End Sub
Private Sub ClampPitch ( )
2018-02-24 01:20:42 +01:00
Pitch = MathHelper . Clamp ( Pitch , - 1 . 5F , 1 . 5F )
2016-09-07 18:50:38 +02:00
End Sub
'Changes the camera's pitch so you can see the stuff that is in front of you. Used when textboxes appear.
Public Sub PitchForward ( )
Dim aim As Single = - 0 . 1F
If ThirdPerson = True Then
aim = - 0 . 25F
End If
If Pitch > aim Then
2021-09-25 19:57:08 +02:00
Pitch -= RotationSpeed * 40 . 0F
2016-09-07 18:50:38 +02:00
If Pitch < aim Then
Pitch = aim
End If
ElseIf Pitch < aim Then
2021-09-25 19:57:08 +02:00
Pitch += RotationSpeed * 40 . 0F
2016-09-07 18:50:38 +02:00
If Pitch > aim Then
Pitch = aim
End If
End If
End Sub
Private Function GetBobbing ( ) As Single
2022-09-16 17:56:30 +02:00
If IsSliding = True OrElse Core . GameOptions . ViewBobbing = False Then
2016-09-07 18:50:38 +02:00
Return 0 . 0F
End If
2018-02-24 09:32:04 +01:00
If Screen . Level ? . Riding = True Then
2016-09-07 18:50:38 +02:00
Return CSng ( Math . Sin ( _bobbingTemp ) * 0 . 012 )
Else
If Core . Player . IsRunning ( ) = True Then
Return CSng ( Math . Sin ( _bobbingTemp ) * 0 . 008 )
Else
Return CSng ( Math . Sin ( _bobbingTemp ) * 0 . 004 )
End If
End If
End Function
#End Region
#Region "PlayerMethods"
Private Sub PlayerMovement ( )
If _moved > 0 . 0F And Turning = False Then
Dim v As Vector3 = PlannedMovement * Speed
2018-08-29 02:34:58 +02:00
If Not Screen . Level . OwnPlayer ( ) . isDancing Then
Position += v
End If
2016-09-07 18:50:38 +02:00
_moved -= Speed
If _moved <= 0 . 0F Then
StopMovement ( )
2018-08-29 02:34:58 +02:00
Screen . Level . OwnPlayer ( ) . isDancing = False
2016-09-07 18:50:38 +02:00
Position . X = Position . X . ToInteger ( )
Position . Y = Position . Y . ToInteger ( ) + 0 . 1F
Position . Z = Position . Z . ToInteger ( )
'If surfing, the player is set to Y = 0.0
If Screen . Level . Surfing = True Then
Position . Y = CSng ( Math . Floor ( Position . Y ) )
End If
If _tempDirectionPressed > - 1 Then
Turn ( _tempDirectionPressed )
End If
_tempDirectionPressed = - 1
Screen . Level . OwnPlayer . DoAnimation = True
If Core . GameOptions . GraphicStyle > 0 Then
If World . NoParticlesList . Contains ( Screen . Level . World . CurrentMapWeather ) = False Then
World . GenerateParticles ( - 1 , Screen . Level . World . CurrentMapWeather )
End If
End If
Core . Player . TakeStep ( _tempAmountOfSteps )
_tempAmountOfSteps = 0
LastStepPosition = Position
End If
If Screen . Level . Surfing = False And _thirdPerson = False And _cameraFocusType = CameraFocusTypes . Player Then
_bobbingTemp += 0 . 25F
End If
End If
Dim isActionscriptReady As Boolean = False
Dim OS As OverworldScreen = Nothing
If CurrentScreen . Identification = Screen . Identifications . OverworldScreen Then
OS = CType ( CurrentScreen , OverworldScreen )
isActionscriptReady = OS . ActionScript . IsReady
End If
2022-09-29 21:27:44 +02:00
If isActionscriptReady = True AndAlso ScriptBlock . TriggeredScriptBlock = False AndAlso Screen . Level . CanMove ( ) = True AndAlso PreventMovement = False Then
2016-09-07 18:50:38 +02:00
If _thirdPerson = False And _cameraFocusType = CameraFocusTypes . Player Then
FirstPersonMovement ( )
Else
ThirdPersonMovement ( )
End If
End If
If Screen . Level . Surfing = True Then
Screen . Level . OwnPlayer . Opacity = 1 . 0F
End If
If _bumpSoundDelay > 0 Then
_bumpSoundDelay -= 1
End If
End Sub
Private Sub FirstPersonMovement ( )
Dim pressedDirection As Integer = - 1
2023-02-27 20:12:18 +01:00
Dim ControllerTurnModifier As Single = 1 . 0F
If ControllerHandler . ButtonDown ( Buttons . RightThumbstickLeft ) = True OrElse ControllerHandler . ButtonDown ( Buttons . RightThumbstickRight ) = True Then
ControllerTurnModifier = 0 . 25F
End If
2016-09-07 18:50:38 +02:00
If YawLocked = False And Turning = False Then
If ( KeyBoardHandler . KeyDown ( KeyBindings . LeftMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . RightThumbstickLeft ) = True ) And Turning = False Then
If _freeCameraMode = True Then
2023-02-27 20:12:18 +01:00
Yaw += RotationSpeed * 40 . 0F * ControllerTurnModifier
2016-09-07 18:50:38 +02:00
ClampYaw ( )
Else
pressedDirection = 1
End If
End If
If ( KeyBoardHandler . KeyDown ( KeyBindings . BackwardMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . LeftThumbstickDown ) = True ) And Turning = False Then
If _freeCameraMode = True Then
If _moved <= 0F Then
Turn ( 2 )
End If
Else
pressedDirection = 2
End If
End If
If ( KeyBoardHandler . KeyDown ( KeyBindings . RightMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . RightThumbstickRight ) = True ) And Turning = False Then
If _freeCameraMode = True Then
2023-02-27 20:12:18 +01:00
Yaw -= RotationSpeed * 40 . 0F * ControllerTurnModifier
2016-09-07 18:50:38 +02:00
ClampYaw ( )
Else
pressedDirection = 3
End If
End If
If _freeCameraMode = False And pressedDirection > - 1 Then
If _moved <= 0F Then
Turn ( pressedDirection )
Else
_tempDirectionPressed = pressedDirection
End If
End If
ClampYaw ( )
If ( KeyBoardHandler . KeyDown ( KeyBindings . ForwardMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . LeftThumbstickUp ) = True ) And Turning = False Then
MoveForward ( )
End If
End If
End Sub
Private Sub ThirdPersonMovement ( )
If _moved <= 0F Then
Dim doMove As Boolean = False
Dim newPlayerFacing As Integer = - 1
If IsThirdPersonMoveButtonDown ( 0 ) = True Then
newPlayerFacing = GetFacingDirection ( ) + 0
doMove = True
ElseIf IsThirdPersonMoveButtonDown ( 1 ) = True Then
newPlayerFacing = GetFacingDirection ( ) + 1
doMove = True
ElseIf IsThirdPersonMoveButtonDown ( 2 ) = True Then
newPlayerFacing = GetFacingDirection ( ) + 2
doMove = True
ElseIf IsThirdPersonMoveButtonDown ( 3 ) = True Then
newPlayerFacing = GetFacingDirection ( ) + 3
doMove = True
End If
While newPlayerFacing > 3
newPlayerFacing -= 4
End While
If doMove = True Then
If newPlayerFacing <> _playerFacing Then
If IsThirdPersonMoveButtonDown ( _playerFacing ) = False And Core . Player . IsRunning ( ) = False And _notPressedThirdPersonDirectionButton >= 3 Then
_waitForThirdPersonTurning = 5
End If
_playerFacing = newPlayerFacing
Screen . Level . OwnPlayer . Opacity = 1 . 0F
Else
If _waitForThirdPersonTurning > 0 Then
_waitForThirdPersonTurning -= 1
Else
MoveForward ( )
End If
End If
_notPressedThirdPersonDirectionButton = 0
Else
If _notPressedThirdPersonDirectionButton < 3 Then
_notPressedThirdPersonDirectionButton += 1
End If
End If
Else
_waitForThirdPersonTurning = 0
_notPressedThirdPersonDirectionButton = 0
End If
End Sub
Private Function IsThirdPersonMoveButtonDown ( ByVal facing As Integer ) As Boolean
Select Case facing
Case 0
Return KeyBoardHandler . KeyDown ( KeyBindings . ForwardMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . LeftThumbstickUp ) = True Or ControllerHandler . ButtonDown ( Buttons . DPadUp ) = True
Case 1
Return KeyBoardHandler . KeyDown ( KeyBindings . LeftMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . LeftThumbstickLeft ) = True Or ControllerHandler . ButtonDown ( Buttons . DPadLeft ) = True
Case 2
Return KeyBoardHandler . KeyDown ( KeyBindings . BackwardMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . LeftThumbstickDown ) = True Or ControllerHandler . ButtonDown ( Buttons . DPadDown ) = True
Case 3
Return KeyBoardHandler . KeyDown ( KeyBindings . RightMoveKey ) = True Or ControllerHandler . ButtonDown ( Buttons . LeftThumbstickRight ) = True Or ControllerHandler . ButtonDown ( Buttons . DPadRight ) = True
End Select
Return False
End Function
Private _bumpSoundDelay As Integer = 35
Private _didWalkAgainst As Boolean = True
Private Sub MoveForward ( )
If _moved <= 0F Then
_didWalkAgainst = True
If CheckCollision ( GetForwardMovedPosition ( ) ) = False Then
Screen . Level . OwnPlayer . Opacity = 1 . 0F
Dim walkSteps As Integer = GetIceSteps ( GetForwardMovedPosition ( ) )
Screen . Level . OwnPlayer . DoAnimation = ( walkSteps <= 1 )
Move ( walkSteps )
Else
'Walked against something, set player transparent
If Screen . Level . Surfing = False Then
If _thirdPerson = True Then
If _didWalkAgainst = True Then
Screen . Level . OwnPlayer . Opacity = 0 . 5F
End If
Fix audio engine & contentpacks (#35)
* Replaced existing Gen 2 SFX with better sounding ones (no ugly reverb)
Replaced MediaPlayer with NAudio(and NAudio.Vorbis) for playing music in order to fix random stopping issues.
The game now directly loads .ogg files instead of the .wma/.xnb combination from before.
ContentPacks are now able to replace Music and SFX again (I haven't added a menu yet for choosing ContentPacks).
To make older GameModes work with current versions, you can add the GameMode property EnterType and set it to "1", this will make the game use the older 2D NewGameScreen.
* Delete GameController.vb
* Add gamecontroller.vb back
* Fix sfx missing
* Battleintro doodle now doesn't loop anymore (for no trainer)
Changed the shutter sound (aka Large Door sound) to something more large door-y
Made the enter sound slightly louder
The enter sound now plays when going through any warp to or from an indoor map (including falling through holes)
The flying sound effect is played earlier in the animation after selecting a location
Changed played sound effect when using the Escape Rope to "teleport" instead of "destroy"
The bump noise now also plays when bumping into something in first person
Fixed small gap between the end of the intro song and the start of the main song
Replaced some songs with better songs
* Fixed some more intro issues
* Forgot to change a thing
* Fixed an error where the main music would play, ignoring the muted musicmanager.
* fix indenting in musicmanager
* The music player will now only start playback on a new song if the music player is not muted, fixed the end time calculation of the intro of a song after muting, Music can't be unmuted now as long as a sound effect plays that stops the music.
* Fixed league restplace position, fixed sound effects sharing the volume slider of the music, sound effects are now also muted when pressing M, changed music on/off popup to audio on/off, removed bump delay in first person, added more control on whether played songs should be looping or not.
* Fixed some more scripts that turn on thirdperson mode but don't check if it was on before or set it back to what it was before afterwards, also fixed a small error in creditsscreen.vb.
* Fixed indenting error in musicmanager.vb, fixed an error of mine where the loopsong parameter would be seen as the playintro parameter.
* Added more music commands, added quite some menu select noises, will add more later
* More select sound effects!
* Fix music not resuming after soundeffect
* Trainer using item now plays the single_heal soundeffect
* Pokémon cries now sound louder
* Possibly fixing crash when playing Pokémon cry at volume higher than 0.71
* Added better quality Pokémon cries, made random overworld cries slightly less loud, added cries for 719 and 720.
* Sound effects now sound louder
* Revert "Added better quality Pokémon cries, made random overworld cries slightly less loud, added cries for 719 and 720."
This reverts commit 8c9296ed1a82144d17f303a52c3f2e9e65a5bfea.
* Fixed the cause of why the title screen music plays even when the game is muted
* Tabs to spaces
* Revert
Co-authored-by: darkfire006 <blazer257@live.com>
Co-authored-by: JappaWakkaP3D <66885565+JappaWakkaP3D@users.noreply.github.com>
Co-authored-by: JappaWakkaP3D <jasper.speelman@outlook.com>
Co-authored-by: Vitaly Mikhailov <personal@aragas.org>
2020-07-09 19:59:42 +02:00
End If
If _bumpSoundDelay = 0 Then
If _didWalkAgainst = True Then
SoundManager . PlaySound ( " bump " )
2016-09-07 18:50:38 +02:00
End If
Fix audio engine & contentpacks (#35)
* Replaced existing Gen 2 SFX with better sounding ones (no ugly reverb)
Replaced MediaPlayer with NAudio(and NAudio.Vorbis) for playing music in order to fix random stopping issues.
The game now directly loads .ogg files instead of the .wma/.xnb combination from before.
ContentPacks are now able to replace Music and SFX again (I haven't added a menu yet for choosing ContentPacks).
To make older GameModes work with current versions, you can add the GameMode property EnterType and set it to "1", this will make the game use the older 2D NewGameScreen.
* Delete GameController.vb
* Add gamecontroller.vb back
* Fix sfx missing
* Battleintro doodle now doesn't loop anymore (for no trainer)
Changed the shutter sound (aka Large Door sound) to something more large door-y
Made the enter sound slightly louder
The enter sound now plays when going through any warp to or from an indoor map (including falling through holes)
The flying sound effect is played earlier in the animation after selecting a location
Changed played sound effect when using the Escape Rope to "teleport" instead of "destroy"
The bump noise now also plays when bumping into something in first person
Fixed small gap between the end of the intro song and the start of the main song
Replaced some songs with better songs
* Fixed some more intro issues
* Forgot to change a thing
* Fixed an error where the main music would play, ignoring the muted musicmanager.
* fix indenting in musicmanager
* The music player will now only start playback on a new song if the music player is not muted, fixed the end time calculation of the intro of a song after muting, Music can't be unmuted now as long as a sound effect plays that stops the music.
* Fixed league restplace position, fixed sound effects sharing the volume slider of the music, sound effects are now also muted when pressing M, changed music on/off popup to audio on/off, removed bump delay in first person, added more control on whether played songs should be looping or not.
* Fixed some more scripts that turn on thirdperson mode but don't check if it was on before or set it back to what it was before afterwards, also fixed a small error in creditsscreen.vb.
* Fixed indenting error in musicmanager.vb, fixed an error of mine where the loopsong parameter would be seen as the playintro parameter.
* Added more music commands, added quite some menu select noises, will add more later
* More select sound effects!
* Fix music not resuming after soundeffect
* Trainer using item now plays the single_heal soundeffect
* Pokémon cries now sound louder
* Possibly fixing crash when playing Pokémon cry at volume higher than 0.71
* Added better quality Pokémon cries, made random overworld cries slightly less loud, added cries for 719 and 720.
* Sound effects now sound louder
* Revert "Added better quality Pokémon cries, made random overworld cries slightly less loud, added cries for 719 and 720."
This reverts commit 8c9296ed1a82144d17f303a52c3f2e9e65a5bfea.
* Fixed the cause of why the title screen music plays even when the game is muted
* Tabs to spaces
* Revert
Co-authored-by: darkfire006 <blazer257@live.com>
Co-authored-by: JappaWakkaP3D <66885565+JappaWakkaP3D@users.noreply.github.com>
Co-authored-by: JappaWakkaP3D <jasper.speelman@outlook.com>
Co-authored-by: Vitaly Mikhailov <personal@aragas.org>
2020-07-09 19:59:42 +02:00
_bumpSoundDelay = 35
2016-09-07 18:50:38 +02:00
End If
End If
End If
End If
End Sub
Public Function CheckCollision ( ByVal newPosition As Vector3 ) As Boolean
Dim cannotWalk As Boolean = True
Dim setSurfFalse As Boolean = False
2022-10-13 13:26:01 +02:00
Dim Position2D As Vector3 = New Vector3 ( newPosition . X , CSng ( Math . Floor ( newPosition . Y ) ) , newPosition . Z )
2016-09-07 18:50:38 +02:00
For Each Floor As Entity In Screen . Level . Floors
If Floor . boundingBox . Contains ( Position2D ) = ContainmentType . Contains Then
cannotWalk = False
setSurfFalse = True
End If
Next
If cannotWalk = False Then
For Each Entity As Entity In Screen . Level . Entities
2022-10-13 13:26:01 +02:00
If Entity . boundingBox . Contains ( Position2D ) = ContainmentType . Contains Then
2016-09-07 18:50:38 +02:00
If cannotWalk = False Then
If Entity . Collision = True Then
cannotWalk = Entity . WalkAgainstFunction ( )
Else
cannotWalk = Entity . WalkIntoFunction ( )
End If
End If
2022-10-13 13:26:01 +02:00
ElseIf Entity . boundingBox . Contains ( New Vector3 ( Position2D . X , Position2D . Y - 1 , Position2D . Z ) ) = ContainmentType . Contains Then
2016-09-07 18:50:38 +02:00
Entity . WalkOntoFunction ( )
End If
Next
Else
For Each Entity As Entity In Screen . Level . Entities
2022-10-13 13:26:01 +02:00
If Entity . boundingBox . Contains ( New Vector3 ( Position2D . X , Position2D . Y - 1 , Position2D . Z ) ) = ContainmentType . Contains Then
2016-09-07 18:50:38 +02:00
Entity . WalkOntoFunction ( )
End If
If Screen . Level . Surfing = True Then
2022-10-13 13:26:01 +02:00
If Entity . boundingBox . Contains ( Position2D ) = ContainmentType . Contains Then
2016-09-07 18:50:38 +02:00
If Entity . Collision = True Then
Entity . WalkAgainstFunction ( )
Else
Entity . WalkIntoFunction ( )
End If
End If
End If
Next
End If
If cannotWalk = False And setSurfFalse = True Then
If Screen . Level . Surfing = True Then
Screen . Level . Surfing = False
Screen . Level . OwnPlayer . SetTexture ( Core . Player . TempSurfSkin , True )
Core . Player . Skin = Core . Player . TempSurfSkin
Screen . Level . OverworldPokemon . warped = True
Screen . Level . OverworldPokemon . Visible = False
If Screen . Level . IsRadioOn = False OrElse GameJolt . PokegearScreen . StationCanPlay ( Screen . Level . SelectedRadioStation ) = False Then
2018-02-24 01:20:42 +01:00
MusicManager . Play ( Screen . Level . MusicLoop )
2016-09-07 18:50:38 +02:00
End If
End If
End If
If GameController . IS_DEBUG_ACTIVE = True Or Core . Player . SandBoxMode = True Then
2022-04-07 12:01:32 +02:00
If _debugWalk = True AndAlso CType ( Core . CurrentScreen , OverworldScreen ) . ActionScript . IsReady = True Then
2016-09-07 18:50:38 +02:00
cannotWalk = False
End If
End If
Return cannotWalk
End Function
Private Function GetIceSteps ( ByVal newPosition As Vector3 ) As Integer
Dim Position2D As Vector3 = New Vector3 ( newPosition . X , newPosition . Y - 0 . 1F , newPosition . Z )
For Each Floor As Entity In Screen . Level . Floors
If Floor . boundingBox . Contains ( Position2D ) = ContainmentType . Contains Then
If CType ( Floor , Floor ) . IsIce = True Then
2022-09-16 17:56:30 +02:00
IsSliding = True
2016-09-07 18:50:38 +02:00
Return CType ( Floor , Floor ) . GetIceFloors ( )
2022-09-16 17:56:30 +02:00
Else
IsSliding = False
2016-09-07 18:50:38 +02:00
End If
End If
Next
Return 1
End Function
Public Overrides Function GetForwardMovedPosition ( ) As Vector3
Return Position + GetMoveDirection ( )
End Function
Public Overrides Function GetMoveDirection ( ) As Vector3
Dim v As Vector3 = PlannedMovement
Select Case GetPlayerFacingDirection ( )
Case 0 'North
If v . Z = 0F Then
v . Z = - 1 . 0F
End If
Case 1 'West
If v . X = 0F Then
v . X = - 1 . 0F
End If
Case 2 'South
If v . Z = 0F Then
v . Z = 1 . 0F
End If
Case 3 'East
If v . X = 0F Then
v . X = 1 . 0F
End If
End Select
2017-01-08 17:25:29 +01:00
'DebugFeature:
If GameController . IS_DEBUG_ACTIVE = True Or Core . Player . SandBoxMode = True Then
If KeyBoardHandler . KeyDown ( Keys . LeftAlt ) Then
If KeyBoardHandler . KeyDown ( KeyBindings . ForwardMoveKey ) Then
v . X = 0F
v . Y = 1 . 0F
v . Z = 0F
ElseIf KeyBoardHandler . KeyDown ( KeyBindings . BackwardMoveKey ) Then
v . X = 0F
v . Y = - 1 . 0F
v . Z = 0F
End If
End If
End If
2016-09-07 18:50:38 +02:00
Return v
End Function
Public Overrides Function GetPlayerFacingDirection ( ) As Integer
If _thirdPerson = False And _cameraFocusType = CameraFocusTypes . Player Then
Return GetFacingDirection ( )
Else
Return _playerFacing
End If
End Function
Public Function GetAimYawFromDirection ( ByVal direction As Integer ) As Single
Select Case direction
Case 0
Return 0F
Case 1
Return MathHelper . Pi * 0 . 5F
Case 2
Return MathHelper . Pi
Case 3
Return MathHelper . Pi * 1 . 5F
End Select
Return 0F
End Function
2022-11-02 11:49:46 +01:00
Public Overrides Sub Turn ( ByVal turns As Integer , Optional ForceCameraTurn As Boolean = False )
2016-09-07 18:50:38 +02:00
If turns > 0 Then
If _thirdPerson = True Then
_playerFacing += turns
While _playerFacing > 3
_playerFacing -= 4
End While
Screen . Level . OwnPlayer . Opacity = 1 . 0F
2022-11-02 11:49:46 +01:00
If ForceCameraTurn = True Then
Dim facing As Integer = GetFacingDirection ( )
facing += _playerFacing - GetFacingDirection ( )
While facing > 3
facing -= 4
End While
Turning = True
_aimDirection = facing
End If
2016-09-07 18:50:38 +02:00
Else
Dim facing As Integer = GetFacingDirection ( )
facing += turns
While facing > 3
facing -= 4
End While
Turning = True
_aimDirection = facing
End If
End If
End Sub
Public Overrides Sub InstantTurn ( ByVal turns As Integer )
If turns > 0 Then
If _thirdPerson = True Then
'Set the camera so the player would't walk into a different direction when holding down the walk button.
Yaw += GetAimYawFromDirection ( turns )
ClampYaw ( )
_playerFacing += turns
While _playerFacing > 3
_playerFacing -= 4
End While
Screen . Level . OwnPlayer . Opacity = 1 . 0F
Else
Dim newFacing As Integer = GetFacingDirection ( ) + turns
While newFacing > 3
newFacing -= 4
End While
Yaw = GetAimYawFromDirection ( newFacing )
End If
End If
End Sub
Private Sub CheckEntities ( )
If Controls . Accept ( ) = True Then
If _moved = 0F And Turning = False Then
Dim checkPosition As Vector3 = GetForwardMovedPosition ( )
checkPosition . Y -= 0 . 1F
For i = 0 To Screen . Level . Entities . Count - 1
If i <= Screen . Level . Entities . Count - 1 Then
Dim result As Single ? = Screen . Level . Entities ( i ) . boundingBox . Intersects ( Ray )
Dim RayIntersects As Boolean = True
If result . HasValue = True Then
Dim minValue As Single = 1 . 3F
If _thirdPerson = True Then
minValue += 1 . 8F
End If
If result . Value < minValue Then
RayIntersects = True
End If
End If
If RayIntersects = True And Screen . Level . Entities ( i ) . boundingBox . Contains ( checkPosition ) = ContainmentType . Contains Then
Screen . Level . Entities ( i ) . ClickFunction ( )
End If
Else
Exit For
End If
Next
End If
End If
End Sub
Public Overrides Sub Move ( Steps As Single )
If Steps <> 0F Then
_moved += Steps
_tempAmountOfSteps += CInt ( Math . Ceiling ( Steps ) )
If _setPlannedMovement = False Then
_plannedMovement = GetMoveDirection ( )
End If
End If
End Sub
Public Overrides Sub StopMovement ( )
_moved = 0F
_plannedMovement = Vector3 . Zero
_setPlannedMovement = False
End Sub
Private Sub ControlThirdPersonCamera ( )
2021-09-27 23:26:37 +02:00
If GameController . IS_DEBUG_ACTIVE = True Or Core . Player . SandBoxMode = True Then
2016-09-07 18:50:38 +02:00
If Controls . CtrlPressed ( ) = True Then
If KeyBoardHandler . KeyDown ( KeyBindings . UpKey ) = True Then
ThirdPersonOffset . Y += Speed
End If
If KeyBoardHandler . KeyDown ( KeyBindings . DownKey ) = True Then
ThirdPersonOffset . Y -= Speed
End If
Else
If KeyBoardHandler . KeyDown ( KeyBindings . UpKey ) = True Then
ThirdPersonOffset . Z -= Speed
End If
If KeyBoardHandler . KeyDown ( KeyBindings . DownKey ) = True Then
ThirdPersonOffset . Z += Speed
End If
If KeyBoardHandler . KeyDown ( KeyBindings . RightKey ) = True Then
ThirdPersonOffset . X += Speed
End If
If KeyBoardHandler . KeyDown ( KeyBindings . LeftKey ) = True Then
ThirdPersonOffset . X -= Speed
End If
End If
End If
End Sub
#End Region
2016-09-19 03:26:44 +02:00
End Class