70 lines
1.4 KiB
GDScript
70 lines
1.4 KiB
GDScript
class_name Villager
|
|
extends SharedSlime
|
|
|
|
|
|
var color_changes = true
|
|
|
|
var is_villager = true
|
|
|
|
var hp = 100
|
|
var aggressor
|
|
|
|
func _process(delta):
|
|
super._process(delta)
|
|
|
|
if task == "become_corrupted":
|
|
become_corrupted()
|
|
|
|
func become_corrupted():
|
|
if location_xz.distance_to(aggressor.location_xz) <= 1:
|
|
print("becoming corrupted")
|
|
print(hp)
|
|
# Spin for effect and lose hp.
|
|
rotate_y(deg_to_rad(-15))
|
|
hp -= 0.5
|
|
else:
|
|
hp = 100
|
|
task = "idle"
|
|
print("cultist left")
|
|
|
|
# Create a new cultist and then destroy self.
|
|
if hp <= 0:
|
|
# Disable hitbox
|
|
$slime_collision.disabled = true
|
|
$CollisionDetection/slime_collision.disabled = true
|
|
|
|
# Load and instantiate a new cultist.
|
|
var cultist = load("res://cultist.tscn")
|
|
cultist = cultist.instantiate()
|
|
get_parent_node_3d().add_child(cultist)
|
|
cultist.set_global_position(get_global_position())
|
|
|
|
# Destroy self.
|
|
queue_free()
|
|
|
|
func get_color_idx() -> int:
|
|
return $slime.color_idx
|
|
|
|
func get_color():
|
|
return $slime.get_color()
|
|
|
|
func _on_area_3d_body_entered(body):
|
|
if "color_changes" not in body:
|
|
return
|
|
var other = body.get_color_idx()
|
|
var mine = get_color_idx()
|
|
if other == mine:
|
|
return
|
|
var delta = abs(other - mine)
|
|
if delta % 2 == 0:
|
|
if mine < other:
|
|
$slime.change_color(other)
|
|
elif mine > other:
|
|
$slime.change_color(other)
|
|
|
|
|
|
func _on_collision_detection_body_entered(body):
|
|
if "is_cultist" in body:
|
|
aggressor = body as Cultist
|
|
task = "become_corrupted"
|