MIF_E31230535/ruanganjaga.gd

119 lines
4.8 KiB
GDScript

extends Node2D
@onready var anim_player = $TransitionLayer/fade_to_black
# ==============================================================================
# 🎛️ SETELAN AUDIO MANUAL RUANG JAGA (UBAH DI SINI)
# ==============================================================================
# Nilai volume dasar dalam desibel (dB).
var VOLUME_DASAR_BGM: float = -20.0
# Durasi efek transisi masuk suara (dalam detik)
var DURASI_FADE_IN: float = 3.0
# ==============================================================================
# 🎵 BARU: AMBIL REFERENSI NODE AUDIO (Sesuai nama bawaan tunggal di scene)
@onready var audio_player = $AudioStreamPlayer
# --- REFERENSI NODE TENTARA, TEMPAT SEMBUNYI, & LOKER ---
@onready var soldier = $Soldier
@onready var tempat_sembunyi = $sembunyi
@onready var loker = $lokerdokumen
@onready var player = $Player
# --- VARIABEL KONTROL SPY/MISSION ---
var tempat_sembunyi_muncul = false
var soldier_sudah_muncul = false
var harus_jalan_ke_target = false
@export var kecepatan_soldier = 400.0
const TARGET_X = 1672.0
func _ready() -> void:
player.SPEED= 650
print("🎬 Ruangjaga 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 Ruangjaga!")
# --- 1. AMANKAN SOLDIER AGAR TIDAK MUNCUL DI AWAL ---
if is_instance_valid(soldier):
soldier.visible = false
soldier.set_physics_process(false)
print("DIAGNOSTIK: Soldier disembunyikan dan dinonaktifkan sementara.")
# --- 2. NONAKTIFKAN TEMPAT SEMBUNYI DI AWAL GAME ---
if is_instance_valid(tempat_sembunyi):
set_status_tempat_sembunyi(false)
print("DIAGNOSTIK: Tempat sembunyi dinonaktifkan di awal game.")
# 🎵 BARU: SISTEM FADE IN OTOMATIS AUDIO TUNGGAL
if audio_player:
# Pastikan sistem loop aktif jika filenya format OGG
if audio_player.stream and audio_player.stream is AudioStreamOggVorbis:
audio_player.stream.loop = true
audio_player.volume_db = -80.0 # Mulai dari senyap total
audio_player.play() # Putar lagu yang terpasang di Inspector
var tween = create_tween()
tween.tween_property(audio_player, "volume_db", VOLUME_DASAR_BGM, DURASI_FADE_IN)\
.set_trans(Tween.TRANS_QUAD)\
.set_ease(Tween.EASE_OUT)
print("🎵 Musik Ruang Jaga mulai berputar dengan efek Fade-In ke ", VOLUME_DASAR_BGM, " dB!")
else:
print("⚠️ Peringatan: Node AudioStreamPlayer tidak ditemukan di Ruang Jaga!")
func _physics_process(delta: float) -> void:
# --- STEP 1: INTERAKSI LOKER MEMUNCULKAN TEMPAT SEMBUNYI ---
if not tempat_sembunyi_muncul and is_instance_valid(loker):
if loker.player_didalam_area != null and Input.is_action_just_pressed("interact"):
if is_instance_valid(soldier) and not soldier.is_dead:
tempat_sembunyi_muncul = true
set_status_tempat_sembunyi(true)
print("🗄️ Loker Terkunci! Tempat sembunyi muncul. Cepat sembunyi, Wayan!")
# --- STEP 2: PLAYER SELESAI MASUK SEMBUNYI -> BARU SOLDIER MUNCUL & JALAN ---
if tempat_sembunyi_muncul and not soldier_sudah_muncul and is_instance_valid(tempat_sembunyi):
var player = tempat_sembunyi.player_didalam_area
# Cek apakah player sudah sukses mengeksekusi 'is_hiding' di dalam tong/loker sembunyi
if player != null and player.is_hiding:
pemicu_munculkan_soldier()
# --- STEP 3: LOGIKA MENGHILANGKAN TEMPAT SEMBUNYI SAAT SOLDIER LANYAP ---
if soldier_sudah_muncul and not is_instance_valid(soldier) and tempat_sembunyi_muncul:
tempat_sembunyi_muncul = false
set_status_tempat_sembunyi(false)
print("🧼 Misi Selesai: Soldier mati, tempat sembunyi dihapus kembali!")
# --- STEP 4: MESIN PENGGERAK SOLDIER MENUJU X = 1672 ---
if harus_jalan_ke_target and is_instance_valid(soldier) and not soldier.is_dead and not soldier.is_chasing:
var arah = sign(TARGET_X - soldier.global_position.x)
if abs(soldier.global_position.x - TARGET_X) > 5.0:
soldier.velocity.x = arah * kecepatan_soldier
if soldier.has_method("atur_arah_wajah"):
soldier.atur_arah_wajah(arah)
else:
soldier.velocity.x = 0
harus_jalan_ke_target = false
print("Soldier Ruangjaga: Sudah sampai di posisi target X: 1672.")
# --- FUNGSI TRIGGER MUSUH DATANG ---
func pemicu_munculkan_soldier():
soldier_sudah_muncul = true
harus_jalan_ke_target = true
if is_instance_valid(soldier):
soldier.visible = true
soldier.set_physics_process(true)
print("🚨 SOLDIER DATANG: Player sudah aman bersembunyi. Soldier muncul dan mulai berpatroli ke arah X: 1672!")
# --- FUNGSI PEMBANTU UNTUK ON/OFF TEMPAT SEMBUNYI ---
func set_status_tempat_sembunyi(status: bool):
if is_instance_valid(tempat_sembunyi):
tempat_sembunyi.visible = status
tempat_sembunyi.set_deferred("monitoring", status)
tempat_sembunyi.set_deferred("monitorable", status)