hero-mark-2/menus/level_select_scholar.gd

172 lines
6.6 KiB
GDScript

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
onready var forward_status: TabContainer = $"%ForwardStatus"
onready var shards_required: Label = $"%ShardsRequired"
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: LevelEntry = LevelData.levels[level_id]
# fail if required boss is not beaten
if not level.boss_required.empty():
var boss_save = Save.current_file.levels[level.boss_required]
if not boss_save.completed:
return
# fail if not enough shards
if Save.current_file.get_total_shards() < level.shards_required:
return
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_status.current_tab = 0
forward_arrow.modulate.a = 0.0
else:
forward_status.current_tab = 0
forward_arrow.modulate.a = 1.0
var next_level = LevelData.levels[level_id + 1]
if Save.current_file.get_total_shards() < next_level.shards_required:
forward_status.current_tab = 1
shards_required.text = str(next_level.shards_required)
if not next_level.boss_required.empty():
var boss_save = Save.current_file.levels[next_level.boss_required]
if not boss_save.completed:
forward_status.current_tab = 2
# 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