131 lines
4.6 KiB
GDScript
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
|