extends Control 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 onready var boss_block: TextureRect = $"%BossBlock" onready var shards_block: HBoxContainer = $"%ShardsBlock" onready var shards_needed: Label = $"%ShardsNeeded" func _ready() -> void: $ShardCount.text = "%02d" % Save.current_file.get_total_shards() Fade.fade_in(Options.transition_speed_secs) 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) call_deferred("grab_focus") #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: forward_arrow.visible = true boss_block.visible = false shards_block.visible = false if selected_level + 1 < LevelData.levels.size(): var save := Save.current_file var level: LevelEntry = LevelData.levels[selected_level + 1] var shards := save.get_total_shards() if save.get_total_shards() < level.shards_required: forward_arrow.visible = false boss_block.visible = false shards_block.visible = true shards_needed.text = str(level.shards_required) if level.boss_required != "" and not save.levels[level.boss_required].completed: forward_arrow.visible = false shards_block.visible = false boss_block.visible = true # 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 _gui_input(event: InputEvent) -> void: if event.is_action_pressed("ui_cancel"): animation_player.play("show_exit") 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"): var level = int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1)) if _can_travel(level): _select_level(level) elif event.is_action_pressed("ui_left"): var level = int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1)) if _can_travel(level): _select_level(level) 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 _can_travel(index: int) -> bool: var save := Save.current_file var level: LevelEntry = LevelData.levels[index] var shards := save.get_total_shards() if save.get_total_shards() < level.shards_required: return false if level.boss_required != "": return save.levels[level.boss_required].completed return true 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 func _on_StayHere_pressed() -> void: animation_player.play("hide_exit") func _on_ExitMenu_pressed() -> void: Fade.fade_out(Options.transition_speed_secs) yield(Fade, "fade_finished") SceneManager.current_scene = load("res://menus/main_menu.tscn").instance()