hero-mark-2/menus/level_select_scholar.gd

289 lines
11 KiB
GDScript

extends Control
export var travel_time: float = 1.0
export var can_menu: bool = true
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
const music = preload("res://audio/music/vitreous_squares.ogg")
func _ready() -> void:
if Audio.ac_music.get_stream() != music:
Audio.play_music(music)
var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette)
player_sprite.material.set_shader_param("palette", palette)
if Game.current_palette == "super_player":
$"%Sparkles".visible = true
$ShardCount.text = "%02d" % Save.current_file.get_total_shards()
var save := Save.current_file
if save.levels["boss3"].completed:
$"%Whirlpool".visible = true
$"%Whirlpool".play("default")
else:
$"%Whirlpool".visible = false
Fade.fade_in(Options.transition_speed_secs)
# 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:
if can_menu:
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