209 lines
7.8 KiB
GDScript
209 lines
7.8 KiB
GDScript
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:
|
|
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")
|
|
|
|
|
|
func _gui_input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("ui_cancel"):
|
|
animation_player.play("show_menu")
|
|
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
|
|
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
|
|
# 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() -> 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()
|
|
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()
|
|
|
|
|
|
func _on_PalettesButton_button_down() -> void:
|
|
SceneManager.current_scene = load("res://menus/palette_select.tscn").instance()
|