diff --git a/godot/scenes/level.tscn b/godot/scenes/level.tscn index d78efa9..be053a8 100644 --- a/godot/scenes/level.tscn +++ b/godot/scenes/level.tscn @@ -76,5 +76,5 @@ text = "Load " [connection signal="interacted" from="Door/Interactable" to="Door" method="_on_interact"] -[connection signal="pressed" from="Control/HBoxContainer/SaveButton" to="Control/Persistence" method="save"] -[connection signal="pressed" from="Control/HBoxContainer/LoadButton" to="Control/Persistence" method="load"] +[connection signal="pressed" from="Control/HBoxContainer/SaveButton" to="Control/Persistence" method="save" binds= ["save1.sav"]] +[connection signal="pressed" from="Control/HBoxContainer/LoadButton" to="Control/Persistence" method="load" binds= ["save1.sav"]] diff --git a/godot/scenes/player.tscn b/godot/scenes/player.tscn index 80098a3..a260fc6 100644 --- a/godot/scenes/player.tscn +++ b/godot/scenes/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=36 format=3 uid="uid://crbrniwi6kd3p"] +[gd_scene load_steps=42 format=3 uid="uid://crbrniwi6kd3p"] [ext_resource type="PackedScene" uid="uid://dpmbimh6m4ari" path="res://scenes/player_mesh.tscn" id="1_3vyb7"] [ext_resource type="Script" uid="uid://50vv0ta67tgl" path="res://src/player.gd" id="1_qhqgy"] @@ -12,6 +12,33 @@ [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_smehm"] animation = &"Aim" +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_d2wvv"] +animation = &"Run" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3v2ag"] +animation = &"PistolIdle" + +[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_jej6c"] +filter_enabled = true +filters = ["AuxScene/Scene/Armature/Skeleton3D:mixamorigHips", "AuxScene/Scene/Armature/Skeleton3D:mixamorigHips001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftFoot", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftLeg", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftLeg001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftToeBase", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftUpLeg", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftUpLeg001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightFoot", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightLeg", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightLeg001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightToeBase", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightUpLeg", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightUpLeg001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigSpine", "AuxScene/Scene/Armature/Skeleton3D:mixamorigSpine1"] + +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_f1ej7"] +graph_offset = Vector2(-828.243, 9.73114) +nodes/Animation/node = SubResource("AnimationNodeAnimation_3v2ag") +nodes/Animation/position = Vector2(-200, 140) +"nodes/Animation 2/node" = SubResource("AnimationNodeAnimation_d2wvv") +"nodes/Animation 2/position" = Vector2(-200, 320) +nodes/Blend2/node = SubResource("AnimationNodeBlend2_jej6c") +nodes/Blend2/position = Vector2(60, 140) +nodes/output/position = Vector2(300, 140) +node_connections = [&"Blend2", 0, &"Animation", &"Blend2", 1, &"Animation 2", &"output", 0, &"Blend2"] + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ur7pv"] +animation = &"Fire" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_y4r1p"] +animation = &"PistolIdle" + [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_tuyoq"] animation = &"PistolIdle" @@ -23,7 +50,7 @@ filter_enabled = true filters = ["", "AuxScene/Scene/Armature/Skeleton3D:mixamorigHead", "AuxScene/Scene/Armature/Skeleton3D:mixamorigHead001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftArm", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftArm001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftForeArm", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftForeArm001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHand", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHand001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandIndex1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandIndex1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandIndex2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandIndex2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandIndex3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandIndex4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandMiddle4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky4", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandPinky4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing4", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandRing4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftHandThumb4", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftShoulder", "AuxScene/Scene/Armature/Skeleton3D:mixamorigLeftShoulder001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigNeck", "AuxScene/Scene/Armature/Skeleton3D:mixamorigNeck001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightArm", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightArm001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightForeArm", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightForeArm001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHand", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHand001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandIndex1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandIndex1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandIndex2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandIndex2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandIndex3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandIndex3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandMiddle1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandMiddle1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandMiddle2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandMiddle2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandMiddle3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandMiddle4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky2001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky4", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandPinky4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing4", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandRing4001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandThumb1", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandThumb1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandThumb2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandThumb3", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightHandThumb3001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightShoulder", "AuxScene/Scene/Armature/Skeleton3D:mixamorigRightShoulder001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigSpine001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigSpine1001", "AuxScene/Scene/Armature/Skeleton3D:mixamorigSpine2", "AuxScene/Scene/Armature/Skeleton3D:mixamorigSpine2001"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ur7pv"] -graph_offset = Vector2(-347.972, 53.4891) +graph_offset = Vector2(-319.616, 91.8118) nodes/Animation/node = SubResource("AnimationNodeAnimation_fjrip") nodes/Animation/position = Vector2(-140, 120) "nodes/Animation 2/node" = SubResource("AnimationNodeAnimation_tuyoq") @@ -32,12 +59,6 @@ nodes/Blend2/node = SubResource("AnimationNodeBlend2_smehm") nodes/Blend2/position = Vector2(80, 120) node_connections = [&"Blend2", 0, &"Animation", &"Blend2", 1, &"Animation 2", &"output", 0, &"Blend2"] -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ur7pv"] -animation = &"Fire" - -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_y4r1p"] -animation = &"PistolIdle" - [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_ur7pv"] advance_mode = 2 @@ -65,16 +86,27 @@ advance_mode = 2 advance_mode = 2 advance_expression = "not is_weapon_ready" +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_4r5pv"] +advance_mode = 2 +advance_expression = "is_running" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_60mlk"] +advance_mode = 2 +advance_expression = "not is_running" + [sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_d2wvv"] states/Aim/node = SubResource("AnimationNodeAnimation_smehm") states/Aim/position = Vector2(327, 194) -states/BlendTree/node = SubResource("AnimationNodeBlendTree_ur7pv") -states/BlendTree/position = Vector2(488, 100) +states/BlendTree/node = SubResource("AnimationNodeBlendTree_f1ej7") +states/BlendTree/position = Vector2(653, 100) +states/End/position = Vector2(890, 40) states/Fire/node = SubResource("AnimationNodeAnimation_ur7pv") states/Fire/position = Vector2(462, 194) states/PistolIdle/node = SubResource("AnimationNodeAnimation_y4r1p") states/PistolIdle/position = Vector2(327, 100) -transitions = ["Start", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_ur7pv"), "PistolIdle", "BlendTree", SubResource("AnimationNodeStateMachineTransition_y4r1p"), "BlendTree", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_d2wvv"), "PistolIdle", "Aim", SubResource("AnimationNodeStateMachineTransition_oprun"), "Aim", "Fire", SubResource("AnimationNodeStateMachineTransition_a8ls1"), "Fire", "Aim", SubResource("AnimationNodeStateMachineTransition_qfm1y"), "Aim", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_fulsm")] +states/Walk/node = SubResource("AnimationNodeBlendTree_ur7pv") +states/Walk/position = Vector2(488, 100) +transitions = ["Start", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_ur7pv"), "PistolIdle", "Walk", SubResource("AnimationNodeStateMachineTransition_y4r1p"), "Walk", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_d2wvv"), "PistolIdle", "Aim", SubResource("AnimationNodeStateMachineTransition_oprun"), "Aim", "Fire", SubResource("AnimationNodeStateMachineTransition_a8ls1"), "Fire", "Aim", SubResource("AnimationNodeStateMachineTransition_qfm1y"), "Aim", "PistolIdle", SubResource("AnimationNodeStateMachineTransition_fulsm"), "Walk", "BlendTree", SubResource("AnimationNodeStateMachineTransition_4r5pv"), "BlendTree", "Walk", SubResource("AnimationNodeStateMachineTransition_60mlk")] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_qhqgy"] animation = &"Idle" @@ -94,11 +126,11 @@ advance_expression = "velocity" [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_smehm"] advance_mode = 2 -advance_expression = "input.is_running" +advance_expression = "is_running" [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_qhqgy"] advance_mode = 2 -advance_expression = "not input.is_running or not velocity" +advance_expression = "not is_running" [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_dqkch"] advance_mode = 2 @@ -165,5 +197,6 @@ tree_root = SubResource("AnimationNodeStateMachine_y4r1p") advance_expression_base_node = NodePath("..") anim_player = NodePath("../Mesh/AnimationPlayer") parameters/Handgun/BlendTree/Blend2/blend_amount = 1.0 +parameters/Handgun/Walk/Blend2/blend_amount = 1.0 [editable path="Mesh"] diff --git a/godot/src/persistence.gd b/godot/src/persistence.gd index e2d463d..2fbc7c7 100644 --- a/godot/src/persistence.gd +++ b/godot/src/persistence.gd @@ -14,11 +14,20 @@ static func get_instance_data(node: Node): data = node.call(SaveMethod) } +func get_file(filename: String) -> Result: + if not filename.is_valid_filename(): + return Result.err('invalid filename "%s"' % filename) + else: + var file_path = path.path_join(filename) + return Result.ok(file_path) + func save(filename: String) -> Result: DirAccess.make_dir_recursive_absolute(path.get_base_dir()) - var file_path = path.path_join(filename) - if not file_path.is_valid_filename(): - return Result.err('invalid file path "%s"' % file_path) + var file_result = get_file(filename) + if file_result.is_err(): + push_error(file_result.unwrap_err()) + return file_result + var file_path = file_result.unwrap() var file = FileAccess.open(file_path, FileAccess.WRITE) var nodes = get_tree().get_nodes_in_group(group_name) @@ -56,13 +65,21 @@ func _get_or_add(instance_data: Dictionary) -> Variant: return node -func load() -> Result: - if not FileAccess.file_exists(path): - return Result.err('ENOENT: "%s" does not exist' % path) +func load(filename: String) -> Result: + var file_result = get_file(filename) + if file_result.is_err(): + push_error(file_result.unwrap_err()) + return file_result + var file_path = file_result.unwrap() + + if not FileAccess.file_exists(file_path): + var err = 'ENOENT: "%s" does not exist' % path + push_error(err) + return Result.err(err) get_tree().call_group(group_name, OnBeforeLoadMethod) - var file = FileAccess.open(path, FileAccess.READ) + var file = FileAccess.open(file_path, FileAccess.READ) var length = file.get_length() while file.get_position() < length: diff --git a/godot/src/player.gd b/godot/src/player.gd index fc174a7..e1acff5 100644 --- a/godot/src/player.gd +++ b/godot/src/player.gd @@ -6,6 +6,9 @@ class_name Player extends CharacterBody3D @onready var input = $Input @onready var interactor = $Interactor +var is_running: bool: + get: return velocity and input.is_running + var is_carrying_item = true var is_weapon_ready: bool: get: return is_carrying_item and input.is_weapon_ready @@ -28,6 +31,7 @@ func move_and_rotate(_delta: float): move_and_slide() func rotate_toward_look(_delta: float): + velocity = Vector3.ZERO var target = input.get_look_target(global_position) if target.is_some(): look_at(target.unwrap(), Vector3.UP, true)