From c6b91c31f25feddfdafc39f3e52ec4c066170131 Mon Sep 17 00:00:00 2001 From: ChaoticByte Date: Wed, 2 Oct 2024 22:18:52 +0200 Subject: [PATCH] Add Entrypoint.keep_velocity and optimize level/entrypoint loading code --- core/globals/levels.gd | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/core/globals/levels.gd b/core/globals/levels.gd index c7f3921..f3b5af8 100644 --- a/core/globals/levels.gd +++ b/core/globals/levels.gd @@ -5,30 +5,37 @@ const mainmenu_player_pos: Vector2 = Vector2(0, 128 + 32) class Entrypoint extends Object: var scene_name: String var player_position: Vector2 + var keep_velocity: bool var initial_velocity: Vector2 func _init( scene_name_: String, player_position_: Vector2, + # keep player velocity + # if player velocity is zero, use initial_velocity + keep_velocity_: bool = true, + # initial player velocity initial_velocity_: Vector2 = Vector2.ZERO ) -> void: self.scene_name = scene_name_ self.player_position = player_position_ + self.keep_velocity = keep_velocity_ self.initial_velocity = initial_velocity_ const SCENES = { "intro": "uid://c6w7lrydi43ts", "test": "uid://dqf665b540tfg", } - -var ENTRYPOINTS = { - "intro_start": Entrypoint.new("intro", Vector2.ZERO), - "test": Entrypoint.new("test", Vector2.ZERO), -} - var MENU_SCENE: PackedScene = preload("res://menu/menu.tscn") +var ENTRYPOINTS = { + "intro_start": Entrypoint.new("intro", Vector2(0, 0)), + "test": Entrypoint.new("test", Vector2(0, 200), false, Vector2(0, -500)), +} + # load that stuff +var current_scene_name: String = "" + func _pre_load_checks() -> bool: if NodeRegistry.level_root_container == null: push_error("Can't load level, level_root is not registered yet.") @@ -38,7 +45,10 @@ func _pre_load_checks() -> bool: return false return true -func load_scene(scn_name: String) -> bool: # returns true on success +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 :) if not _pre_load_checks(): return false if not scn_name in SCENES: @@ -61,9 +71,11 @@ func load_entrypoint(ep_name: String) -> bool: # returns true on success if not _pre_load_checks(): return false var e: Entrypoint = ENTRYPOINTS[ep_name] + var loaded = false if load_scene(e.scene_name): NodeRegistry.player.position = e.player_position - NodeRegistry.player.velocity = e.initial_velocity + if not e.keep_velocity or NodeRegistry.player.velocity == Vector2.ZERO: + NodeRegistry.player.velocity = e.initial_velocity Gamestate.last_entrypoint = ep_name Gamestate.save_slot() # save game return true