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)