2024-09-27 21:30:35 +02:00
extends Node
2024-10-01 23:19:37 +02:00
const mainmenu_player_pos : Vector2 = Vector2 ( 0 , 128 + 32 )
2024-09-27 21:30:35 +02:00
class Entrypoint extends Object :
var scene_name : String
var player_position : Vector2
2024-10-02 22:18:52 +02:00
var keep_velocity : bool
2024-10-01 23:19:37 +02:00
var initial_velocity : Vector2
2024-09-27 21:30:35 +02:00
func _init (
scene_name_ : String ,
player_position_ : Vector2 ,
2024-10-02 22:18:52 +02:00
# keep player velocity
# if player velocity is zero, use initial_velocity
keep_velocity_ : bool = true ,
# initial player velocity
2024-10-01 23:19:37 +02:00
initial_velocity_ : Vector2 = Vector2 . ZERO
2024-09-27 21:30:35 +02:00
) - > void :
self . scene_name = scene_name_
self . player_position = player_position_
2024-10-02 22:18:52 +02:00
self . keep_velocity = keep_velocity_
2024-10-01 23:19:37 +02:00
self . initial_velocity = initial_velocity_
2024-09-27 21:30:35 +02:00
const SCENES = {
2024-10-03 13:08:31 +02:00
" menu " : " uid://bqmpoix37kutp " ,
2024-10-01 23:19:37 +02:00
" intro " : " uid://c6w7lrydi43ts " ,
" test " : " uid://dqf665b540tfg " ,
2024-09-27 21:30:35 +02:00
}
2024-10-02 22:18:52 +02:00
var MENU_SCENE : PackedScene = preload ( " res://menu/menu.tscn " )
2024-09-27 21:30:35 +02:00
var ENTRYPOINTS = {
2024-10-02 22:18:52 +02:00
" intro_start " : Entrypoint . new ( " intro " , Vector2 ( 0 , 0 ) ) ,
2024-10-03 10:45:49 +02:00
" test " : Entrypoint . new ( " test " , Vector2 ( 1680 , 200 ) , false , Vector2 ( 0 , - 500 ) ) ,
2024-09-27 21:30:35 +02:00
}
# load that stuff
2024-10-02 22:18:52 +02:00
var current_scene_name : String = " "
2024-10-01 23:19:37 +02:00
func _pre_load_checks ( ) - > bool :
if NodeRegistry . level_root_container == null :
2024-10-03 13:08:31 +02:00
push_error ( " Can ' t load level, level_root_container is not registered yet. " )
return false
if NodeRegistry . level_text_root_container == null :
push_error ( " Can ' t load level, level_text_root_container is not registered yet. " )
2024-10-01 23:19:37 +02:00
return false
if NodeRegistry . player == null :
push_error ( " Can ' t load entrypoint, player is not registered yet. " )
return false
return true
2024-09-27 21:30:35 +02:00
2024-10-02 22:18:52 +02:00
func load_scene ( scn_name : String , force_reload : bool = false ) - > bool :
# returns true on success
if current_scene_name == scn_name and not force_reload :
return true # nothing to do :)
2024-10-01 23:19:37 +02:00
if not _pre_load_checks ( ) :
2024-09-27 21:30:35 +02:00
return false
if not scn_name in SCENES :
push_error ( " Level " + scn_name + " doesn ' t exist. " )
return false
unload_scene ( )
2024-10-03 13:08:31 +02:00
var scn : Node2D = load ( SCENES [ scn_name ] ) . instantiate ( )
NodeRegistry . level_root_container . add_child ( scn )
for t in get_tree ( ) . get_nodes_in_group ( " text_viewport " ) :
t . reparent ( NodeRegistry . level_text_root_container )
2024-09-27 21:30:35 +02:00
return true
func unload_scene ( ) :
2024-10-03 13:08:31 +02:00
for container in [
NodeRegistry . level_root_container ,
NodeRegistry . level_text_root_container
] :
if container != null :
for c in container . get_children ( ) :
c . queue_free ( )
2024-09-27 21:30:35 +02:00
func load_entrypoint ( ep_name : String ) - > bool : # returns true on success
if not ep_name in ENTRYPOINTS :
push_error ( " Entrypoint " + ep_name + " doesn ' t exist. " )
return false
2024-10-01 23:19:37 +02:00
if not _pre_load_checks ( ) :
2024-09-27 21:30:35 +02:00
return false
var e : Entrypoint = ENTRYPOINTS [ ep_name ]
if load_scene ( e . scene_name ) :
2024-10-01 23:19:37 +02:00
NodeRegistry . player . position = e . player_position
2024-10-03 10:45:49 +02:00
NodeRegistry . player . camera . call_deferred ( " reset_smoothing " )
2024-10-02 22:18:52 +02:00
if not e . keep_velocity or NodeRegistry . player . velocity == Vector2 . ZERO :
NodeRegistry . player . velocity = e . initial_velocity
2024-10-01 23:19:37 +02:00
Gamestate . last_entrypoint = ep_name
Gamestate . save_slot ( ) # save game
2024-09-27 21:30:35 +02:00
return true
else :
return false
2024-10-01 23:19:37 +02:00
func load_menu ( ) :
if not _pre_load_checks ( ) :
return false
unload_scene ( )
NodeRegistry . player . position = mainmenu_player_pos
2024-10-03 13:08:31 +02:00
return load_scene ( " menu " , true )