mirror of
https://github.com/P3D-Legacy/P3D-Legacy.git
synced 2025-08-28 05:08:40 +02:00
* 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>
1051 lines
37 KiB
VB.net
1051 lines
37 KiB
VB.net
Public Class OverworldCamera
|
|
|
|
Inherits Camera
|
|
|
|
#Region "Fields"
|
|
|
|
Public oldX, oldY As Single
|
|
|
|
Private _thirdPerson As Boolean = False
|
|
Public _canToggleThirdPerson As Boolean = True
|
|
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.
|
|
|
|
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
|
|
Private _moved As Single = 0F
|
|
|
|
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)
|
|
|
|
'Debug variables
|
|
Public oldDate As Date = Date.Now
|
|
|
|
#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
|
|
|
|
Public Overrides ReadOnly Property CPosition() As Vector3
|
|
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()
|
|
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)
|
|
Dim text As String = ""
|
|
|
|
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
|
|
dy = gState.ThumbSticks.Right.Y * 40.0F * -1.0F
|
|
End If
|
|
|
|
If _isFixed = False AndAlso (dx <> 0 OrElse dy <> 0) Then
|
|
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
|
|
'text = " (Moving)"
|
|
End If
|
|
'Dim interval As TimeSpan
|
|
'interval = Date.Now - oldDate
|
|
'Logger.Debug("ControlCamera: " & interval.Milliseconds.ToString & " ms" & text)
|
|
'oldDate = Date.Now
|
|
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
|
|
|
|
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
|
|
|
|
_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
|
|
If KeyBoardHandler.KeyPressed(KeyBindings.PerspectiveSwitchKey) = True Or ControllerHandler.ButtonPressed(Buttons.LeftShoulder) = True Then
|
|
Dim actionscriptReady As Boolean = True
|
|
If CurrentScreen.Identification = Screen.Identifications.OverworldScreen Then
|
|
actionscriptReady = CType(CurrentScreen, OverworldScreen).ActionScript.IsReady
|
|
End If
|
|
If actionscriptReady = True And _canToggleThirdPerson Then
|
|
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
|
|
Yaw = GetAimYawFromDirection(_playerFacing)
|
|
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
|
|
' 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
|
|
|
|
End If
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
#Region "CameraMethods"
|
|
|
|
Private Sub SetSpeed()
|
|
If CurrentScreen.Identification = Screen.Identifications.OverworldScreen AndAlso CType(CurrentScreen, OverworldScreen).ActionScript.IsReady = False Then
|
|
Speed = 0.04F
|
|
Else
|
|
If Screen.Level.Riding = True Then
|
|
Speed = 0.08F
|
|
Else
|
|
If Core.Player.IsRunning() = True Then
|
|
Speed = 0.06F
|
|
Else
|
|
Speed = 0.04F
|
|
End If
|
|
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()
|
|
Yaw -= RotationSpeed * 35.0F
|
|
If Yaw <= yawAim Then
|
|
Turning = False
|
|
_aimDirection = -1
|
|
Yaw = yawAim
|
|
ClampYaw()
|
|
End If
|
|
Else
|
|
ClampYaw()
|
|
Yaw += RotationSpeed * 35.0F
|
|
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()
|
|
Pitch = MathHelper.Clamp(Pitch, -1.5F, 1.5F)
|
|
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
|
|
Pitch -= RotationSpeed * 35.0F
|
|
If Pitch < aim Then
|
|
Pitch = aim
|
|
End If
|
|
ElseIf Pitch < aim Then
|
|
Pitch += RotationSpeed * 35.0F
|
|
If Pitch > aim Then
|
|
Pitch = aim
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Private Function GetBobbing() As Single
|
|
If Core.GameOptions.ViewBobbing = False Then
|
|
Return 0.0F
|
|
End If
|
|
If Screen.Level?.Riding = True Then
|
|
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
|
|
|
|
If Not Screen.Level.OwnPlayer().isDancing Then
|
|
Position += v
|
|
End If
|
|
|
|
|
|
_moved -= Speed
|
|
If _moved <= 0.0F Then
|
|
StopMovement()
|
|
Screen.Level.OwnPlayer().isDancing = False
|
|
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
|
|
|
|
If isActionscriptReady = True And Screen.Level.CanMove() = True Then
|
|
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
|
|
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
|
|
Yaw += RotationSpeed * 35.0F
|
|
|
|
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
|
|
Yaw -= RotationSpeed * 35.0F
|
|
|
|
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
|
|
End If
|
|
If _bumpSoundDelay = 0 Then
|
|
If _didWalkAgainst = True Then
|
|
SoundManager.PlaySound("bump")
|
|
End If
|
|
_bumpSoundDelay = 35
|
|
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
|
|
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
|
|
cannotWalk = False
|
|
setSurfFalse = True
|
|
End If
|
|
Next
|
|
|
|
If cannotWalk = False Then
|
|
For Each Entity As Entity In Screen.Level.Entities
|
|
If Entity.boundingBox.Contains(newPosition) = ContainmentType.Contains Then
|
|
If cannotWalk = False Then
|
|
If Entity.Collision = True Then
|
|
cannotWalk = Entity.WalkAgainstFunction()
|
|
Else
|
|
cannotWalk = Entity.WalkIntoFunction()
|
|
End If
|
|
End If
|
|
ElseIf Entity.boundingBox.Contains(New Vector3(newPosition.X, newPosition.Y - 1, newPosition.Z)) = ContainmentType.Contains Then
|
|
Entity.WalkOntoFunction()
|
|
End If
|
|
Next
|
|
Else
|
|
For Each Entity As Entity In Screen.Level.Entities
|
|
If Entity.boundingBox.Contains(New Vector3(newPosition.X, newPosition.Y - 1, newPosition.Z)) = ContainmentType.Contains Then
|
|
Entity.WalkOntoFunction()
|
|
End If
|
|
If Screen.Level.Surfing = True Then
|
|
If Entity.boundingBox.Contains(newPosition) = ContainmentType.Contains Then
|
|
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
|
|
MusicManager.Play(Screen.Level.MusicLoop)
|
|
End If
|
|
End If
|
|
End If
|
|
|
|
'DebugFeature:
|
|
If GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then
|
|
If KeyBoardHandler.KeyDown(Keys.LeftControl) = True Then
|
|
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
|
|
Return CType(Floor, Floor).GetIceFloors()
|
|
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
|
|
|
|
'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
|
|
|
|
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
|
|
|
|
Public Overrides Sub Turn(ByVal turns As Integer)
|
|
If turns > 0 Then
|
|
If _thirdPerson = True Then
|
|
_playerFacing += turns
|
|
While _playerFacing > 3
|
|
_playerFacing -= 4
|
|
End While
|
|
Screen.Level.OwnPlayer.Opacity = 1.0F
|
|
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()
|
|
If GameController.IS_DEBUG_ACTIVE = True Then
|
|
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
|
|
|
|
End Class
|