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 var boss_shown: bool = false var starting_level = false 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 boss_time: Label = $"%BossTime" 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" onready var world_title: Label = $"%WorldTitle" onready var options_screen = $OptionsScreen func _ready() -> void: var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) player_sprite.material.set_shader_param("palette", palette) $ShardCount.text = "%02d" % Save.current_file.get_total_shards() Fade.fade_in(Options.transition_speed_secs) Audio.ac_music.stop() # set initial offset selected_level = Game.current_level 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] 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 _input(event: InputEvent) -> void: # if event.is_action_pressed("ui_cancel") and $"%MenuPopup".rect_scale.y >= 1.0: # animation_player.play("hide_menu") pass func _gui_input(event: InputEvent) -> void: if event.is_action_pressed("ui_cancel") or event.is_action_pressed("pause") && $"%MenuPopup".visible == false: animation_player.play("show_menu") if not made_selection: # player is walking around if event.is_action_pressed("ui_accept"): _update_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_start") or event.is_action_pressed("ui_accept"): starting_level = true $"%MenuPopup".rect_position.y = 9001 Game.current_level = selected_level Game.change_map(LevelData.levels[selected_level].scene) elif event.is_action_pressed("ui_cancel"): if boss_shown: animation_player.play("hide_boss") boss_shown = false else: 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 elif event.is_action_pressed("ui_down"): var level = int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1)) if _can_travel(level): _select_level(level) _update_stats(false) elif event.is_action_pressed("ui_up"): var level = int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1)) if _can_travel(level): _select_level(level) _update_stats(false) func _select_level(level_id: int) -> void: var level = LevelData.levels[level_id] selected_level = level_id Game.current_level = selected_level # 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 #set world name if selected_level < 3: world_title.text = "Garden of love:\nremnants of nature's beauty" if selected_level == 3: world_title.text = "Artificial life:\namalgam, stranger to the gods" if selected_level > 3 && selected_level < 7: world_title.text = "Harsh Reality:\nHappiness through Hardship" if selected_level == 7: world_title.text = "Dr.Intelli the Vengeful monster:\nfriend to no one, cold metal prison" if selected_level > 7 && selected_level < 11: world_title.text = "Artificial world:\nend man-made suffering" if selected_level == 11: world_title.text = "This is it SG...\nchange the future, we believe in you" if selected_level > 11: world_title.text = "Great Job!\nwelcome to bonus land!" # 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] 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(popup: bool = true) -> 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] if LevelData.levels[selected_level].boss: boss_time.text = Game.format_time(save_data.time_any) match selected_level: 3: $"%PressStartBoss".text = "Press Start To Fight!" $"%BossFlavorText".text = "Swiftest Slay" 7: $"%PressStartBoss".text = "Press Start To Fight!" $"%BossFlavorText".text = "Speediest Smashing" 11: $"%PressStartBoss".text = "Press Start To Change The Future!" $"%BossFlavorText".text = "Fastest Future" if popup: animation_player.play("show_boss") elif not boss_shown: $AuxPlayer.play("hide_stats") animation_player.play("show_boss") boss_shown = true else: 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() 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 if popup: animation_player.play("show_stats") elif boss_shown: $AuxPlayer.play("hide_boss") animation_player.play("show_stats") boss_shown = false 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() func _on_PalettesButton_button_down() -> void: SceneManager.current_scene = load("res://menus/palette_select.tscn").instance() func _on_OptionsScreen_exit(): options_screen.visible = false $"%OptionsButton".grab_focus() func _on_OptionsButton_button_down(): options_screen.visible = true options_screen.focus() func _on_ResumeButton_button_down(): $MenuSounds.can_play = false