class_name Villager extends SharedSlime var color_changes = true var is_villager = true var hp = 100 var aggressor func _ready(): super._ready() $SoundTimer.wait_time = rng.randi_range(15, 65) $SoundTimer.start() 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" func _on_sound_timer_timeout(): $happyslime.play() $SoundTimer.wait_time = rng.randi_range(15, 65) $SoundTimer.start()