first version of EU AI Act game
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
extends CharacterBody3D
|
||||
class_name NPC_interactable
|
||||
|
||||
@export var speed = 3.0
|
||||
# set direction seperate for each npc instance
|
||||
@export var direction := Vector3()
|
||||
var turning = false
|
||||
var tmp_dir : Vector3
|
||||
var tmp_rotation : Vector3
|
||||
var rot_y = 0
|
||||
var facing_interacter = false
|
||||
@export var prompt_message = ""
|
||||
@export var dialogue = "res://Interact/dialogue/test_dialogue.dialogue"
|
||||
@export var talkable = false
|
||||
@export var dissapear_after_dialogoue = false
|
||||
@export var game_balloon = "/game_balloons/game_balloon_v_2.tscn"
|
||||
@export var alienID = 0
|
||||
signal dialogue_finished
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
# move the character based on its set direction
|
||||
velocity.x = speed * direction.x
|
||||
velocity.z = speed * direction.z
|
||||
|
||||
# Add the gravity.
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
|
||||
move_and_slide()
|
||||
|
||||
if $RayCast3D.is_colliding() and not turning:
|
||||
turn_around()
|
||||
|
||||
if $RayCast3D2.is_colliding() and not turning:
|
||||
turn_half()
|
||||
|
||||
|
||||
func turn_around():
|
||||
turning = true
|
||||
var dir = direction
|
||||
var turn_tween = create_tween()
|
||||
turn_tween.tween_property(self, "rotation_degrees", Vector3(0, 180, 0), 0.6).as_relative()
|
||||
|
||||
await get_tree().create_timer(0.6).timeout
|
||||
|
||||
direction.x = dir.x * -1
|
||||
direction.z = dir.z * -1
|
||||
turning = false
|
||||
|
||||
func turn_half():
|
||||
turning = true
|
||||
var dir = direction
|
||||
var turn_tween = create_tween()
|
||||
turn_tween.tween_property(self, "rotation_degrees", Vector3(0, 90, 0), 0.6).as_relative()
|
||||
|
||||
await get_tree().create_timer(0.6).timeout
|
||||
direction.x = dir.z
|
||||
direction.z = -dir.x
|
||||
turning = false
|
||||
|
||||
func stop_walking(body: Node3D):
|
||||
#stop moving
|
||||
if direction != Vector3.ZERO:
|
||||
tmp_dir = direction
|
||||
direction = Vector3.ZERO
|
||||
|
||||
|
||||
func resume_walking():
|
||||
self.rotate(Vector3(0,1,0), deg_to_rad(-rot_y))
|
||||
print(rot_y)
|
||||
rot_y = 0
|
||||
facing_interacter = false
|
||||
direction.x = tmp_dir.x
|
||||
direction.z = tmp_dir.z
|
||||
|
||||
func turn_to_face_interacter(body: Node3D):
|
||||
if not facing_interacter:
|
||||
# turn to face player
|
||||
tmp_rotation = self.rotation_degrees
|
||||
var turn_tween = create_tween()
|
||||
rot_y = -(self.rotation_degrees.y - body.rotation_degrees.y)
|
||||
print(self.rotation_degrees.y, ' ', body.rotation_degrees.y, ' ', rot_y)
|
||||
turn_tween.tween_property(self, "rotation_degrees", Vector3(0, rot_y, 0), 0.2).as_relative()
|
||||
facing_interacter = true
|
||||
|
||||
|
||||
func _on_interaction_checker_body_entered(body: Node3D) -> void:
|
||||
print(body.name + " is here")
|
||||
stop_walking(body)
|
||||
# if alienID == 99:
|
||||
# $helper.wave()
|
||||
|
||||
|
||||
func _on_interaction_checker_body_exited(body: Node3D) -> void:
|
||||
print(body.name + " is gone, resume walking")
|
||||
resume_walking()
|
||||
if alienID == 99:
|
||||
$helper.play_idle()
|
||||
|
||||
|
||||
func dialogue_ended() -> void:
|
||||
dialogue_finished.emit()
|
||||
DialogueState.setAlienFlag(alienID)
|
||||
if dissapear_after_dialogoue:
|
||||
print("disappear")
|
||||
if $CollisionShape3D:
|
||||
$CollisionShape3D.disabled = true
|
||||
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
queue_free()
|
||||
if alienID == 99:
|
||||
$helper.play_idle()
|
||||
Reference in New Issue
Block a user