221 lines
7.8 KiB
GDScript
221 lines
7.8 KiB
GDScript
extends Control
|
|
|
|
# ==============================================================================
|
|
# 🎛️ SETELAN AUDIO MANUAL MAIN MENU (UBAH DI SINI)
|
|
# ==============================================================================
|
|
var VOLUME_BGM_DAMAI: float = 0.0 # Volume dasar Audio 1 (Suasana damai)
|
|
var VOLUME_BGM_HANCUR: float = 0.0 # Volume dasar Audio 2 (Suasana tegang/hancur)
|
|
|
|
var DURASI_FADE_IN: float = 3.0 # Durasi musik memudar masuk (detik)
|
|
var DURASI_FADE_OUT: float = 1.5 # Durasi musik memudar keluar (detik)
|
|
# ==============================================================================
|
|
|
|
@onready var bg_damai = $BackgroundDamai
|
|
@onready var bg_hancur = $BackgroundHancur
|
|
@onready var bg_stage_1_selesai = $BackgroundStage1Selesai
|
|
@onready var bg_stage_2_selesai = $BackgroundStage2Selesai
|
|
|
|
# 🎬 Ambil referensi ke AnimationPlayer
|
|
@onready var anim_player = $TransitionLayer/fade_to_black
|
|
|
|
# 🔊 FIX: Jalur tombol disesuaikan karena berada di dalam VBoxContainer
|
|
@onready var start_button = $VBoxContainer/StartButton
|
|
|
|
# 🎵 AMBIL REFERENSI KEDUA NODE AUDIO STREAM
|
|
@onready var audio_damai = $AudioStreamPlayer # Audio 1 (Damai)
|
|
@onready var audio_hancur = $AudioStreamPlayer2 # Audio 2 (Tegang/Hancur)
|
|
|
|
# Variabel pengaman transisi
|
|
var is_transitioning = false
|
|
var baru_tamat_stage_3 = false
|
|
|
|
func _ready():
|
|
# Amankan setelan loop pada audio jika menggunakan format OGG
|
|
atur_loop_audio(audio_damai)
|
|
atur_loop_audio(audio_hancur)
|
|
|
|
# 🎬 1. JALANKAN FADE IN VISUAL SAAT MASUK MAIN MENU
|
|
if anim_player and anim_player.has_animation("fadein"):
|
|
anim_player.play("fadein")
|
|
print("🎬 Main Menu: Memutar animasi fadein...")
|
|
|
|
# 🛠️ CHECKPOINT PROGRESS
|
|
if Global.baru_selesai_stage_1:
|
|
Global.stage_terbuka = 2
|
|
Global.baru_selesai_stage_1 = false
|
|
print("💾 Sistem Main Menu: Progress diperbarui ke Stage 2!")
|
|
|
|
if Global.baru_selesai_stage_2:
|
|
Global.stage_terbuka = 3
|
|
Global.baru_selesai_stage_2 = false
|
|
print("💾 Sistem Main Menu: Progress diperbarui ke Stage 3!")
|
|
|
|
if Global.baru_selesai_stage_3:
|
|
Global.stage_terbuka = 0
|
|
Global.main_menu_harus_glitch = false
|
|
baru_tamat_stage_3 = true
|
|
Global.baru_selesai_stage_3 = false
|
|
print("🏆 GAME TAMAT! Sistem Main Menu: Progress kembali ke awal dengan damai.")
|
|
|
|
# 📺 2. LOGIKA MANAJEMEN BACKGROUND DAN AUDIO SPESIFIK STAGE
|
|
sembunyikan_semua_bg()
|
|
|
|
if baru_tamat_stage_3:
|
|
if bg_damai: bg_damai.visible = true
|
|
play_fade_in_audio(audio_damai, VOLUME_BGM_DAMAI)
|
|
print("📺 Main Menu: Game tamat! Menampilkan BG Damai & memutar Audio 1.")
|
|
|
|
elif Global.stage_terbuka == 1:
|
|
# Selesai Stage 0 -> Putar Audio Damai dulu, nanti pindah ke Audio Hancur setelah glitch
|
|
play_fade_in_audio(audio_damai, VOLUME_BGM_DAMAI)
|
|
eksekusi_glitch()
|
|
|
|
elif Global.stage_terbuka == 2:
|
|
if bg_stage_1_selesai: bg_stage_1_selesai.visible = true
|
|
play_fade_in_audio(audio_hancur, VOLUME_BGM_HANCUR)
|
|
print("📺 Main Menu: Menampilkan BG Stage 1 Selesai & memutar Audio 2.")
|
|
|
|
elif Global.stage_terbuka == 3:
|
|
if bg_stage_2_selesai: bg_stage_2_selesai.visible = true
|
|
play_fade_in_audio(audio_hancur, VOLUME_BGM_HANCUR)
|
|
print("📺 Main Menu: Menampilkan BG Stage 2 Selesai & memutar Audio 2.")
|
|
|
|
elif Global.main_menu_harus_glitch:
|
|
play_fade_in_audio(audio_damai, VOLUME_BGM_DAMAI)
|
|
eksekusi_glitch()
|
|
|
|
else:
|
|
# Mode normal / Baru main Stage 0 awal
|
|
if bg_damai: bg_damai.visible = true
|
|
play_fade_in_audio(audio_damai, VOLUME_BGM_DAMAI)
|
|
print("📺 Main Menu: Menampilkan BG Damai awal & memutar Audio 1.")
|
|
|
|
# 🎛️ PERBARUI TEKS TOMBOL START BERDASARKAN PROGRESS
|
|
perbarui_teks_tombol_start()
|
|
|
|
# --- 🎛️ LOGIKA DINAMIS PENGUBAH TEKS TOMBOL START ---
|
|
func perbarui_teks_tombol_start():
|
|
if not start_button:
|
|
print("⚠️ Peringatan: Node tombol start tidak ditemukan!")
|
|
return
|
|
|
|
if baru_tamat_stage_3:
|
|
start_button.text = "Ulangi"
|
|
print("🎛️ Tombol Start diatur ke mode: Ulangi (Game Tamat)")
|
|
elif Global.stage_terbuka in [1, 2, 3]:
|
|
start_button.text = "Lanjutkan"
|
|
print("🎛️ Tombol Start diatur ke mode: Lanjutkan (Stage ", Global.stage_terbuka, ")")
|
|
else:
|
|
start_button.text = "Mulai"
|
|
print("🎛️ Tombol Start diatur ke mode: Mulai (Game Baru / Stage 0)")
|
|
|
|
# --- FUNGSI BANTUAN AUDIO ---
|
|
func atur_loop_audio(player_node: AudioStreamPlayer):
|
|
if player_node and player_node.stream and player_node.stream is AudioStreamOggVorbis:
|
|
player_node.stream.loop = true
|
|
|
|
func play_fade_in_audio(player_node: AudioStreamPlayer, volume_target: float):
|
|
if player_node:
|
|
player_node.volume_db = -80.0
|
|
player_node.play()
|
|
var tween = create_tween()
|
|
tween.tween_property(player_node, "volume_db", volume_target, DURASI_FADE_IN)\
|
|
.set_trans(Tween.TRANS_QUAD)\
|
|
.set_ease(Tween.EASE_OUT)
|
|
|
|
# --- FUNGSI RESET VISIBILITY SEMUA BACKGROUND ---
|
|
func sembunyikan_semua_bg():
|
|
if bg_damai: bg_damai.visible = false
|
|
if bg_hancur: bg_hancur.visible = false
|
|
if bg_stage_1_selesai: bg_stage_1_selesai.visible = false
|
|
if bg_stage_2_selesai: bg_stage_2_selesai.visible = false
|
|
|
|
# --- LOGIKA EFEK GLITCH & PERGANTIAN AUDIO ---
|
|
func eksekusi_glitch():
|
|
print("📺 Efek Glitch Dimulai...")
|
|
# Loop kedip sebanyak 8 kali antara bg_damai and bg_hancur
|
|
for i in range(8):
|
|
bg_damai.visible = false
|
|
bg_hancur.visible = true
|
|
await get_tree().create_timer(randf_range(0.02, 0.1)).timeout
|
|
|
|
bg_damai.visible = true
|
|
bg_hancur.visible = false
|
|
await get_tree().create_timer(randf_range(0.05, 0.3)).timeout
|
|
|
|
bg_damai.visible = false
|
|
bg_hancur.visible = true
|
|
print("Efek Glitch Selesai: Dunia telah berubah.")
|
|
|
|
# 🎵 Matikan Audio Damai (Audio 1) dan panggil Audio Hancur (Audio 2) setelah kedipan beres
|
|
if audio_damai and audio_damai.is_playing():
|
|
audio_damai.stop()
|
|
|
|
play_fade_in_audio(audio_hancur, VOLUME_BGM_HANCUR)
|
|
print("🎵 Audio 2 (Hancur) mulai diputar dengan mulus!")
|
|
|
|
# --- TOMBOL START ---
|
|
func _on_start_button_pressed() -> void:
|
|
if is_transitioning: return
|
|
|
|
var tujuan_scene = ""
|
|
if Global.stage_terbuka == 0:
|
|
tujuan_scene = "res://cutstage0_1.tscn"
|
|
elif Global.stage_terbuka == 1:
|
|
tujuan_scene = "res://cutstage1_1.tscn"
|
|
elif Global.stage_terbuka == 2:
|
|
tujuan_scene = "res://cutstage2_1.tscn"
|
|
elif Global.stage_terbuka == 3:
|
|
tujuan_scene = "res://cutstage3_1.tscn"
|
|
else:
|
|
tujuan_scene = "res://cutstage0_1.tscn"
|
|
|
|
mulai_fadeout_dan_pindah(tujuan_scene)
|
|
|
|
# --- TOMBOL EXIT ---
|
|
func _on_exit_button_pressed() -> void:
|
|
if is_transitioning: return
|
|
is_transitioning = true
|
|
print("🎬 Keluar Game: Memutar fadeout sebelum menutup aplikasi...")
|
|
|
|
# 🎵 Fade-out semua audio yang saat ini aktif
|
|
eksekusi_fade_out_semua_audio()
|
|
|
|
if anim_player and anim_player.has_animation("fadeout"):
|
|
anim_player.play("fadeout")
|
|
await anim_player.animation_finished
|
|
|
|
get_tree().quit()
|
|
|
|
# --- FUNGSI TRANSISI BERSAMA & FADE OUT AUDIO ---
|
|
func mulai_fadeout_dan_pindah(path_tujuan: String):
|
|
is_transitioning = true
|
|
print("BERHASIL: Tombol ditekan. Memulai proses fadeout...")
|
|
|
|
# 🎵 Pemicu Fade-out Audio secara perlahan saat klik tombol
|
|
eksekusi_fade_out_semua_audio()
|
|
|
|
if anim_player and anim_player.has_animation("fadeout"):
|
|
anim_player.play("fadeout")
|
|
await anim_player.animation_finished
|
|
else:
|
|
print("⚠️ Peringatan: Animasi 'fadeout' tidak ditemukan, langsung berpindah!")
|
|
|
|
# Matikan total audio sebelum pindah agar menghemat RAM
|
|
if audio_damai: audio_damai.stop()
|
|
if audio_hancur: audio_hancur.stop()
|
|
|
|
print("🚀 Berpindah dari Main Menu ke: ", path_tujuan)
|
|
get_tree().change_scene_to_file(path_tujuan)
|
|
|
|
func eksekusi_fade_out_semua_audio():
|
|
if audio_damai and audio_damai.is_playing():
|
|
var tween_out1 = create_tween()
|
|
tween_out1.tween_property(audio_damai, "volume_db", -80.0, DURASI_FADE_OUT)\
|
|
.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
|
|
|
|
if audio_hancur and audio_hancur.is_playing():
|
|
var tween_out2 = create_tween()
|
|
tween_out2.tween_property(audio_hancur, "volume_db", -80.0, DURASI_FADE_OUT)\
|
|
.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
|