Work on pickups and multiplayer

This commit is contained in:
2026-03-19 23:50:29 -04:00
parent d128501f7c
commit 9d931a3b46
42 changed files with 771 additions and 324 deletions

View File

@@ -1,18 +1,18 @@
[gd_scene load_steps=59 format=3 uid="uid://bflg720h1w3d3"]
[ext_resource type="Script" uid="uid://tb7n6ybv43ch" path="res://assets/BinbunVFX/shared/script/vfx_controller.gd" id="1_so17j"]
[ext_resource type="Shader" uid="uid://b6ke6r1fjb8s3" path="res://assets/BinbunVFX/impact_explosions/src/shader/explosion_core.gdshader" id="2_d2rk6"]
[ext_resource type="Material" uid="uid://dnw08mtonx63d" path="res://assets/BinbunVFX/impact_explosions/src/material/explosion/explosion_smoke.tres" id="2_plj08"]
[ext_resource type="Shader" uid="uid://d28ltkmbbdcjb" path="res://assets/BinbunVFX/impact_explosions/src/shader/sparks.gdshader" id="3_msnhc"]
[ext_resource type="Shader" uid="uid://bf8eiigjam2fr" path="res://assets/BinbunVFX/impact_explosions/src/shader/explostion_ring.gdshader" id="5_d2rk6"]
[ext_resource type="Texture2D" uid="uid://85fb3gemkbhp" path="res://assets/BinbunVFX/shared/texture/cracks_01.png" id="5_otofc"]
[ext_resource type="Texture2D" uid="uid://bbxo5nkvy537a" path="res://assets/BinbunVFX/shared/texture/cracks_emission_01.png" id="6_d2rk6"]
[ext_resource type="Shader" uid="uid://ccd4kg68n7uox" path="res://assets/BinbunVFX/impact_explosions/src/shader/basic_billboard.gdshader" id="8_y01pw"]
[ext_resource type="Script" uid="uid://bdk8hhttligw" path="res://assets/BinbunVFX/shared/script/vfx_light.gd" id="9_85p3d"]
[ext_resource type="Script" uid="uid://tb7n6ybv43ch" path="res://experimental/BinbunVFX/shared/script/vfx_controller.gd" id="1_so17j"]
[ext_resource type="Shader" uid="uid://b6ke6r1fjb8s3" path="res://experimental/BinbunVFX/impact_explosions/src/shader/explosion_core.gdshader" id="2_d2rk6"]
[ext_resource type="Material" uid="uid://dnw08mtonx63d" path="res://experimental/BinbunVFX/impact_explosions/src/material/explosion/explosion_smoke.tres" id="2_plj08"]
[ext_resource type="Shader" uid="uid://d28ltkmbbdcjb" path="res://experimental/BinbunVFX/impact_explosions/src/shader/sparks.gdshader" id="3_msnhc"]
[ext_resource type="Shader" uid="uid://bf8eiigjam2fr" path="res://experimental/BinbunVFX/impact_explosions/src/shader/explostion_ring.gdshader" id="5_d2rk6"]
[ext_resource type="Texture2D" uid="uid://85fb3gemkbhp" path="res://experimental/BinbunVFX/shared/texture/cracks_01.png" id="5_otofc"]
[ext_resource type="Texture2D" uid="uid://bbxo5nkvy537a" path="res://experimental/BinbunVFX/shared/texture/cracks_emission_01.png" id="6_d2rk6"]
[ext_resource type="Shader" uid="uid://ccd4kg68n7uox" path="res://experimental/BinbunVFX/impact_explosions/src/shader/basic_billboard.gdshader" id="8_y01pw"]
[ext_resource type="Script" uid="uid://bdk8hhttligw" path="res://experimental/BinbunVFX/shared/script/vfx_light.gd" id="9_85p3d"]
[sub_resource type="Gradient" id="Gradient_y01pw"]
[sub_resource type="Gradient" id="Gradient_iyrbe"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_85p3d"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_dga0b"]
noise_type = 2
frequency = 0.02
fractal_octaves = 1
@@ -22,9 +22,9 @@ domain_warp_amplitude = 5.0
domain_warp_fractal_octaves = 1
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_csir3"]
noise = SubResource("FastNoiseLite_dga0b")
color_ramp = SubResource("Gradient_iyrbe")
seamless = true
color_ramp = SubResource("Gradient_y01pw")
noise = SubResource("FastNoiseLite_85p3d")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_e6ocy"]
resource_local_to_scene = true
@@ -139,8 +139,8 @@ noise_type = 2
fractal_octaves = 3
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_7t2vj"]
seamless = true
noise = SubResource("FastNoiseLite_d2rk6")
seamless = true
[sub_resource type="Gradient" id="Gradient_d2rk6"]
offsets = PackedFloat32Array(0.868159, 0.980099, 1)
@@ -215,10 +215,10 @@ frequency = 0.02
fractal_octaves = 2
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_cwquj"]
invert = true
seamless = true
seamless_blend_skirt = 1.0
noise = SubResource("FastNoiseLite_y01pw")
seamless = true
invert = true
seamless_blend_skirt = 1.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_85p3d"]
render_priority = 0
@@ -476,6 +476,7 @@ _data = {
}
[node name="VFXExplosion_01" type="Node3D"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
script = ExtResource("1_so17j")
primary_color = Color(1, 0.662745, 0.0666667, 1)
secondary_color = Color(0.984314, 0.192157, 0, 1)
@@ -492,6 +493,7 @@ mesh = SubResource("SphereMesh_awqfb")
[node name="Smoke" type="GPUParticles3D" parent="."]
layers = 540672
material_override = ExtResource("2_plj08")
emitting = false
amount = 16
lifetime = 0.8
one_shot = true
@@ -502,6 +504,7 @@ draw_pass_1 = SubResource("SphereMesh_plj08")
[node name="Sparks" type="GPUParticles3D" parent="."]
layers = 540672
material_override = SubResource("ShaderMaterial_msnhc")
emitting = false
amount = 16
lifetime = 0.5
one_shot = true

View File

@@ -357,6 +357,7 @@ _data = {
}
[node name="VFXExplosion_04" type="Node3D"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
script = ExtResource("1_gkc2v")
primary_color = Color(1, 0.529412, 0, 1)
secondary_color = Color(1, 0.337255, 0, 1)

BIN
external/progress_fill.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

40
external/progress_fill.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://g7k311jjr73e"
path="res://.godot/imported/progress_fill.png-0edd49454969b595fd5cd4e41197d4b2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/progress_fill.png"
dest_files=["res://.godot/imported/progress_fill.png-0edd49454969b595fd5cd4e41197d4b2.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
external/progress_over.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

40
external/progress_over.png.import vendored Normal file
View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cp188cfq4qeas"
path="res://.godot/imported/progress_over.png-123d5e181e53b8525430d778ea9358ff.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://external/progress_over.png"
dest_files=["res://.godot/imported/progress_over.png-123d5e181e53b8525430d778ea9358ff.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

1
models/datablock.gltf Normal file
View File

@@ -0,0 +1 @@
{"asset":{"version":"2.0","generator":"Blockbench 5.0.7 glTF exporter"},"scenes":[{"nodes":[0],"name":"blockbench_export"}],"scene":0,"nodes":[{"rotation":[0.3535533905932738,0.3535533905932738,0.14644660940672624,0.8535533905932737],"name":"mesh","mesh":0}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AAAAPwAAgD8AAAA/AAAAPwAAAAAAAAA/AAAAPwAAgD8AAAC/AAAAPwAAAAAAAAC/AAAAvwAAgD8AAAA/AAAAvwAAgD8AAAC/AAAAvwAAAAAAAAA/AAAAvwAAAAAAAAC/AAAAPwAAgD8AAAA/AAAAPwAAgD8AAAC/AAAAvwAAgD8AAAA/AAAAvwAAgD8AAAC/AAAAPwAAAAAAAAA/AAAAvwAAAAAAAAA/AAAAPwAAAAAAAAC/AAAAvwAAAAAAAAC/AAAAPwAAgD8AAAA/AAAAvwAAgD8AAAA/AAAAPwAAAAAAAAA/AAAAvwAAAAAAAAA/AAAAPwAAgD8AAAC/AAAAPwAAAAAAAAC/AAAAvwAAgD8AAAC/AAAAvwAAAAAAAAC/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD8AAIA/AgAAAAEAAgABAAMABgAEAAUABgAFAAcACgAIAAkACgAJAAsADgAMAA0ADgANAA8AEgAQABEAEgARABMAFgAUABUAFgAVABcA"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[0.5,1,0.5],"min":[-0.5,0,-0.5],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[1,1],"min":[0,0],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1,"baseColorTexture":{"index":0}},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"textures":[{"sampler":0,"source":0,"name":"texture"}],"samplers":[{"magFilter":9728,"minFilter":9728,"wrapS":33071,"wrapT":33071}],"images":[{"mimeType":"image/png","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAgUlEQVR4AeyWsQ0AIQwDI8ZgDuZgWOZgDtb4lwu7/eYTGiOdIqXA5irac/m0uHxUYO8doPcemSAD8N0qwEX1VIE5Z4DsAsgAzFEBLqqnC9iADdiADdiADdiADdiADcjAWitA9rccGYA5KsBF9VSBMUaAc05kggzAh6oAF3/Pr/teAAAA//+XbCPxAAAABklEQVQDAKj338Fk9RQnAAAAAElFTkSuQmCC"}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]}]}

View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://d187i1jot4wmy"
path="res://.godot/imported/datablock.gltf-bd1206a04074a56813fd4c73675028f6.scn"
[deps]
source_file="res://models/datablock.gltf"
dest_files=["res://.godot/imported/datablock.gltf-bd1206a04074a56813fd4c73675028f6.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
models/datablock_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b7s2n7xcvntpl"
path.s3tc="res://.godot/imported/datablock_0.png-be2ea7c3074a4bce475d2e7d6a4e74f6.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "78f80e90042787b6f29cb279213d54f5"
}
[deps]
source_file="res://models/datablock_0.png"
dest_files=["res://.godot/imported/datablock_0.png-be2ea7c3074a4bce475d2e7d6a4e74f6.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=4 uid="uid://dewb10lmvj1yy"]
[gd_scene load_steps=15 format=4 uid="uid://dewb10lmvj1yy"]
[ext_resource type="Script" uid="uid://d3t381vws7vns" path="res://scripts/level.gd" id="1_0a1dj"]
[ext_resource type="PackedScene" uid="uid://bgocskbofewsr" path="res://templates/HUD.tscn" id="2_uckv6"]
@@ -9,10 +9,18 @@
[ext_resource type="Texture2D" uid="uid://dri0a20l6kpbj" path="res://visuals/images/icon.svg" id="7_cttrw"]
[ext_resource type="AudioStream" uid="uid://cr0n18se6jnig" path="res://audio/music/Industrial Matts Fridge Intensity 2.wav" id="9_d3ajt"]
[ext_resource type="Script" uid="uid://b5npi1ys4lnf4" path="res://scripts/multiplayer_level_setup.gd" id="9_owm7e"]
[ext_resource type="PackedScene" uid="uid://dyvov4i48mqoi" path="res://templates/datablock_pickup.tscn" id="10_owm7e"]
[sub_resource type="Environment" id="Environment_x4b8f"]
background_energy_multiplier = 0.29
background_mode = 1
ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 1
tonemap_white = 16.0
glow_enabled = true
fog_mode = 1
fog_light_color = Color(0.21401742, 0.23577034, 0.2696176, 1)
fog_light_energy = 0.0
fog_density = 1.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_d3ajt"]
resource_name = "material_0"
@@ -413,6 +421,9 @@ autoplay = true
unique_name_in_owner = true
script = ExtResource("9_owm7e")
[node name="Datablock Pickup" parent="." instance=ExtResource("10_owm7e")]
transform = Transform3D(0.99999994, 0, 0, 0, 0.9426415, -0.33380684, 0, 0.33380687, 0.94264144, 0.5, 1.790432, 0.5)
[connection signal="spawned" from="PawnSpawner" to="MultiplayerLevelSetup" method="_on_pawn_spawner_spawned"]
[connection signal="spawned" from="CameraSpawner" to="MultiplayerLevelSetup" method="_on_camera_spawner_spawned"]

70
scenes/vrep_loading.tscn Normal file
View File

@@ -0,0 +1,70 @@
[gd_scene load_steps=3 format=3 uid="uid://dq5mtoakhfxx4"]
[ext_resource type="Texture2D" uid="uid://cp188cfq4qeas" path="res://external/progress_over.png" id="1_wa8kr"]
[ext_resource type="Texture2D" uid="uid://g7k311jjr73e" path="res://external/progress_fill.png" id="2_0fdvr"]
[node name="Node2D" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
color = Color(0, 0, 0, 1)
[node name="RichTextLabel" type="RichTextLabel" parent="."]
layout_mode = 0
offset_left = 160.0
offset_top = 413.0
offset_right = 1765.0
offset_bottom = 618.0
theme_override_font_sizes/normal_font_size = 150
bbcode_enabled = true
text = "LOADING V-REP . . ."
fit_content = true
scroll_active = false
[node name="TextureProgressBar" type="TextureProgressBar" parent="."]
texture_filter = 1
layout_mode = 0
offset_left = 133.0
offset_top = 894.0
offset_right = 1731.0
offset_bottom = 987.0
nine_patch_stretch = true
stretch_margin_left = 10
stretch_margin_top = 10
stretch_margin_right = 10
stretch_margin_bottom = 10
texture_over = ExtResource("1_wa8kr")
texture_progress = ExtResource("2_0fdvr")
[node name="RichTextLabel2" type="RichTextLabel" parent="."]
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -309.0
offset_top = -260.0
offset_right = 309.0
offset_bottom = -205.0
grow_horizontal = 2
grow_vertical = 0
theme_override_font_sizes/normal_font_size = 40
bbcode_enabled = true
text = "[center]Simulating Virtual Environment[/center]
"
fit_content = true
scroll_active = false

View File

@@ -65,8 +65,8 @@ func is_multiplayer() -> bool:
return multiplayer_game
func start_level(pawns : Dictionary[int, StringName]) -> void:
pawns_selected = pawns
func start_level(pawn_dict : Dictionary[int, StringName]) -> void:
pawns_selected = pawn_dict
if !Multiplayer.is_host():
return
@@ -135,11 +135,11 @@ func level_spawned(peer_id : int) -> void:
check_level_ready()
func check_level_ready() -> void:
var ready : bool = true
var level_ready : bool = true
for id in level_synced:
if level_synced[id] == false:
ready = false
if ready:
level_ready = false
if level_ready:
level.setup()
func oneshot(stream : AudioStream) -> void:

View File

@@ -81,26 +81,26 @@ func is_server() -> bool:
func is_host() -> bool:
return id == 1
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if waiting:
var ready : bool = true
var group_ready : bool = true
for pr in player_readiness.values():
if !pr:
ready = false
group_ready = false
break
if ready:
if group_ready:
all_ready.emit()
waiting = false
for pr in player_readiness.keys():
player_readiness[pr] = false
func _add_player_to_game(id : int) -> void:
print("Player %s joined the game!" % id)
func _add_player_to_game(pid : int) -> void:
print("Player %s joined the game!" % pid)
await get_tree().create_timer(0.5).timeout
get_handle_from_peer(id)
get_handle_from_peer(pid)
func _remove_player_from_game(id : int) -> void:
print("Player %s left the game!" % id)
func _remove_player_from_game(pid : int) -> void:
print("Player %s left the game!" % pid)
func get_handle_from_peer(peer_id) -> void:
rpc_id(peer_id, "report_handle_to_peer", id)

17
scripts/collectable.gd Normal file
View File

@@ -0,0 +1,17 @@
class_name Pickup extends Area3D
enum Type{
DATABLOCK,
INTEGRITY,
SCAN,
BASIC_HACK,
ADVANCED_HACK
}
@export var type : Type
func _on_body_entered(body: Node3D) -> void:
if body is PawnController:
body.pickup(type)
queue_free()

View File

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

View File

@@ -10,7 +10,7 @@ func _on_melee_range_changed(melee : bool) -> void:
range_attack_button.visible = !melee
melee_attack_button.visible = melee
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
hack_button.set_pressed_no_signal(Input.is_action_pressed("install"))
detect_button.set_pressed_no_signal(Input.is_action_pressed("detect"))
switch_button.set_pressed_no_signal(Input.is_action_pressed("detonate"))

View File

@@ -47,7 +47,7 @@ var decompiling : bool
var failed : bool
var difficulty : int = 1
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
timer_label.text = "%02f.3" % timer.time_left
func start_decompiling() -> void:
@@ -109,5 +109,5 @@ func succeed() -> void:
func _on_hack_failed() -> void:
fail()
func _on_hack_removed(type : Hack.Type) -> void:
func _on_hack_removed(_type : Hack.Type) -> void:
Game.player.close_modal()

View File

@@ -22,25 +22,25 @@ func _on_timeout() -> void:
func spread() -> void:
var new_squares : Dictionary[Vector3i, bool] = {}
for square in last_spread:
for sq in last_spread:
for i in range(-1, 2):
for j in range(-1, 2):
for k in range(-1, 2):
var ts = square + Vector3i(i, j, k)
new_squares[square + Vector3i(i, j, k)] = true
#var ts = sq + Vector3i(i, j, k)
new_squares[sq + Vector3i(i, j, k)] = true
last_spread = []
for square in new_squares.keys():
if squares.has(square):
for sq in new_squares.keys():
if squares.has(sq):
continue
var floor_square = square + Vector3i(0,-1,0)
var floor_square = sq + Vector3i(0,-1,0)
if(Game.level.floor_layer.get_cell_item(floor_square) == GridMap.INVALID_CELL_ITEM
and Game.level.ramp_layer.get_cell_item(floor_square) == GridMap.INVALID_CELL_ITEM):
continue
last_spread.append(square)
squares[square] = true
emit_gas(square)
last_spread.append(sq)
squares[sq] = true
emit_gas(sq)
func emit_gas(square) -> void:
func emit_gas(sq) -> void:
var gas = gas_square_template.instantiate()
gas.setup(hack_owner, damage)
Game.level.add_vfx(gas, square)
Game.level.add_vfx(gas, sq)

View File

@@ -16,9 +16,9 @@ func _physics_process(delta: float) -> void:
if time_remaining <= 0:
queue_free()
func setup(owner, damage) -> void:
self.hack_owner = hack_owner
self.damage = damage
func setup(h_owner, dam) -> void:
hack_owner = h_owner
damage = dam
time_remaining = 2.0
func _on_body_entered(body: Node3D) -> void:

View File

@@ -26,10 +26,10 @@ const hack_icons : Dictionary = {
Hack.Type.PURGE : preload("res://external/purge-icon.png"),
}
const destroy_explosion_template = preload("res://templates/explosion.tscn")
const purge_explosion_template = preload("res://templates/explosion.tscn")
const destroy_explosion_template = preload("res://experimental/BinbunVFX/impact_explosions/effects/explosion/vfx_explosion_01.tscn")
const purge_explosion_template = preload("res://experimental/BinbunVFX/impact_explosions/effects/explosion/vfx_explosion_03.tscn")
const contain_template = preload("res://templates/pitfall.tscn")
const trigger_explosion_template = preload("res://templates/explosion.tscn")
const trigger_explosion_template = preload("res://experimental/BinbunVFX/impact_explosions/effects/explosion/vfx_explosion_04.tscn")
const infect_emitter_template = preload("res://templates/gas_emitter.tscn")
const force_activate_sound = preload("res://audio/sounds/TomWinandySFX_UI_ScifiTech_Start_06.wav")
@@ -69,13 +69,13 @@ func _enter_tree() -> void:
func _exit_tree() -> void:
Game.level.remove_map_marker(self)
func setup(type : Type, direction : Vector3, hack_owner : int) -> void:
self.type = type
self.hack_owner = hack_owner
func setup(new_type : Type, dir : Vector3, h_owner : int) -> void:
type = new_type
hack_owner = h_owner
if type == Type.REDIRECT:
var r : float = atan2(direction.z, direction.x)
var r : float = atan2(dir.z, dir.x)
var cardinal : float = roundi(r * 2 / PI) * PI / 2
self.direction = Vector3(cos(cardinal), 0, sin(cardinal))
direction = Vector3(cos(cardinal), 0, sin(cardinal))
func remove() -> void:
removed.emit(type)
@@ -127,7 +127,7 @@ func _ready() -> void:
force_strip.rotate_y(r)
force_strip.visible = owns_hack
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
just_revealed = false
func blast(body : PawnController) -> void:
@@ -149,16 +149,16 @@ func activate() -> void:
for body in get_overlapping_bodies():
body.fling(direction, 5.0)
Type.PURGE:
var exp = purge_explosion_template.instantiate()
Game.level.add_vfx(exp, square)
var expl = purge_explosion_template.instantiate()
Game.level.add_vfx(expl, square)
explode = true
Type.TRIGGER:
var exp = trigger_explosion_template.instantiate()
Game.level.add_vfx(exp, square)
var expl = trigger_explosion_template.instantiate()
Game.level.add_vfx(expl, square)
explode = true
Type.DESTROY:
var exp = destroy_explosion_template.instantiate()
Game.level.add_vfx(exp, square)
var expl = destroy_explosion_template.instantiate()
Game.level.add_vfx(expl, square)
explode = true
Type.INFECT:
var emitter = infect_emitter_template.instantiate()
@@ -181,10 +181,10 @@ func trigger_adjacent_bombs() -> void:
if hack.type == Type.DESTROY and hack != self:
hack.delay_trigger()
func generate_contain(square : Vector3i) -> void:
func generate_contain(sq : Vector3i) -> void:
var contain = contain_template.instantiate()
contain.duration = 6.0
Game.level.add_vfx(contain, square)
Game.level.add_vfx(contain, sq)
func blast_players() -> void:
for body in range_area.get_overlapping_bodies():
@@ -206,7 +206,7 @@ func _on_body_entered(body: Node3D) -> void:
return
if !decompiling or body.id != decompile_id:
if !body.detecting:
if !body.is_detecting():
activate()

View File

@@ -17,8 +17,8 @@ func proximal_shake(distance : float) -> void:
var d = global_position.distance_squared_to(Game.player.global_position)
var d_sq = distance * distance
if d <= d_sq:
var str : float = (d_sq - d) / d_sq
var l_val : float = lerp(0.0, 1.0, str)
Input.start_joy_vibration(0, l_val,l_val,lerp(0.5, 1.0, str))
var strength : float = (d_sq - d) / d_sq
var l_val : float = lerp(0.0, 1.0, strength)
Input.start_joy_vibration(0, l_val,l_val,lerp(0.5, 1.0, strength))
Game.player.camera.add_trauma(l_val)

View File

@@ -8,11 +8,11 @@ func _ready() -> void:
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
pass
func _on_health_changed(current : int, max : int) -> void:
max_value = max
func _on_health_changed(current : int, max_amt : int) -> void:
max_value = max_amt
value = current
func _on_poison_status_changed(poisoned : bool) -> void:

View File

@@ -25,6 +25,6 @@ func set_ammo(ammo : int) -> void:
ammo_label.text = str(ammo)
ammo_label.modulate = Color.DIM_GRAY if ammo == 0 else Color.WHITE
func _on_ammo_changed(current : int, max : int) -> void:
func _on_ammo_changed(current : int, _max_amt : int) -> void:
set_ammo(current)

View File

@@ -56,13 +56,13 @@ func spawn_players_singleplayer() -> void:
var pc : PawnController = pawn_controller.instantiate()
pawns[1] = pc
pawns_node.add_child(pc,true)
var position : Vector3
var pos : Vector3
if(spawn_points == null
or len(spawn_points) <= 1):
position = Vector3(0,0,0)
pos = Vector3(0,0,0)
else:
position = spawn_points[0].global_position
pc.global_position = position
pos = spawn_points[0].global_position
pc.global_position = pos
pc.setup(1, Game.pawns_selected[1])
add_pawn_camera(pc)
cameras[1].register_pawn(1)
@@ -83,17 +83,17 @@ func spawn_players_multiplayer() -> void:
for key in pawns:
var pc = pawns[key]
var position : Vector3
var pos : Vector3
if(spawn_points == null
or len(spawn_points) <= count):
if key == Multiplayer.id:
position = Vector3(0,0,0)
pos = Vector3(0,0,0)
else:
position = Vector3(3,0,0)
pos = Vector3(3,0,0)
else:
position = spawn_points[count].global_position
pos = spawn_points[count].global_position
count += 1
pc.global_position = position
pc.global_position = pos
pc.setup.rpc(key, Game.pawns_selected[key])
multiplayer_level_setup.set_players_unready(Multiplayer.players.values())
@@ -198,7 +198,7 @@ func remove_map_marker(target) -> void:
func add_map_marker(target) -> void:
var marker : MapMarker
var height : float
var height : float = 0
if target is PawnController:
marker = map_marker_templates.pawn.instantiate()
height += 40

View File

@@ -2,17 +2,17 @@ class_name MapMarker extends Node3D
var target : Node3D
func register_target(target : Node3D) -> void:
self.target = target
func register_target(new_target : Node3D) -> void:
target = new_target
reposition()
func reposition() -> void:
var loc = target.position
position = Vector3(loc.x, position.y, loc.z)
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if target:
reposition()
func _on_hack_revealed(is_visible : bool) -> void:
visible = is_visible
func _on_hack_revealed(reveal : bool) -> void:
visible = reveal

View File

@@ -56,7 +56,7 @@ func _on_pawn_spawner_spawned(node: Node) -> void:
func _on_camera_spawner_spawned(node: Node) -> void:
func _on_camera_spawner_spawned(_node: Node) -> void:
cameras_expected -= 1
if cameras_expected == 0:
all_cameras_spawned.emit()

View File

@@ -70,7 +70,7 @@ func _on_joining_back_button_pressed() -> void:
%Joining.visible = false
%Menu.visible = true
func _on_client_added(peer_handle : String, peer_id : int) -> void:
func _on_client_added(peer_handle : String, _peer_id : int) -> void:
%ParticipantsText.text = "[color=FFFF00][b]*%s[/b][/color]\n[color=FFFFFF]*%s[/color]" % [handle, peer_handle]
%StartButton.disabled = false

View File

@@ -48,6 +48,21 @@ func _on_struggle_changed(value : float) -> void:
else:
struggle_bar.value = value
func set_animation_length(node_name : String, length : float) -> void:
if length == 0:
length = 0.01
var blendtree : AnimationNodeBlendTree = anim_tree.tree_root.get_node(node_name)
if !blendtree:
return
var anim_node : AnimationNodeAnimation = blendtree.get_node("Animation")
if !anim_node:
return
var animation : Animation = anim_player.get_animation(anim_node.animation)
if !animation:
return
var a_scale : float = animation.length / length
anim_tree["parameters/%s/TimeScale/scale" % node_name] = a_scale
func _on_footstep_timer_timeout() -> void:
walk_sound.play()

View File

@@ -45,7 +45,7 @@ func _process(delta: float) -> void:
func shake():
noise_y += .1
var amount = pow(trauma, trauma_power)
var n_val = noise.get_noise_2d(noise.seed*2, noise_y)
#var n_val = noise.get_noise_2d(noise.seed*2, noise_y)
h_offset = max_offset.x * amount * randf_range(-1, 1)
v_offset = max_offset.y * amount * randf_range(-1, 1)
print("%f %f" % [h_offset, v_offset])

View File

@@ -2,6 +2,11 @@ class_name PawnController extends CharacterBody3D
enum State {
NORMAL,
DETECTING,
INSTALLING,
UNINSTALLING,
MELEE_ATTACKING,
RANGED_ATTACKING,
KNOCKDOWN,
KNOCKUP,
FLUNG,
@@ -26,7 +31,7 @@ const range_sphere_template = preload("res://templates/range_sphere.tscn")
@onready var detect_sound : AudioStreamPlayer3D = $DetectSound
@onready var fling_sound : AudioStreamPlayer3D = $FlingSound
@onready var crash_sound : AudioStreamPlayer3D = $CrashSound
@onready var reload_sound : AudioStreamPlayer3D = $PawnBody/ReloadSound
@onready var reload_sound : AudioStreamPlayer3D
@onready var detect_icon : Sprite3D = $DetectIcon
@export var id : int = 1
@@ -35,9 +40,6 @@ const range_sphere_template = preload("res://templates/range_sphere.tscn")
var button_actions : Dictionary[int, String]
var current_square : Vector3i
var facing : Vector3
@export var detecting : bool = false
var installing : bool = false
var uninstalling : bool = false
var range_sphere : RangeSphere
var detect_squares : Dictionary[Vector3i, bool] = {}
var detect_tween : Tween = null
@@ -51,18 +53,17 @@ var poison_time_remaining : float = 0
var poison_pulse_timer : float
var melee_range : float = 3.0
var can_melee : bool = false
var ranged_range : float = 6
var attack_timer : float = 0
var melee_recovery_time : float = .75
var ranged_recovery_time : float = .2
var ranged_recovery_time : float = 0.25
var ranged_reload_time : float = 1
var projectile_speed : float = 10.0
var projectile_damage : int = 4
var ammo = 5
var max_ammo = 5
var combat_target
var meleeing : bool = false
var shooting : bool = false
var reloading : bool = false
var take_shot : bool = false
var flinch : float = 0
@@ -98,7 +99,22 @@ func _exit_tree() -> void:
#Game.level.evaluate_outcome()
#Game.evaluate
func calculate_pawn_velocity(dir : Vector3) -> Vector3:
var y = velocity.y
var result = speed * dir
if is_poisoned():
result *= 0.5
if is_crouching():
result *= .33
result.y = y
return result
func play_footsteps(spd : float, loud : bool) -> void:
if loud:
body.play_footsteps(spd)
func stop_footsteps() -> void:
body.stop_footsteps()
func _physics_process(delta: float) -> void:
if attack_timer > 0:
@@ -142,26 +158,16 @@ func _physics_process(delta: float) -> void:
knockdown(-fling_direction)
hurt(10)
moving = false
State.NORMAL:
State.NORMAL, State.DETECTING, State.INSTALLING:
can_fall = true
if dir.length_squared() > 0:
moving = true
velocity = calculate_pawn_velocity(dir)
facing = dir.normalized()
body.look_at(body.global_position - dir)
var y = velocity.y
velocity = speed * dir
if is_poisoned():
velocity *= 0.5
if is_crouching():
velocity *= .33
velocity.y = y
if !detecting:
body.play_footsteps(lerp(.78, .33, dir.length()))
else:
body.stop_footsteps()
elif body != null:
body.stop_footsteps()
play_footsteps(lerp(.78, .33, dir.length()), true)
else:
stop_footsteps()
if body != null:
body.set_animation_parameter("parameters/Motion/blend_position", dir.length())
body.set_animation_parameter("parameters/Crouch/blend_position", dir.length())
@@ -171,12 +177,9 @@ func _physics_process(delta: float) -> void:
else:
moving = true
can_fall = true
State.KNOCKDOWN,State.BOUND,State.DEAD:
return
if can_fall:
var down = 0
if !is_on_floor():
velocity.y = velocity.y + get_gravity().y * delta
moving = true
@@ -184,8 +187,9 @@ func _physics_process(delta: float) -> void:
if moving:
move_and_slide()
if detecting:
if is_detecting():
update_detect_region.rpc(true)
if range_sphere:
update_range_sphere()
#Deal with the rest of the buttons
@@ -200,7 +204,7 @@ func _physics_process(delta: float) -> void:
for button in buttons:
if input.is_action_just_pressed(button):
modal.button_pressed(button)
elif state == State.NORMAL:
else:
update_actions()
@rpc("call_local", "reliable")
@@ -213,15 +217,17 @@ func set_pawn_body(pb : PawnBody) -> void:
body = pb
pb.reloading.connect(reload_ranged)
pb.shooting.connect(fire_ranged)
reload_sound = body.find_child("ReloadSound")
add_child(body)
body.set_animation_length("Ranged Fire", ranged_recovery_time)
struggling.connect(body._on_struggle_changed)
func attack() -> void:
if attack_timer > 0:
return
if meleeing:
body.play_animation.rpc("melee")
if can_melee:
state = State.MELEE_ATTACKING
attack_timer = melee_recovery_time
else:
if ammo <= 0:
@@ -229,14 +235,14 @@ func attack() -> void:
return
attack_timer = ranged_recovery_time
shooting = true
state = State.RANGED_ATTACKING
take_shot = true
if combat_target != null:
var v = body.global_position.direction_to(combat_target.global_position)
v.y = 0
body.look_at(body.global_position - v)
func reload_ranged() -> void:
reloading = false
reload_sound.play()
@@ -245,41 +251,44 @@ func reload_ranged() -> void:
ammo_changed.emit(ammo, max_ammo)
func update_actions() -> void:
if attack_timer <= 0 and shooting and !input.is_action_pressed("attack"):
shooting = false
if state == State.DEAD:
return
if attack_timer <= 0 and is_attacking():
if !input.is_action_pressed("attack"):
state = State.NORMAL
elif is_shooting():
if ammo <= 0:
reloading = true
else:
take_shot = true
if input.is_action_just_pressed("left cycle hack"):
cycle_active_hack(-1)
if input.is_action_just_pressed("right cycle hack"):
cycle_active_hack(1)
if input.is_action_just_pressed("detonate"):
detonate()
elif !installing:
if input.is_action_just_pressed("detect"):
start_detecting()
elif input.is_action_just_released("detect"):
stop_detecting()
if!detecting:
if input.is_action_just_pressed("install"):
installing = true
if range_sphere != null:
range_sphere.queue_free()
range_sphere = range_sphere_template.instantiate()
Game.level.add_child(range_sphere)
#Set the range sphere size based upon the current hack
update_range_sphere()
if input.is_action_just_released("install"):
installing = false
range_sphere.queue_free()
range_sphere = null
try_install_hack()
match(state):
State.NORMAL:
if input.is_action_just_pressed("detonate"):
detonate()
if(input.is_action_just_pressed("detect")
and input.is_action_pressed("detect")):
start_detecting()
return
if(input.is_action_just_pressed("install")
and input.is_action_pressed("install")):
start_installing()
return
elif input.is_action_pressed("attack"):
attack()
elif input.is_action_just_released("install"):
installing = false
range_sphere.queue_free()
range_sphere = null
try_install_hack()
State.DETECTING:
if !input.is_action_pressed("detect"):
stop_detecting()
State.INSTALLING:
if !input.is_action_pressed("install"):
stop_installing()
try_install_hack()
func update_range_sphere() -> void:
var new_pos = (global_position - Vector3.ONE * .5).round() + Vector3(0.5, 0, 0.5)
@@ -324,6 +333,7 @@ func fire_ranged() -> void:
ammo-=1
ammo_changed.emit(ammo, max_ammo)
shot.speed = projectile_speed
shot.id = id
tdir = body.ranged_point.global_position.direction_to(combat_target.global_position) if combat_target else facing
shot.direction = tdir
shot.damage = projectile_damage
@@ -368,10 +378,10 @@ func check_attack_target() -> void:
ranged_closest = target
ranged_d_sq = d_sq
if melee_closest != null:
meleeing = true
can_melee = true
combat_target = melee_closest
else:
meleeing = false
can_melee = false
if ranged_closest != null:
combat_target = ranged_closest
combat_target_changed.emit(melee_closest != null)
@@ -423,21 +433,21 @@ func detect_alert() -> void:
detect_tween.tween_callback(func(): detect_tween = null)
func close_modal() -> void:
uninstalling = false
state = State.NORMAL
if modal != null:
modal.queue_free()
modal = null
func show_uninstall_hack_modal() -> void:
stop_detecting()
uninstalling = true
state = State.UNINSTALLING
modal = uninstall_hack_modal.instantiate()
modal.square = current_square
Game.level.add_child(modal)
func show_decompile_hack_modal() -> void:
stop_detecting()
uninstalling = true
state = State.UNINSTALLING
modal = decompile_hack_modal.instantiate()
modal.difficulty = Game.level.difficulty
modal.square = current_square
@@ -451,8 +461,23 @@ func show_decompile_hack_modal() -> void:
Game.level.add_child(modal)
func start_detecting() -> void:
detecting = true
update_detect_region.rpc(false)
state = State.DETECTING
update_detect_region(false)
func start_installing() -> void:
state = State.INSTALLING
if id == Multiplayer.id:
if range_sphere != null:
range_sphere.queue_free()
range_sphere = range_sphere_template.instantiate()
Game.level.add_child(range_sphere)
#Set the range sphere size based upon the current hack
update_range_sphere()
func stop_installing() -> void:
state = State.NORMAL
range_sphere.queue_free()
range_sphere = null
@rpc("authority", "call_local")
func update_detect_region(update : bool) -> void:
@@ -477,13 +502,14 @@ func update_detect_region(update : bool) -> void:
var remove_list = []
var hack_detected : bool = false
var hack : Hack
for sq in new_squares.keys():
if update and detect_squares.has(sq):
continue
if !Game.level.detect_square(sq, true):
remove_list.append(sq)
else:
var hack = Game.level.get_square_hack(sq + Vector3i(0,1,0))
hack = Game.level.get_square_hack(sq + Vector3i(0,1,0))
if hack and hack.is_just_revealed():
hack_detected = true
@@ -495,7 +521,7 @@ func update_detect_region(update : bool) -> void:
for key in remove_list:
detect_squares.erase(key)
var hack : Hack = Game.level.get_square_hack(current_square)
hack = Game.level.get_square_hack(current_square)
if hack != null:
if hack.hack_owner == Multiplayer.id:
show_uninstall_hack_modal()
@@ -504,7 +530,7 @@ func update_detect_region(update : bool) -> void:
show_decompile_hack_modal()
func stop_detecting() -> void:
detecting = false
state = State.NORMAL
clear_detect_region.rpc()
@rpc("authority", "call_local")
@@ -516,8 +542,8 @@ func clear_detect_region() -> void:
detect_squares = {}
@rpc("authority", "call_local", "reliable")
func setup(id : int, pawn : StringName) -> void:
self.id = id
func setup(p_id : int, pawn : StringName) -> void:
id = p_id
var base_data : PawnBaseData = Game.pawns[pawn]
var hacklist : Array[PawnLevelData.HackData] = []
for hack in base_data.starting_hacks:
@@ -564,9 +590,11 @@ func hurt(damage : int) -> void:
health_changed.emit(data.life, data.max_life)
if data.life == 0:
die.rpc()
@rpc("any_peer", "call_local")
@rpc("authority", "call_local")
func die() -> void:
state = State.DEAD
body.travel_animation("Death")
input_locked = true
if id == Multiplayer.id:
var death_tween = create_tween()
@@ -578,21 +606,15 @@ func _on_hack_decompiled(type : Hack.Type) -> void:
for i in range(len(data.hacks)):
var d = data.hacks[i]
if d.type == type:
d.max -= 1
d.max_quantity -= 1
hack_quantity_changed.emit(i, d.quantity)
break
#hurt
#blast
#blast_players
#activate
#activate_hack
#fail
#on_hack_failed
func _on_hack_activated(type : Hack.Type) -> void:
for i in range(len(data.hacks)):
var d = data.hacks[i]
if d.type == type:
d.quantity = min(d.max, d.quantity+ 1)
d.quantity = min(d.max_quantity, d.quantity+ 1)
hack_quantity_changed.emit(i, d.quantity)
break
@@ -623,10 +645,10 @@ func poison(damage : int, length : float) -> void:
pshader.set_shader_parameter("strength", 0.5)
poison_status_changed.emit(true)
func fling(direction : Vector3, speed : float) -> void:
func fling(direction : Vector3, spd : float) -> void:
state = State.FLUNG
fling_direction = direction
fling_speed = speed
fling_speed = spd
fling_sound.play()
func knockdown(direction : Vector3) -> void:
@@ -641,14 +663,14 @@ func knockdown(direction : Vector3) -> void:
knockdown_tween.tween_property(self, "input_locked", false, 0)
knockdown_tween.tween_callback(Callable(body.look_at).bind(facing, Vector3(0,1,0)))
func knockup(velocity : Vector3) -> void:
func knockup(vel : Vector3) -> void:
if state != State.KNOCKUP:
state = State.KNOCKUP
input_locked = true
if is_on_floor():
self.velocity = Vector3.UP * .1
velocity = Vector3.UP * .1
move_and_slide()
self.velocity = velocity
velocity = vel
func knockback(direction : Vector3, impact : float) -> void:
if state != State.NORMAL:
@@ -672,14 +694,46 @@ func start_pitfall(square : Vector3, duration : float) -> void:
tween.tween_property(self, "input_locked", false, 0)
tween.tween_callback(pitfall.bind(duration))
func _on_melee_hit(body : Node3D) -> void:
func _on_melee_hit(_body : Node3D) -> void:
#TODO: WRITE THE MELEE DAMAGE CODE
pass
func is_attacking() -> bool:
return state == State.RANGED_ATTACKING or state == State.MELEE_ATTACKING
func is_meleeing() -> bool:
return state == State.MELEE_ATTACKING
func is_shooting() -> bool:
return state == State.RANGED_ATTACKING
func is_dead() -> bool:
return state == State.DEAD
func is_detecting() -> bool:
return detecting
return state == State.DETECTING
func is_installing() -> bool:
return state == State.INSTALLING
func is_uninstalling() -> bool:
return state == State.UNINSTALLING
func is_crouching() -> bool:
return detecting or installing or uninstalling
var result : bool = false
match(state):
State.DETECTING: result = true
State.INSTALLING: result = true
State.UNINSTALLING: result = true
return result
func add_random_hack(advanced : bool) -> void:
#TODO: Add random hack spawning using RPCs
pass
func pickup(type : Pickup.Type) -> void:
if id != Multiplayer.id:
return
match(type):
Pickup.Type.DATABLOCK: print("Datablock picked up!")
Pickup.Type.BASIC_HACK: add_random_hack(false)

View File

@@ -35,5 +35,5 @@ func tv_blur(amount : float) -> void:
var blinder_mat : ShaderMaterial = portrait_blinder.material
blinder_mat.set_shader_parameter("opacity_limit", amount)
func set_pawn_name(name : String) -> void:
pawn_name.text = name
func set_pawn_name(p_name : String) -> void:
pawn_name.text = p_name

View File

@@ -32,7 +32,7 @@ func _ready() -> void:
"attack":false
}
func _physics_process(delta: float) -> void:
func _physics_process(_delta: float) -> void:
if get_multiplayer_authority() != Multiplayer.id:
return
var d = Input.get_vector("west", "east", "north", "south")

View File

@@ -3,12 +3,12 @@ class_name PawnLevelData extends Node
class HackData:
var type : Hack.Type
var quantity : int
var max : int
var max_quantity : int
func _init(type : Hack.Type, quantity : int, max : int) -> void:
self.type = type
self.quantity = quantity
self.max = max
func _init(new_type : Hack.Type, amt : int, max_amt : int) -> void:
type = new_type
quantity = amt
max_quantity = max_amt
var hacks : Array[HackData] = []
var active_hack : int = 0

View File

@@ -1,23 +1,24 @@
class_name Projectile extends RigidBody3D
class_name Projectile extends Area3D
var id : int = 0
var direction : Vector3
var speed : float
var friend_safe : bool = true
var damage
var time_remaining : float
func _ready() -> void:
linear_velocity = speed * direction
time_remaining = 2
func _physics_process(delta: float) -> void:
global_position += speed * direction * delta
time_remaining -= delta
if time_remaining <= 0:
queue_free()
func _on_body_entered(body: Node) -> void:
queue_free()
func _on_hit_area_entered(body: Node3D) -> void:
if body is PawnController:
body.hurt(damage)
if !friend_safe or id != body.id:
body.hurt(damage)
queue_free()
else:
queue_free()

View File

@@ -15,8 +15,7 @@ var type : Hack.Type = -1
rim_sphere.radius = _radius
if intersect_sphere != null:
intersect_sphere.radius = _radius
func set_range(range : float) -> void:
radius = range
func set_range(new_radius : float) -> void:
radius = new_radius

View File

@@ -56,7 +56,7 @@ func _ready() -> void:
glow_tween.tween_property(target, "modulate:a", .8, .5)
glow_tween.tween_property(target, "modulate:a", 1, .5)
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
if Input.is_action_just_pressed("ui_menu"):
opened = !opened
start.visible = !opened

View File

@@ -11,27 +11,18 @@ emission_energy_multiplier = 2.69
[sub_resource type="BoxShape3D" id="BoxShape3D_7i3j4"]
size = Vector3(0.15, 0.15, 0.15)
[node name="Bullet" type="RigidBody3D"]
gravity_scale = 0.0
contact_monitor = true
max_contacts_reported = 3
[node name="Bullet" type="Area3D"]
collision_layer = 0
collision_mask = 2
script = ExtResource("1_tc5n7")
[node name="CSGSphere3D" type="CSGSphere3D" parent="."]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
radius = 0.05
radial_segments = 4
rings = 3
radial_segments = 6
material = SubResource("StandardMaterial3D_fnprb")
[node name="HitArea" type="Area3D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="HitArea"]
shape = SubResource("BoxShape3D_7i3j4")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_7i3j4")
[node name="OmniLight3D" type="OmniLight3D" parent="."]
@@ -42,5 +33,4 @@ light_volumetric_fog_energy = 0.0
light_size = 0.2
omni_range = 0.4
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="body_entered" from="HitArea" to="." method="_on_hit_area_entered"]
[connection signal="body_entered" from="." to="." method="_on_hit_area_entered"]

View File

@@ -0,0 +1,81 @@
[gd_scene load_steps=8 format=4 uid="uid://dyvov4i48mqoi"]
[ext_resource type="Script" uid="uid://du3s0b1kotb6l" path="res://scripts/collectable.gd" id="1_mbwd5"]
[ext_resource type="Texture2D" uid="uid://b7s2n7xcvntpl" path="res://models/datablock_0.png" id="2_vuv4s"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ucvlk"]
resource_name = "material_0"
transparency = 2
alpha_scissor_threshold = 0.05
alpha_antialiasing_mode = 0
cull_mode = 2
albedo_texture = ExtResource("2_vuv4s")
texture_filter = 0
texture_repeat = false
[sub_resource type="ArrayMesh" id="ArrayMesh_m2shw"]
_surfaces = [{
"aabb": AABB(-0.5, 0, -0.5, 1, 1, 1),
"format": 34896613377,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAQADAAIAAwAAAAIAAAAEAAEAAQAFAAMABAAFAAEAAwAGAAAABgAEAAAABQAGAAMABgAHAAQABAAHAAUABQAHAAYA"),
"name": "material_0",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 8,
"vertex_data": PackedByteArray("/////wAAAAD//wAA//8AAP///////wAAAAD/////AAD//wAAAAAAAAAAAAD//wAAAAD//wAAAAAAAAAAAAAAAA==")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_v5j1m"]
resource_name = "blockbench_export_mesh"
_surfaces = [{
"aabb": AABB(-0.5, 0, -0.5, 1, 1, 1),
"attribute_data": PackedByteArray("//8AAAAA//8AAAAA//////////8AAAAA//8AAAAA//8AAP////8AAP////8AAAAA/////wAAAAD//wAAAAD///////8AAAAA//8AAAAA/////wAAAAD//wAAAAD/////"),
"format": 34896613399,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUACAAJAAoACAALAAkADAANAA4ADAAPAA0AEAARABIAEAATABEAFAAVABYAFAAXABUA"),
"material": SubResource("StandardMaterial3D_ucvlk"),
"name": "material_0",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 24,
"vertex_data": PackedByteArray("/////wAA/7///wAA////v/////////+///8AAAAA/78AAAAA////vwAA//8AAP+/AAD//////78AAAAAAAD/vwAA//////+//////wAA/7//////////vwAA//8AAP+///8AAAAA/78AAAAA////v///AAD///+/AAAAAAAA/7///wAA//8AgAAA/////wCA////////AIAAAAAA//8AgAAA//8AAP////8AAAAA////////AAD//wAAAAAAAP///38AAP9/AAD/fwAA/38AAP9/////f////3////9///////9/////f////3////9/AAD/fwAA/38AAP9/AAD/f/9/////f////3////9/////f////3////9/////f///")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_m2shw")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnid6"]
shading_mode = 2
diffuse_mode = 3
specular_mode = 1
disable_ambient_light = true
disable_fog = true
disable_specular_occlusion = true
albedo_texture = ExtResource("2_vuv4s")
emission_enabled = true
emission = Color(1, 1, 1, 1)
emission_energy_multiplier = 1.66
emission_operator = 1
emission_texture = ExtResource("2_vuv4s")
texture_filter = 0
[sub_resource type="BoxShape3D" id="BoxShape3D_5c3s5"]
size = Vector3(0.6, 0.6, 0.6)
[node name="Datablock Pickup" type="Area3D"]
collision_layer = 0
collision_mask = 2
script = ExtResource("1_mbwd5")
[node name="mesh" type="MeshInstance3D" parent="."]
transform = Transform3D(0.21338832, -0.036611654, 0.125, 0.125, 0.125, -0.17677669, -0.036611654, 0.21338832, 0.125, 0.0036189556, 0.63486314, -0.1206578)
mesh = SubResource("ArrayMesh_v5j1m")
skeleton = NodePath("")
surface_material_override/0 = SubResource("StandardMaterial3D_lnid6")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.63486314, 0)
shape = SubResource("BoxShape3D_5c3s5")
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

View File

@@ -53,7 +53,10 @@ floor_constant_speed = true
floor_max_angle = 0.93549645
floor_snap_length = 1.0
script = ExtResource("1_h27ep")
pawn_name = null
speed = 2.25
id = null
state = null
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.375, 0)

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=121 format=4 uid="uid://c3s6gqy0s5kus"]
[gd_scene load_steps=125 format=4 uid="uid://c3s6gqy0s5kus"]
[ext_resource type="Script" uid="uid://wye3mat5y5yg" path="res://scripts/pawn_body.gd" id="1_ox2bo"]
[ext_resource type="PackedScene" uid="uid://cfunlbp8arnlh" path="res://templates/bullet.tscn" id="2_pbmu7"]
@@ -10332,10 +10332,22 @@ tracks/59/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [&"firing"],
"args": [&"shooting"],
"method": &"emit_signal"
}]
}
tracks/60/type = "value"
tracks/60/imported = false
tracks/60/enabled = true
tracks/60/path = NodePath("%RangedPoint:position")
tracks/60/interp = 1
tracks/60/loop_wrap = true
tracks/60/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(-0.069371, 0.6716403, 0.300628)]
}
[sub_resource type="Animation" id="Animation_y78ih"]
resource_name = "Punch_Cross"
@@ -19279,9 +19291,22 @@ sync = true
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_h27ep"]
animation = &"Death01"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_dn5ph"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_18nw6"]
animation = &"Hit_Chest"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_agdjh"]
animation = &"Sword_Attack"
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_aih1w"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_onvhp"]
nodes/output/position = Vector2(800, 140)
nodes/Animation/node = SubResource("AnimationNodeAnimation_agdjh")
nodes/Animation/position = Vector2(300, 120)
nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_aih1w")
nodes/TimeScale/position = Vector2(560, 120)
node_connections = [&"output", 0, &"TimeScale", &"TimeScale", 0, &"Animation"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_pnc3q"]
animation = &"Idle"
@@ -19313,24 +19338,26 @@ snap = 0.09
value_label = ".5"
sync = true
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_8h8ae"]
animation = &"Pistol_Shoot"
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_18nw6"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_agdjh"]
graph_offset = Vector2(-128.77832, -28.638329)
nodes/output/position = Vector2(340, 120)
nodes/Animation/node = SubResource("AnimationNodeAnimation_8h8ae")
nodes/Animation/position = Vector2(-80, 100)
nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_18nw6")
nodes/TimeScale/position = Vector2(140, 100)
node_connections = [&"output", 0, &"TimeScale", &"TimeScale", 0, &"Animation"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_tpe7m"]
animation = &"Pistol_Idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_44rnf"]
animation = &"Pistol_Reload"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_80lp4"]
animation = &"Pistol_Reload"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_n15br"]
animation = &"Pistol_Shoot"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ko1jy"]
animation = &"Pistol_Shoot"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_rtmky"]
animation = &"Sword_Attack"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_bdfr7"]
advance_mode = 2
@@ -19348,54 +19375,59 @@ advance_expression = "!is_crouching()"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_myj18"]
advance_mode = 2
advance_expression = "shooting == true"
advance_expression = "is_shooting()"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_emnr3"]
advance_mode = 2
advance_expression = "shooting == false"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_1skj0"]
advance_mode = 2
advance_expression = "take_shot == true"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_prcnq"]
switch_mode = 2
advance_mode = 2
advance_expression = "take_shot == false"
advance_expression = "!is_shooting()"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_n5wpo"]
advance_mode = 2
advance_expression = "reloading = true"
advance_expression = "reloading == true"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_p0uug"]
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_8h8ae"]
advance_mode = 2
advance_expression = "take_shot == true"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_18nw6"]
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_7mens"]
advance_mode = 2
advance_expression = "is_meleeing()"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_g0o8v"]
xfade_time = 0.5
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_80lp4"]
allow_transition_to_self = true
states/Crouch/node = SubResource("AnimationNodeBlendSpace1D_mggey")
states/Crouch/position = Vector2(831, 331.8868)
states/Crouch/position = Vector2(914.5, 319.8868)
states/Death/node = SubResource("AnimationNodeAnimation_h27ep")
states/Death/position = Vector2(1264, 190)
states/End/position = Vector2(1124, 98)
states/Hit_Chest/node = SubResource("AnimationNodeAnimation_dn5ph")
states/Hit_Chest/position = Vector2(134, 239)
states/Death/position = Vector2(1121, 106.23659)
states/End/position = Vector2(1855, 203)
states/Hit_Chest/node = SubResource("AnimationNodeAnimation_18nw6")
states/Hit_Chest/position = Vector2(730.58984, 106.23659)
"states/Melee Attack/node" = SubResource("AnimationNodeBlendTree_onvhp")
"states/Melee Attack/position" = Vector2(914.5, 59.236588)
states/Motion/node = SubResource("AnimationNodeBlendSpace1D_a4li3")
states/Motion/position = Vector2(852.5, 214.3125)
states/Pistol_Idle/node = SubResource("AnimationNodeAnimation_tpe7m")
states/Pistol_Idle/position = Vector2(1009.58984, 214.3125)
states/Pistol_Reload/node = SubResource("AnimationNodeAnimation_80lp4")
states/Pistol_Reload/position = Vector2(162, 294)
"states/Pistol_Reload 2/node" = SubResource("AnimationNodeAnimation_44rnf")
"states/Pistol_Reload 2/position" = Vector2(1017.08984, 357.23657)
states/Pistol_Shoot/node = SubResource("AnimationNodeAnimation_n15br")
states/Pistol_Shoot/position = Vector2(1185.75, 215.71875)
"states/Ranged Attack/node" = SubResource("AnimationNodeAnimation_ko1jy")
"states/Ranged Attack/position" = Vector2(853, 90)
states/Start/position = Vector2(543, 176)
states/Sword_Attack/node = SubResource("AnimationNodeAnimation_rtmky")
states/Sword_Attack/position = Vector2(319, 229)
transitions = ["Start", "Motion", SubResource("AnimationNodeStateMachineTransition_bdfr7"), "Motion", "Crouch", SubResource("AnimationNodeStateMachineTransition_26i23"), "Crouch", "Motion", SubResource("AnimationNodeStateMachineTransition_phens"), "Motion", "Pistol_Idle", SubResource("AnimationNodeStateMachineTransition_myj18"), "Pistol_Idle", "Motion", SubResource("AnimationNodeStateMachineTransition_emnr3"), "Pistol_Idle", "Pistol_Shoot", SubResource("AnimationNodeStateMachineTransition_1skj0"), "Pistol_Shoot", "Pistol_Idle", SubResource("AnimationNodeStateMachineTransition_prcnq"), "Pistol_Idle", "Pistol_Reload 2", SubResource("AnimationNodeStateMachineTransition_n5wpo"), "Pistol_Reload 2", "Pistol_Idle", SubResource("AnimationNodeStateMachineTransition_p0uug")]
graph_offset = Vector2(356.58984, 139.23659)
states/Motion/position = Vector2(914.5, 214.3125)
"states/Ranged Attack/node" = SubResource("AnimationNodeBlendTree_agdjh")
"states/Ranged Attack/position" = Vector2(1363.5898, 214.3125)
"states/Ranged Idle/node" = SubResource("AnimationNodeAnimation_tpe7m")
"states/Ranged Idle/position" = Vector2(1134.5898, 214.3125)
"states/Ranged Reload/node" = SubResource("AnimationNodeAnimation_44rnf")
"states/Ranged Reload/position" = Vector2(1134.5898, 319.8868)
states/Start/position = Vector2(646, 214.3125)
transitions = ["Start", "Motion", SubResource("AnimationNodeStateMachineTransition_bdfr7"), "Motion", "Crouch", SubResource("AnimationNodeStateMachineTransition_26i23"), "Crouch", "Motion", SubResource("AnimationNodeStateMachineTransition_phens"), "Motion", "Ranged Idle", SubResource("AnimationNodeStateMachineTransition_myj18"), "Ranged Idle", "Motion", SubResource("AnimationNodeStateMachineTransition_emnr3"), "Ranged Idle", "Ranged Reload", SubResource("AnimationNodeStateMachineTransition_n5wpo"), "Ranged Reload", "Ranged Idle", SubResource("AnimationNodeStateMachineTransition_p0uug"), "Ranged Idle", "Ranged Attack", SubResource("AnimationNodeStateMachineTransition_8h8ae"), "Ranged Attack", "Ranged Idle", SubResource("AnimationNodeStateMachineTransition_18nw6"), "Motion", "Melee Attack", SubResource("AnimationNodeStateMachineTransition_7mens"), "Melee Attack", "Motion", SubResource("AnimationNodeStateMachineTransition_g0o8v")]
graph_offset = Vector2(287.58984, 37.236588)
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_ghbft"]
streams_count = 5
@@ -19460,8 +19492,8 @@ bones/1/name = "Hips"
bones/1/parent = 0
bones/1/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9167, -0.05010003)
bones/1/enabled = true
bones/1/position = Vector3(0.0029217794, 0.87712944, -0.08623208)
bones/1/rotation = Quaternion(-0.048274823, -0.122335054, -0.0053202827, 0.99129987)
bones/1/position = Vector3(0.009960683, 0.062668204, -0.54616094)
bones/1/rotation = Quaternion(-0.71823287, -0.10042195, 0.07455257, 0.6844698)
bones/1/scale = Vector3(1, 1, 1)
bones/2/name = "Spine"
bones/2/parent = 1
@@ -19475,77 +19507,77 @@ bones/3/parent = 2
bones/3/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.12309997, 0.015199981)
bones/3/enabled = true
bones/3/position = Vector3(0, 0.12309997, 0.015199981)
bones/3/rotation = Quaternion(0.083439596, -0.050386205, -0.014193618, 0.995137)
bones/3/rotation = Quaternion(0.10398251, 0.0027813378, -0.004713317, 0.99456406)
bones/3/scale = Vector3(1, 1, 1)
bones/4/name = "UpperChest"
bones/4/parent = 3
bones/4/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.14120016, -0.004500025)
bones/4/enabled = true
bones/4/position = Vector3(0, 0.14120016, -0.004500025)
bones/4/rotation = Quaternion(0.083440006, -0.1491554, -0.011031527, 0.9852253)
bones/4/rotation = Quaternion(0.1086738, -0.011971049, 0.014305387, 0.9939025)
bones/4/scale = Vector3(1, 1, 1)
bones/5/name = "Neck"
bones/5/parent = 4
bones/5/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.17280002, -0.005600037)
bones/5/enabled = true
bones/5/position = Vector3(0, 0.17280002, -0.005600037)
bones/5/rotation = Quaternion(0.017888838, 0.10118126, 0.006566928, 0.99468553)
bones/5/rotation = Quaternion(-0.33731186, 0.012180819, -0.0069038575, 0.9412889)
bones/5/scale = Vector3(1, 1, 1)
bones/6/name = "Head"
bones/6/parent = 5
bones/6/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.081100024, 0.0155999875)
bones/6/enabled = true
bones/6/position = Vector3(0, 0.081100024, 0.0155999875)
bones/6/rotation = Quaternion(0.024657993, -0.13774714, -0.024798114, 0.98985)
bones/6/rotation = Quaternion(-0.044471268, 0.013187573, -0.004703428, 0.9989126)
bones/6/scale = Vector3(1, 1, 1)
bones/7/name = "LeftShoulder"
bones/7/parent = 4
bones/7/rest = Transform3D(0, 1, 0, 0, 0, 1, 1, 0, 0, 0.0188, 0.14310004, 0.07629998)
bones/7/enabled = true
bones/7/position = Vector3(0.0188, 0.14310004, 0.07629998)
bones/7/rotation = Quaternion(0.47803193, 0.5050022, 0.4935733, -0.52234435)
bones/7/rotation = Quaternion(0.58398527, 0.39858466, 0.39873582, -0.5840387)
bones/7/scale = Vector3(1, 1, 1)
bones/8/name = "LeftUpperArm"
bones/8/parent = 7
bones/8/rest = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, -0.13680005, 0.17309996, -0.01710007)
bones/8/enabled = true
bones/8/position = Vector3(-0.13680005, 0.17309996, -0.01710007)
bones/8/rotation = Quaternion(0.49294424, 0.77037, -0.40433675, 0.0069256644)
bones/8/rotation = Quaternion(0.0016868409, 0.9983379, -0.05759801, 0.0009866056)
bones/8/scale = Vector3(1, 1, 1)
bones/9/name = "LeftLowerArm"
bones/9/parent = 8
bones/9/rest = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0.004699965, 0.27440003, 3.769936e-08)
bones/9/enabled = true
bones/9/position = Vector3(0.004699965, 0.27440003, 3.769936e-08)
bones/9/rotation = Quaternion(0.40944093, -0.57015, 0.5879608, 0.40198165)
bones/9/rotation = Quaternion(-0.17464358, -0.6755791, 0.69889116, -0.15698323)
bones/9/scale = Vector3(1, 1, 1)
bones/10/name = "LeftHand"
bones/10/parent = 9
bones/10/rest = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 2.0133815e-08, 0.27260005, 0.004700036)
bones/10/enabled = true
bones/10/position = Vector3(2.0133815e-08, 0.27260005, 0.004700036)
bones/10/rotation = Quaternion(-0.066626236, 0.5500871, 0.035547514, 0.8316861)
bones/10/rotation = Quaternion(-0.03758643, 0.57259077, -0.024788877, 0.8186041)
bones/10/scale = Vector3(1, 1, 1)
bones/11/name = "LeftIndexProximal"
bones/11/parent = 10
bones/11/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03090003, 0.11989991, 0.001999812)
bones/11/enabled = true
bones/11/position = Vector3(-0.03090003, 0.11989991, 0.001999812)
bones/11/rotation = Quaternion(0.03729071, -7.154156e-08, -5.175003e-07, 0.99930453)
bones/11/rotation = Quaternion(0.048656568, -4.4703484e-08, 0.023325518, 0.99854314)
bones/11/scale = Vector3(1, 1, 1)
bones/12/name = "LeftIndexIntermediate"
bones/12/parent = 11
bones/12/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.097772e-09, 0.040700007, 1.25191555e-08)
bones/12/enabled = true
bones/12/position = Vector3(-4.097772e-09, 0.040700007, 1.25191555e-08)
bones/12/rotation = Quaternion(0.3397444, -1.3053811e-07, -1.8548973e-06, 0.94051784)
bones/12/rotation = Quaternion(0.04865685, 0.0030170977, 0.02306965, 0.9985446)
bones/12/scale = Vector3(1, 1, 1)
bones/13/name = "LeftIndexDistal"
bones/13/parent = 12
bones/13/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.0742177e-09, 0.034800045, 1.1683975e-08)
bones/13/enabled = true
bones/13/position = Vector3(-2.0742177e-09, 0.034800045, 1.1683975e-08)
bones/13/rotation = Quaternion(0.26331255, 3.1589735e-08, -2.7728588e-06, 0.9647106)
bones/13/rotation = Quaternion(0.04866741, 0.00729902, 0.02213545, 0.9985431)
bones/13/scale = Vector3(1, 1, 1)
bones/14/name = "index_04_leaf_l"
bones/14/parent = 13
@@ -19559,21 +19591,21 @@ bones/15/parent = 10
bones/15/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.005200028, 0.121599905, -0.00040022636)
bones/15/enabled = true
bones/15/position = Vector3(-0.005200028, 0.121599905, -0.00040022636)
bones/15/rotation = Quaternion(0.034359887, -0.0016245749, -0.08324677, 0.99593514)
bones/15/rotation = Quaternion(0.034836993, -0.0016470999, -2.3841858e-07, 0.9993917)
bones/15/scale = Vector3(1, 1, 1)
bones/16/name = "LeftMiddleIntermediate"
bones/16/parent = 15
bones/16/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0019999952, 0.04229999, 2.1621558e-08)
bones/16/enabled = true
bones/16/position = Vector3(0.0019999952, 0.04229999, 2.1621558e-08)
bones/16/rotation = Quaternion(0.3884896, 0.008260064, -0.010748425, 0.92135346)
bones/16/rotation = Quaternion(0.034841835, -0.0015417933, -5.9604645e-08, 0.9993917)
bones/16/scale = Vector3(1, 1, 1)
bones/17/name = "LeftMiddleDistal"
bones/17/parent = 16
bones/17/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0014999973, 0.033899974, 1.615871e-07)
bones/17/enabled = true
bones/17/position = Vector3(0.0014999973, 0.033899974, 1.615871e-07)
bones/17/rotation = Quaternion(0.42306805, -0.019677328, -3.4574791e-06, 0.9058843)
bones/17/rotation = Quaternion(0.034838162, -0.0016204122, -3.5762795e-07, 0.9993917)
bones/17/scale = Vector3(1, 1, 1)
bones/18/name = "middle_04_leaf_l"
bones/18/parent = 17
@@ -19587,21 +19619,21 @@ bones/19/parent = 10
bones/19/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04079998, 0.10769992, 0.0015997506)
bones/19/enabled = true
bones/19/position = Vector3(0.04079998, 0.10769992, 0.0015997506)
bones/19/rotation = Quaternion(0.4281105, -0.028753696, -0.066136904, 0.9008444)
bones/19/rotation = Quaternion(0.016165243, -0.0010857434, -0.015371444, 0.9997506)
bones/19/scale = Vector3(1, 1, 1)
bones/20/name = "LeftLittleIntermediate"
bones/20/parent = 19
bones/20/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0027000003, 0.040200002, 1.7218216e-10)
bones/20/enabled = true
bones/20/position = Vector3(0.0027000003, 0.040200002, 1.7218216e-10)
bones/20/rotation = Quaternion(0.39108172, -0.13253164, 0.046397403, 0.9095811)
bones/20/rotation = Quaternion(0.035252716, 0.0044559534, -0.00024011728, 0.9993684)
bones/20/scale = Vector3(1, 1, 1)
bones/21/name = "LeftLittleDistal"
bones/21/parent = 20
bones/21/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0018999914, 0.027600013, 2.2658543e-07)
bones/21/enabled = true
bones/21/position = Vector3(0.0018999914, 0.027600013, 2.2658543e-07)
bones/21/rotation = Quaternion(0.4008552, -0.027103845, -2.9876176e-06, 0.9157405)
bones/21/rotation = Quaternion(0.03479651, -0.0023528042, -1.4901163e-07, 0.9993917)
bones/21/scale = Vector3(1, 1, 1)
bones/22/name = "pinky_04_leaf_l"
bones/22/parent = 21
@@ -19615,21 +19647,21 @@ bones/23/parent = 10
bones/23/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01709998, 0.1190999, -0.00010017503)
bones/23/enabled = true
bones/23/position = Vector3(0.01709998, 0.1190999, -0.00010017503)
bones/23/rotation = Quaternion(0.30737934, -0.010949735, -0.16781034, 0.9366098)
bones/23/rotation = Quaternion(0.0348538, -0.0012416095, -3.5762787e-07, 0.9993917)
bones/23/scale = Vector3(1, 1, 1)
bones/24/name = "LeftRingIntermediate"
bones/24/parent = 23
bones/24/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.001399991, 0.039300047, -1.0103322e-07)
bones/24/enabled = true
bones/24/position = Vector3(0.001399991, 0.039300047, -1.0103322e-07)
bones/24/rotation = Quaternion(0.3325078, -0.17884532, 0.061298802, 0.9239564)
bones/24/rotation = Quaternion(0.034853745, -0.0012408198, -8.940698e-08, 0.9993917)
bones/24/scale = Vector3(1, 1, 1)
bones/25/name = "LeftRingDistal"
bones/25/parent = 24
bones/25/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0010999943, 0.030899974, -1.0082857e-07)
bones/25/enabled = true
bones/25/position = Vector3(0.0010999943, 0.030899974, -1.0082857e-07)
bones/25/rotation = Quaternion(0.42352107, -0.015981447, -3.7984141e-06, 0.9057453)
bones/25/rotation = Quaternion(0.034851145, -0.0013151317, -5.9604638e-08, 0.9993917)
bones/25/scale = Vector3(1, 1, 1)
bones/26/name = "ring_04_leaf_l"
bones/26/parent = 25
@@ -19643,21 +19675,21 @@ bones/27/parent = 10
bones/27/rest = Transform3D(0, -0.577, 0.816, 0, 0.816, 0.577, -1, 0, 0, -0.03360002, 0.02729993, 0.022799803)
bones/27/enabled = true
bones/27/position = Vector3(-0.03360002, 0.02729993, 0.022799803)
bones/27/rotation = Quaternion(-0.21418707, 0.6738871, 0.21418677, 0.6738873)
bones/27/rotation = Quaternion(-0.35230717, 0.5411503, 0.33356342, 0.6868562)
bones/27/scale = Vector3(1, 0.99939233, 0.99939233)
bones/28/name = "LeftThumbProximal"
bones/28/parent = 27
bones/28/rest = Transform3D(0.99999994, 0, 0, 0, 0.9999999, 2.9802322e-08, 0, -2.9802322e-08, 0.9999999, -0.019199941, 0.03816641, 0.005296665)
bones/28/enabled = true
bones/28/position = Vector3(-0.019199941, 0.03816641, 0.005296665)
bones/28/rotation = Quaternion(-3.3225461e-07, -1.2098091e-07, -2.5420556e-07, 1)
bones/28/rotation = Quaternion(0.21444397, -0.06163305, -0.079114676, 0.971574)
bones/28/scale = Vector3(0.99999994, 0.9999999, 0.9999999)
bones/29/name = "LeftThumbDistal"
bones/29/parent = 28
bones/29/rest = Transform3D(1, 0, 0, 0, 1.0000001, 0, 0, 0, 1.0000001, -0.021900143, 0.043532185, 0.0060270326)
bones/29/enabled = true
bones/29/position = Vector3(-0.021900143, 0.043532185, 0.0060270326)
bones/29/rotation = Quaternion(1.1049305e-07, 6.664385e-08, 1.4723999e-07, 1)
bones/29/rotation = Quaternion(-5.9604645e-08, -2.9802322e-08, 1.4901161e-07, 1)
bones/29/scale = Vector3(1, 1.0000001, 1.0000001)
bones/30/name = "thumb_04_leaf_l"
bones/30/parent = 29
@@ -19665,167 +19697,167 @@ bones/30/rest = Transform3D(0.6015796, -0.44539672, 0.6631167, 0.39881337, 0.887
bones/30/enabled = true
bones/30/position = Vector3(-0.018200096, 0.036257587, 0.0050497632)
bones/30/rotation = Quaternion(-0.030814808, 0.3790144, 0.2359555, 0.8942726)
bones/30/scale = Vector3(1.0001454, 1.0004876, 1.0005833)
bones/30/scale = Vector3(1.0001454, 1.0004877, 1.0005833)
bones/31/name = "RightShoulder"
bones/31/parent = 4
bones/31/rest = Transform3D(0, -1, 0, 0, 0, 1, -1, 0, 0, -0.0188, 0.14310004, 0.07629998)
bones/31/enabled = true
bones/31/position = Vector3(-0.0188, 0.14310004, 0.07629998)
bones/31/rotation = Quaternion(0.4653403, -0.5231923, -0.581982, -0.41355187)
bones/31/rotation = Quaternion(0.38350642, -0.5053365, -0.42170727, -0.6478586)
bones/31/scale = Vector3(1, 1, 1)
bones/32/name = "RightUpperArm"
bones/32/parent = 31
bones/32/rest = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0.13680005, 0.17309996, -0.01710007)
bones/32/enabled = true
bones/32/position = Vector3(0.13680005, 0.17309996, -0.01710007)
bones/32/rotation = Quaternion(-0.5746534, 0.7629577, -0.29604623, -0.0050707604)
bones/32/rotation = Quaternion(0.072124854, 0.9839927, 0.16293766, 0.0027908683)
bones/32/scale = Vector3(1, 1, 1)
bones/33/name = "RightLowerArm"
bones/33/parent = 32
bones/33/rest = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, -0.004699971, 0.2744, 1.6425727e-07)
bones/33/enabled = true
bones/33/position = Vector3(-0.004699971, 0.2744, 1.6425727e-07)
bones/33/rotation = Quaternion(0.26061803, 0.7097086, -0.5588766, 0.3406597)
bones/33/rotation = Quaternion(-0.119480915, 0.90324116, -0.10729908, 0.3979531)
bones/33/scale = Vector3(1, 1, 1)
bones/34/name = "RightHand"
bones/34/parent = 33
bones/34/rest = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, -2.829891e-08, 0.27259997, 0.004700046)
bones/34/enabled = true
bones/34/position = Vector3(-2.829891e-08, 0.27259997, 0.004700046)
bones/34/rotation = Quaternion(0.2154221, -0.082114436, -0.03242578, 0.97252214)
bones/34/rotation = Quaternion(-0.07690081, -0.08546657, -0.05117686, 0.99204975)
bones/34/scale = Vector3(1, 1, 1)
bones/35/name = "RightIndexProximal"
bones/35/parent = 34
bones/35/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.030900035, 0.11989994, 0.0019998003)
bones/35/enabled = true
bones/35/position = Vector3(0.030900035, 0.11989994, 0.0019998003)
bones/35/rotation = Quaternion(-0.0018894076, -2.3841858e-07, 0.044270396, 0.99901783)
bones/35/rotation = Quaternion(-0.0019154402, -1.4901163e-07, -1.6391279e-07, 0.99999815)
bones/35/scale = Vector3(1, 1, 1)
bones/36/name = "RightIndexIntermediate"
bones/36/parent = 35
bones/36/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5648136e-10, 0.040700104, -1.0677797e-07)
bones/36/enabled = true
bones/36/position = Vector3(-5.5648136e-10, 0.040700104, -1.0677797e-07)
bones/36/rotation = Quaternion(0.38319921, -0.02836375, 0.011775523, 0.923155)
bones/36/rotation = Quaternion(0.039266, 7.45058e-08, 8.9406956e-07, 0.99922884)
bones/36/scale = Vector3(1, 1, 1)
bones/37/name = "RightIndexDistal"
bones/37/parent = 36
bones/37/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.121974e-10, 0.03480002, -1.0666921e-07)
bones/37/enabled = true
bones/37/position = Vector3(-6.121974e-10, 0.03480002, -1.0666921e-07)
bones/37/rotation = Quaternion(0.5064349, -1.3411044e-07, 4.470348e-06, 0.86227816)
bones/37/rotation = Quaternion(0.039265927, -1.4901159e-08, 1.490116e-07, 0.99922884)
bones/37/scale = Vector3(1, 1, 1)
bones/38/name = "index_04_leaf_r"
bones/38/parent = 37
bones/38/rest = Transform3D(-1.0000001, 1.173466e-07, -1.5419573e-07, 6.8917885e-08, 0.9999999, 1.3196864e-08, 1.7491357e-07, 2.6301036e-08, -0.9999999, 2.5607045e-09, 0.030099956, 1.2416471e-08)
bones/38/enabled = true
bones/38/position = Vector3(2.5607045e-09, 0.030099956, 1.2416471e-08)
bones/38/rotation = Quaternion(1.9557778e-08, 1, -1.7506343e-09, -8.7456776e-08)
bones/38/rotation = Quaternion(4.6566093e-09, 1, 8.765633e-08, -7.2555615e-08)
bones/38/scale = Vector3(1.0000001, 0.9999999, 0.9999999)
bones/39/name = "RightMiddleProximal"
bones/39/parent = 34
bones/39/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0052000335, 0.12159993, -0.00040023506)
bones/39/enabled = true
bones/39/position = Vector3(0.0052000335, 0.12159993, -0.00040023506)
bones/39/rotation = Quaternion(0.6046183, 0.028586894, 0.03459153, 0.79525036)
bones/39/rotation = Quaternion(0.06796153, 0.0032131374, 0.0697587, 0.995241)
bones/39/scale = Vector3(1, 1, 1)
bones/40/name = "RightMiddleIntermediate"
bones/40/parent = 39
bones/40/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0019999943, 0.04230002, -9.594936e-08)
bones/40/enabled = true
bones/40/position = Vector3(-0.0019999943, 0.04230002, -9.594936e-08)
bones/40/rotation = Quaternion(0.5162386, 0.077261716, -0.033125486, 0.8523092)
bones/40/rotation = Quaternion(0.070700124, -0.01894638, 0.0015430152, 0.9973165)
bones/40/scale = Vector3(1, 1, 1)
bones/41/name = "RightMiddleDistal"
bones/41/parent = 40
bones/41/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0014999958, 0.033900008, 4.301159e-08)
bones/41/enabled = true
bones/41/position = Vector3(-0.0014999958, 0.033900008, 4.301159e-08)
bones/41/rotation = Quaternion(0.29623953, 0.013778644, 1.2516977e-06, 0.95501435)
bones/41/rotation = Quaternion(0.06966789, 0.0032404072, 0, 0.99756503)
bones/41/scale = Vector3(1, 1, 1)
bones/42/name = "middle_04_leaf_r"
bones/42/parent = 41
bones/42/rest = Transform3D(-0.99892014, -0.04646147, -2.7325223e-07, -0.04646151, 0.99891984, 6.6721384e-09, 2.9273497e-07, 3.3413276e-08, -0.9999999, -0.0015999991, 0.03440002, 2.7677858e-08)
bones/42/enabled = true
bones/42/position = Vector3(-0.0015999991, 0.03440002, 2.7677858e-08)
bones/42/rotation = Quaternion(-0.02323703, 0.99973, 1.3300989e-08, -1.4671618e-07)
bones/42/rotation = Quaternion(-0.02323703, 0.99973, 2.8544385e-08, -1.6126707e-07)
bones/42/scale = Vector3(1, 0.99999976, 0.9999999)
bones/43/name = "RightLittleProximal"
bones/43/parent = 34
bones/43/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.040799975, 0.107699946, 0.0015997475)
bones/43/enabled = true
bones/43/position = Vector3(-0.040799975, 0.107699946, 0.0015997475)
bones/43/rotation = Quaternion(0.80694354, 0.05419756, -0.041671038, 0.5866586)
bones/43/rotation = Quaternion(0.14282705, 0.009592847, 0.18191487, 0.97283894)
bones/43/scale = Vector3(1, 1, 1)
bones/44/name = "RightLittleIntermediate"
bones/44/parent = 43
bones/44/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0026999926, 0.040199965, -4.7321702e-11)
bones/44/enabled = true
bones/44/position = Vector3(-0.0026999926, 0.040199965, -4.7321702e-11)
bones/44/rotation = Quaternion(0.31627935, 0.13458802, -0.038931996, 0.93826324)
bones/44/rotation = Quaternion(0.16319741, -0.06257492, 0.011865467, 0.9845356)
bones/44/scale = Vector3(1, 1, 1)
bones/45/name = "RightLittleDistal"
bones/45/parent = 44
bones/45/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0018999918, 0.027600035, -1.0417894e-08)
bones/45/enabled = true
bones/45/position = Vector3(-0.0018999918, 0.027600035, -1.0417894e-08)
bones/45/rotation = Quaternion(0.25646293, 0.017340943, 3.3676624e-06, 0.9663985)
bones/45/rotation = Quaternion(0.15871903, 0.010731831, 1.8179417e-06, 0.98726547)
bones/45/scale = Vector3(1, 1, 1)
bones/46/name = "pinky_04_leaf_r"
bones/46/parent = 45
bones/46/rest = Transform3D(-0.99772197, -0.0674616, -2.5873078e-07, -0.06746164, 0.9977217, 1.503156e-08, 1.7270258e-07, 4.6777405e-08, -0.9999999, -0.001899995, 0.028100003, -1.2148155e-07)
bones/46/enabled = true
bones/46/position = Vector3(-0.001899995, 0.028100003, -1.2148155e-07)
bones/46/rotation = Quaternion(-0.03375011, 0.99943036, 7.077092e-09, -1.322724e-07)
bones/46/rotation = Quaternion(-0.03375008, 0.99943036, 4.924054e-08, -5.6300305e-08)
bones/46/scale = Vector3(1.0000001, 0.99999976, 0.9999999)
bones/47/name = "RightRingProximal"
bones/47/parent = 34
bones/47/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.017099975, 0.11909993, -0.00010018104)
bones/47/enabled = true
bones/47/position = Vector3(-0.017099975, 0.11909993, -0.00010018104)
bones/47/rotation = Quaternion(0.7688189, 0.027387554, -0.019950124, 0.6385684)
bones/47/rotation = Quaternion(0.060118727, 0.0021414754, 0.16436438, 0.98456365)
bones/47/scale = Vector3(1, 1, 1)
bones/48/name = "RightRingIntermediate"
bones/48/parent = 47
bones/48/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0013999942, 0.039300077, -2.1747476e-07)
bones/48/enabled = true
bones/48/position = Vector3(-0.0013999942, 0.039300077, -2.1747476e-07)
bones/48/rotation = Quaternion(0.32148638, 0.10910274, -0.03375864, 0.94000185)
bones/48/rotation = Quaternion(0.071474396, -0.050074168, 0.003676861, 0.9961779)
bones/48/scale = Vector3(1, 1, 1)
bones/49/name = "RightRingDistal"
bones/49/parent = 48
bones/49/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0010999979, 0.030900003, -9.946502e-08)
bones/49/enabled = true
bones/49/position = Vector3(-0.0010999979, 0.030900003, -9.946502e-08)
bones/49/rotation = Quaternion(0.3906144, 0.0147405695, 3.0696388e-06, 0.9204363)
bones/49/rotation = Quaternion(0.069693655, 0.0026300102, 2.682209e-07, 0.99756503)
bones/49/scale = Vector3(1, 1, 1)
bones/50/name = "ring_04_leaf_r"
bones/50/parent = 49
bones/50/rest = Transform3D(-0.9992889, -0.037708856, -3.9285123e-07, -0.037708916, 0.99928814, 7.1365776e-09, 4.1251042e-07, 3.5821593e-08, -0.9999999, -0.0011999963, 0.031799987, 5.404123e-09)
bones/50/enabled = true
bones/50/position = Vector3(-0.0011999963, 0.031799987, 5.404123e-09)
bones/50/rotation = Quaternion(-0.018857807, 0.9998222, 1.4018108e-08, -2.0655628e-07)
bones/50/rotation = Quaternion(-0.018857837, 0.9998222, -1.5216909e-08, -2.369153e-07)
bones/50/scale = Vector3(1.0000001, 0.99999934, 0.9999999)
bones/51/name = "RightThumbMetacarpal"
bones/51/parent = 34
bones/51/rest = Transform3D(0, 0.577, -0.816, 0, 0.816, 0.577, 1, 0, 0, 0.03360003, 0.02729996, 0.022799788)
bones/51/enabled = true
bones/51/position = Vector3(0.03360003, 0.02729996, 0.022799788)
bones/51/rotation = Quaternion(-0.06001975, -0.7160839, -0.2818967, 0.6357324)
bones/51/rotation = Quaternion(-0.21439502, -0.63646096, -0.31083846, 0.6725561)
bones/51/scale = Vector3(1, 0.99939233, 0.99939233)
bones/52/name = "RightThumbProximal"
bones/52/parent = 51
bones/52/rest = Transform3D(0.99999994, 0, 0, 0, 0.9999999, 2.9802322e-08, 0, -2.9802322e-08, 0.9999999, 0.019199956, 0.038166482, 0.005296612)
bones/52/enabled = true
bones/52/position = Vector3(0.019199956, 0.038166482, 0.005296612)
bones/52/rotation = Quaternion(0.18916614, -0.26830974, 0.13073356, 0.9354864)
bones/52/rotation = Quaternion(0.057934128, -0.0067607053, 0.32589677, 0.9436044)
bones/52/scale = Vector3(0.99999994, 0.9999999, 0.9999999)
bones/53/name = "RightThumbDistal"
bones/53/parent = 52
bones/53/rest = Transform3D(1, 0, 0, 0, 1.0000001, 0, 0, 0, 1.0000001, 0.021899961, 0.04353219, 0.0060271067)
bones/53/enabled = true
bones/53/position = Vector3(0.021899961, 0.04353219, 0.0060271067)
bones/53/rotation = Quaternion(0.41658878, -0.19039917, -0.13526444, 0.87858146)
bones/53/rotation = Quaternion(-2.9802319e-08, 0, 8.940695e-08, 1)
bones/53/scale = Vector3(1, 1.0000001, 1.0000001)
bones/54/name = "thumb_04_leaf_r"
bones/54/parent = 53
@@ -19833,27 +19865,27 @@ bones/54/rest = Transform3D(0.6015796, 0.4453967, -0.6631166, -0.39881328, 0.887
bones/54/enabled = true
bones/54/position = Vector3(0.018199861, 0.03625768, 0.00504987)
bones/54/rotation = Quaternion(-0.030814791, -0.37901437, -0.23595548, 0.8942726)
bones/54/scale = Vector3(1.0001454, 1.0004877, 1.0005834)
bones/54/scale = Vector3(1.0001453, 1.0004876, 1.0005833)
bones/55/name = "LeftUpperLeg"
bones/55/parent = 1
bones/55/rest = Transform3D(-1, 0, 0, 0, -1, 0, 0, 0, 1, 0.089, 0.015400031, 0.051499985)
bones/55/enabled = true
bones/55/position = Vector3(0.089, 0.015400031, 0.051499985)
bones/55/rotation = Quaternion(-0.00078904, 0.11607768, 0.98681295, -0.11280838)
bones/55/rotation = Quaternion(-0.0010083821, -0.027820975, 0.9891616, -0.14416796)
bones/55/scale = Vector3(1, 1, 1)
bones/56/name = "LeftLowerLeg"
bones/56/parent = 55
bones/56/rest = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, -7.450581e-09, 0.40029997, -0.0027998893)
bones/56/enabled = true
bones/56/position = Vector3(-7.450581e-09, 0.40029997, -0.0027998893)
bones/56/rotation = Quaternion(0.015998328, 0.98269093, -0.14611013, 0.11275837)
bones/56/rotation = Quaternion(0.04211544, 0.9126826, -0.10421773, 0.39290655)
bones/56/scale = Vector3(1, 1, 1)
bones/57/name = "LeftFoot"
bones/57/parent = 56
bones/57/rest = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, -7.218184e-09, 0.42809996, 0.034399886)
bones/57/enabled = true
bones/57/position = Vector3(-7.218184e-09, 0.42809996, 0.034399886)
bones/57/rotation = Quaternion(-0.092097424, 0.7294667, -0.6776705, 0.012619125)
bones/57/rotation = Quaternion(-0.11777024, 0.79136837, -0.59887403, -0.03487399)
bones/57/scale = Vector3(1, 1, 1)
bones/58/name = "LeftToes"
bones/58/parent = 57
@@ -19874,28 +19906,28 @@ bones/60/parent = 1
bones/60/rest = Transform3D(-1, 0, 0, 0, -1, 0, 0, 0, 1, -0.089, 0.015400031, 0.051499985)
bones/60/enabled = true
bones/60/position = Vector3(-0.089, 0.015400031, 0.051499985)
bones/60/rotation = Quaternion(0.00082032575, -0.1092699, 0.98706883, 0.1172803)
bones/60/rotation = Quaternion(0.001243161, 0.07711153, 0.981053, 0.17772843)
bones/60/scale = Vector3(1, 1, 1)
bones/61/name = "RightLowerLeg"
bones/61/parent = 60
bones/61/rest = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 7.450581e-09, 0.40029997, -0.0027998893)
bones/61/enabled = true
bones/61/position = Vector3(7.450581e-09, 0.40029997, -0.0027998893)
bones/61/rotation = Quaternion(-0.030194327, 0.9287684, -0.08459321, -0.35961306)
bones/61/rotation = Quaternion(-0.021503527, 0.9737953, -0.11414845, -0.19552632)
bones/61/scale = Vector3(1, 1, 1)
bones/62/name = "RightFoot"
bones/62/parent = 61
bones/62/rest = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 7.683263e-09, 0.4280999, 0.034399875)
bones/62/enabled = true
bones/62/position = Vector3(7.683263e-09, 0.4280999, 0.034399875)
bones/62/rotation = Quaternion(0.17524873, 0.6450124, -0.7437998, 0.0029911033)
bones/62/rotation = Quaternion(0.18900639, 0.81196153, -0.5517746, -0.023236103)
bones/62/scale = Vector3(1, 1, 1)
bones/63/name = "RightToes"
bones/63/parent = 62
bones/63/rest = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 3.5171341e-09, 0.14900002, -0.08849997)
bones/63/enabled = true
bones/63/position = Vector3(3.5171341e-09, 0.14900002, -0.08849997)
bones/63/rotation = Quaternion(-2.230305e-08, 1, 8.940697e-08, 2.2097256e-08)
bones/63/rotation = Quaternion(-6.397143e-08, 1, 2.9802322e-08, 4.368002e-08)
bones/63/scale = Vector3(1, 1, 1)
bones/64/name = "ball_leaf_r"
bones/64/parent = 63
@@ -19935,7 +19967,7 @@ light_energy = 1.137
[node name="RangedPoint" type="Node3D" parent="Model"]
unique_name_in_owner = true
transform = Transform3D(1, -7.450581e-09, 2.2351742e-08, -7.450581e-09, 1, 0, 0, 0, 1, -0.069371, 0.6716403, 0.26833847)
transform = Transform3D(1, -7.450581e-09, 2.2351742e-08, -7.450581e-09, 1, 0, 0, 0, 1, 0, 0, 0)
[node name="AnimationPlayer" type="AnimationPlayer" parent="Model"]
unique_name_in_owner = true
@@ -19950,7 +19982,9 @@ tree_root = SubResource("AnimationNodeStateMachine_80lp4")
advance_expression_base_node = NodePath("../../..")
anim_player = NodePath("../AnimationPlayer")
parameters/Crouch/blend_position = 0.0
"parameters/Melee Attack/TimeScale/scale" = 1.0
parameters/Motion/blend_position = 0.002057613
"parameters/Ranged Attack/TimeScale/scale" = 1.0
[node name="MeleeSound" type="AudioStreamPlayer3D" parent="."]
stream = SubResource("AudioStreamRandomizer_ghbft")