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!")