157 lines
6.3 KiB
GDScript
157 lines
6.3 KiB
GDScript
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")
|