1148 lines
36 KiB
VB.net
1148 lines
36 KiB
VB.net
Imports System.Threading
|
|
''' <summary>
|
|
''' A class that manages the collection of entities to represent a map.
|
|
''' </summary>
|
|
Public Class Level
|
|
|
|
#Region "Fields"
|
|
|
|
Private _routeSign As RouteSign = Nothing
|
|
Private _world As World = Nothing
|
|
Private _pokemonEncounter As PokemonEncounter = Nothing
|
|
|
|
''' <summary>
|
|
''' Stores warp data for warping to a new map.
|
|
''' </summary>
|
|
Public WarpData As WarpDataStruct
|
|
|
|
''' <summary>
|
|
''' Stores temporary Pokémon encounter data.
|
|
''' </summary>
|
|
Public PokemonEncounterData As PokemonEcounterDataStruct
|
|
|
|
' Level states:
|
|
Private _isSurfing As Boolean = False
|
|
Private _isRiding As Boolean = False
|
|
Private _usedStrength As Boolean = False
|
|
Private _isDark As Boolean = False
|
|
Private _walkedSteps As Integer = 0
|
|
|
|
Private _offsetMapUpdateDelay As Integer = 50 ' Ticks until the next Offset Map update occurs.
|
|
|
|
' Map properties:
|
|
Private _terrain As Terrain = New Terrain(Terrain.TerrainTypes.Plain)
|
|
Private _mapName As String = ""
|
|
Private _musicLoop As String = ""
|
|
Private _levelFile As String = ""
|
|
Private _canTeleport As Boolean = True
|
|
Private _canDig As Boolean = False
|
|
Private _canFly As Boolean = False
|
|
Private _rideType As Integer = 0
|
|
Private _weatherType As Integer = 0
|
|
Private _environmentType As Integer = 0
|
|
Private _wildPokemonGrass As Boolean = True
|
|
Private _wildPokemonFloor As Boolean = False
|
|
Private _wildPokemonWater As Boolean = True
|
|
Private _showOverworldPokemon As Boolean = True
|
|
Private _currentRegion As String = "Johto"
|
|
Private _hiddenabilitychance As Integer = 0
|
|
Private _lightingType As Integer = 0
|
|
Private _isSafariZone As Boolean = False
|
|
Private _isBugCatchingContest As Boolean = False
|
|
|
|
Private _bugCatchingContestData As String = ""
|
|
Private _battleMapData As String = ""
|
|
|
|
' Entity enumerations:
|
|
Private _ownPlayer As OwnPlayer
|
|
Private _ownOverworldPokemon As OverworldPokemon
|
|
|
|
Private _entities As New List(Of Entity)
|
|
Private _floors As New List(Of Entity)
|
|
Private _shaders As New List(Of Shader)
|
|
Private _backdropRenderer As BackdropRenderer
|
|
|
|
Private _networkPlayers As New List(Of NetworkPlayer)
|
|
Private _networkPokemon As New List(Of NetworkPokemon)
|
|
|
|
Private _offsetMapEntities As New List(Of Entity)
|
|
Private _offsetMapFloors As New List(Of Entity)
|
|
|
|
' Radio:
|
|
Private _isRadioOn As Boolean = False
|
|
Private _selectedRadioStation As GameJolt.PokegearScreen.RadioStation = Nothing
|
|
Private _radioChannels As New List(Of Decimal)
|
|
|
|
Private _offsetTimer As New Timers.Timer()
|
|
Private _isUpdatingOffsetMaps As Boolean = False
|
|
|
|
#End Region
|
|
|
|
#Region "Properties"
|
|
|
|
''' <summary>
|
|
''' The Terrain of this level.
|
|
''' </summary>
|
|
Public ReadOnly Property Terrain() As Terrain
|
|
Get
|
|
Return Me._terrain
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' A RouteSign on the top left corner of the screen to display the map's name.
|
|
''' </summary>
|
|
Public ReadOnly Property RouteSign() As RouteSign
|
|
Get
|
|
Return Me._routeSign
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates whether the player is Surfing.
|
|
''' </summary>
|
|
Public Property Surfing() As Boolean
|
|
Get
|
|
Return _isSurfing
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._isSurfing = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates whether the player is Riding.
|
|
''' </summary>
|
|
Public Property Riding() As Boolean
|
|
Get
|
|
Return Me._isRiding
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._isRiding = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Indicates whether the player used Strength already.
|
|
''' </summary>
|
|
Public Property UsedStrength() As Boolean
|
|
Get
|
|
Return Me._usedStrength
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._usedStrength = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The reference to the active OwnPlayer instance.
|
|
''' </summary>
|
|
Public Property OwnPlayer() As OwnPlayer
|
|
Get
|
|
Return Me._ownPlayer
|
|
End Get
|
|
Set(value As OwnPlayer)
|
|
Me._ownPlayer = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The reference to the active OverworldPokemon instance.
|
|
''' </summary>
|
|
Public Property OverworldPokemon() As OverworldPokemon
|
|
Get
|
|
Return Me._ownOverworldPokemon
|
|
End Get
|
|
Set(value As OverworldPokemon)
|
|
Me._ownOverworldPokemon = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of entities composing the map.
|
|
''' </summary>
|
|
Public Property Entities() As List(Of Entity)
|
|
Get
|
|
Return Me._entities
|
|
End Get
|
|
Set(value As List(Of Entity))
|
|
Me._entities = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of floors the player can move on.
|
|
''' </summary>
|
|
Public Property Floors() As List(Of Entity)
|
|
Get
|
|
Return Me._floors
|
|
End Get
|
|
Set(value As List(Of Entity))
|
|
Me._floors = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of shaders that add specific lighting to the map.
|
|
''' </summary>
|
|
Public Property Shaders() As List(Of Shader)
|
|
Get
|
|
Return Me._shaders
|
|
End Get
|
|
Set(value As List(Of Shader))
|
|
Me._shaders = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of players on the server to render.
|
|
''' </summary>
|
|
Public Property NetworkPlayers() As List(Of NetworkPlayer)
|
|
Get
|
|
Return Me._networkPlayers
|
|
End Get
|
|
Set(value As List(Of NetworkPlayer))
|
|
Me._networkPlayers = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of Pokémon on the server to render.
|
|
''' </summary>
|
|
Public Property NetworkPokemon() As List(Of NetworkPokemon)
|
|
Get
|
|
Return Me._networkPokemon
|
|
End Get
|
|
Set(value As List(Of NetworkPokemon))
|
|
Me._networkPokemon = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of entities the offset maps are composed of.
|
|
''' </summary>
|
|
Public Property OffsetmapEntities() As List(Of Entity)
|
|
Get
|
|
Return Me._offsetMapEntities
|
|
End Get
|
|
Set(value As List(Of Entity))
|
|
Me._offsetMapEntities = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The array of floors the offset maps are composed of.
|
|
''' </summary>
|
|
Public Property OffsetmapFloors() As List(Of Entity)
|
|
Get
|
|
Return Me._offsetMapFloors
|
|
End Get
|
|
Set(value As List(Of Entity))
|
|
Me._offsetMapFloors = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The name of the current map.
|
|
''' </summary>
|
|
''' <remarks>This name gets displayed on the RouteSign.</remarks>
|
|
Public Property MapName() As String
|
|
Get
|
|
Return Me._mapName
|
|
End Get
|
|
Set(value As String)
|
|
Me._mapName = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The default background music for this level.
|
|
''' </summary>
|
|
''' <remarks>Doesn't play for Surfing, Riding and Radio.</remarks>
|
|
Public Property MusicLoop() As String
|
|
Get
|
|
Return Me._musicLoop
|
|
End Get
|
|
Set(value As String)
|
|
Me._musicLoop = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The file this level got loaded from.
|
|
''' </summary>
|
|
''' <remarks>The path is relative to the \maps\ or \GameMode\[gamemode]\maps\ path.</remarks>
|
|
Public Property LevelFile() As String
|
|
Get
|
|
Return Me._levelFile
|
|
End Get
|
|
Set(value As String)
|
|
Me._levelFile = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the player can use the move Teleport.
|
|
''' </summary>
|
|
Public Property CanTeleport As Boolean
|
|
Get
|
|
Return Me._canTeleport
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._canTeleport = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the player can use the move Dig or an Escape Rope.
|
|
''' </summary>
|
|
Public Property CanDig As Boolean
|
|
Get
|
|
Return Me._canDig
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._canDig = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the player can use the move Fly.
|
|
''' </summary>
|
|
Public Property CanFly As Boolean
|
|
Get
|
|
Return Me._canFly
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._canFly = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The type of Ride the player can use on this map.
|
|
''' </summary>
|
|
''' <remarks>0 = Depends on CanDig and CanFly, 1 = True, 2 = False</remarks>
|
|
Public Property RideType As Integer
|
|
Get
|
|
Return Me._rideType
|
|
End Get
|
|
Set(value As Integer)
|
|
Me._rideType = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The Weather on this map.
|
|
''' </summary>
|
|
''' <remarks>For the weather, look at the WeatherTypes enumeration in World.vb</remarks>
|
|
Public Property WeatherType As Integer
|
|
Get
|
|
Return Me._weatherType
|
|
End Get
|
|
Set(value As Integer)
|
|
Me._weatherType = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The environment type for this map.
|
|
''' </summary>
|
|
Public Property EnvironmentType As Integer
|
|
Get
|
|
Return Me._environmentType
|
|
End Get
|
|
Set(value As Integer)
|
|
Me._environmentType = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the player can encounter wild Pokémon in the Grass entities.
|
|
''' </summary>
|
|
Public Property WildPokemonGrass As Boolean
|
|
Get
|
|
Return Me._wildPokemonGrass
|
|
End Get
|
|
Set(value As Boolean)
|
|
_wildPokemonGrass = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the player can encounter wild Pokémon on every floor tile.
|
|
''' </summary>
|
|
Public Property WildPokemonFloor As Boolean
|
|
Get
|
|
Return Me._wildPokemonFloor
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._wildPokemonFloor = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the player can encounter wild Pokémon while Surfing.
|
|
''' </summary>
|
|
Public Property WildPokemonWater As Boolean
|
|
Get
|
|
Return Me._wildPokemonWater
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._wildPokemonWater = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the map is dark, and needs to be lightened up by Flash.
|
|
''' </summary>
|
|
Public Property IsDark As Boolean
|
|
Get
|
|
Return Me._isDark
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._isDark = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the Overworld Pokémon is visible.
|
|
''' </summary>
|
|
Public Property ShowOverworldPokemon As Boolean
|
|
Get
|
|
Return Me._showOverworldPokemon
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._showOverworldPokemon = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The amount of walked steps on this map.
|
|
''' </summary>
|
|
Public Property WalkedSteps As Integer
|
|
Get
|
|
Return Me._walkedSteps
|
|
End Get
|
|
Set(value As Integer)
|
|
Me._walkedSteps = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The region this map is assigned to.
|
|
''' </summary>
|
|
''' <remarks>The default is "Johto".</remarks>
|
|
Public Property CurrentRegion As String
|
|
Get
|
|
Return Me._currentRegion
|
|
End Get
|
|
Set(value As String)
|
|
Me._currentRegion = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Chance of a Hidden Ability being on a wild Pokémon.
|
|
''' </summary>
|
|
Public Property HiddenAbilityChance As Integer
|
|
Get
|
|
Return Me._hiddenabilitychance
|
|
End Get
|
|
Set(value As Integer)
|
|
Me._hiddenabilitychance = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The LightingType of this map. More information in the Level\UpdateLighting.
|
|
''' </summary>
|
|
Public Property LightingType As Integer
|
|
Get
|
|
Return Me._lightingType
|
|
End Get
|
|
Set(value As Integer)
|
|
Me._lightingType = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the map is a part of the Safari Zone. This changes the Battle Menu and the Menu Screen.
|
|
''' </summary>
|
|
Public Property IsSafariZone As Boolean
|
|
Get
|
|
Return Me._isSafariZone
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._isSafariZone = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the map is a part of the Bug Catching Contest. This changes the Battle Menu and the Menu Screen.
|
|
''' </summary>
|
|
Public Property IsBugCatchingContest As Boolean
|
|
Get
|
|
Return Me._isBugCatchingContest
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._isBugCatchingContest = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Holds data for the Bug Catching Contest.
|
|
''' </summary>
|
|
''' <remarks>Composed of 3 values, separated by ",": 0 = script location for ending the contest, 1 = script location for selecting the remaining balls item, 2 = Menu Item name for the remaining balls item.</remarks>
|
|
Public Property BugCatchingContestData As String
|
|
Get
|
|
Return Me._bugCatchingContestData
|
|
End Get
|
|
Set(value As String)
|
|
Me._bugCatchingContestData = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Used to modify the Battle Map camera position.
|
|
''' </summary>
|
|
''' <remarks>Data: MapName,x,y,z OR Mapname OR x,y,z OR empty</remarks>
|
|
Public Property BattleMapData() As String
|
|
Get
|
|
Return Me._battleMapData
|
|
End Get
|
|
Set(value As String)
|
|
Me._battleMapData = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Used to modify the Battle Map.
|
|
''' </summary>
|
|
''' <remarks>Data: MapName,x,y,z OR Mapname OR empty</remarks>
|
|
Public Property SurfingBattleMapData As String
|
|
|
|
''' <summary>
|
|
''' The instance of the World class, handling time, season and weather based operations.
|
|
''' </summary>
|
|
Public Property World() As World
|
|
Get
|
|
Return Me._world
|
|
End Get
|
|
Set(value As World)
|
|
Me._world = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Whether the Radio is currently activated.
|
|
''' </summary>
|
|
Public Property IsRadioOn() As Boolean
|
|
Get
|
|
Return Me._isRadioOn
|
|
End Get
|
|
Set(value As Boolean)
|
|
Me._isRadioOn = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The currently selected Radio station. If possible, this will replace the Music Loop.
|
|
''' </summary>
|
|
Public Property SelectedRadioStation() As GameJolt.PokegearScreen.RadioStation
|
|
Get
|
|
Return Me._selectedRadioStation
|
|
End Get
|
|
Set(value As GameJolt.PokegearScreen.RadioStation)
|
|
Me._selectedRadioStation = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Allowed Radio channels on this map.
|
|
''' </summary>
|
|
Public Property AllowedRadioChannels() As List(Of Decimal)
|
|
Get
|
|
Return Me._radioChannels
|
|
End Get
|
|
Set(value As List(Of Decimal))
|
|
Me._radioChannels = value
|
|
End Set
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' Handles wild Pokémon encounters.
|
|
''' </summary>
|
|
Public ReadOnly Property PokemonEncounter() As PokemonEncounter
|
|
Get
|
|
Return Me._pokemonEncounter
|
|
End Get
|
|
End Property
|
|
|
|
''' <summary>
|
|
''' The backdrop renderer of this level.
|
|
''' </summary>
|
|
Public ReadOnly Property BackdropRenderer() As BackdropRenderer
|
|
Get
|
|
Return _backdropRenderer
|
|
End Get
|
|
End Property
|
|
|
|
#End Region
|
|
|
|
#Region "Structures"
|
|
|
|
''' <summary>
|
|
''' A structure to store warp data in.
|
|
''' </summary>
|
|
Public Structure WarpDataStruct
|
|
''' <summary>
|
|
''' The destination map file.
|
|
''' </summary>
|
|
Public WarpDestination As String
|
|
|
|
''' <summary>
|
|
''' The position to warp the player to.
|
|
''' </summary>
|
|
Public WarpPosition As Vector3
|
|
|
|
''' <summary>
|
|
''' The check to see if the player should get warped next tick.
|
|
''' </summary>
|
|
Public DoWarpInNextTick As Boolean
|
|
|
|
''' <summary>
|
|
''' Amount of 90° rotations counterclockwise.
|
|
''' </summary>
|
|
Public WarpRotations As Integer
|
|
|
|
''' <summary>
|
|
''' The correct camera yaw to set the camera to after the warping.
|
|
''' </summary>
|
|
Public CorrectCameraYaw As Single
|
|
|
|
''' <summary>
|
|
''' If the warp action got triggered by a warp block.
|
|
''' </summary>
|
|
Public IsWarpBlock As Boolean
|
|
End Structure
|
|
|
|
''' <summary>
|
|
''' A structure to store wild Pokémon encounter data in.
|
|
''' </summary>
|
|
Public Structure PokemonEcounterDataStruct
|
|
''' <summary>
|
|
''' The assumed position the player will be in when encounterning the Pokémon.
|
|
''' </summary>
|
|
Public Position As Vector3
|
|
|
|
''' <summary>
|
|
''' Whether the player encountered a Pokémon.
|
|
''' </summary>
|
|
Public EncounteredPokemon As Boolean
|
|
|
|
''' <summary>
|
|
''' The encounter method.
|
|
''' </summary>
|
|
Public Method As Spawner.EncounterMethods
|
|
|
|
''' <summary>
|
|
''' The link to the .poke file used to spawn the Pokémon in.
|
|
''' </summary>
|
|
Public PokeFile As String
|
|
End Structure
|
|
|
|
#End Region
|
|
|
|
''' <summary>
|
|
''' Creates a new instance of the Level class.
|
|
''' </summary>
|
|
Public Sub New()
|
|
Me._routeSign = New RouteSign()
|
|
Me.WarpData = New WarpDataStruct()
|
|
Me.PokemonEncounterData = New PokemonEcounterDataStruct()
|
|
Me._pokemonEncounter = New PokemonEncounter(Me)
|
|
|
|
Me.StartOffsetMapUpdate()
|
|
|
|
Me._backdropRenderer = New BackdropRenderer()
|
|
Me._backdropRenderer.Initialize()
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Initializes the offset map update cycle.
|
|
''' </summary>
|
|
Public Sub StartOffsetMapUpdate()
|
|
If Not Me._offsetTimer Is Nothing Then
|
|
Me._offsetTimer.Stop()
|
|
End If
|
|
|
|
Me._offsetTimer = New Timers.Timer()
|
|
Me._offsetTimer.Interval = 16
|
|
Me._offsetTimer.AutoReset = True
|
|
AddHandler Me._offsetTimer.Elapsed, AddressOf Me.UpdateOffsetMap
|
|
Me._offsetTimer.Start()
|
|
|
|
Logger.Debug("Started Offset map update")
|
|
End Sub
|
|
|
|
Public Sub StopOffsetMapUpdate()
|
|
Me._offsetTimer.Stop()
|
|
While Me._isUpdatingOffsetMaps
|
|
Thread.Sleep(1)
|
|
End While
|
|
|
|
Logger.Debug("Stopped Offset map update")
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Loads a level from a levelfile.
|
|
''' </summary>
|
|
''' <param name="Levelpath">The path to load the level from. Start with "|" to prevent loading a levelfile.</param>
|
|
Public Sub Load(ByVal Levelpath As String)
|
|
|
|
' copy all changed files
|
|
If GameController.IS_DEBUG_ACTIVE Then
|
|
DebugFileWatcher.TriggerReload()
|
|
End If
|
|
|
|
' Create a parameter array to pass over to the LevelLoader:
|
|
Dim params As New List(Of Object)
|
|
params.AddRange({Levelpath, False, New Vector3(0, 0, 0), 0, New List(Of String)})
|
|
|
|
' Create the world and load the level:
|
|
World = New World(0, 0)
|
|
|
|
If Levelpath.StartsWith("|") = False Then
|
|
Me.StopOffsetMapUpdate()
|
|
Dim levelLoader As New LevelLoader()
|
|
levelLoader.LoadLevel(params.ToArray())
|
|
Else
|
|
Logger.Debug("Don't attempt to load a levelfile.")
|
|
End If
|
|
|
|
' Create own player entity and OverworldPokémon entity and add them to the entity enumeration:
|
|
OwnPlayer = New OwnPlayer(0, 0, 0, {TextureManager.DefaultTexture}, Core.Player.Skin, 0, 0, "", "Gold", 0)
|
|
OverworldPokemon = New OverworldPokemon(Screen.Camera.Position.X, Screen.Camera.Position.Y, Screen.Camera.Position.Z + 1)
|
|
OverworldPokemon.ChangeRotation()
|
|
Entities.AddRange({OwnPlayer, OverworldPokemon})
|
|
|
|
Me.Surfing = Core.Player.startSurfing
|
|
Me.StartOffsetMapUpdate()
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Renders the level.
|
|
''' </summary>
|
|
Public Sub Draw()
|
|
Me._backdropRenderer.Draw()
|
|
|
|
' Set the effect's View and Projection matrices:
|
|
Screen.Effect.View = Screen.Camera.View
|
|
Screen.Effect.Projection = Screen.Camera.Projection
|
|
|
|
' Reset the Debug values:
|
|
DebugDisplay.DrawnVertices = 0
|
|
DebugDisplay.MaxVertices = 0
|
|
DebugDisplay.MaxDistance = 0
|
|
|
|
Dim AllEntities As New List(Of Entity)
|
|
Dim AllFloors As New List(Of Entity)
|
|
|
|
AllEntities.AddRange(Entities)
|
|
AllFloors.AddRange(Floors)
|
|
|
|
If Core.GameOptions.LoadOffsetMaps > 0 Then
|
|
AllEntities.AddRange(OffsetmapEntities)
|
|
AllFloors.AddRange(OffsetmapFloors)
|
|
End If
|
|
|
|
AllEntities = (From f In AllEntities Order By f.CameraDistance Descending).ToList()
|
|
AllFloors = (From f In AllFloors Order By f.CameraDistance Descending).ToList()
|
|
|
|
'Render floors:
|
|
For i = 0 To AllFloors.Count - 1
|
|
If i <= AllFloors.Count - 1 Then
|
|
AllFloors(i).Render()
|
|
DebugDisplay.MaxVertices += AllFloors(i).VertexCount
|
|
End If
|
|
Next
|
|
|
|
'Render all other entities:
|
|
For i = 0 To AllEntities.Count - 1
|
|
If i <= AllEntities.Count - 1 Then
|
|
AllEntities(i).Render()
|
|
DebugDisplay.MaxVertices += AllEntities(i).VertexCount
|
|
End If
|
|
Next
|
|
|
|
If IsDark = True Then
|
|
DrawFlashOverlay()
|
|
End If
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Updates the level's logic.
|
|
''' </summary>
|
|
Public Sub Update()
|
|
Me._backdropRenderer.Update()
|
|
|
|
Me.UpdatePlayerWarp()
|
|
Me._pokemonEncounter.TriggerBattle()
|
|
|
|
' Reload map from file (Debug or Sandbox Mode):
|
|
If GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then
|
|
If KeyBoardHandler.KeyPressed(Keys.R) = True And Core.CurrentScreen.Identification = Screen.Identifications.OverworldScreen Then
|
|
Core.OffsetMaps.Clear()
|
|
Logger.Debug(String.Format("Reload map file: {0}", Me._levelFile))
|
|
Me.Load(LevelFile)
|
|
End If
|
|
End If
|
|
|
|
' Update all network players and Pokémon:
|
|
If JoinServerScreen.Online = True Then
|
|
Core.ServersManager.PlayerManager.UpdatePlayers()
|
|
End If
|
|
|
|
' Call Update and UpdateEntity methods of all entities:
|
|
Me.UpdateEntities()
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Updates all entities on the map and offset map and sorts the enumarations.
|
|
''' </summary>
|
|
Public Sub UpdateEntities()
|
|
' Update and remove entities:
|
|
If LevelLoader.IsBusy = False Then
|
|
For i = 0 To Entities.Count - 1
|
|
If i <= Entities.Count - 1 Then
|
|
If Entities.Count - 1 >= i AndAlso Entities(i).CanBeRemoved Then
|
|
Entities.RemoveAt(i)
|
|
i -= 1
|
|
Else
|
|
If Entities(i).NeedsUpdate Then
|
|
Entities(i).Update()
|
|
End If
|
|
|
|
' UpdateEntity for all entities:
|
|
Me.Entities(i).UpdateEntity()
|
|
End If
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
' UpdateEntity for all floors:
|
|
For i = 0 To Me.Floors.Count - 1
|
|
If i <= Me.Floors.Count - 1 Then
|
|
Me.Floors(i).UpdateEntity()
|
|
End If
|
|
Next
|
|
|
|
Me.SortEntities()
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Sorts the entity enumerations.
|
|
''' </summary>
|
|
Public Sub SortEntities()
|
|
If LevelLoader.IsBusy = False Then
|
|
Entities = (From f In Entities Order By f.CameraDistance Descending).ToList()
|
|
End If
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Sorts and updates offset map entities.
|
|
''' </summary>
|
|
Public Sub UpdateOffsetMap()
|
|
Me._isUpdatingOffsetMaps = True
|
|
If Core.GameOptions.LoadOffsetMaps > 0 Then
|
|
' The Update function of entities on offset maps are not getting called.
|
|
|
|
If Me._offsetMapUpdateDelay <= 0 Then ' Only when the delay is 0, update.
|
|
' Sort the list:
|
|
If LevelLoader.IsBusy = False Then
|
|
OffsetmapEntities = (From e In OffsetmapEntities Order By e.CameraDistance Descending).ToList()
|
|
End If
|
|
|
|
Me._offsetMapUpdateDelay = Core.GameOptions.LoadOffsetMaps - 1 'Set the new delay
|
|
|
|
' Remove entities that CanBeRemoved (see what I did there?):
|
|
' Now it also updates the remaining entities.
|
|
For i = 0 To OffsetmapEntities.Count - 1
|
|
If i <= OffsetmapEntities.Count - 1 Then
|
|
If OffsetmapEntities(i).CanBeRemoved Then
|
|
OffsetmapEntities.RemoveAt(i)
|
|
i -= 1
|
|
Else
|
|
OffsetmapEntities(i).UpdateEntity()
|
|
End If
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next
|
|
|
|
' Call UpdateEntity on all offset map floors:
|
|
For i = Me.OffsetmapFloors.Count - 1 To 0 Step -1
|
|
If i <= Me.OffsetmapFloors.Count - 1 Then
|
|
Me.OffsetmapFloors(i).UpdateEntity()
|
|
End If
|
|
Next
|
|
Else
|
|
Me._offsetMapUpdateDelay -= 1
|
|
End If
|
|
End If
|
|
Me._isUpdatingOffsetMaps = False
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Renders offset map entities.
|
|
''' </summary>
|
|
Private Sub RenderOffsetMap()
|
|
' Render floors:
|
|
For i = 0 To Me.OffsetmapFloors.Count - 1
|
|
If i <= Me.OffsetmapFloors.Count - 1 Then
|
|
If Not Me.OffsetmapFloors(i) Is Nothing Then
|
|
Me.OffsetmapFloors(i).Render()
|
|
DebugDisplay.MaxVertices += Me.OffsetmapFloors(i).VertexCount
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
' Render entities:
|
|
For i = 0 To Me.OffsetmapEntities.Count - 1
|
|
If i <= Me.OffsetmapEntities.Count - 1 Then
|
|
If Not Me.OffsetmapEntities(i) Is Nothing Then
|
|
Me.OffsetmapEntities(i).Render()
|
|
DebugDisplay.MaxVertices += Me.OffsetmapEntities(i).VertexCount
|
|
End If
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Draws the flash overlay to the screen.
|
|
''' </summary>
|
|
Private Sub DrawFlashOverlay()
|
|
Core.SpriteBatch.Draw(TextureManager.GetTexture("GUI\Overworld\flash_overlay"), New Rectangle(0, 0, Core.windowSize.Width, Core.windowSize.Height), Color.White)
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Handles warp events for the player.
|
|
''' </summary>
|
|
Private Sub UpdatePlayerWarp()
|
|
If WarpData.DoWarpInNextTick = True Then ' If a warp event got scheduled.
|
|
' Disable wild Pokémon:
|
|
Me._wildPokemonFloor = False
|
|
Me.PokemonEncounterData.EncounteredPokemon = False
|
|
|
|
' Set the Surfing flag for the next map:
|
|
Core.Player.startSurfing = Surfing
|
|
|
|
' Change the player position:
|
|
Screen.Camera.Position = WarpData.WarpPosition
|
|
|
|
Dim tempProperties As String = Me.CanDig.ToString() & "," & Me.CanFly.ToString() ' Store properties to determine if the "enter" sound should be played.
|
|
|
|
' Store skin values:
|
|
Dim usingGameJoltTexture As Boolean = OwnPlayer.UsingGameJoltTexture
|
|
Core.Player.Skin = OwnPlayer.SkinName
|
|
|
|
' Load the new level:
|
|
Dim params As New List(Of Object)
|
|
params.AddRange({WarpData.WarpDestination, False, New Vector3(0, 0, 0), 0, New List(Of String)})
|
|
|
|
World = New World(0, 0)
|
|
|
|
Me.StopOffsetMapUpdate()
|
|
Dim levelLoader As New LevelLoader()
|
|
levelLoader.LoadLevel(params.ToArray())
|
|
|
|
Core.Player.AddVisitedMap(Me.LevelFile) ' Add new map to visited maps list.
|
|
UsedStrength = False ' Disable Strength usuage upon map switch.
|
|
Me.Surfing = Core.Player.startSurfing ' Set the Surfing property after map switch.
|
|
|
|
' Create player and Pokémon entities:
|
|
OwnPlayer = New OwnPlayer(0, 0, 0, {TextureManager.DefaultTexture}, Core.Player.Skin, 0, 0, "", "Gold", 0)
|
|
OwnPlayer.SetTexture(Core.Player.Skin, usingGameJoltTexture)
|
|
|
|
OverworldPokemon = New OverworldPokemon(Screen.Camera.Position.X, Screen.Camera.Position.Y, Screen.Camera.Position.Z + 1)
|
|
OverworldPokemon.Visible = False
|
|
OverworldPokemon.warped = True
|
|
Entities.AddRange({OwnPlayer, OverworldPokemon})
|
|
|
|
' Set Ride skin, if needed:
|
|
If Riding = True And CanRide() = False Then
|
|
Riding = False
|
|
OwnPlayer.SetTexture(Core.Player.TempRideSkin, True)
|
|
Core.Player.Skin = Core.Player.TempRideSkin
|
|
End If
|
|
|
|
' If any turns after the warp are defined, apply them:
|
|
Screen.Camera.InstantTurn(WarpData.WarpRotations)
|
|
|
|
' Make the RouteSign appear:
|
|
Me._routeSign.Setup(MapName)
|
|
|
|
' Play the correct music track:
|
|
If IsRadioOn = True AndAlso GameJolt.PokegearScreen.StationCanPlay(Me.SelectedRadioStation) = True Then
|
|
MusicManager.Play(SelectedRadioStation.Music, True)
|
|
Else
|
|
IsRadioOn = False
|
|
If Me.Surfing = True Then
|
|
MusicManager.Play("surf", True)
|
|
Else
|
|
If Me.Riding = True Then
|
|
MusicManager.Play("ride", True)
|
|
Else
|
|
MusicManager.Play(MusicLoop, True)
|
|
End If
|
|
End If
|
|
End If
|
|
|
|
' Initialize the world with newly loaded environment variables:
|
|
World.Initialize(Screen.Level.EnvironmentType, Screen.Level.WeatherType)
|
|
|
|
' If this map is on the restplaces list, set the player's last restplace to this map:
|
|
Dim restplaces As List(Of String) = System.IO.File.ReadAllLines(GameModeManager.GetMapPath("restplaces.dat")).ToList()
|
|
|
|
For Each line As String In restplaces
|
|
Dim place As String = line.GetSplit(0, "|")
|
|
If place = LevelFile Then
|
|
Core.Player.LastRestPlace = place
|
|
Core.Player.LastRestPlacePosition = line.GetSplit(1, "|")
|
|
End If
|
|
Next
|
|
|
|
' If the warp happened through a warp block, make the player walk one step forward after switching to the new map:
|
|
If Screen.Camera.IsMoving = True And WarpData.IsWarpBlock = True Then
|
|
Screen.Camera.StopMovement()
|
|
Screen.Camera.Move(1.0F)
|
|
End If
|
|
|
|
' Because of the map change, Roaming Pokémon are moving to their next location on the world map:
|
|
RoamingPokemon.ShiftRoamingPokemon(-1)
|
|
|
|
' Check if the enter sound should be played by checking if CanDig or CanFly properties are different from the last map:
|
|
If tempProperties <> Me.CanDig.ToString() & "," & Me.CanFly.ToString() Then
|
|
SoundManager.PlaySound("enter", False)
|
|
ElseIf tempProperties = "True,False" And Me.CanDig = True And Me.CanFly = False Then
|
|
SoundManager.PlaySound("enter", False)
|
|
ElseIf tempProperties = "False,False" And Me.CanDig = False And Me.CanFly = False Then
|
|
SoundManager.PlaySound("enter", False)
|
|
End If
|
|
|
|
' Unlock the yaw on the camera:
|
|
CType(Screen.Camera, OverworldCamera).YawLocked = False
|
|
NetworkPlayer.ScreenRegionChanged()
|
|
|
|
' If a warp occured, update the camera:
|
|
Screen.Camera.Update()
|
|
|
|
' Disable the warp check:
|
|
Me.WarpData.DoWarpInNextTick = False
|
|
WarpData.IsWarpBlock = False
|
|
|
|
If Core.ServersManager.ServerConnection.Connected = True Then
|
|
' Update network players:
|
|
Core.ServersManager.PlayerManager.NeedsUpdate = True
|
|
End If
|
|
|
|
End If
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Returns a list of all NPCs on the map.
|
|
''' </summary>
|
|
Public Function GetNPCs() As List(Of NPC)
|
|
Dim reList As New List(Of NPC)
|
|
|
|
For Each Entity As Entity In Me.Entities
|
|
If Entity.EntityID = "NPC" Then
|
|
reList.Add(CType(Entity, NPC))
|
|
End If
|
|
Next
|
|
|
|
Return reList
|
|
End Function
|
|
|
|
''' <summary>
|
|
''' Returns an NPC based on their ID.
|
|
''' </summary>
|
|
''' <param name="ID">The ID of the NPC to return from the level.</param>
|
|
''' <returns>Returns either a matching NPC or Nothing.</returns>
|
|
Public Function GetNPC(ByVal ID As Integer) As NPC
|
|
For Each NPC As NPC In GetNPCs()
|
|
If NPC.NPCID = ID Then
|
|
Return NPC
|
|
End If
|
|
Next
|
|
|
|
Return Nothing
|
|
End Function
|
|
|
|
''' <summary>
|
|
''' Returns an NPC based on the entity ID.
|
|
''' </summary>
|
|
Public Function GetEntity(ByVal ID As Integer) As Entity
|
|
If ID = -1 Then
|
|
Throw New Exception("-1 is the default value for NOT having an ID, therefore is not a valid ID.")
|
|
Else
|
|
For Each ent As Entity In Me.Entities
|
|
If ent.ID = ID Then
|
|
Return ent
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
Return Nothing
|
|
End Function
|
|
|
|
''' <summary>
|
|
''' Checks all NPCs on the map for if the player is in their line of sight.
|
|
''' </summary>
|
|
Public Sub CheckTrainerSights()
|
|
For Each Entity As Entity In Entities
|
|
If Entity.EntityID = "NPC" Then
|
|
Dim NPC As NPC = CType(Entity, NPC)
|
|
If NPC.IsTrainer = True Then
|
|
NPC.CheckInSight()
|
|
End If
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
''' <summary>
|
|
''' Determines whether the player can use Ride on this map.
|
|
''' </summary>
|
|
Public Function CanRide() As Boolean
|
|
If GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then 'Always true for Sandboxmode and Debug mode.
|
|
Return True
|
|
End If
|
|
If RideType > 0 Then
|
|
Select Case RideType
|
|
Case 1
|
|
Return True
|
|
Case 2
|
|
Return False
|
|
End Select
|
|
End If
|
|
If Screen.Level.CanDig = False And Screen.Level.CanFly = False Then
|
|
Return False
|
|
Else
|
|
Return True
|
|
End If
|
|
End Function
|
|
|
|
''' <summary>
|
|
''' Whether the player can move based on the entity around him.
|
|
''' </summary>
|
|
Public Function CanMove() As Boolean
|
|
For Each e As Entity In Me.Entities
|
|
If e.Position.X = Screen.Camera.Position.X And e.Position.Z = Screen.Camera.Position.Z And CInt(e.Position.Y) = CInt(Screen.Camera.Position.Y) Then
|
|
Return e.LetPlayerMove()
|
|
End If
|
|
Next
|
|
Return True
|
|
End Function
|
|
|
|
End Class |