95 lines
3.3 KiB
GDScript
95 lines
3.3 KiB
GDScript
extends Area2D
|
|
|
|
# --- 🛠️ PRELOAD CETAKAN TUTORIAL UTAMA ---
|
|
const TUTORIAL_SCENE = preload("res://tutorial.tscn")
|
|
|
|
@export var waktu_kabur: float = 30.0 # Waktu bagi player untuk lari (30 detik)
|
|
|
|
@onready var sprite_bom: Sprite2D = $nobel808
|
|
|
|
var player_didalam_area: Node2D = null
|
|
var bom_sudah_dispang: bool = false # Mempertahankan penulisan variabel bawaanmu
|
|
var bom_sudah_dipasang: bool = false
|
|
var timer_aktif: bool = false
|
|
var sisa_waktu: float = 0.0
|
|
|
|
# 🛠️ BARU: Pengaman agar tutorial pasang bom hanya muncul sekali saja
|
|
var tutorial_bom_sudah_muncul: bool = false
|
|
|
|
func _ready() -> void:
|
|
# Memastikan bom tidak terlihat saat scene dimulai
|
|
if sprite_bom:
|
|
sprite_bom.visible = false
|
|
|
|
func _on_body_entered(body: Node2D) -> void:
|
|
if body.is_in_group("pemain") and not bom_sudah_dipasang:
|
|
player_didalam_area = body
|
|
print("💣 Titik pemasangan peledak ditemukan! Tekan interaksi untuk memasang Nobel's 808...")
|
|
|
|
# 🛠️ BARU: Picu tutorial pasang bom saat player mendeteksi titik ini pertama kali
|
|
if not tutorial_bom_sudah_muncul:
|
|
pemicu_tutorial_titik_bom()
|
|
|
|
func _on_body_exited(body: Node2D) -> void:
|
|
if body == player_didalam_area:
|
|
player_didalam_area = null
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if not event.is_action_pressed("interact"):
|
|
return
|
|
|
|
if player_didalam_area == null or bom_sudah_dipasang:
|
|
return
|
|
|
|
# Jalankan fungsi pasang bom
|
|
pasang_bom()
|
|
|
|
func pasang_bom() -> void:
|
|
bom_sudah_dipasang = true
|
|
bom_sudah_dispang = true # Sinkronisasi failsafe variabel bawaan
|
|
|
|
# 1. Munculkan sprite bom seolah-olah tertempel di mesin
|
|
if sprite_bom:
|
|
sprite_bom.visible = true
|
|
|
|
# 2. KUNCI UTAMA: Potong paksa timer global menjadi tinggal 15 detik!
|
|
Globaltimer.sisa_waktu = 15.0
|
|
Globaltimer.mulai_timer() # Memastikan timer global tetap berjalan
|
|
|
|
print("💥 Nobel's 808 terpasang! Detonator 'Time Pencil' diaktifkan!")
|
|
print("🚨 OVERRIDE: Waktu meledak dipercepat menjadi 15 DETIK! RUN, WAYAN, RUN!!")
|
|
|
|
# --- 🛠️ FUNGSI BARU: MEMUNCULKAN TUTORIAL DESAIN B0M ---
|
|
func pemicu_tutorial_titik_bom() -> void:
|
|
tutorial_bom_sudah_muncul = true # Kunci saklar agar tidak berulang
|
|
|
|
print("💡 Player menemukan posisi peledak, memunculkan instruksi Nobel's 808...")
|
|
var tutorial_instance = TUTORIAL_SCENE.instantiate()
|
|
|
|
# Sesuai pesanan teks darimu, Wayan!
|
|
tutorial_instance.teks_panduan = "Ini titik yang sempurna! Tekan tombol 'Interact' untuk memasang bom dan segeralah kabur!"
|
|
|
|
# Lempar ke scene root agar membekukan gameplay
|
|
get_tree().current_scene.add_child(tutorial_instance)
|
|
|
|
func _process(delta: float) -> void:
|
|
# Logika hitung mundur global setelah bom terpasang
|
|
if timer_aktif:
|
|
sisa_waktu -= delta
|
|
print("⏰ BOM AKAN MELEDAK DALAM: ", snp(sisa_waktu, 1), " DETIK!")
|
|
|
|
# Jika waktu habis dan player belum sampai pintu keluar... GAME OVER!
|
|
if sisa_waktu <= 0.0:
|
|
timer_aktif = false
|
|
eksekusi_ledakan_bunker()
|
|
|
|
func snp(nilai: float, tempat: int) -> float:
|
|
return round(nilai * pow(10, tempat)) / pow(10, tempat)
|
|
|
|
func eksekusi_ledakan_bunker() -> void:
|
|
print("💥💥💥 BOOM!!! Seluruh bunker meledak rata dengan tanah! 💥💥💥")
|
|
# Di sini kamu bisa panggil fungsi Player mati atau memicu layar Game Over (Kalah)
|
|
if player_didalam_area:
|
|
if player_didalam_area.has_method("terima_damage"):
|
|
player_didalam_area.terima_damage(999) # Instakill jika masih di dalam map
|