class_name Weener extends CharacterBody2D @onready var sprite := $Sprite @onready var nav2d := $NavigationAgent2D const ref_speed := 500.0 @onready var speed := ref_speed @onready var target := position @onready var interactions := [] var door: Door = null #@onready var inventory := [] static var spawnpoint: int = -1 static var sprite_flip: bool var input_listen := true func _physics_process(delta: float) -> void: set_target() if input_listen: navigate(delta) func _ready() -> void: nav2d.navigation_finished.connect(func() -> void: if door != null: travel(door) ) sprite.flip_h = sprite_flip func _exit_tree() -> void: sprite_flip = sprite.flip_h func set_target() -> void: if Input.is_action_just_pressed("set_target"): if !interactions.is_empty() and interactions[0].mouse_in: interact(interactions[0]) else: nav2d.target_position = get_global_mouse_position() if position.distance_to(nav2d.target_position) > 750: speed = ref_speed * 1.8 else: speed = ref_speed func navigate(delta: float) -> void: if nav2d.is_navigation_finished(): sprite.play("stand") return var next_path_position: Vector2 = nav2d.get_next_path_position() velocity = global_position.direction_to(next_path_position) * speed sprite.flip_h = velocity.x > 0 position += velocity * delta if speed > ref_speed: sprite.play("run") else: sprite.play("walk") func _on_area_entered(area): interactions.insert(0, area) func _on_area_exited(area): interactions.erase(area) func _on_walk_detect_area_entered(area: Area2D) -> void: door = area as Door func _on_walk_detect_area_exited(_area: Area2D) -> void: door = null func interact(item: Item) -> void: match item.item_type: Item.ItemTypes.NONE: return Item.ItemTypes.TALK: print(" ".join(item.text)) Item.ItemTypes.PICKUP: input_listen = false sprite.play("grab") sprite.animation_finished.connect(func() -> void: input_listen = true) Inventory.inventory.set(item.item_id, false) item.queue_free() print(Inventory.inventory) Item.ItemTypes.USE: #item.execute(item.uses) for use in item.uses: match use: Item.UseTypes.TAKE_ITEM: if item.useable_item in Inventory.inventory: Inventory.inventory.set(item.useable_item, true) print(Inventory.inventory) item.used = true Item.UseTypes.CLEAR: if item.used: item.queue_free() _: break func travel(d: Door) -> void: spawnpoint = d.go_to_spawnpoint get_tree().change_scene_to_file(d.target_scene)