83 lines
2.8 KiB
GDScript
83 lines
2.8 KiB
GDScript
extends Area2D
|
|
|
|
# Atur jumlah damage langsung dari Inspector jika suatu saat ingin kamu ubah
|
|
@export var damage_ranjau: int = 35
|
|
|
|
var sudah_meledak: bool = false
|
|
|
|
# Ambil referensi AnimationPlayer di dalam scene ranjau
|
|
@onready var anim_player = $AnimationPlayer
|
|
|
|
# 🔌 AMBIL REFERENSI SPRITE LEDAKAN
|
|
@onready var sprite_ledakan = $ledakan
|
|
|
|
# 🔌 AMBIL REFERENSI SEMUA VISUAL FISIK RANJAU KAMU
|
|
@onready var sprite_awal = $Sprite2D # Sprite2D pertama
|
|
@onready var sprite_2d2 = $Sprite2D2 # Sprite2D2 (yang di dalamnya ada 2d3)
|
|
|
|
# 🎵 BARU: REFERENSI NODE AUDIO UNTUK SUARA LEDAKAN
|
|
@onready var audio_ledakan = $AudioStreamPlayer
|
|
|
|
func _ready() -> void:
|
|
# Hubungkan sinyal ketika ada objek yang masuk ke area ranjau
|
|
body_entered.connect(_on_body_entered)
|
|
|
|
# Pastikan sprite ledakan mati saat game pertama kali dimulai
|
|
if sprite_ledakan:
|
|
sprite_ledakan.visible = false
|
|
|
|
# Pastikan semua bodi fisik ranjau menyala di awal game
|
|
if sprite_awal:
|
|
sprite_awal.visible = true
|
|
if sprite_2d2:
|
|
sprite_2d2.visible = true
|
|
|
|
# Memulai animasi berkedip sejak awal game
|
|
if anim_player and anim_player.has_animation("kedip"):
|
|
anim_player.play("kedip")
|
|
print("🚨 Ranjau aktif dan lampu indikator mulai berkedip.")
|
|
|
|
func _on_body_entered(body: Node2D) -> void:
|
|
# Pastikan yang menginjak adalah Player dan ranjau belum meledak
|
|
if (body.name == "Player" or body.is_in_group("pemain")) and not sudah_meledak:
|
|
sudah_meledak = true
|
|
print("💥 Ranjau Terinjak! Memulai sekuens ledakan...")
|
|
|
|
# Jalankan sekuens ledakan
|
|
eksekusi_ledakan(body)
|
|
|
|
func eksekusi_ledakan(player_node: Node2D) -> void:
|
|
# 🩸 1. INSTAN: KURANGI NYAWA PLAYER SEKETIKA
|
|
if player_node.has_method("terima_damage"):
|
|
player_node.terima_damage(damage_ranjau)
|
|
print("💥 INSTAN: Ranjau memicu fungsi terima_damage sebesar ", damage_ranjau)
|
|
elif "health" in player_node:
|
|
player_node.health -= damage_ranjau
|
|
|
|
# 🎵 BARU: PICU AUDIO LEDAKAN SEBELUM FISIK DIHILANGKAN
|
|
if audio_ledakan:
|
|
audio_ledakan.play()
|
|
print("🔊 SFX: Menggelegar! Suara ledakan ranjau diputar.")
|
|
|
|
# 💥 2. HAPUS SEMUA FISIK BOM SEKALIGUS (Sprite2D, Sprite2D2, dan Sprite2D3 otomatis lenyap)
|
|
if sprite_awal:
|
|
sprite_awal.visible = false
|
|
if sprite_2d2:
|
|
sprite_2d2.visible = false
|
|
print("🚫 SEMUA fisik bom (Sprite2D, 2d2, dan 2d3) resmi dihilangkan!")
|
|
|
|
# 🎬 3. HIDUPKAN SPRITE LEDAKAN & MAINKAN ANIMASINYA
|
|
if sprite_ledakan:
|
|
sprite_ledakan.visible = true
|
|
|
|
if anim_player and anim_player.has_animation("ledakan"):
|
|
anim_player.play("ledakan")
|
|
print("🎆 Memutar animasi ledakan ranjau...")
|
|
# Menunggu efek visual ledakan selesai terputar sebelum menghapus scene
|
|
await anim_player.animation_finished
|
|
else:
|
|
await get_tree().create_timer(0.4).timeout
|
|
|
|
# 🗑️ 4. HAPUS TOTAL SCENE RANJAU DARI MAP
|
|
queue_free()
|