149 lines
5.0 KiB
GDScript
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!")
|