MIF_E31230535/panelkontrol.gd

131 lines
4.6 KiB
GDScript

extends Area2D
# --- 🛠️ PRELOAD CETAKAN TUTORIAL UTAMA ---
const TUTORIAL_SCENE = preload("res://tutorial.tscn")
@export var waktu_peretasan: float = 3.0 # Durasi interaksi (3 detik)
var player_didalam_area: Node2D = null
var sedang_meretas: bool = false
var timer_peretasan: float = 0.0
var sistem_sudah_mati: bool = false
# 📊 AMBIL REFERENSI NODE PROGRESS BAR KAMU
@onready var progress_bar = $ProgressBar
# 🛠️ BARU: Pengaman agar tutorial petunjuk sabotase hanya muncul sekali saja
var tutorial_sudah_muncul: bool = false
func _ready() -> void:
# Pengingat: Hubungkan sinyal body_entered dan body_exited di tab Node (Editor) ya!
# 📊 Sembunyikan dan atur nilai awal Progress Bar saat game dimulai
if progress_bar:
progress_bar.visible = false
progress_bar.max_value = waktu_peretasan
progress_bar.value = 0.0
else:
print("⚠️ Peringatan: Node 'ProgressBar' tidak ditemukan di bawah Area2D!")
func _on_body_entered(body: Node2D) -> void:
# Jika player masuk dan sistem keamanan belum dimatikan
if body.is_in_group("pemain") and not sistem_sudah_mati:
player_didalam_area = body
print("🎛️ Panel Kontrol ditemukan! Tekan interaksi untuk mematikan pertahanan radar & laut Jerman...")
# 🛠️ BARU: Picu tutorial sabotase saat player mendekati area panel pertama kali
if not tutorial_sudah_muncul:
pemicu_tutorial_sabotase()
func _on_body_exited(body: Node2D) -> void:
if body == player_didalam_area:
player_didalam_area = null
# Antispasi jika player membatalkan proses di tengah jalan dengan keluar area
if sedang_meretas:
sedang_meretas = false
timer_peretasan = 0.0
# 📊 Sembunyikan dan reset progress bar saat keluar area
if progress_bar:
progress_bar.visible = false
progress_bar.value = 0.0
print("❌ Proses dihentikan! Aliran data radar gagal diputus karena Player menjauh.")
func _input(event: InputEvent) -> void:
if not event.is_action_pressed("interact"):
return
# Jika player tidak ada di area ATAU sistem sudah sukses dimatikan, abaikan semua tombol
if player_didalam_area == null or sistem_sudah_mati:
return
# Logika start / cancel interaksi
if not sedang_meretas:
sedang_meretas = true
timer_peretasan = 0.0 # 📊 Mulai hitung dari 0 detik maju ke depan
# 📊 Tampilkan progress bar saat mulai meretas
if progress_bar:
progress_bar.value = 0.0
progress_bar.visible = true
print("📡 Memulai peretasan sistem radar... Mohon tunggu.")
else:
sedang_meretas = false
timer_peretasan = 0.0
# 📊 Sembunyikan kembali jika dibatalkan manual
if progress_bar:
progress_bar.visible = false
progress_bar.value = 0.0
print("⏹️ Peretasan dibatalkan manual oleh Player.")
# --- 🛠️ FUNGSI BARU: INSTANSIASI INDIKATOR PANDUAN SABOTASE ---
func pemicu_tutorial_sabotase() -> void:
tutorial_sudah_muncul = true # Kunci saklar agar tidak terulang
print("💡 Player menemukan panel, memunculkan informasi taktis pangkalan militer...")
var tutorial_instance = TUTORIAL_SCENE.instantiate()
# Sesuai pesanan teks instruksi darimu, Wayan!
tutorial_instance.teks_panduan = "Panel kontrol persenjataan pangkalan militer ditemukan. Sabotase panel ini dengan menekan tombol 'Interact' guna memudahkan pasukan sekutu mendekati pesisir Normandia!"
# Masukkan ke root scene aktif agar membekukan jalannya gameplay utama
get_tree().current_scene.add_child(tutorial_instance)
func _process(delta: float) -> void:
# Jalankan hitung maju hanya jika player sedang menekan interaksi
if sedang_meretas and not sistem_sudah_mati:
timer_peretasan += delta # 📊 Akumulasi waktu berjalan maju
# 📊 Perbarui isi bar secara real-time
if progress_bar:
progress_bar.value = timer_peretasan
print("⏳ Mengunduh enkripsi & mematikan radar... Sisa waktu: ", snp(waktu_peretasan - timer_peretasan, 1), " detik.")
# Sukses setelah mencapai batas waktu_peretasan (3 detik)
if timer_peretasan >= waktu_peretasan:
sedang_meretas = false
sistem_sudah_mati = true
# 📊 Sembunyikan setelah sukses terisi penuh
if progress_bar:
progress_bar.visible = false
eksekusi_sistem_padam()
# Fungsi pembantu untuk membulatkan angka desimal di output
func snp(nilai: float, tempat: int) -> float:
return round(nilai * pow(10, tempat)) / pow(10, tempat)
func eksekusi_sistem_padam() -> void:
print("🟢 [SUKSES] Sistem Pertahanan Udara (Flak) dan Radar Pantai Jerman di Normandia telah NONAKTIF!")
print("📢 OUTPUT: Kapal dan pesawat Sekutu sekarang bisa mendekat tanpa terdeteksi oleh bunker ini!")
# Mengunci Area2D agar tidak bisa memicu sinyal atau mendeteksi player lagi
monitoring = false
monitorable = false