extends Node2D # --- 🛠️ PRELOAD CETAKAN TUTORIAL UTAMA --- const TUTORIAL_SCENE = preload("res://tutorial.tscn") @onready var player = $Player var ui_canvas = null # ============================================================================== # 🎛️ SETELAN AUDIO MANUAL STAGE 3 (UBAH DI SINI) # ============================================================================== # Nilai dalam desibel (dB). 0.0 adalah volume asli lagu bawaan. var VOLUME_DASAR_BGM: float = 0.0 var VOLUME_DASAR_BGM_2: float = -5.0 # 🎵 BARU: Volume dasar audio kedua # Durasi efek transisi suara (dalam detik) var DURASI_FADE_IN: float = 3.0 var DURASI_FADE_OUT: float = 1.5 # ============================================================================== # 🎵 AMBIL REFERENSI KEDUA NODE AUDIO (Sesuaikan dengan nama nodemu di scene) @onready var bgm_player = $BacksoundMusic @onready var bgm_player_2 = $BacksoundMusic2 # 🎵 BARU: Node audio kedua @onready var area_selesai = $stageselesai func _ready() -> void: player.SPEED=650 if Engine.is_editor_hint(): return print("🏗️ Stage 3 Berlin Dimuat. Memulai inisialisasi...") # 🎬 BARU & FIX: EFEK FADE IN SAAT STAGE DIMULAI var anim_player = get_node_or_null("TransitionLayer/fade_to_black") if anim_player and anim_player.has_animation("fadein"): print("🎬 Menjalankan animasi 'fadein' di awal stage...") anim_player.play("fadein") # 🛠️ BARU: Tunggu animasi fadein selesai sebelum memunculkan petunjuk tutorial awal anim_player.animation_finished.connect(func(_anim_name): pemicu_tutorial_awal_stage(), CONNECT_ONE_SHOT) else: print("⚠️ Peringatan: Node 'fade_to_black' atau animasi 'fadein' tidak ditemukan!") # Failsafe: Jika animasi tidak ada, tutorial langsung dipicu saja pemicu_tutorial_awal_stage() # 🎵 SISTEM FADE IN AUDIO OTOMATIS STAGE 3 (AUDIO 1) if bgm_player: if bgm_player.stream and bgm_player.stream is AudioStreamOggVorbis: bgm_player.stream.loop = true bgm_player.volume_db = -80.0 bgm_player.play() var tween_fadein = create_tween() tween_fadein.tween_property(bgm_player, "volume_db", VOLUME_DASAR_BGM, DURASI_FADE_IN)\ .set_trans(Tween.TRANS_QUAD)\ .set_ease(Tween.EASE_OUT) print("🎵 Musik Stage 3 (Audio 1) dimulai dengan efek Fade-In...") else: print("⚠️ Peringatan: Node AudioStreamPlayer bernama '$BacksoundMusic' tidak ditemukan!") # 🎵 BARU: SISTEM FADE IN AUDIO OTOMATIS STAGE 3 (AUDIO 2) if bgm_player_2: if bgm_player_2.stream and bgm_player_2.stream is AudioStreamOggVorbis: bgm_player_2.stream.loop = true bgm_player_2.volume_db = -80.0 # Mulai dari senyap total bgm_player_2.play() var tween_fadein2 = create_tween() tween_fadein2.tween_property(bgm_player_2, "volume_db", VOLUME_DASAR_BGM_2, DURASI_FADE_IN)\ .set_trans(Tween.TRANS_QUAD)\ .set_ease(Tween.EASE_OUT) print("🎵 Musik Stage 3 (Audio 2) dimulai dengan efek Fade-In...") else: print("⚠️ Peringatan: Node AudioStreamPlayer bernama '$BacksoundMusic2' tidak ditemukan!") # 1. Ambil Player & UI player = $Player ui_canvas = get_node_or_null("UI/UISimple") # 2. Hubungkan Sinyal Nyawa if player and ui_canvas: ui_canvas.update_nyawa_player(player.health) player.connect("hp_berubah", _on_player_hp_berubah) print("🔌 Hubungan sinyal darah di Stage 3 SUKSES dikonfigurasi!") else: if not player: print("❌ Eror Jalur: Node '$Player' tidak ditemukan!") if not ui_canvas: print("❌ Eror Jalur: Node 'UI/UISimple' tidak ditemukan!") # 3. Hubungkan sinyal Area2D secara otomatis lewat kode if area_selesai: area_selesai.body_entered.connect(_on_stageselesai_body_entered) print("✅ Sinyal area 'stageselesai' berhasil terhubung!") else: print("❌ Eror Jalur: Node '$stageselesai' tidak ditemukan di Scene!") # --- 🛠️ FUNGSI BARU: INSTANSIASI TUTORIAL AWAL BERLIN --- func pemicu_tutorial_awal_stage() -> void: print("💡 Memunculkan instruksi bertahan hidup awal di Stage 3...") var tutorial_instance = TUTORIAL_SCENE.instantiate() # Sesuai pesanan teks darimu, Wayan! Shiro rapihkan dengan baris baru (\n) agar nyaman dibaca. tutorial_instance.teks_panduan = "Di situasi yang amat kacau seperti ini, yang perlu kamu lakukan hanyalah maju dan serang! kamu bisa menghindari peluru lawan dengan melompat.\n\nHati-hati! Sesuatu yang berkelip di tanah bisa saja membuatmu meregang nyawa dengan cepat!" # Ditambahkan langsung ke root scene agar bisa mempause game jika skrip UI-mu mendukungnya add_child(tutorial_instance) # --- FUNGSI PERANTARA SINYAL --- func _on_player_hp_berubah(hp_baru: int) -> void: if ui_canvas: ui_canvas.update_nyawa_player(hp_baru) # --- FUNGSI DETEKSI PINDAH SCENE --- func _on_stageselesai_body_entered(body: Node2D) -> void: if body == player: print("🎯 Player telah mencapai akhir Fase 1! Menyiapkan perpindahan scene...") # 🎬 BARU: Panggil animasi fadeout sebelum pindah scene var anim_player = get_node_or_null("TransitionLayer/fade_to_black") if anim_player and anim_player.has_animation("fadeout"): print("🎬 Memulai animasi fadeout...") anim_player.play("fadeout") # 🎵 EFEK FADE OUT AUDIO 1 SAAT MENYENTUH AREA SELESAI if bgm_player and bgm_player.is_playing(): print("🎵 Menurunkan volume musik Stage 3 (Audio 1) perlahan (Fade-Out)...") var tween_fadeout = create_tween() tween_fadeout.tween_property(bgm_player, "volume_db", -80.0, DURASI_FADE_OUT)\ .set_trans(Tween.TRANS_QUAD)\ .set_ease(Tween.EASE_IN) # 🎵 BARU: EFEK FADE OUT AUDIO 2 SAAT MENYENTUH AREA SELESAI if bgm_player_2 and bgm_player_2.is_playing(): print("🎵 Menurunkan volume musik Stage 3 (Audio 2) perlahan (Fade-Out)...") var tween_fadeout2 = create_tween() tween_fadeout2.tween_property(bgm_player_2, "volume_db", -80.0, DURASI_FADE_OUT)\ .set_trans(Tween.TRANS_QUAD)\ .set_ease(Tween.EASE_IN) # Tunggu sampai layar hitam total (animasi selesai) baru lanjut ke bawah await anim_player.animation_finished else: print("⚠️ Peringatan: Animasi 'fadeout' tidak ditemukan. Langsung pindah scene!") # 🎵 Matikan kedua audio sepenuhnya sebelum benar-benar berganti scene if bgm_player: bgm_player.stop() if bgm_player_2: bgm_player_2.stop() print("🎬 Menuju cutscene transisi: cutstage3_3...") get_tree().call_deferred("change_scene_to_file", "res://cutstage3_3.tscn")