104 lines
2.8 KiB
GDScript
104 lines
2.8 KiB
GDScript
class_name OverworldSingleton extends Node
|
|
|
|
signal mapChanged(map:PackedScene, playerDestinationNodeName:String)
|
|
|
|
var newMapPath:String
|
|
var hasFadedOut:bool = false
|
|
var playerDestinationNodeName:String
|
|
var newMapLoaded:bool = false
|
|
|
|
var _dialogueEntities:Dictionary = {}
|
|
var _playerEntity:Entity = null
|
|
|
|
func registerDialogueEntity(entity:Entity) -> void:
|
|
_dialogueEntities[entity.dialogueName.to_lower()] = entity
|
|
if entity.movementType == Entity.MovementType.PLAYER:
|
|
_playerEntity = entity
|
|
|
|
func unregisterDialogueEntity(entity:Entity) -> void:
|
|
_dialogueEntities.erase(entity.dialogueName.to_lower())
|
|
if _playerEntity == entity:
|
|
_playerEntity = null
|
|
|
|
func getEntityByDialogueName(dialogueName:String) -> Entity:
|
|
return _dialogueEntities.get(dialogueName.to_lower(), null)
|
|
|
|
func getPlayerEntity() -> Entity:
|
|
return _playerEntity
|
|
|
|
func isMapChanging() -> bool:
|
|
return newMapPath != ""
|
|
|
|
func _enter_tree() -> void:
|
|
pass
|
|
|
|
func _exit_tree() -> void:
|
|
TRANSITION.fadeOutEnd.disconnect(onFadeOutEnd)
|
|
TRANSITION.fadeInEnd.disconnect(onFadeInEnd)
|
|
|
|
func _process(_delta:float) -> void:
|
|
if(!isMapChanging()):
|
|
return
|
|
|
|
var status = ResourceLoader.load_threaded_get_status(newMapPath)
|
|
if status == ResourceLoader.THREAD_LOAD_FAILED:
|
|
push_error("Failed to load map: " + newMapPath)
|
|
newMapPath = ""
|
|
|
|
elif status == ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
|
|
push_error("Failed to load map: " + newMapPath)
|
|
newMapPath = ""
|
|
|
|
elif status == ResourceLoader.THREAD_LOAD_IN_PROGRESS:
|
|
print("Map loading in progress for: " + newMapPath)
|
|
|
|
elif status == ResourceLoader.THREAD_LOAD_LOADED:
|
|
newMapLoaded = true
|
|
newMapReady()
|
|
|
|
|
|
|
|
func mapChange(map:String, playerDestinationNodeName:String) -> void:
|
|
# Begin Loading new map
|
|
newMapPath = map
|
|
playerDestinationNodeName = playerDestinationNodeName
|
|
ResourceLoader.load_threaded_request(newMapPath)
|
|
|
|
# Begin fadeout
|
|
hasFadedOut = false
|
|
TRANSITION.fade(TransitionSingleton.FadeType.FADE_OUT)
|
|
TRANSITION.fadeOutEnd.connect(onFadeOutEnd)
|
|
|
|
func onFadeOutEnd() -> void:
|
|
# Fade out has occurred, are we still waiting for the map to load?
|
|
TRANSITION.fadeOutEnd.disconnect(onFadeOutEnd)
|
|
hasFadedOut = true
|
|
|
|
# Make sure we aren't still waiting for the map to load.
|
|
if !newMapLoaded:
|
|
return
|
|
newMapReady()
|
|
|
|
func newMapReady():
|
|
if !hasFadedOut:
|
|
return
|
|
|
|
# Instantiate the new map
|
|
var mapResource = ResourceLoader.load_threaded_get(newMapPath)
|
|
if mapResource == null:
|
|
push_error("Failed to load map resource: " + newMapPath)
|
|
return
|
|
|
|
# Stop tracking new map name
|
|
newMapPath = ""
|
|
|
|
# Emit event
|
|
mapChanged.emit(mapResource, playerDestinationNodeName)
|
|
|
|
# Begin Fade In
|
|
TRANSITION.fade(TransitionSingleton.FadeType.FADE_IN)
|
|
TRANSITION.fadeInEnd.connect(onFadeInEnd)
|
|
|
|
func onFadeInEnd() -> void:
|
|
TRANSITION.fadeInEnd.disconnect(onFadeInEnd)
|