MIF_E31230535/main_menu.gd

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)