MIF_E31230535/stage_2.gd

163 lines
6.9 KiB
GDScript

extends Node2D
# --- 🛠️ PRELOAD CETAKAN TUTORIAL UTAMA ---
const TUTORIAL_SCENE = preload("res://tutorial.tscn")
# ==============================================================================
# 🎛️ SETELAN AUDIO MANUAL STAGE 2 (UBAH DI SINI)
# ==============================================================================
# Setelan untuk AudioStreamPlayer Pertama (Misalnya untuk Lagu Latar/BGM utama)
var VOLUME_AUDIO_1: float = -5.0
var DURASI_FADE_IN_1: float = 3.0
# Setelan untuk AudioStreamPlayer Kedua (Misalnya untuk Suara Ambience/Angin/Sirine)
var VOLUME_AUDIO_2: float = 0.0
var DURASI_FADE_IN_2: float = 2.0
# Durasi efek meredupkan suara (dalam detik)
var DURASI_FADE_OUT: float = 1.5
# ==============================================================================
# 🎵 AMBIL REFERENSI KEDUA NODE AUDIO (Sesuai nama bawaan di scene kamu)
@onready var audio_player_1 = $AudioStreamPlayer
@onready var audio_player_2 = $AudioStreamPlayer2
@onready var anim_player = $TransitionLayer/fade_to_black
@onready var player = $Player
# --- REFERENSI NODE TENTARA & TONG SAMPAH ---
@onready var soldier = $Soldier
@onready var tong_sampah_area = $tongsampah/Area2D2
# --- VARIABEL KONTROL KONDISI MISI ---
var harus_jalan_ke_kiri = false
var player_di_dekat_tong = false
@export var kecepatan_soldier = 250.0
const TARGET_X_KIRI = 5000.0
# 🛠️ BARU: Pengaman agar tutorial area gedung/musuh datang hanya muncul sekali
var tutorial_gedung_sudah_muncul: bool = false
func _ready() -> void:
player.SPEED= 650
# 🎵 MEMULAI AUDIO 1 DENGAN SETELAN NYA SENDIRI
if audio_player_1:
# Failsafe: Pastikan sistem loop aktif jika filenya format OGG
if audio_player_1.stream and audio_player_1.stream is AudioStreamOggVorbis:
audio_player_1.stream.loop = true
audio_player_1.volume_db = -80.0 # Mulai dari senyap
audio_player_1.play()
var tween1 = create_tween()
tween1.tween_property(audio_player_1, "volume_db", VOLUME_AUDIO_1, DURASI_FADE_IN_1)\
.set_trans(Tween.TRANS_QUAD)\
.set_ease(Tween.EASE_OUT)
print("🎵 Audio 1 mulai berputar terus-menerus dengan target volume: ", VOLUME_AUDIO_1, " dB")
# 🎵 MEMULAI AUDIO 2 DENGAN SETELAN YANG BERBEDA
if audio_player_2:
if audio_player_2.stream and audio_player_2.stream is AudioStreamOggVorbis:
audio_player_2.stream.loop = true
audio_player_2.volume_db = -80.0 # Mulai dari senyap
audio_player_2.play()
var tween2 = create_tween()
tween2.tween_property(audio_player_2, "volume_db", VOLUME_AUDIO_2, DURASI_FADE_IN_2)\
.set_trans(Tween.TRANS_QUAD)\
.set_ease(Tween.EASE_OUT)
print("🎵 Audio 2 mulai berputar terus-menerus dengan target volume: ", VOLUME_AUDIO_2, " dB")
print("🎬 Stage 2 Berhasil Dimuat! Memulai animasi fadein...")
if get_node_or_null("TransitionLayer/fade_to_black"):
var anim = get_node("TransitionLayer/fade_to_black")
anim.play("fadein")
else:
print("⚠️ Peringatan: Jalur TransitionLayer/fade_to_black tidak ditemukan di Stage 2!")
# --- INISIALISASI: PAKSA HADAP KIRI SEJAK AWAL ---
if is_instance_valid(soldier):
soldier.velocity.x = -1.0
if soldier.has_method("atur_arah_wajah"):
soldier.atur_arah_wajah(-1)
soldier.velocity.x = 0
# --- HUBUNGKAN SINYAL MASUK & KELUAR AREA ---
if tong_sampah_area:
if not tong_sampah_area.body_entered.is_connected(_on_tong_sampah_body_entered):
tong_sampah_area.body_entered.connect(_on_tong_sampah_body_entered)
if not tong_sampah_area.body_exited.is_connected(_on_tong_sampah_body_exited):
tong_sampah_area.body_exited.connect(_on_tong_sampah_body_exited)
# 🛠️ TUNGGU 1.5 DETIK SETELAH LEVEL DIMUAT, LALU PICU PENJELASAN MISI & LAMPU SOROT
pemicu_tutorial_misi_sabotase()
# --- 🛠️ FUNGSI: MEMBERIKAN JEDA SEBELUM TUTORIAL DI STAGE 2 MUNCUL ---
func pemicu_tutorial_misi_sabotase() -> void:
await get_tree().create_timer(1.5).timeout
print("💡 Memunculkan informasi misi Stage 2 dan aturan lampu sorot...")
var tutorial_instance = TUTORIAL_SCENE.instantiate()
tutorial_instance.teks_panduan = "Misimu adalah mematikan sistem persenjataan pasukan Jerman, and merebut Peta Lokasi Artileri milik mereka. Tempat ini banyak memiliki lampu sorot untuk mendeteksi musuh. 3 Detik disorot oleh mereka, maka kamu akan tamat\n\nTutorial:\nManfaatkan Tempat Sampah untuk bersembunyi dari sorot lampu. Cari dan sabotase generator supaya lampu padam."
get_tree().current_scene.add_child(tutorial_instance)
# --- 🛠️ FUNGSI BARU: MEMICU TUTORIAL SAAT PLAYER DEKAT GEDUNG / MUSUH DATANG ---
func _on_area_tutorial_gedung_body_entered(body: Node2D) -> void:
if body.name == "Player" and not tutorial_gedung_sudah_muncul:
tutorial_gedung_sudah_muncul = true
print("💡 Player memicu area deteksi kedatangan musuh dan petunjuk pintu gedung...")
var tutorial_instance = TUTORIAL_SCENE.instantiate()
# Sesuai pesanan teks deskripsi darimu, Wayan!
tutorial_instance.teks_panduan = "Sepertinya ada yang datang! Seseorang sadar lampu sorot mati! Segera bersembunyi pada tong sampah. Kau bisa habisi musuh diam diam atau melanjutkan perjalananmu menuju ruang kendali.\n\nLakukan 'Interact' dengan pintu gedung didepanmu untuk memasuki ruang kendari!"
get_tree().current_scene.add_child(tutorial_instance)
func _unhandled_input(event):
# --- LOGIKA TOMBOL INTERAKSI (F) ---
if player_di_dekat_tong and event.is_action_pressed("interact") and not harus_jalan_ke_kiri:
if is_instance_valid(soldier) and not soldier.is_dead:
harus_jalan_ke_kiri = true
print("🎯 Sabotase Sukses! Player menekan F. Soldier mulai berjalan ke kiri!")
func _physics_process(delta: float) -> void:
if harus_jalan_ke_kiri and is_instance_valid(soldier) and not soldier.is_dead and not soldier.is_chasing:
if soldier.global_position.x > TARGET_X_KIRI:
soldier.velocity.x = -kecepatan_soldier
else:
soldier.velocity.x = 0
harus_jalan_ke_kiri = false
print("Soldier Stage 2: Sudah sampai di posisi tujuan.")
if audio_player_1 and audio_player_1.is_playing():
var tween_out1 = create_tween()
tween_out1.tween_property(audio_player_1, "volume_db", -80.0, DURASI_FADE_OUT)\
.set_trans(Tween.TRANS_QUAD)\
.set_ease(Tween.EASE_IN)
if audio_player_2 and audio_player_2.is_playing():
var tween_out2 = create_tween()
tween_out2.tween_property(audio_player_2, "volume_db", -80.0, DURASI_FADE_OUT)\
.set_trans(Tween.TRANS_QUAD)\
.set_ease(Tween.EASE_IN)
print("🎵 Menurunkan volume kedua musik secara sinematik (Fade-Out)...")
if anim_player and anim_player.has_animation("fadeout"):
anim_player.play("fadeout")
await anim_player.animation_finished
if audio_player_1: audio_player_1.stop()
if audio_player_2: audio_player_2.stop()
func _on_tong_sampah_body_entered(body):
if body.name == "Player":
player_di_dekat_tong = true
print("Sinyal: Player berada di dekat tong sampah. Siap menekan F.")
func _on_tong_sampah_body_exited(body):
if body.name == "Player":
player_di_dekat_tong = false
print("Sinyal: Player menjauhi tong sampah.")