diff --git a/levels/grunkbeast_test/visual_test/visual_test.tscn b/levels/grunkbeast_test/visual_test/visual_test.tscn index 207f9d9..c434f86 100644 --- a/levels/grunkbeast_test/visual_test/visual_test.tscn +++ b/levels/grunkbeast_test/visual_test/visual_test.tscn @@ -384,7 +384,6 @@ environment = ExtResource("24_ibsng") [node name="Player" parent="." instance=ExtResource("26_hposp")] transform = Transform3D(0.866025, 0, -0.5, 0, 1, 0, 0.5, 0, 0.866025, -6, 1.2, 9.3) -godmode = true [node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] navigation_mesh = SubResource("NavigationMesh_n2727") @@ -2182,6 +2181,9 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 0, -2.7) visibility_aabb = AABB(-9, -3, -4.5, 18, 6, 9) process_material = SubResource("ParticleProcessMaterial_42r5i") +[node name="LurkPoint11" type="Marker3D" parent="NavigationRegion3D/Level/CommonArea" groups=["LurkPoint"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, -3, -3.3) + [node name="Room1" type="Node3D" parent="NavigationRegion3D/Level"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2, 0, 9.3) @@ -2614,6 +2616,9 @@ process_material = SubResource("ParticleProcessMaterial_e530b") [node name="OverheadLight" parent="NavigationRegion3D/Level/Room2" instance=ExtResource("6_n2727")] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -3, 3, 0) +[node name="LurkPoint10" type="Marker3D" parent="NavigationRegion3D/Level/Room2" groups=["LurkPoint"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, -1.8) + [node name="Room3" type="Node3D" parent="NavigationRegion3D/Level"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2, -3, 9.3) @@ -2836,6 +2841,9 @@ transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 2.9 transform = Transform3D(0.258819, 0, 0.965926, 0, 1, 0, -0.965926, 0, 0.258819, 11.4, 0.3, 3.90001) sleeping = true +[node name="LurkPoint1" type="Marker3D" parent="NavigationRegion3D/Level/Room3" groups=["LurkPoint"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8, 0, 0) + [node name="Room4" type="Node3D" parent="NavigationRegion3D/Level"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.8, -3, 9.3) diff --git a/project.godot b/project.godot index 0a8c250..7c3cf72 100644 --- a/project.godot +++ b/project.godot @@ -108,7 +108,7 @@ gameplay/beast/anger_max=150.0 gameplay/beast/anger_decay_rate=1.0 gameplay/beast/anger_noise=10.0 gameplay/beast/anger_noise_near=30.0 -gameplay/beast/provocation_range=4.8 +gameplay/beast/provocation_range=5.5 gameplay/beast/anger_alarm=60.0 gameplay/beast/anger_alarm_extra=60.0 gameplay/beast/anger_touch=35.0 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 7100d9d..52e0abf 100644 --- a/src/world/grunk_beast/behaviors/actions/get_random_target.gd +++ b/src/world/grunk_beast/behaviors/actions/get_random_target.gd @@ -1,12 +1,15 @@ @tool class_name GetRandomTarget extends ActionLeaf -## Picks a random navigable point near the actor and writes it to the blackboard. +## Picks a random navigable point near a center target and writes it to the blackboard. ## ## If the random point is not navigable, will return RUNNING and pick a new point next tick. ## Blackboard key under which to store the random target. @export var blackboard_key := "target" +## Optional blackboard key of the center target. By default, the actor's position will be used. +@export var center_target_key: String + ## Standard deviation of position in each direction, in game units. @export var st_dev := Vector3(1, 0, 1) @@ -15,12 +18,11 @@ 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 target := Vector3( - randfn(beast.global_position.x, st_dev.x), - randfn(beast.global_position.y, st_dev.y), - randfn(beast.global_position.z, st_dev.z) + randfn(center.x, st_dev.x), randfn(center.y, st_dev.y), randfn(center.z, st_dev.z) ) if not beast.path_shorter_than(target, max_path_len): diff --git a/src/world/grunk_beast/behaviors/actions/print_debug_action.gd b/src/world/grunk_beast/behaviors/actions/print_debug_action.gd index f35292e..54fcd96 100644 --- a/src/world/grunk_beast/behaviors/actions/print_debug_action.gd +++ b/src/world/grunk_beast/behaviors/actions/print_debug_action.gd @@ -1,3 +1,4 @@ +@tool class_name PrintDebugAction extends ActionLeaf ## Print this node's name every tick. 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 ac08cb6..e17feb0 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 @@ -23,6 +23,8 @@ func _excluded_rids() -> Array[RID]: func tick(_actor: Node, blackboard: Blackboard) -> int: var target: Node3D = blackboard.get_value(blackboard_key) + if not target: + return FAILURE 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() diff --git a/src/world/grunk_beast/grunk_beast.gd b/src/world/grunk_beast/grunk_beast.gd index c2d18dc..378ac7e 100644 --- a/src/world/grunk_beast/grunk_beast.gd +++ b/src/world/grunk_beast/grunk_beast.gd @@ -39,6 +39,7 @@ var traversing_link := false @onready var nav_probe: NavigationAgent3D = %NavProbe @onready var sound_detection_cooldown: Timer = %SoundDetectionCooldown +@onready var touch_cooldown: Timer = %TouchCooldown @onready var blackboard: Blackboard = %Blackboard @onready var behavior: BeehaveTree = %GrunkBeastBehavior @@ -97,6 +98,7 @@ func _set_poi(value: Vector3) -> void: #region Character Controller func _ready() -> void: + nav_agent.velocity_computed.connect(_on_velocity_computed) if World.instance and World.instance.manager: World.instance.manager.alarm_triggered.connect(_on_alarm_triggered) if play_spawn_animation: @@ -144,36 +146,47 @@ func path_shorter_than(target: Vector3, limit: float) -> bool: func _physics_process(_delta: float) -> void: + # Update debug info + if debug_canvas_layer.visible: + beast_behavior_label.text = str(blackboard.get_value("current_mode")) + beast_anger_meter.value = anger_level + + # Don't use nav agent before map has synchronized + if NavigationServer3D.map_get_iteration_id(nav_agent.get_navigation_map()) == 0: + return + var motion := Vector3.ZERO if pathfinding and not nav_agent.is_navigation_finished(): - var path_pos := nav_agent.get_next_path_position() - var relative_pos := path_pos - global_position - motion = relative_pos.normalized() * get_speed() + motion = global_position.direction_to(nav_agent.get_next_path_position()) * get_speed() - velocity.x = motion.x - velocity.z = motion.z + motion.y = velocity.y if not is_on_floor(): - velocity += gravity + motion += gravity if motion: model.set_target_rotation(atan2(motion.x, motion.z)) - model.set_move_speed(velocity.length()) - move_and_slide() + if nav_agent.avoidance_enabled: + nav_agent.set_velocity(motion) + else: + _on_velocity_computed(motion) - # Update debug info - if debug_canvas_layer.visible: - beast_behavior_label.text = str(behavior.get_running_action()) - beast_anger_meter.value = anger_level + +func _on_velocity_computed(safe_velocity: Vector3) -> void: + model.set_move_speed(safe_velocity.length()) + velocity = safe_velocity + move_and_slide() func on_sound_detected(source: Vector3) -> void: point_of_interest = source if sound_detection_cooldown.is_stopped(): + print_debug("Beast heard something from ", source) anger_level += GrunkBeast.anger_noise if source.distance_to(self.global_position) <= GrunkBeast.provocation_range: + print_debug("... And it was close, too!") anger_level += GrunkBeast.anger_noise_near sound_detection_cooldown.start() # TODO animation? @@ -195,14 +208,16 @@ func _anger_decay() -> void: func _on_alarm_triggered(source: GunkAlarm) -> void: + print_debug("The beast was angered by the alarm!") point_of_interest = source.global_position anger_level += GrunkBeast.anger_alarm if World.instance.manager.alert_level >= GrunkBeast.anger_extra_alert_level: + print_debug("The beast got extra-angry!") anger_level += GrunkBeast.anger_alarm_extra -func _on_touch(body: Node3D) -> void: - var player: Player = body as Player - if not player: - return - anger_level += GrunkBeast.anger_touch +func _on_touch(_body: Node3D) -> void: + if touch_cooldown.is_stopped(): + print_debug("Touched the beast!") + anger_level += GrunkBeast.anger_touch + touch_cooldown.start() diff --git a/src/world/grunk_beast/grunk_beast.tscn b/src/world/grunk_beast/grunk_beast.tscn index 2f79751..a2f2d57 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=40 format=3 uid="uid://ehf5sg3ahvbf"] +[gd_scene load_steps=41 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,10 +17,11 @@ [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://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://crkjak4kyv56m" path="res://addons/beehave/nodes/decorators/inverter.gd" id="28_csisu"] @@ -28,23 +29,24 @@ [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"] [sub_resource type="Curve" id="Curve_sm756"] _limits = [0.0, 10.0, 0.0, 150.0] -_data = [Vector2(0, 1.2), 0.0, 0.0, 0, 0, Vector2(30, 3), 0.0, 0.0, 0, 0, Vector2(80, 5), 0.00861322, 0.00861322, 0, 0, Vector2(120, 6), 0.0473384, 0.0473384, 0, 0, Vector2(150, 10), 0.0, 0.0, 0, 0] +_data = [Vector2(0, 1.2), 0.0, 0.0, 0, 0, Vector2(30, 3), 0.0740828, 0.0740828, 0, 0, Vector2(80, 4), 0.0, 0.0, 0, 0, Vector2(120, 6), 0.0949869, 0.0949869, 0, 0, Vector2(150, 7), 0.0, 0.0, 0, 0] point_count = 5 -[sub_resource type="SphereShape3D" id="SphereShape3D_1cnlk"] -radius = 2.0 - [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_faau1"] radius = 0.4 [sub_resource type="SphereShape3D" id="SphereShape3D_wffas"] -radius = 16.0 +radius = 9.0 + +[sub_resource type="SphereShape3D" id="SphereShape3D_1cnlk"] +radius = 2.0 [sub_resource type="SphereShape3D" id="SphereShape3D_3gbao"] radius = 1.4 @@ -52,11 +54,8 @@ radius = 1.4 [sub_resource type="SphereShape3D" id="SphereShape3D_6qixb"] radius = 6.0 -[sub_resource type="SphereShape3D" id="SphereShape3D_d4ex2"] -radius = 6.2 - [sub_resource type="SphereShape3D" id="SphereShape3D_lak6w"] -radius = 12.0 +radius = 10.0 [node name="GrunkBeast" type="CharacterBody3D" groups=["GrunkBeast"]] collision_layer = 36 @@ -74,14 +73,6 @@ unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) time_scale_factor = 2.0 -[node name="TouchingRange" type="Area3D" parent="FrameSkipper/Shambler"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -0.9) -collision_layer = 0 -collision_mask = 8 - -[node name="CollisionShape3D" type="CollisionShape3D" parent="FrameSkipper/Shambler/TouchingRange"] -shape = SubResource("SphereShape3D_1cnlk") - [node name="CollisionShape3D" type="CollisionShape3D" parent="."] shape = SubResource("CapsuleShape3D_faau1") @@ -95,7 +86,6 @@ script = ExtResource("4_csisu") [node name="NavAgent" type="NavigationAgent3D" parent="Navigation"] unique_name_in_owner = true path_height_offset = 0.25 -avoidance_enabled = true debug_enabled = true [node name="NavProbe" type="NavigationAgent3D" parent="Navigation"] @@ -114,6 +104,14 @@ metadata/_custom_type_script = "uid://cfsiyhhrcua6o" [node name="CollisionShape3D" type="CollisionShape3D" parent="GameSoundListener"] shape = SubResource("SphereShape3D_wffas") +[node name="TouchingRange" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.9) +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="TouchingRange"] +shape = SubResource("SphereShape3D_1cnlk") + [node name="GrabbingRange" type="Area3D" parent="."] collision_layer = 0 collision_mask = 8 @@ -128,13 +126,6 @@ collision_mask = 8 [node name="CollisionShape3D" type="CollisionShape3D" parent="PouncingRange"] shape = SubResource("SphereShape3D_6qixb") -[node name="TrackingRange" type="Area3D" parent="."] -collision_layer = 0 -collision_mask = 8 - -[node name="CollisionShape3D" type="CollisionShape3D" parent="TrackingRange"] -shape = SubResource("SphereShape3D_d4ex2") - [node name="SniffRange" type="Area3D" parent="."] collision_layer = 0 collision_mask = 8 @@ -146,6 +137,11 @@ shape = SubResource("SphereShape3D_lak6w") unique_name_in_owner = true one_shot = true +[node name="TouchCooldown" type="Timer" parent="."] +unique_name_in_owner = true +wait_time = 0.5 +one_shot = true + [node name="AngerDecay" type="Timer" parent="."] autostart = true @@ -183,92 +179,110 @@ metadata/_custom_type_script = "uid://du7uk56300y28" script = ExtResource("35_4alar") metadata/_custom_type_script = "uid://dsf3a8vlolhx8" -[node name="PursuitSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator"] +[node name="TransitionToPursuit" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator"] script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence"] +[node name="PursuitModeInactive" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/TransitionToPursuit"] +script = ExtResource("14_urnsk") +left_operand = "get_value(\"current_mode\")" +operator = 1 +right_operand = "\"pursuit\"" +metadata/_custom_type_script = "uid://uoy6r3dbnq25" + +[node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/TransitionToPursuit"] script = ExtResource("31_6qixb") settings_key = "game/gameplay/beast/anger_start_pursuit" delta = 20.0 metadata/_custom_type_script = "uid://ccifed50rmjm2" -[node name="SetPlayerTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence"] +[node name="SetPlayerTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/TransitionToPursuit"] script = ExtResource("15_1cnlk") metadata/_custom_type_script = "uid://rdfsxwehjjrd" -[node name="ActionSelector" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence"] +[node name="SetPursuitModeActive" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode"] +script = ExtResource("17_6qixb") +key = "\"current_mode\"" +value = "\"pursuit\"" +metadata/_custom_type_script = "uid://cvq483a337v6s" + +[node name="AlwaysSucceedDecorator2" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode"] +script = ExtResource("35_4alar") +metadata/_custom_type_script = "uid://dsf3a8vlolhx8" + +[node name="ActionSelector" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2"] script = ExtResource("7_vvw1q") metadata/_custom_type_script = "uid://cw22yurt5l74k" -[node name="AlwaysFailDecorator" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector"] +[node name="AlwaysFailDecorator" 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/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/AlwaysFailDecorator"] +[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/AlwaysFailDecorator"] script = ExtResource("10_kjykp") blackboard_key = "pursuit_target" metadata/_custom_type_script = "uid://u1ntpwjwjqhj" -[node name="GrabSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector"] +[node name="GrabSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector"] script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="IsTargetInGrabbingRange" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/GrabSequence" node_paths=PackedStringArray("area")] +[node name="IsTargetInGrabbingRange" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/GrabSequence" node_paths=PackedStringArray("area")] script = ExtResource("9_xuag8") blackboard_key = "pursuit_target" -area = NodePath("../../../../../../../../GrabbingRange") +area = NodePath("../../../../../../../GrabbingRange") metadata/_custom_type_script = "uid://7k5hor1omsxc" -[node name="GrabCooldown" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/GrabSequence"] +[node name="GrabCooldown" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/GrabSequence"] script = ExtResource("10_ntlom") wait_time = 2.0 metadata/_custom_type_script = "uid://2qri6rrfv8ui" -[node name="GrabTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/GrabSequence/GrabCooldown"] +[node name="GrabTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/GrabSequence/GrabCooldown"] script = ExtResource("11_nq7ke") blackboard_key = "pursuit_target" metadata/_custom_type_script = "uid://b0xue7ao0gjqo" -[node name="ChaseSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector"] +[node name="ChaseSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector"] script = ExtResource("12_xde72") metadata/_custom_type_script = "uid://dcojdhvj8qcw0" -[node name="TargetReachable" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/ChaseSequence"] +[node name="TargetReachable" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/ChaseSequence"] script = ExtResource("32_6qixb") metadata/_custom_type_script = "uid://rpsd3i11lnur" -[node name="TravelToDestination" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/ChaseSequence"] +[node name="TravelToDestination" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/ChaseSequence"] script = ExtResource("14_4y64f") metadata/_custom_type_script = "uid://om57w2acvgb7" -[node name="FrustrationSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector"] +[node name="FrustrationSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector"] script = ExtResource("12_xde72") metadata/_custom_type_script = "uid://dcojdhvj8qcw0" -[node name="HasLineOfSight" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/FrustrationSequence" node_paths=PackedStringArray("exclusions", "sight_origin")] +[node name="HasLineOfSight" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/FrustrationSequence" node_paths=PackedStringArray("exclusions", "sight_origin")] script = ExtResource("32_urnsk") blackboard_key = "pursuit_target" -exclusions = [NodePath("../../../../../../../..")] -sight_origin = NodePath("../../../../../../../../CollisionShape3D/SightOrigin") +exclusions = [NodePath("../../../../../../..")] +sight_origin = NodePath("../../../../../../../CollisionShape3D/SightOrigin") metadata/_custom_type_script = "uid://dlbmi25edn8b7" -[node name="FrustrationCooldown" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/FrustrationSequence"] +[node name="FrustrationCooldown" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/FrustrationSequence"] script = ExtResource("10_ntlom") wait_time = 1.0 metadata/_custom_type_script = "uid://2qri6rrfv8ui" -[node name="GetFrustrated" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/FrustrationSequence/FrustrationCooldown"] +[node name="GetFrustrated" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/FrustrationSequence/FrustrationCooldown"] script = ExtResource("31_6qixb") settings_key = "game/gameplay/beast/anger_pursuit_frustrated" delta = 6.0 metadata/_custom_type_script = "uid://ccifed50rmjm2" -[node name="BoredomCooldown" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector"] +[node name="BoredomCooldown" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector"] script = ExtResource("10_ntlom") +wait_time = 4.0 metadata/_custom_type_script = "uid://2qri6rrfv8ui" -[node name="GetBored" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator/PursuitSequence/ActionSelector/BoredomCooldown"] +[node name="GetBored" type="Node" parent="GrunkBeastBehavior/StateSelector/PursuitMode/AlwaysSucceedDecorator2/ActionSelector/BoredomCooldown"] script = ExtResource("31_6qixb") settings_key = "game/gameplay/beast/anger_pursuit_bored" delta = -10.0 @@ -284,103 +298,112 @@ blackboard_key = "anger_level" settings_key = "game/gameplay/beast/anger_threshold_tracking" metadata/_custom_type_script = "uid://du7uk56300y28" -[node name="SequenceComposite" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode"] +[node name="AlwaysSucceedDecorator" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode"] +script = ExtResource("35_4alar") +metadata/_custom_type_script = "uid://dsf3a8vlolhx8" + +[node name="TransitionToTracking" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/AlwaysSucceedDecorator"] script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite"] +[node name="TransitionFromLurking" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/AlwaysSucceedDecorator/TransitionToTracking"] +script = ExtResource("14_urnsk") +left_operand = "get_value(\"current_mode\")" +right_operand = "\"lurking\"" +metadata/_custom_type_script = "uid://uoy6r3dbnq25" + +[node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/AlwaysSucceedDecorator/TransitionToTracking"] script = ExtResource("31_6qixb") settings_key = "game/gameplay/beast/anger_pursuit_frustrated" delta = 4.0 metadata/_custom_type_script = "uid://ccifed50rmjm2" -[node name="ActionSelector" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite"] +[node name="SetTrackingModeActive" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode"] +script = ExtResource("17_6qixb") +key = "\"current_mode\"" +value = "\"tracking\"" +metadata/_custom_type_script = "uid://cvq483a337v6s" + +[node name="ActionSelector" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode"] script = ExtResource("7_vvw1q") metadata/_custom_type_script = "uid://cw22yurt5l74k" -[node name="AlwaysFailDecorator" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector"] -script = ExtResource("15_oons1") -metadata/_custom_type_script = "uid://dwfdg523bk776" - -[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/AlwaysFailDecorator"] -script = ExtResource("10_kjykp") -blackboard_key = "point_of_interest" -metadata/_custom_type_script = "uid://u1ntpwjwjqhj" - -[node name="InvestigateAction" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector"] +[node name="InvestigateAction" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector"] script = ExtResource("12_xde72") metadata/_custom_type_script = "uid://dcojdhvj8qcw0" -[node name="POIInRange" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction"] +[node name="POIInRange" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction"] script = ExtResource("34_vbkm0") blackboard_key = "point_of_interest" -max_range = 6.2 +max_range = 6.0 metadata/_custom_type_script = "uid://o625e667ig2e" -[node name="AlwaysSucceedDecorator" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction"] +[node name="AlwaysSucceedDecorator" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction"] script = ExtResource("35_4alar") metadata/_custom_type_script = "uid://dsf3a8vlolhx8" -[node name="InvestigateSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator"] +[node name="InvestigateSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator"] script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="RandomDelay" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] +[node name="RandomDelay" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] script = ExtResource("11_mbqcc") mean_time = 4.0 st_dev_time = 0.6 -wait_time = 4.48953 +wait_time = 4.26245 metadata/_custom_type_script = "uid://beyk2xtbjrsg4" -[node name="PickRandomInvestigationTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomDelay"] +[node name="PickRandomInvestigationTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomDelay"] script = ExtResource("24_asd50") blackboard_key = "investigation_target" +center_target_key = "point_of_interest" +st_dev = Vector3(5, 0, 5) metadata/_custom_type_script = "uid://ubcelage67hs" -[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] +[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] script = ExtResource("10_kjykp") blackboard_key = "investigation_target" metadata/_custom_type_script = "uid://u1ntpwjwjqhj" -[node name="TravelToDestination" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] +[node name="TravelToDestination" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] script = ExtResource("14_4y64f") metadata/_custom_type_script = "uid://om57w2acvgb7" -[node name="RandomChance" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] +[node name="RandomChance" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence"] script = ExtResource("36_uy7at") probability = 0.1 metadata/_custom_type_script = "uid://c7n3lak5yhrpv" -[node name="SniffSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance"] +[node name="SniffSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance"] script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="Sniff" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence"] +[node name="Sniff" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence"] script = ExtResource("26_lak6w") metadata/_custom_type_script = "uid://bksvlal4gjhfr" -[node name="SetTargetFromArea" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence" node_paths=PackedStringArray("area")] -script = ExtResource("13_x8l6r") +[node name="SetPointOfInterest" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/InvestigateAction/AlwaysSucceedDecorator/InvestigateSequence/RandomChance/SniffSequence" node_paths=PackedStringArray("area")] +script = ExtResource("32_vbkm0") blackboard_key = "point_of_interest" -area = NodePath("../../../../../../../../../../../SniffRange") -metadata/_custom_type_script = "uid://b34l3v4sr8rmq" +area = NodePath("../../../../../../../../../../SniffRange") +metadata/_custom_type_script = "uid://dj7a2tj4cqap2" -[node name="IncrementBeastAnger" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/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") settings_key = "game/gameplay/beast/anger_sniff" delta = 40.0 metadata/_custom_type_script = "uid://ccifed50rmjm2" -[node name="TravelSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector"] +[node name="TravelSequence" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector"] script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/TravelSequence"] +[node name="SetNavTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/TravelSequence"] script = ExtResource("10_kjykp") blackboard_key = "point_of_interest" metadata/_custom_type_script = "uid://u1ntpwjwjqhj" -[node name="TravelToDestination" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/SequenceComposite/ActionSelector/TravelSequence"] +[node name="TravelToDestination" type="Node" parent="GrunkBeastBehavior/StateSelector/TrackingMode/ActionSelector/TravelSequence"] script = ExtResource("14_4y64f") metadata/_custom_type_script = "uid://om57w2acvgb7" @@ -388,11 +411,17 @@ metadata/_custom_type_script = "uid://om57w2acvgb7" script = ExtResource("8_0gxpq") metadata/_custom_type_script = "uid://cg016dbe7gs1x" +[node name="SetLurkingModeActive" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode"] +script = ExtResource("17_6qixb") +key = "\"current_mode\"" +value = "\"lurking\"" +metadata/_custom_type_script = "uid://cvq483a337v6s" + [node name="RandomDelay" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode"] script = ExtResource("11_mbqcc") mean_time = 9.0 st_dev_time = 1.0 -wait_time = 9.31084 +wait_time = 9.20004 metadata/_custom_type_script = "uid://beyk2xtbjrsg4" [node name="PickRandomLurkTarget" type="Node" parent="GrunkBeastBehavior/StateSelector/LurkingMode/RandomDelay"] @@ -435,7 +464,7 @@ layout_mode = 2 [node name="Label" type="Label" parent="DebugCanvasLayer/MarginContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Current beast behavior: " +text = "Current beast mode: " [node name="BeastBehaviorLabel" type="Label" parent="DebugCanvasLayer/MarginContainer/VBoxContainer/HBoxContainer"] unique_name_in_owner = true @@ -456,8 +485,8 @@ layout_mode = 2 size_flags_vertical = 1 max_value = 150.0 -[connection signal="body_entered" from="FrameSkipper/Shambler/TouchingRange" to="." method="_on_touch"] [connection signal="link_reached" from="Navigation/NavAgent" to="." method="_on_link_reached"] [connection signal="waypoint_reached" from="Navigation/NavAgent" to="." method="_on_waypoint_reached"] [connection signal="sound_detected" from="GameSoundListener" to="." method="on_sound_detected"] +[connection signal="body_entered" from="TouchingRange" to="." method="_on_touch"] [connection signal="timeout" from="AngerDecay" to="." method="_anger_decay"] diff --git a/src/world/grunk_beast/shambler/shambler.tscn b/src/world/grunk_beast/shambler/shambler.tscn index 03ec5e8..459bcb2 100644 --- a/src/world/grunk_beast/shambler/shambler.tscn +++ b/src/world/grunk_beast/shambler/shambler.tscn @@ -171,6 +171,9 @@ bone = 5 forward_axis = 2 primary_rotation_axis = 2 use_secondary_rotation = false +duration = 0.3 +transition_type = 7 +ease_type = 1 use_angle_limitation = true symmetry_limitation = true primary_limit_angle = 1.5708 @@ -217,6 +220,7 @@ parameters/rear_scale/scale = 1.0 [node name="LookTargetPivot" 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"] diff --git a/src/world/world.tscn b/src/world/world.tscn index a67352d..4d792d0 100644 --- a/src/world/world.tscn +++ b/src/world/world.tscn @@ -4,7 +4,7 @@ [ext_resource type="Resource" uid="uid://tgac5tnfx56r" path="res://src/world/world_manager.tres" id="2_5kmgb"] [ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="2_6fy3g"] [ext_resource type="Resource" uid="uid://0i72bf8ip1lx" path="res://src/world/spook_manager.tres" id="3_l0av5"] -[ext_resource type="PackedScene" uid="uid://bov4ok76woyc" path="res://levels/ghost_ship/ghost_ship.tscn" id="4_5kmgb"] +[ext_resource type="PackedScene" uid="uid://700gr7k3gqlf" path="res://levels/grunkbeast_test/visual_test/visual_test.tscn" id="4_5kmgb"] [ext_resource type="PackedScene" uid="uid://c0uitm5cg88h1" path="res://src/ui/menus/kill_screen/kill_screen.tscn" id="6_l0av5"] [ext_resource type="PackedScene" uid="uid://brknr57xc2cp0" path="res://src/ui/elements/save_icon/save_icon.tscn" id="7_5kmgb"] diff --git a/utilities/sandbox/sandbox.tscn b/utilities/sandbox/sandbox.tscn index fe41fcc..b941856 100644 --- a/utilities/sandbox/sandbox.tscn +++ b/utilities/sandbox/sandbox.tscn @@ -1,18 +1,20 @@ -[gd_scene load_steps=6 format=3 uid="uid://db8w8eljku535"] +[gd_scene load_steps=8 format=3 uid="uid://db8w8eljku535"] [ext_resource type="Script" uid="uid://duegbpkukv4e" path="res://utilities/sandbox/sandbox.gd" id="1_mxso2"] [ext_resource type="Script" uid="uid://bb0t2ovl7wifo" path="res://addons/beehave/nodes/beehave_tree.gd" id="2_fjanr"] [ext_resource type="Script" uid="uid://dcojdhvj8qcw0" path="res://addons/beehave/nodes/composites/sequence_reactive.gd" id="3_hovx8"] [ext_resource type="Script" uid="uid://yar3g43pb3fm" path="res://src/world/grunk_beast/behaviors/actions/print_debug_action.gd" id="4_1rbkg"] -[ext_resource type="Script" uid="uid://c7n3lak5yhrpv" path="res://src/world/grunk_beast/behaviors/decorators/random_chance.gd" id="5_f6f0v"] +[ext_resource type="Script" uid="uid://cg016dbe7gs1x" path="res://addons/beehave/nodes/composites/sequence.gd" id="5_ua2rg"] +[ext_resource type="Script" uid="uid://dorri1tul8gfx" path="res://addons/beehave/nodes/decorators/delayer.gd" id="6_buuky"] +[ext_resource type="Script" uid="uid://c84st521ytmk3" path="res://addons/beehave/nodes/decorators/until_fail.gd" id="6_f6f0v"] [node name="Sandbox" type="Node"] script = ExtResource("1_mxso2") [node name="BeehaveTree" type="Node" parent="." node_paths=PackedStringArray("blackboard", "actor")] script = ExtResource("2_fjanr") -tick_rate = 60 -blackboard = NodePath("@Node@94268") +tick_rate = 5 +blackboard = NodePath("@Node@22149") actor = NodePath("..") metadata/_custom_type_script = "uid://bb0t2ovl7wifo" @@ -20,14 +22,35 @@ metadata/_custom_type_script = "uid://bb0t2ovl7wifo" script = ExtResource("3_hovx8") metadata/_custom_type_script = "uid://dcojdhvj8qcw0" -[node name="DebugA" type="Node" parent="BeehaveTree/SequenceReactiveComposite"] +[node name="ShouldPrintEveryFrame" type="Node" parent="BeehaveTree/SequenceReactiveComposite"] script = ExtResource("4_1rbkg") metadata/_custom_type_script = "uid://yar3g43pb3fm" -[node name="RandomChance" type="Node" parent="BeehaveTree/SequenceReactiveComposite"] -script = ExtResource("5_f6f0v") -metadata/_custom_type_script = "uid://c7n3lak5yhrpv" +[node name="SequenceComposite" type="Node" parent="BeehaveTree/SequenceReactiveComposite"] +script = ExtResource("5_ua2rg") +metadata/_custom_type_script = "uid://cg016dbe7gs1x" -[node name="DebugBB" type="Node" parent="BeehaveTree/SequenceReactiveComposite/RandomChance"] +[node name="ShouldPrintOnlyOnceXXXXXXXXXXXX" type="Node" parent="BeehaveTree/SequenceReactiveComposite/SequenceComposite"] +script = ExtResource("4_1rbkg") +metadata/_custom_type_script = "uid://yar3g43pb3fm" + +[node name="UntilFailDecorator" type="Node" parent="BeehaveTree/SequenceReactiveComposite/SequenceComposite"] +script = ExtResource("6_f6f0v") +metadata/_custom_type_script = "uid://c84st521ytmk3" + +[node name="SequenceReactiveComposite" type="Node" parent="BeehaveTree/SequenceReactiveComposite/SequenceComposite/UntilFailDecorator"] +script = ExtResource("3_hovx8") +metadata/_custom_type_script = "uid://dcojdhvj8qcw0" + +[node name="ShouldPrintEveryFrameINNER" type="Node" parent="BeehaveTree/SequenceReactiveComposite/SequenceComposite/UntilFailDecorator/SequenceReactiveComposite"] +script = ExtResource("4_1rbkg") +metadata/_custom_type_script = "uid://yar3g43pb3fm" + +[node name="DelayDecorator" type="Node" parent="BeehaveTree/SequenceReactiveComposite/SequenceComposite/UntilFailDecorator/SequenceReactiveComposite"] +script = ExtResource("6_buuky") +wait_time = 0.5 +metadata/_custom_type_script = "uid://dorri1tul8gfx" + +[node name="OnceInAWhile" type="Node" parent="BeehaveTree/SequenceReactiveComposite/SequenceComposite/UntilFailDecorator/SequenceReactiveComposite/DelayDecorator"] script = ExtResource("4_1rbkg") metadata/_custom_type_script = "uid://yar3g43pb3fm"