Beast look target

This commit is contained in:
Rob Kelly 2025-09-05 15:56:27 -06:00
parent 2061d0072b
commit 047a5557f4
20 changed files with 146 additions and 96 deletions

View File

@ -53,3 +53,19 @@ static func pick_unseen_from_group(group_name: String) -> Node3D:
return target return target
return null 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

View File

@ -12,6 +12,14 @@ func set_target_rotation(_theta: float) -> void:
pass # Implemented in derived type 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: func set_move_speed(_speed: float) -> void:
pass # Implemented in derived type pass # Implemented in derived type

View File

@ -18,8 +18,10 @@ class_name GetRandomTarget extends ActionLeaf
func tick(actor: Node, blackboard: Blackboard) -> int: 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 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( var target := Vector3(
randfn(center.x, st_dev.x), randfn(center.y, st_dev.y), randfn(center.z, st_dev.z) randfn(center.x, st_dev.x), randfn(center.y, st_dev.y), randfn(center.z, st_dev.z)

View File

@ -16,14 +16,9 @@ func tick(actor: Node, blackboard: Blackboard) -> int:
if beast.traversing_link: if beast.traversing_link:
return RUNNING return RUNNING
var target: Variant = blackboard.get_value(blackboard_key) if not blackboard.has_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:
return FAILURE return FAILURE
nav_agent.target_position = SceneTools.get_position(blackboard.get_value(blackboard_key))
return SUCCESS if nav_agent.is_navigation_finished() else RUNNING return SUCCESS if nav_agent.is_navigation_finished() else RUNNING

View File

@ -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

View File

@ -0,0 +1 @@
uid://bkp4xe18nfqj

View File

@ -19,13 +19,8 @@ func tick(actor: Node, blackboard: Blackboard) -> int:
if beast.traversing_link: if beast.traversing_link:
return RUNNING return RUNNING
var value: Variant = blackboard.get_value(blackboard_key) if not blackboard.has_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:
return FAILURE return FAILURE
nav_agent.target_position = SceneTools.get_position(blackboard.get_value(blackboard_key))
return SUCCESS return SUCCESS

View File

@ -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

View File

@ -1 +0,0 @@
uid://cx8cifdmdrlpe

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
uid://bogt3htgqe12s

View File

@ -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

View File

@ -1 +0,0 @@
uid://yw2u7rlr0whk

View File

@ -22,12 +22,12 @@ func _excluded_rids() -> Array[RID]:
func tick(_actor: Node, blackboard: Blackboard) -> int: func tick(_actor: Node, blackboard: Blackboard) -> int:
var target: Node3D = blackboard.get_value(blackboard_key) if not blackboard.has_value(blackboard_key):
if not target:
return FAILURE 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( var collisions := sight_origin.get_world_3d().direct_space_state.intersect_ray(
PhysicsRayQueryParameters3D.create( PhysicsRayQueryParameters3D.create(
sight_origin.global_position, target.global_position, collision_mask, _excluded_rids() sight_origin.global_position, target, collision_mask, _excluded_rids()
) )
) )

View File

@ -13,5 +13,5 @@ func tick(actor: Node, blackboard: Blackboard) -> int:
var actor_3d: Node3D = actor var actor_3d: Node3D = actor
if not blackboard.has_value(blackboard_key): if not blackboard.has_value(blackboard_key):
return FAILURE 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 return SUCCESS if target.distance_to(actor_3d.global_position) <= max_range else FAILURE

View File

@ -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="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"] [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://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://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://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://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://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://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://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://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://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://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://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://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://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://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://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://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://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"] [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") script = ExtResource("15_oons1")
metadata/_custom_type_script = "uid://dwfdg523bk776" 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") script = ExtResource("10_kjykp")
blackboard_key = "pursuit_target" blackboard_key = "pursuit_target"
metadata/_custom_type_script = "uid://u1ntpwjwjqhj" metadata/_custom_type_script = "uid://u1ntpwjwjqhj"
@ -318,6 +330,11 @@ settings_key = "game/gameplay/beast/anger_pursuit_frustrated"
delta = 4.0 delta = 4.0
metadata/_custom_type_script = "uid://ccifed50rmjm2" 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"] [node name="SetTrackingModeActive" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode"]
script = ExtResource("17_6qixb") script = ExtResource("17_6qixb")
key = "\"current_mode\"" key = "\"current_mode\""
@ -350,7 +367,7 @@ metadata/_custom_type_script = "uid://cg016dbe7gs1x"
script = ExtResource("11_mbqcc") script = ExtResource("11_mbqcc")
mean_time = 4.0 mean_time = 4.0
st_dev_time = 0.6 st_dev_time = 0.6
wait_time = 4.15553 wait_time = 4.77435
metadata/_custom_type_script = "uid://beyk2xtbjrsg4" metadata/_custom_type_script = "uid://beyk2xtbjrsg4"
[node name="PickRandomInvestigationTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomDelay"] [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) st_dev = Vector3(5, 0, 5)
metadata/_custom_type_script = "uid://ubcelage67hs" 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"] [node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"]
script = ExtResource("10_kjykp") script = ExtResource("10_kjykp")
blackboard_key = "investigation_target" blackboard_key = "investigation_target"
@ -382,11 +405,17 @@ metadata/_custom_type_script = "uid://cg016dbe7gs1x"
script = ExtResource("26_lak6w") script = ExtResource("26_lak6w")
metadata/_custom_type_script = "uid://bksvlal4gjhfr" 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")] [node name="SetTargetFromArea" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence" node_paths=PackedStringArray("area")]
script = ExtResource("32_vbkm0") script = ExtResource("13_x8l6r")
blackboard_key = "point_of_interest" blackboard_key = "point_of_interest"
area = NodePath("../../../../../../../../../../SniffRange") 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"] [node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence"]
script = ExtResource("31_6qixb") script = ExtResource("31_6qixb")
@ -398,6 +427,12 @@ metadata/_custom_type_script = "uid://ccifed50rmjm2"
script = ExtResource("8_0gxpq") script = ExtResource("8_0gxpq")
metadata/_custom_type_script = "uid://cg016dbe7gs1x" 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"] [node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/TravelSequence"]
script = ExtResource("10_kjykp") script = ExtResource("10_kjykp")
blackboard_key = "point_of_interest" blackboard_key = "point_of_interest"
@ -417,11 +452,16 @@ key = "\"current_mode\""
value = "\"lurking\"" value = "\"lurking\""
metadata/_custom_type_script = "uid://cvq483a337v6s" 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"] [node name="RandomDelay" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode"]
script = ExtResource("11_mbqcc") script = ExtResource("11_mbqcc")
mean_time = 9.0 mean_time = 9.0
st_dev_time = 1.0 st_dev_time = 1.0
wait_time = 7.90497 wait_time = 8.60673
metadata/_custom_type_script = "uid://beyk2xtbjrsg4" metadata/_custom_type_script = "uid://beyk2xtbjrsg4"
[node name="PickRandomLurkTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode/RandomDelay"] [node name="PickRandomLurkTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode/RandomDelay"]

