119 lines
4.8 KiB
GDScript
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)
|