[gd_scene format=3 uid="uid://8t87iy0t0igo"] [ext_resource type="PackedScene" uid="uid://c1g1vy67lf550" path="res://assets/character/player/player.tscn" id="1_eqqp1"] [ext_resource type="Environment" uid="uid://14b3gterja03" path="res://data/world_environment.tres" id="2_ykyjo"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bxedw"] radius = 0.4 [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_1oybq"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_f46kd"] [sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_ykyjo"] fadeout_time = 0.02 [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_vqq2l"] animation = &"hang-clamber" [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ykyjo"] sync = true [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_4vq5b"] animation = &"fall" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3rerk"] animation = &"RESET" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3nfmf"] animation = &"jump" [sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_eqqp1"] fadein_time = 0.05 fadeout_time = 0.05 [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_42cpl"] animation = &"hang" [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_uxov2"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_eqqp1"] animation = &"run" [sub_resource type="AnimationNodeTimeSeek" id="AnimationNodeTimeSeek_eqqp1"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_i8sra"] animation = &"skid" [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_jbsc3"] [sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_uxov2"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_i825w"] animation = &"run-start" [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_3rerk"] [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_nmc1l"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_uxov2"] animation = &"grip" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_f46kd"] animation = &"wallrun_left" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_nmc1l"] animation = &"wallrun_right" [sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_eqqp1"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_uxov2"] graph_offset = Vector2(-363.57355, -446.2923) nodes/output/position = Vector2(1140, 140) nodes/ClimbUpClip/node = SubResource("AnimationNodeAnimation_vqq2l") nodes/ClimbUpClip/position = Vector2(480, 480) nodes/Decelerating/node = SubResource("AnimationNodeBlend2_ykyjo") nodes/Decelerating/position = Vector2(-340, -600) nodes/Air/node = SubResource("AnimationNodeBlend2_1oybq") nodes/Air/position = Vector2(480, -280) nodes/Speed/node = SubResource("AnimationNodeTimeScale_jbsc3") nodes/Speed/position = Vector2(60, -540) nodes/Wall/node = SubResource("AnimationNodeBlend2_3rerk") nodes/Wall/position = Vector2(700, -60) nodes/WallAction/node = SubResource("AnimationNodeBlend2_nmc1l") nodes/WallAction/position = Vector2(480, 20) nodes/WallGripLoop/node = SubResource("AnimationNodeAnimation_uxov2") nodes/WallGripLoop/position = Vector2(260, 20) nodes/WallRunLeftLoop/node = SubResource("AnimationNodeAnimation_f46kd") nodes/WallRunLeftLoop/position = Vector2(40, 200) nodes/WallRunSide/node = SubResource("AnimationNodeBlend2_eqqp1") nodes/WallRunSide/position = Vector2(260, 200) nodes/WallRunRightLoop/node = SubResource("AnimationNodeAnimation_nmc1l") nodes/WallRunRightLoop/position = Vector2(40, 380) nodes/SkidStopLoop/node = SubResource("AnimationNodeAnimation_i8sra") nodes/SkidStopLoop/position = Vector2(-620, -420) nodes/IdleLoop/node = SubResource("AnimationNodeAnimation_3rerk") nodes/IdleLoop/position = Vector2(60, -740) nodes/Moving/node = SubResource("AnimationNodeBlend2_uxov2") nodes/Moving/position = Vector2(260, -560) nodes/AirTime/node = SubResource("AnimationNodeBlend2_f46kd") nodes/AirTime/position = Vector2(260, -280) nodes/Jumping/node = SubResource("AnimationNodeAnimation_3nfmf") nodes/Jumping/position = Vector2(60, -280) nodes/Falling/node = SubResource("AnimationNodeAnimation_4vq5b") nodes/Falling/position = Vector2(60, -100) nodes/Ledge/node = SubResource("AnimationNodeOneShot_eqqp1") nodes/Ledge/position = Vector2(920, 140) nodes/LedgeLoop/node = SubResource("AnimationNodeAnimation_42cpl") nodes/LedgeLoop/position = Vector2(480, 300) nodes/ClimbUp/node = SubResource("AnimationNodeOneShot_ykyjo") nodes/ClimbUp/position = Vector2(700, 260) nodes/StartRunning/node = SubResource("AnimationNodeOneShot_uxov2") nodes/StartRunning/position = Vector2(-120, -600) nodes/StartRunningAnimation/node = SubResource("AnimationNodeAnimation_i825w") nodes/StartRunningAnimation/position = Vector2(-440, -300) nodes/RunLoop/node = SubResource("AnimationNodeAnimation_eqqp1") nodes/RunLoop/position = Vector2(-740, -620) nodes/RunSeek/node = SubResource("AnimationNodeTimeSeek_eqqp1") nodes/RunSeek/position = Vector2(-540, -620) node_connections = [&"output", 0, &"Ledge", &"Decelerating", 0, &"RunSeek", &"Decelerating", 1, &"SkidStopLoop", &"Air", 0, &"Moving", &"Air", 1, &"AirTime", &"Speed", 0, &"StartRunning", &"Wall", 0, &"Air", &"Wall", 1, &"WallAction", &"WallAction", 0, &"WallGripLoop", &"WallAction", 1, &"WallRunSide", &"WallRunSide", 0, &"WallRunLeftLoop", &"WallRunSide", 1, &"WallRunRightLoop", &"Moving", 0, &"IdleLoop", &"Moving", 1, &"Speed", &"AirTime", 0, &"Jumping", &"AirTime", 1, &"Falling", &"Ledge", 0, &"Wall", &"Ledge", 1, &"ClimbUp", &"ClimbUp", 0, &"LedgeLoop", &"ClimbUp", 1, &"ClimbUpClip", &"StartRunning", 0, &"Decelerating", &"StartRunning", 1, &"StartRunningAnimation", &"RunSeek", 0, &"RunLoop"] [sub_resource type="GDScript" id="GDScript_i825w"] resource_name = "PlayerAnimationPlayer" script/source = "extends AnimationTree @onready var body := get_owner() as PlayerBody @onready var behaviour_tree : PlayerBehaviourTree = $\"../../PlayerBehaviourTree\" @export var default_blend_time : float @export var full_speed : float @export var min_skid_speed : float @export var skid_blend_speed_in : float @export var skid_blend_speed_out : float @export var jump_to_fall_speed : float @export var air_blend_speed : float var previous_speed : float = 0.0 func property_move_toward(property : String, target, speed) -> float: var current = get(property) var diff = target - current var dir = sign(diff) var new_value = current if abs(diff) <= speed: new_value = target else: new_value = current + dir * speed if new_value == current: return current else: set(property, new_value) return new_value func process_skid_blend(delta : float, speed : float): var current_deceleration_blend = get(\"parameters/Decelerating/blend_amount\") var deceleration_distance : float = 0.0 if behaviour_tree.get_world_move_input().dot(body.velocity) > 0.1 else clamp(speed / min_skid_speed, 0.0, 1.0) var skid_blend_speed : float = skid_blend_speed_in if deceleration_distance >= current_deceleration_blend else skid_blend_speed_out property_move_toward(\"parameters/Decelerating/blend_amount\", deceleration_distance, delta * skid_blend_speed) func _physics_process(delta: float) -> void: var speed : float = Vector2(body.velocity.x, body.velocity.z).length() if previous_speed == 0.0 and speed > 0.0 and not get(\"parameters/StartRunning/active\"): set(\"parameters/RunSeek/seek_request\", 0.0) set(\"parameters/StartRunning/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE) set(\"parameters/Speed/scale\", clamp(speed / full_speed, 0.2, 1.0)) previous_speed = speed process_skid_blend(delta, speed) property_move_toward(\"parameters/Moving/blend_amount\", 1.0 if speed > 0.05 else 0.0, delta * default_blend_time) var in_air : bool = 1.0 == property_move_toward(\"parameters/Air/blend_amount\", 0.0 if body.is_on_floor() else 1.0, delta * air_blend_speed) if in_air: property_move_toward(\"parameters/AirTime/blend_amount\", 1.0, delta * jump_to_fall_speed) if body.is_on_floor(): set(\"parameters/Wall/blend_amount\", 0.0) " [sub_resource type="GDScript" id="GDScript_f46kd"] resource_name = "HangRay" script/source = "@tool extends RayCast3D @export var dist_mul : float @export var height : float = 1.0 var last_direction : Vector3 = Vector3.BACK @onready var body : PlayerBody = get_owner() as Node3D func _ready() -> void: add_exception(body) func _physics_process(_delta : float): _process(_delta) func _process(_delta : float): if Engine.is_editor_hint() and body: global_position = body.global_position + Vector3.UP * height + Vector3.BACK * dist_mul elif body: var direction : Vector3 = -body.velocity if body.is_on_wall(): direction = body.get_wall_normal() direction = Vector3(direction.x, 0, direction.z).normalized() if not direction.is_zero_approx(): last_direction = direction global_position = body.global_position + Vector3.UP * height + last_direction * dist_mul force_raycast_update() " [sub_resource type="GDScript" id="GDScript_4vq5b"] resource_name = "PlayerHighWallRay" script/source = "extends RayCast3D @onready var body : PlayerBody = get_owner() as Node3D func _ready() -> void: add_exception(body) func _physics_process(_delta : float): _process(_delta) func _process(_delta : float): target_position = ($\"../HangRay\".global_position - global_position) * 2.0 global_rotation = Vector3.ZERO global_position = get_parent_node_3d().global_position + Vector3.UP * 2.0 force_raycast_update() " [sub_resource type="GDScript" id="GDScript_3rerk"] resource_name = "BelowLedgePrerequisite" script/source = "extends PlayerAction var timeout : bool = false func _ready(): %LedgeHangTimer.timeout.connect(set.bind(\"timeout\", false)) func _enter() -> int: blackboard.high_wall_ray.force_raycast_update() blackboard.hang_ray.force_raycast_update() if not timeout and not body.is_on_floor() and body.is_on_wall() and blackboard.hang_ray.is_colliding() and not blackboard.high_wall_ray.is_colliding(): blackboard.ground_ray.force_raycast_update() var wall_normal_y : float = blackboard.hang_ray.get_collision_normal().y var edge_distance : float = blackboard.hang_ray.get_collision_point().distance_to(blackboard.hang_ray.global_position) if wall_normal_y > 0.9 and blackboard.get_ground_distance() > edge_distance + 1: timeout = true return Success return Fail " [sub_resource type="GDScript" id="GDScript_uxov2"] resource_name = "PlayerLedgeHangAction" script/source = "extends PlayerAction var wall_normal : Vector3 var distance_from_hang_point : Vector3 func _enter() -> int: blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE) wall_normal = body.get_wall_normal() wall_normal = Vector3(wall_normal.x, 0, wall_normal.z).normalized() blackboard.character.look_at(blackboard.character.global_position - wall_normal) return Running func _execute() -> int: if get_status() == Running: maintain_animation_state() distance_from_hang_point = blackboard.hang_ray.get_collision_point() - blackboard.hang_ray.global_position update_physics_state() return check_input_changes() return get_status() func _exit(): %LedgeHangTimer.start() func maintain_animation_state(): blackboard.anim.set(\"parameters/Air/blend_amount\", 0.0) blackboard.anim.set(\"parameters/Wall/blend_amount\", 0.0) func update_physics_state(): body.velocity = Vector3.ZERO body.global_position = body.global_position.lerp(body.global_position + distance_from_hang_point, 0.25) func check_input_changes(): var input_dot_wall : float = wall_normal.dot(blackboard.get_world_move_input()) if distance_from_hang_point.length() < 0.05 and (input_dot_wall < -0.7 or Input.is_action_just_pressed(\"jump\")): return Success if body.is_on_floor() or input_dot_wall > 0.5 and distance_from_hang_point.length() < 0.05: blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT); return Fail return get_status() " [sub_resource type="GDScript" id="GDScript_i8sra"] resource_name = "PlayerLedgeClimbAnimation" script/source = "extends PlayerAnimationAction func _execute() ->int: blackboard.anim.set(\"parameters/Wall/blend_amount\", 0.0) blackboard.anim.set(\"parameters/Air/blend_amount\", 0.0) return get_status() func _exit(): blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT) " [sub_resource type="GDScript" id="GDScript_3rfka"] resource_name = "PlayerWallRunAction" script/source = "extends PlayerAction @export var gravity_scale : float @export var max_upward_velocity : float @export var drag : float @export var blend_in_time : float @export var min_ground_speed : float @export var jump_normal_force : float @export var jump_input_force : float @export var jump_vertical_force : float @export var min_run_time : float var run_time : float = 0.0 func _enter() -> int: var flat_velocity := Vector2(body.velocity.x, body.velocity.z) var input_velocity_dot : float = blackboard.get_world_move_input().normalized().dot(body.velocity.normalized()) var ground_velocity := Vector3(body.velocity.x, 0, body.velocity.z) if body.is_on_wall_only() and input_velocity_dot > 0.01 and ground_velocity.length() >= min_ground_speed and flat_velocity.length() > -body.velocity.y * 4.0: if Input.is_action_just_pressed(\"jump\") and run_time > min_run_time: var wall_flat := Vector3(body.get_wall_normal().x, 0, body.get_wall_normal().z) body.velocity = wall_flat * jump_normal_force + (ground_velocity + blackboard.get_world_move_input()).normalized() * jump_input_force * ground_velocity.length() body.velocity.y = jump_vertical_force blackboard.character.look_at(blackboard.character.global_position + Vector3(body.velocity.x, 0, body.velocity.z)) blackboard.anim.set(\"parameters/AirTime/blend_amount\", 0.0) else: run_time += get_process_delta_time() body.velocity *= 1 - drag body.velocity += body.get_gravity() * get_process_delta_time() * gravity_scale body.velocity.y = min(max_upward_velocity, body.velocity.y) blackboard.character.look_at(blackboard.character.global_position + body.velocity) blackboard.anim.set(\"parameters/WallAction/blend_amount\", 1.0) blackboard.anim.property_move_toward(\"parameters/Wall/blend_amount\", 1.0, get_process_delta_time() * blend_in_time) var dot : float = body.get_wall_normal().dot(blackboard.character.basis.x) blackboard.anim.set(\"parameters/WallRunSide/blend_amount\", 0.0 if dot > 0 else 1.0) return Success else: run_time = 0.0 return Fail " [sub_resource type="GDScript" id="GDScript_nmc1l"] resource_name = "WallGripAction" script/source = "extends PlayerAction @export var wall_drag : float @export var max_y_velocity : float @export var jump_normal_force : float @export var jump_vertical_force : float func _enter() -> int: var flat_wall := Vector3(body.get_wall_normal().x, 0, body.get_wall_normal().z) var input_into_wall := blackboard.get_world_move_input().normalized().dot(body.get_wall_normal()) < 0.1 if body.is_on_wall_only() and input_into_wall and blackboard.get_ground_distance() > .5 and body.velocity.y < 1.0: if Input.is_action_just_pressed(\"jump\"): body.velocity = flat_wall * jump_normal_force body.velocity.y = jump_vertical_force blackboard.character.look_at(blackboard.character.global_position + Vector3(body.velocity.x, 0, body.velocity.z)) blackboard.anim.set(\"parameters/AirTime/blend_amount\", 0.0) else: var delta := get_process_delta_time() var target_velocity := Vector3(0, clamp(body.velocity.y, -max_y_velocity, 0.0), 0) body.velocity = body.velocity.move_toward(target_velocity, wall_drag * delta) + (body.get_gravity() * 0.2 * delta) body.velocity.y = min(body.velocity.y, 0.0) blackboard.character.look_at(blackboard.character.global_position + body.get_wall_normal()) blackboard.anim.set(\"parameters/WallAction/blend_amount\", 0.0) blackboard.anim.property_move_toward(\"parameters/Wall/blend_amount\", 1.0 if body.is_on_wall_only() else 0.0, delta * blackboard.anim.default_blend_time) return Success return Fail " [sub_resource type="GDScript" id="GDScript_ykyjo"] resource_name = "FallingAction" script/source = "extends PlayerAction @export_range(0.0, 1.0, 0.001) var drag : float = 0.001 func _execute() -> int: if not body.is_on_floor(): body.velocity *= 1.0 - drag body.velocity += body.get_gravity() * get_process_delta_time() var look_direction := Vector3(blackboard.character.global_basis.z.x, 0, blackboard.character.global_basis.z.z) blackboard.character.look_at(blackboard.character.global_position - look_direction) blackboard.anim.property_move_toward(\"parameters/Wall/blend_amount\", 0.0, get_process_delta_time() * 15) return Success return Fail " [sub_resource type="GDScript" id="GDScript_eqqp1"] resource_name = "JumpAction" script/source = "extends PlayerAction @export var vertical_jump_velocity : float func _enter() -> int: if Input.is_action_just_pressed(\"jump\") and body.is_on_floor(): body.velocity.y = vertical_jump_velocity blackboard.anim.set(\"parameters/AirTime/blend_amount\", 0.0) return Success else: return Fail " [sub_resource type="GDScript" id="GDScript_bxedw"] resource_name = "RunningAction" script/source = "extends PlayerMovementAction func _enter() -> int: process_movement(true) return Success " [node name="Player" type="PlayerBody" unique_id=591139793] floor_max_angle = 0.87266463 floor_snap_length = 0.2 [node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1143027860] shape = SubResource("CapsuleShape3D_bxedw") [node name="GroundRay" type="RayCast3D" parent="." unique_id=1763928231] process_mode = 3 process_priority = 1 process_physics_priority = 1 target_position = Vector3(0, -500, 0) hit_back_faces = false [node name="PlayerModel" parent="." unique_id=1710695753 instance=ExtResource("1_eqqp1")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) [node name="AnimationTree" type="AnimationTree" parent="PlayerModel" unique_id=847372421] root_motion_track = NodePath("HumanArmature/Skeleton3D:root") tree_root = SubResource("AnimationNodeBlendTree_uxov2") anim_player = NodePath("../AnimationPlayer") parameters/Decelerating/blend_amount = 0.0 parameters/Air/blend_amount = 0.0 parameters/Speed/scale = 1.0 parameters/Wall/blend_amount = 0.0 parameters/WallAction/blend_amount = 0.0 parameters/WallRunSide/blend_amount = 0.0 parameters/Moving/blend_amount = 0.0 parameters/AirTime/blend_amount = 0.0 parameters/Ledge/active = false parameters/Ledge/internal_active = false parameters/Ledge/request = 0 parameters/ClimbUp/active = false parameters/ClimbUp/internal_active = false parameters/ClimbUp/request = 0 parameters/StartRunning/active = false parameters/StartRunning/internal_active = false parameters/StartRunning/request = 0 parameters/RunSeek/seek_request = -1.0 script = SubResource("GDScript_i825w") default_blend_time = 30.0 full_speed = 5.0 min_skid_speed = 10.0 skid_blend_speed_in = 5.0 skid_blend_speed_out = 3.0 jump_to_fall_speed = 2.0 air_blend_speed = 50.0 [node name="HangRay" type="RayCast3D" parent="PlayerModel" unique_id=183285060] process_mode = 3 process_priority = 1 process_physics_priority = 1 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, -0.44) target_position = Vector3(0, -2, 0) hit_back_faces = false script = SubResource("GDScript_f46kd") dist_mul = -0.44 [node name="HighWallRay" type="RayCast3D" parent="PlayerModel" unique_id=2283840] process_mode = 3 process_priority = 1 process_physics_priority = 1 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) target_position = Vector3(0, 0, -0.5) collision_mask = 15 hit_back_faces = false script = SubResource("GDScript_4vq5b") [node name="Camera3D" type="PlayerCamera" parent="." unique_id=709217818] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0.81082594, 1.2089427) fov = 96.8 target_distance = 1.7 origin_height = 0.6 [node name="PlayerBehaviourTree" type="PlayerBehaviourTree" parent="." unique_id=1439326326 node_paths=PackedStringArray("character")] character = NodePath("../PlayerModel") [node name="BehaviourRepeater" type="BehaviourRepeater" parent="PlayerBehaviourTree" unique_id=766320099] [node name="ActionSelector" type="BehaviourSelector" parent="PlayerBehaviourTree/BehaviourRepeater" unique_id=433229675] [node name="LedgeHangSequence" type="BehaviourSequence" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector" unique_id=285489367] [node name="CanLedgeHang" type="PlayerAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector/LedgeHangSequence" unique_id=1704888964] script = SubResource("GDScript_3rerk") [node name="BehaviourAlwaysSuccess" type="BehaviourAlwaysSuccess" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector/LedgeHangSequence" unique_id=1899198413] [node name="LedgeActionsSequence" type="BehaviourSequence" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector/LedgeHangSequence/BehaviourAlwaysSuccess" unique_id=524493208] [node name="LedgeHang" type="PlayerAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector/LedgeHangSequence/BehaviourAlwaysSuccess/LedgeActionsSequence" unique_id=189327718] script = SubResource("GDScript_uxov2") [node name="LedgeClimbAnimation" type="PlayerAnimationAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector/LedgeHangSequence/BehaviourAlwaysSuccess/LedgeActionsSequence" unique_id=980794512] one_shot_path = "ClimbUp" script = SubResource("GDScript_i8sra") [node name="LedgeHangTimer" type="Timer" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector/LedgeHangSequence" unique_id=465275658] unique_name_in_owner = true process_mode = 1 [node name="WallRun" type="PlayerAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector" unique_id=2090512639] script = SubResource("GDScript_3rfka") gravity_scale = 0.169 max_upward_velocity = 2.0 drag = 0.01 blend_in_time = 50.0 min_ground_speed = 5.0 jump_normal_force = 4.0 jump_input_force = 1.3 jump_vertical_force = 4.0 min_run_time = 0.05 [node name="WallGrip" type="PlayerAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector" unique_id=85039173] script = SubResource("GDScript_nmc1l") wall_drag = 15.0 max_y_velocity = 4.0 jump_normal_force = 4.0 jump_vertical_force = 6.0 [node name="Fall" type="PlayerAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector" unique_id=570179125] script = SubResource("GDScript_ykyjo") drag = 0.015 [node name="Jump" type="PlayerAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector" unique_id=553747039] script = SubResource("GDScript_eqqp1") vertical_jump_velocity = 6.0 [node name="Run" type="PlayerMovementAction" parent="PlayerBehaviourTree/BehaviourRepeater/ActionSelector" unique_id=2080183164] target_speed = 10.0 acceleration = 20.0 deceleration = 25.0 script = SubResource("GDScript_bxedw") [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=647455591] environment = ExtResource("2_ykyjo")