289 lines
11 KiB
GDScript
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
|