MIF_E31230535/landmine.gd

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()