extends Node export var travel_time: float = 1.0 var selected_level: int = 0 var made_selection: bool = false var selected_shard: int = 0 var tween: SceneTreeTween = null var hop_tween: SceneTreeTween = null onready var level_path: Path2D = $LevelPath onready var player_position: PathFollow2D = $"%PlayerPosition" onready var player_sprite: Sprite = $"%PlayerSprite" onready var back_arrow: TextureRect = $"%BackArrow" onready var level_title: Label = $"%LevelTitle" onready var forward_arrow: TextureRect = $"%ForwardArrow" onready var in_cave: PathFollow2D = $"%InCave" onready var out_cave: PathFollow2D = $"%OutCave" onready var score_any: Label = $"%ScoreAny" onready var time_any: Label = $"%TimeAny" onready var score_100: Label = $"%Score100" onready var time_100: Label = $"%Time100" onready var filled_shards: Node2D = $"%FilledShards" onready var shard_title: Label = $"%ShardTitle" onready var shard_arrow: Sprite = $"%ShardArrow" onready var animation_player: AnimationPlayer = $AnimationPlayer func _ready() -> void: Fade.fade_in(0.4) Audio.ac_music.stop() # set initial offset LevelData.levels[selected_level].save_id var target_level = level_path.get_node(LevelData.levels[selected_level].save_id) if target_level != null: player_position.offset = target_level.offset _select_level(selected_level) #func _input(event: InputEvent) -> void: # # load selected map # if Input.is_action_just_pressed("ui_accept"): # Game.current_level = selected_level # Game.change_map(LevelData.levels[selected_level].scene) # elif Input.is_action_just_pressed("ui_right"): # _select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1))) # elif Input.is_action_just_pressed("ui_left"): # _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) #func _process(delta: float) -> void: # # load selected map # if Input.is_action_just_pressed("ui_accept"): # Game.current_level = selected_level # Game.change_map(LevelData.levels[selected_level].scene) # elif Input.is_action_just_pressed("ui_right"): # _select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1))) # elif Input.is_action_just_pressed("ui_left"): # _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) func _process(delta: float) -> void: # make SG disappear inside of cave if player_position.offset >= in_cave.offset and player_position.offset <= out_cave.offset: player_sprite.visible = false else: player_sprite.visible = true func _input(event: InputEvent) -> void: if not made_selection: # player is walking around if event.is_action_pressed("ui_accept"): _update_stats() animation_player.play("show_stats") made_selection = true elif event.is_action_pressed("ui_right"): _select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1))) elif event.is_action_pressed("ui_left"): _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1))) else: # player has selected level if event.is_action_pressed("ui_accept"): Game.current_level = selected_level Game.change_map(LevelData.levels[selected_level].scene) elif event.is_action_pressed("ui_cancel"): animation_player.play("hide_stats") made_selection = false elif event.is_action_pressed("ui_right"): selected_shard = posmod(selected_shard + 1, 8) shard_title.text = LevelData.levels[selected_level].shard_titles[selected_shard] shard_arrow.position.x = filled_shards.get_child(selected_shard).position.x elif event.is_action_pressed("ui_left"): selected_shard = posmod(selected_shard - 1, 8) shard_title.text = LevelData.levels[selected_level].shard_titles[selected_shard] shard_arrow.position.x = filled_shards.get_child(selected_shard).position.x func _select_level(level_id: int) -> void: var level = LevelData.levels[level_id] selected_level = level_id # hide arrows at edges of leve set if level_id == 0: back_arrow.modulate.a = 0.0 else: back_arrow.modulate.a = 1.0 if level_id == LevelData.levels.size() - 1: forward_arrow.modulate.a = 0.0 else: forward_arrow.modulate.a = 1.0 # set text level_title.text = level.title # initiate animation _travel_to_level(level.save_id) func _travel_to_level(level_name: String) -> void: # get path offset of target level var target_level = level_path.get_node(level_name) if target_level != null: if target_level.offset < player_position.offset: player_sprite.flip_h = true else: player_sprite.flip_h = false # kill existing tweens if exist if tween != null: tween.kill() if hop_tween != null: hop_tween.kill() player_sprite.position.y = -2.0 # hopping animation hop_tween = create_tween().set_loops() hop_tween.tween_property(player_sprite, "position:y", -4.0, 0.0) hop_tween.tween_interval(0.1) hop_tween.tween_property(player_sprite, "position:y", -2.0, 0.0) hop_tween.tween_interval(0.1) # travel animation tween = create_tween() # go to target offset tween.tween_property(player_position, "offset", target_level.offset, travel_time) # kill other animation tween.tween_callback(hop_tween, "kill") tween.tween_property(player_sprite, "position:y", -2.0, 0.0) func _update_stats() -> void: # fill in level panel information var save_id = LevelData.levels[selected_level].save_id var save_data: Save.LevelSaveData = Save.current_file.levels[save_id] score_any.text = "%05d" % save_data.score_any time_any.text = Game.format_time(save_data.time_any) score_100.text = "%05d" % save_data.score_100 time_100.text = Game.format_time(save_data.time_100) var shards = filled_shards.get_children() print(save_data.shards_collected) for i in 8: shards[i].visible = save_data.shards_collected[i] selected_shard = 0 shard_title.text = LevelData.levels[selected_level].shard_titles[selected_shard] shard_arrow.position.x = filled_shards.get_child(selected_shard).position.x