MIF_E31230535/generator.gd

149 lines
5.0 KiB
GDScript

extends Area2D
# --- 🛠️ PRELOAD CETAKAN TUTORIAL UTAMA ---
const TUTORIAL_SCENE = preload("res://tutorial.tscn")
# --- SAKLAR BARU UNTUK STAGE 2_2 ---
@export var langsung_rusak_dari_awal: bool = false
@export var waktu_sabotase: float = 5.0 # Durasi countdown dalam detik
@export var gambar_rusak: Texture2D # Slot untuk gambar generator hancur
@export var skala_rusak: Vector2 = Vector2(1.947, 1.872) # Slot untuk atur skala gambar rusak secara manual
# 🛠️ BARU: Hubungkan ke node ProgressBar kamu
@onready var progress_bar = $ProgressSabotase
var player_didalam_area: Node2D = null
var sedang_sabotase: bool = false
var timer_sabotase: float = 0.0
var sabotase_selesai: bool = false
# 🛠️ BARU: Pengaman agar tutorial masuk area generator hanya muncul sekali saja
var tutorial_sudah_muncul: bool = false
func _ready() -> void:
# Pastikan bar disembunyikan saat game baru mulai
if progress_bar:
progress_bar.visible = false
progress_bar.value = 0
# KUNCI STAGE 2_2: Jika di Inspector dicentang True, langsung jalankan fungsi rusak
if langsung_rusak_dari_awal:
eksekusi_langsung_rusak()
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("pemain") and not sabotase_selesai:
player_didalam_area = body
print("⚡ Generator ditemukan! Tekan interaksi untuk memulai sabotase...")
# 🛠️ BARU: Picu tutorial jika player pertama kali masuk area ini
if not tutorial_sudah_muncul:
pemicu_tutorial_area_generator()
func _on_body_exited(body: Node2D) -> void:
if body == player_didalam_area:
player_didalam_area = null
if sedang_sabotase:
sedang_sabotase = false
timer_sabotase = 0.0
# 🛠️ BARU: Sembunyikan dan reset bar jika pemain kabur
if progress_bar:
progress_bar.visible = false
progress_bar.value = 0
print("❌ Sabotase dibatalkan karena Player meninggalkan area!")
func _input(event: InputEvent) -> void:
if not event.is_action_pressed("interact"):
return
if player_didalam_area == null or sabotase_selesai:
return
if not sedang_sabotase:
sedang_sabotase = true
timer_sabotase = waktu_sabotase
# 🛠️ BARU: Munculkan bar dan set mulai dari 0 saat sabotase dimulai
if progress_bar:
progress_bar.visible = true
progress_bar.value = 0
print("🛠️ Memulai sabotase... JANGAN BERGERAK!")
else:
sedang_sabotase = false
timer_sabotase = 0.0
# 🛠️ BARU: Sembunyikan bar jika dibatalkan secara manual
if progress_bar:
progress_bar.visible = false
progress_bar.value = 0
print("⏹️ Sabotase dihentikan manual oleh Player.")
func _process(delta: float) -> void:
if sedang_sabotase and not sabotase_selesai:
timer_sabotase -= delta
# 🛠️ BARU: Hitung persentase progress (0 hingga 100)
if progress_bar:
var progress_persen = ((waktu_sabotase - timer_sabotase) / waktu_sabotase) * 100.0
progress_bar.value = progress_persen
print("⏳ Merusak generator... Sisa waktu: ", snp(timer_sabotase, 1), " detik.")
if timer_sabotase <= 0.0:
sedang_sabotase = false
sabotase_selesai = true
# 🛠️ BARU: Sembunyikan bar karena tugas sudah selesai
if progress_bar:
progress_bar.visible = false
pemicu_sabotase_berhasil()
func snp(nilai: float, tempat: int) -> float:
return round(nilai * pow(10, tempat)) / pow(10, tempat)
# --- 🛠️ FUNGSI BARU: MEMBENTUK INSTANCE TUTORIAL SAAT PLAYER DEKAT GENERATOR ---
func pemicu_tutorial_area_generator() -> void:
tutorial_sudah_muncul = true # Kunci saklar agar tidak memicu duplikat
print("💡 Player mendekati generator, menampilkan petunjuk interaksi sabotase...")
var tutorial_instance = TUTORIAL_SCENE.instantiate()
# Sesuai isi pesan yang kamu minta, Wayan!
tutorial_instance.teks_panduan = "Generator ditemukan! Klik tombol 'Interact' untuk mulai menyabotase dan memadamkan lampu."
# Masukkan ke dalam scene utama (membekukan pergerakan musuh dan player sejenak)
get_tree().current_scene.add_child(tutorial_instance)
func pemicu_sabotase_berhasil() -> void:
print("💥 JLEB... BOOM! GENERATOR BERHASIL DISABOTASE! Semua fasilitas militer padam! 💥")
# Mengubah gambar sprite dan skalanya secara manual lewat Inspector
if has_node("Sprite2D"):
$Sprite2D.texture = gambar_rusak
$Sprite2D.scale = skala_rusak
# Perintahkan SEMUA node di dalam "grup_lampu" untuk menjalankan fungsi matikan_lampu_total()
get_tree().call_group("grup_lampu", "matikan_lampu_total")
# --- FUNGSI UNTUK INSTAN RUSAK SAAT SCENE BARU DIMUAT ---
func eksekusi_langsung_rusak() -> void:
sabotase_selesai = true
tutorial_sudah_muncul = true # Blokir tutorial jika dari awal stage generatornya sudah diatur rusak
# Pastikan bar tetap sembunyi
if progress_bar:
progress_bar.visible = false
# Langsung ubah gambar ke kondisi rusak sejak detik pertama
if has_node("Sprite2D"):
$Sprite2D.texture = gambar_rusak
$Sprite2D.scale = skala_rusak
# Perintahkan semua menara lampu untuk langsung padam total sejak awal scene dimuat
get_tree().call_group("grup_lampu", "matikan_lampu_total")
print("⚙️ [Stage 2_2] Generator diinisialisasi rusak dari awal. Perintah padam dikirim!")