From 047a5557f497e92240966cc1af0c077e64bcc786 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Fri, 5 Sep 2025 15:56:27 -0600 Subject: [PATCH] Beast look target --- src/util/scene_tools.gd | 16 ++++++ src/world/grunk_beast/beast_model.gd | 8 +++ .../behaviors/actions/get_random_target.gd | 4 +- .../behaviors/actions/pursue_target.gd | 11 +--- .../behaviors/actions/set_look_target.gd | 19 +++++++ .../behaviors/actions/set_look_target.gd.uid | 1 + .../behaviors/actions/set_nav_target.gd | 11 +--- .../actions/set_player_nav_target.gd | 12 ---- .../actions/set_player_nav_target.gd.uid | 1 - .../actions/set_target_position_from_area.gd | 21 ------- .../set_target_position_from_area.gd.uid | 1 - .../behaviors/actions/unset_look_target.gd | 12 ++++ .../actions/unset_look_target.gd.uid | 1 + .../actions/update_stalking_target.gd | 18 ------ .../actions/update_stalking_target.gd.uid | 1 - .../behaviors/conditions/has_line_of_sight.gd | 6 +- .../behaviors/conditions/point_in_range.gd | 2 +- src/world/grunk_beast/grunk_beast.tscn | 56 ++++++++++++++++--- src/world/grunk_beast/shambler/shambler.gd | 26 ++++++--- src/world/grunk_beast/shambler/shambler.tscn | 15 +++-- 20 files changed, 146 insertions(+), 96 deletions(-) create mode 100644 src/world/grunk_beast/behaviors/actions/set_look_target.gd create mode 100644 src/world/grunk_beast/behaviors/actions/set_look_target.gd.uid delete mode 100644 src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd delete mode 100644 src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd.uid delete mode 100644 src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd delete mode 100644 src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd.uid create mode 100644 src/world/grunk_beast/behaviors/actions/unset_look_target.gd create mode 100644 src/world/grunk_beast/behaviors/actions/unset_look_target.gd.uid delete mode 100644 src/world/grunk_beast/behaviors/actions/update_stalking_target.gd delete mode 100644 src/world/grunk_beast/behaviors/actions/update_stalking_target.gd.uid diff --git a/src/util/scene_tools.gd b/src/util/scene_tools.gd index 75a57c9..e90ed87 100644 --- a/src/util/scene_tools.gd +++ b/src/util/scene_tools.gd @@ -53,3 +53,19 @@ static func pick_unseen_from_group(group_name: String) -> Node3D: return target return null + + +## Coerce a position from the given value +## +## Use this to handle Vector3 and Node3D generically e.g. in behaviors. +static func get_position(value: Variant) -> Vector3: + if value is Vector3: + @warning_ignore("unsafe_cast") + return value as Vector3 + if value is Node3D and is_instance_valid(value): + @warning_ignore("unsafe_cast") + return (value as Node3D).global_position + if value is Vector3i: + @warning_ignore("unsafe_cast") + return Vector3(value as Vector3i) + return Vector3.ZERO diff --git a/src/world/grunk_beast/beast_model.gd b/src/world/grunk_beast/beast_model.gd index b86502b..1af2c82 100644 --- a/src/world/grunk_beast/beast_model.gd +++ b/src/world/grunk_beast/beast_model.gd @@ -12,6 +12,14 @@ func set_target_rotation(_theta: float) -> void: pass # Implemented in derived type +func set_look_target(_target: Vector3) -> void: + pass # Implemented in derived type + + +func unset_look_target() -> void: + pass # Implemented in derived type + + func set_move_speed(_speed: float) -> void: pass # Implemented in derived type diff --git a/src/world/grunk_beast/behaviors/actions/get_random_target.gd b/src/world/grunk_beast/behaviors/actions/get_random_target.gd index 52e0abf..18b9953 100644 --- a/src/world/grunk_beast/behaviors/actions/get_random_target.gd +++ b/src/world/grunk_beast/behaviors/actions/get_random_target.gd @@ -18,8 +18,10 @@ class_name GetRandomTarget extends ActionLeaf func tick(actor: Node, blackboard: Blackboard) -> int: - var center: Vector3 = blackboard.get_value(center_target_key, (actor as Node3D).global_position) var beast := actor as GrunkBeast + var center: Vector3 = beast.global_position + if blackboard.has_value(center_target_key): + center = SceneTools.get_position(blackboard.get_value(center_target_key)) var target := Vector3( randfn(center.x, st_dev.x), randfn(center.y, st_dev.y), randfn(center.z, st_dev.z) diff --git a/src/world/grunk_beast/behaviors/actions/pursue_target.gd b/src/world/grunk_beast/behaviors/actions/pursue_target.gd index 29f1749..9682729 100644 --- a/src/world/grunk_beast/behaviors/actions/pursue_target.gd +++ b/src/world/grunk_beast/behaviors/actions/pursue_target.gd @@ -16,14 +16,9 @@ func tick(actor: Node, blackboard: Blackboard) -> int: if beast.traversing_link: return RUNNING - var target: Variant = blackboard.get_value(blackboard_key) - if target is Vector3: - @warning_ignore("unsafe_cast") - nav_agent.target_position = target as Vector3 - elif target is Node3D and is_instance_valid(target): - @warning_ignore("unsafe_cast") - nav_agent.target_position = (target as Node3D).global_position - else: + if not blackboard.has_value(blackboard_key): return FAILURE + nav_agent.target_position = SceneTools.get_position(blackboard.get_value(blackboard_key)) + return SUCCESS if nav_agent.is_navigation_finished() else RUNNING diff --git a/src/world/grunk_beast/behaviors/actions/set_look_target.gd b/src/world/grunk_beast/behaviors/actions/set_look_target.gd new file mode 100644 index 0000000..98767c7 --- /dev/null +++ b/src/world/grunk_beast/behaviors/actions/set_look_target.gd @@ -0,0 +1,19 @@ +@tool +class_name SetLookTarget extends ActionLeaf +## Set the look target of the given model to a point stored on the blackboard. + +## Blackboard key to set as the model's look target +@export var blackboard_key := "target" + +## Model controller whose look target should be set +@export var controller: BeastModel + + +func tick(_actor: Node, blackboard: Blackboard) -> int: + if not blackboard.has_value(blackboard_key): + return FAILURE + + var target: Vector3 = SceneTools.get_position(blackboard.get_value(blackboard_key)) + controller.set_look_target(target) + + return SUCCESS diff --git a/src/world/grunk_beast/behaviors/actions/set_look_target.gd.uid b/src/world/grunk_beast/behaviors/actions/set_look_target.gd.uid new file mode 100644 index 0000000..d7d1701 --- /dev/null +++ b/src/world/grunk_beast/behaviors/actions/set_look_target.gd.uid @@ -0,0 +1 @@ +uid://bkp4xe18nfqj diff --git a/src/world/grunk_beast/behaviors/actions/set_nav_target.gd b/src/world/grunk_beast/behaviors/actions/set_nav_target.gd index c331ec3..3d62d28 100644 --- a/src/world/grunk_beast/behaviors/actions/set_nav_target.gd +++ b/src/world/grunk_beast/behaviors/actions/set_nav_target.gd @@ -19,13 +19,8 @@ func tick(actor: Node, blackboard: Blackboard) -> int: if beast.traversing_link: return RUNNING - var value: Variant = blackboard.get_value(blackboard_key) - if value is Vector3: - @warning_ignore("unsafe_cast") - nav_agent.target_position = value as Vector3 - elif value is Node3D and is_instance_valid(value): - @warning_ignore("unsafe_cast") - nav_agent.target_position = (value as Node3D).global_position - else: + if not blackboard.has_value(blackboard_key): return FAILURE + + nav_agent.target_position = SceneTools.get_position(blackboard.get_value(blackboard_key)) return SUCCESS diff --git a/src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd b/src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd deleted file mode 100644 index c66d86d..0000000 --- a/src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd +++ /dev/null @@ -1,12 +0,0 @@ -@tool -class_name SetPlayerNavTarget extends ActionLeaf -## Set the current nav target to the player's current position. - -@onready var nav_agent: NavigationAgent3D = %NavAgent - - -func tick(_actor: Node, _blackboard: Blackboard) -> int: - if Player.instance: - nav_agent.target_position = Player.instance.global_position - return SUCCESS - return FAILURE diff --git a/src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd.uid b/src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd.uid deleted file mode 100644 index cff42ec..0000000 --- a/src/world/grunk_beast/behaviors/actions/set_player_nav_target.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cx8cifdmdrlpe diff --git a/src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd b/src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd deleted file mode 100644 index c3f602e..0000000 --- a/src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd +++ /dev/null @@ -1,21 +0,0 @@ -@tool -class_name SetTargetPositionFromArea extends ActionLeaf -## Store the global position of the first node in the given area on the blackboard. -## -## Returns FAILURE if there is no such node overlapping the given area. -## NOTE: You probably should only use this with areas masked to only have one possible body. - -## Key to store the target under. -@export var blackboard_key := "target" - -## Area to get target from. -@export var area: Area3D - - -func tick(_actor: Node, blackboard: Blackboard) -> int: - var bodies := area.get_overlapping_bodies() - if not bodies or bodies[0] is not Node3D: - return FAILURE - - blackboard.set_value(blackboard_key, (bodies[0] as Node3D).global_position) - return SUCCESS diff --git a/src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd.uid b/src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd.uid deleted file mode 100644 index 36784db..0000000 --- a/src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dj7a2tj4cqap2 diff --git a/src/world/grunk_beast/behaviors/actions/unset_look_target.gd b/src/world/grunk_beast/behaviors/actions/unset_look_target.gd new file mode 100644 index 0000000..93d2c16 --- /dev/null +++ b/src/world/grunk_beast/behaviors/actions/unset_look_target.gd @@ -0,0 +1,12 @@ +@tool +class_name UnsetLookTarget extends ActionLeaf +## Unset the look target of the given model controller. + +## Model controller whose look target should be unset +@export var controller: BeastModel + + +func tick(_actor: Node, _blackboard: Blackboard) -> int: + controller.unset_look_target() + + return SUCCESS diff --git a/src/world/grunk_beast/behaviors/actions/unset_look_target.gd.uid b/src/world/grunk_beast/behaviors/actions/unset_look_target.gd.uid new file mode 100644 index 0000000..dfecf48 --- /dev/null +++ b/src/world/grunk_beast/behaviors/actions/unset_look_target.gd.uid @@ -0,0 +1 @@ +uid://bogt3htgqe12s diff --git a/src/world/grunk_beast/behaviors/actions/update_stalking_target.gd b/src/world/grunk_beast/behaviors/actions/update_stalking_target.gd deleted file mode 100644 index 8ba2005..0000000 --- a/src/world/grunk_beast/behaviors/actions/update_stalking_target.gd +++ /dev/null @@ -1,18 +0,0 @@ -@tool -class_name UpdateStalkingTarget extends ActionLeaf -## Copy the pursuit target to the stalking target during pursuit. - -const SOURCE_KEY := "pursuit_target" -const DEST_KEY := "stalking_target" - -@onready var stalking_timer: Timer = %StalkingTimer - - -func tick(_actor: Node, blackboard: Blackboard) -> int: - @warning_ignore("unsafe_cast") - var target := blackboard.get_value(SOURCE_KEY) as Node3D - if not is_instance_valid(target): - return FAILURE - blackboard.set_value(DEST_KEY, target.global_position) - stalking_timer.start() - return SUCCESS diff --git a/src/world/grunk_beast/behaviors/actions/update_stalking_target.gd.uid b/src/world/grunk_beast/behaviors/actions/update_stalking_target.gd.uid deleted file mode 100644 index 0160e6d..0000000 --- a/src/world/grunk_beast/behaviors/actions/update_stalking_target.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://yw2u7rlr0whk diff --git a/src/world/grunk_beast/behaviors/conditions/has_line_of_sight.gd b/src/world/grunk_beast/behaviors/conditions/has_line_of_sight.gd index e17feb0..1b41dfb 100644 --- a/src/world/grunk_beast/behaviors/conditions/has_line_of_sight.gd +++ b/src/world/grunk_beast/behaviors/conditions/has_line_of_sight.gd @@ -22,12 +22,12 @@ func _excluded_rids() -> Array[RID]: func tick(_actor: Node, blackboard: Blackboard) -> int: - var target: Node3D = blackboard.get_value(blackboard_key) - if not target: + if not blackboard.has_value(blackboard_key): return FAILURE + var target: Vector3 = SceneTools.get_position(blackboard.get_value(blackboard_key)) var collisions := sight_origin.get_world_3d().direct_space_state.intersect_ray( PhysicsRayQueryParameters3D.create( - sight_origin.global_position, target.global_position, collision_mask, _excluded_rids() + sight_origin.global_position, target, collision_mask, _excluded_rids() ) ) diff --git a/src/world/grunk_beast/behaviors/conditions/point_in_range.gd b/src/world/grunk_beast/behaviors/conditions/point_in_range.gd index dc36cbc..7b8cf50 100644 --- a/src/world/grunk_beast/behaviors/conditions/point_in_range.gd +++ b/src/world/grunk_beast/behaviors/conditions/point_in_range.gd @@ -13,5 +13,5 @@ func tick(actor: Node, blackboard: Blackboard) -> int: var actor_3d: Node3D = actor if not blackboard.has_value(blackboard_key): return FAILURE - var target: Vector3 = blackboard.get_value(blackboard_key) + var target: Vector3 = SceneTools.get_position(blackboard.get_value(blackboard_key)) return SUCCESS if target.distance_to(actor_3d.global_position) <= max_range else FAILURE diff --git a/src/world/grunk_beast/grunk_beast.tscn b/src/world/grunk_beast/grunk_beast.tscn index 89635a4..b6a82ba 100644 --- a/src/world/grunk_beast/grunk_beast.tscn +++ b/src/world/grunk_beast/grunk_beast.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=41 format=3 uid="uid://ehf5sg3ahvbf"] +[gd_scene load_steps=43 format=3 uid="uid://ehf5sg3ahvbf"] [ext_resource type="PackedScene" uid="uid://brrd33217oplv" path="res://src/world/grunk_beast/shambler/shambler.tscn" id="2_csisu"] [ext_resource type="Script" uid="uid://bukihqt1lybnx" path="res://src/util/frame_skipper.gd" id="2_lak6w"] @@ -17,19 +17,21 @@ [ext_resource type="Script" uid="uid://du7uk56300y28" path="res://src/world/grunk_beast/behaviors/conditions/compare_setting.gd" id="12_a1qno"] [ext_resource type="Script" uid="uid://cg55nu4y0a5ud" path="res://src/world/grunk_beast/behaviors/actions/pick_random_from_group.gd" id="12_ml8dd"] [ext_resource type="Script" uid="uid://dcojdhvj8qcw0" path="res://addons/beehave/nodes/composites/sequence_reactive.gd" id="12_xde72"] +[ext_resource type="Script" uid="uid://b34l3v4sr8rmq" path="res://src/world/grunk_beast/behaviors/actions/set_target_from_area.gd" id="13_x8l6r"] [ext_resource type="Script" uid="uid://om57w2acvgb7" path="res://src/world/grunk_beast/behaviors/actions/travel_to_destination.gd" id="14_4y64f"] [ext_resource type="Script" uid="uid://uoy6r3dbnq25" path="res://addons/beehave/nodes/leaves/blackboard_compare.gd" id="14_urnsk"] [ext_resource type="Script" uid="uid://rdfsxwehjjrd" path="res://src/world/grunk_beast/behaviors/actions/set_player_target.gd" id="15_1cnlk"] [ext_resource type="Script" uid="uid://dwfdg523bk776" path="res://addons/beehave/nodes/decorators/failer.gd" id="15_oons1"] [ext_resource type="Script" uid="uid://cvq483a337v6s" path="res://addons/beehave/nodes/leaves/blackboard_set.gd" id="17_6qixb"] +[ext_resource type="Script" uid="uid://bkp4xe18nfqj" path="res://src/world/grunk_beast/behaviors/actions/set_look_target.gd" id="17_vbkm0"] [ext_resource type="Script" uid="uid://ubcelage67hs" path="res://src/world/grunk_beast/behaviors/actions/get_random_target.gd" id="24_asd50"] [ext_resource type="Script" uid="uid://bksvlal4gjhfr" path="res://src/world/grunk_beast/behaviors/actions/sniff.gd" id="26_lak6w"] +[ext_resource type="Script" uid="uid://bogt3htgqe12s" path="res://src/world/grunk_beast/behaviors/actions/unset_look_target.gd" id="27_vbkm0"] [ext_resource type="Script" uid="uid://crkjak4kyv56m" path="res://addons/beehave/nodes/decorators/inverter.gd" id="28_csisu"] [ext_resource type="Script" uid="uid://bjgvke8pjbdiq" path="res://src/world/grunk_beast/behaviors/actions/await_signal.gd" id="29_sm756"] [ext_resource type="Script" uid="uid://ccifed50rmjm2" path="res://src/world/grunk_beast/behaviors/actions/increment_beast_anger.gd" id="31_6qixb"] [ext_resource type="Script" uid="uid://rpsd3i11lnur" path="res://src/world/grunk_beast/behaviors/conditions/target_reachable.gd" id="32_6qixb"] [ext_resource type="Script" uid="uid://dlbmi25edn8b7" path="res://src/world/grunk_beast/behaviors/conditions/has_line_of_sight.gd" id="32_urnsk"] -[ext_resource type="Script" uid="uid://dj7a2tj4cqap2" path="res://src/world/grunk_beast/behaviors/actions/set_target_position_from_area.gd" id="32_vbkm0"] [ext_resource type="Script" uid="uid://o625e667ig2e" path="res://src/world/grunk_beast/behaviors/conditions/point_in_range.gd" id="34_vbkm0"] [ext_resource type="Script" uid="uid://dsf3a8vlolhx8" path="res://addons/beehave/nodes/decorators/succeeder.gd" id="35_4alar"] [ext_resource type="Script" uid="uid://c7n3lak5yhrpv" path="res://src/world/grunk_beast/behaviors/decorators/random_chance.gd" id="36_uy7at"] @@ -218,7 +220,17 @@ metadata/_custom_type_script = "uid://cw22yurt5l74k" script = ExtResource("15_oons1") metadata/_custom_type_script = "uid://dwfdg523bk776" -[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/AlwaysFailDecorator"] +[node name="SetLookTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/AlwaysFailDecorator" node_paths=PackedStringArray("controller")] +script = ExtResource("17_vbkm0") +blackboard_key = "pursuit_target" +controller = NodePath("../../../../../../../FrameSkipper/Shambler") +metadata/_custom_type_script = "uid://bkp4xe18nfqj" + +[node name="AlwaysFailDecorator2" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector"] +script = ExtResource("15_oons1") +metadata/_custom_type_script = "uid://dwfdg523bk776" + +[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/AlwaysFailDecorator2"] script = ExtResource("10_kjykp") blackboard_key = "pursuit_target" metadata/_custom_type_script = "uid://u1ntpwjwjqhj" @@ -318,6 +330,11 @@ settings_key = "game/gameplay/beast/anger_pursuit_frustrated" delta = 4.0 metadata/_custom_type_script = "uid://ccifed50rmjm2" +[node name="UnsetLookTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/AlwaysSucceedDecorator/TransitionToTracking" node_paths=PackedStringArray("controller")] +script = ExtResource("27_vbkm0") +controller = NodePath("../../../../../../FrameSkipper/Shambler") +metadata/_custom_type_script = "uid://bogt3htgqe12s" + [node name="SetTrackingModeActive" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode"] script = ExtResource("17_6qixb") key = "\"current_mode\"" @@ -350,7 +367,7 @@ metadata/_custom_type_script = "uid://cg016dbe7gs1x" script = ExtResource("11_mbqcc") mean_time = 4.0 st_dev_time = 0.6 -wait_time = 4.15553 +wait_time = 4.77435 metadata/_custom_type_script = "uid://beyk2xtbjrsg4" [node name="PickRandomInvestigationTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomDelay"] @@ -360,6 +377,12 @@ center_target_key = "point_of_interest" st_dev = Vector3(5, 0, 5) metadata/_custom_type_script = "uid://ubcelage67hs" +[node name="SetLookTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence" node_paths=PackedStringArray("controller")] +script = ExtResource("17_vbkm0") +blackboard_key = "investigation_target" +controller = NodePath("../../../../../../../../FrameSkipper/Shambler") +metadata/_custom_type_script = "uid://bkp4xe18nfqj" + [node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] script = ExtResource("10_kjykp") blackboard_key = "investigation_target" @@ -382,11 +405,17 @@ metadata/_custom_type_script = "uid://cg016dbe7gs1x" script = ExtResource("26_lak6w") metadata/_custom_type_script = "uid://bksvlal4gjhfr" -[node name="SetPointOfInterest" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence" node_paths=PackedStringArray("area")] -script = ExtResource("32_vbkm0") +[node name="SetTargetFromArea" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence" node_paths=PackedStringArray("area")] +script = ExtResource("13_x8l6r") blackboard_key = "point_of_interest" area = NodePath("../../../../../../../../../../SniffRange") -metadata/_custom_type_script = "uid://dj7a2tj4cqap2" +metadata/_custom_type_script = "uid://b34l3v4sr8rmq" + +[node name="SetLookTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence" node_paths=PackedStringArray("controller")] +script = ExtResource("17_vbkm0") +blackboard_key = "point_of_interest" +controller = NodePath("../../../../../../../../../../FrameSkipper/Shambler") +metadata/_custom_type_script = "uid://bkp4xe18nfqj" [node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence"] script = ExtResource("31_6qixb") @@ -398,6 +427,12 @@ metadata/_custom_type_script = "uid://ccifed50rmjm2" script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" +[node name="SetLookTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/TravelSequence" node_paths=PackedStringArray("controller")] +script = ExtResource("17_vbkm0") +blackboard_key = "point_of_interest" +controller = NodePath("../../../../../../FrameSkipper/Shambler") +metadata/_custom_type_script = "uid://bkp4xe18nfqj" + [node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/TravelSequence"] script = ExtResource("10_kjykp") blackboard_key = "point_of_interest" @@ -417,11 +452,16 @@ key = "\"current_mode\"" value = "\"lurking\"" metadata/_custom_type_script = "uid://cvq483a337v6s" +[node name="UnsetLookTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode" node_paths=PackedStringArray("controller")] +script = ExtResource("27_vbkm0") +controller = NodePath("../../../../FrameSkipper/Shambler") +metadata/_custom_type_script = "uid://bogt3htgqe12s" + [node name="RandomDelay" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode"] script = ExtResource("11_mbqcc") mean_time = 9.0 st_dev_time = 1.0 -wait_time = 7.90497 +wait_time = 8.60673 metadata/_custom_type_script = "uid://beyk2xtbjrsg4" [node name="PickRandomLurkTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode/RandomDelay"] diff --git a/src/world/grunk_beast/shambler/shambler.gd b/src/world/grunk_beast/shambler/shambler.gd index f3bace7..55e18b5 100644 --- a/src/world/grunk_beast/shambler/shambler.gd +++ b/src/world/grunk_beast/shambler/shambler.gd @@ -21,7 +21,9 @@ var blend_input := 0.0 @onready var armature: Node3D = %Armature @onready var animation_player: AnimationPlayer = %AnimationPlayer @onready var animation_tree: AnimationTree = %AnimationTree -@onready var look_target_pivot: Node3D = %LookTargetPivot +@onready var dynamic_look_target: Marker3D = %DynamicLookTarget + +@onready var look_target_pivot: Node3D = %DefaultLookTargetPivot func _ready() -> void: @@ -29,12 +31,6 @@ func _ready() -> void: _update_transform() -func play_spawn_animation() -> void: - animation_tree["parameters/emerge_floor_trigger/request"] = ( - AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE - ) - - func _start_player_rumble() -> void: # TODO this is awful. Integrate PhantomCamera or similar if Player.instance: @@ -47,10 +43,26 @@ func _end_player_rumble() -> void: create_tween().tween_property(Player.instance, "camera_rumble", 0.0, 0.4) +func play_spawn_animation() -> void: + animation_tree["parameters/emerge_floor_trigger/request"] = ( + AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE + ) + + func set_target_rotation(theta: float) -> void: target_theta = theta +func set_look_target(target: Vector3) -> void: + dynamic_look_target.top_level = true + dynamic_look_target.global_position = target + + +func unset_look_target() -> void: + dynamic_look_target.top_level = false + dynamic_look_target.position = Vector3.ZERO + + func set_move_speed(speed: float) -> void: blend_target = speed animation_tree["parameters/anim_scale/scale"] = ( diff --git a/src/world/grunk_beast/shambler/shambler.tscn b/src/world/grunk_beast/shambler/shambler.tscn index 8306d35..07d1f8e 100644 --- a/src/world/grunk_beast/shambler/shambler.tscn +++ b/src/world/grunk_beast/shambler/shambler.tscn @@ -166,19 +166,19 @@ bones/42/position = Vector3(3.2303e-07, 2.28217e-07, -7.45868e-09) surface_material_override/0 = ExtResource("2_nayyt") [node name="LookIK" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="1"] -target_node = NodePath("../../../LookTargetPivot/LookTarget") +target_node = NodePath("../../../DefaultLookTargetPivot/DefaultLookPosition/DynamicLookTarget") bone_name = "Spine.005" bone = 5 forward_axis = 2 primary_rotation_axis = 2 use_secondary_rotation = false -duration = 0.3 +duration = 0.4 transition_type = 7 ease_type = 1 use_angle_limitation = true symmetry_limitation = true primary_limit_angle = 1.5708 -primary_damp_threshold = 0.7 +primary_damp_threshold = 0.4 [node name="SleeveL" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="2"] transform = Transform3D(0.0438309, 7.45058e-08, -0.999039, 0.999039, 6.10948e-07, 0.0438309, 7.37607e-07, -1, -4.47035e-08, 1.63061, 0.0124229, 0.803842) @@ -219,15 +219,18 @@ parameters/idle_blend/blend_amount = 0.0 parameters/rear_add/add_amount = 0.0 parameters/rear_scale/scale = 1.0 -[node name="LookTargetPivot" type="Node3D" parent="." index="3"] +[node name="DefaultLookTargetPivot" type="Node3D" parent="." index="3"] unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) top_level = true -[node name="LookTarget" type="Marker3D" parent="LookTargetPivot" index="0"] +[node name="DefaultLookPosition" type="Marker3D" parent="DefaultLookTargetPivot" index="0"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10) -[node name="DebugBall" type="MeshInstance3D" parent="LookTargetPivot/LookTarget" index="0"] +[node name="DynamicLookTarget" type="Marker3D" parent="DefaultLookTargetPivot/DefaultLookPosition" index="0"] +unique_name_in_owner = true + +[node name="DebugBall" type="MeshInstance3D" parent="DefaultLookTargetPivot/DefaultLookPosition/DynamicLookTarget" index="0"] visible = false mesh = SubResource("SphereMesh_s7rwx")