viscosity/project/objects/player.tscn
2026-06-16 15:48:04 +02:00

551 lines
23 KiB
Text

[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")