View File

@ -21,7 +21,9 @@ var blend_input := 0.0
@onready var armature: Node3D = %Armature @onready var armature: Node3D = %Armature
@onready var animation_player: AnimationPlayer = %AnimationPlayer @onready var animation_player: AnimationPlayer = %AnimationPlayer
@onready var animation_tree: AnimationTree = %AnimationTree @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: func _ready() -> void:
@ -29,12 +31,6 @@ func _ready() -> void:
_update_transform() _update_transform()
func play_spawn_animation() -> void:
animation_tree["parameters/emerge_floor_trigger/request"] = (
AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE
)
func _start_player_rumble() -> void: func _start_player_rumble() -> void:
# TODO this is awful. Integrate PhantomCamera or similar # TODO this is awful. Integrate PhantomCamera or similar
if Player.instance: if Player.instance:
@ -47,10 +43,26 @@ func _end_player_rumble() -> void:
create_tween().tween_property(Player.instance, "camera_rumble", 0.0, 0.4) 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: func set_target_rotation(theta: float) -> void:
target_theta = theta 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: func set_move_speed(speed: float) -> void:
blend_target = speed blend_target = speed
animation_tree["parameters/anim_scale/scale"] = ( animation_tree["parameters/anim_scale/scale"] = (

View File

@ -166,19 +166,19 @@ bones/42/position = Vector3(3.2303e-07, 2.28217e-07, -7.45868e-09)
surface_material_override/0 = ExtResource("2_nayyt") surface_material_override/0 = ExtResource("2_nayyt")
[node name="LookIK" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="1"] [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_name = "Spine.005"
bone = 5 bone = 5
forward_axis = 2 forward_axis = 2
primary_rotation_axis = 2 primary_rotation_axis = 2
use_secondary_rotation = false use_secondary_rotation = false
duration = 0.3 duration = 0.4
transition_type = 7 transition_type = 7
ease_type = 1 ease_type = 1
use_angle_limitation = true use_angle_limitation = true
symmetry_limitation = true symmetry_limitation = true
primary_limit_angle = 1.5708 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"] [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) 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_add/add_amount = 0.0
parameters/rear_scale/scale = 1.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 unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
top_level = true 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) 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 visible = false
mesh = SubResource("SphereMesh_s7rwx") mesh = SubResource("SphereMesh_s7rwx")