Compare commits

...

4 Commits

Author SHA1 Message Date
1ab14b6bb1 Spray sounds
All checks were successful
linting & formatting / build (push) Successful in 18s
2025-03-29 12:31:23 -06:00
7fa75c3cf0 Beam sounds 2025-03-29 11:51:18 -06:00
03aff37ee7 Added head bob & footstep SFX 2025-03-28 16:16:43 -06:00
53884a8232 Level building 2025-03-28 14:17:18 -06:00
104 changed files with 4827 additions and 166 deletions

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,22 @@
# Blender 4.3.2 MTL File: 'alarm.blend'
# www.blender.org
newmtl Core
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
newmtl Grunk
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2

View File

@ -0,0 +1,122 @@
# Blender 4.3.2
# www.blender.org
mtllib alarm_core.mtl
o Bud
v -0.000305 0.016706 -0.051647
v 0.050954 0.014567 0.011255
v 0.022972 0.014608 0.046766
v -0.050603 0.015038 0.012086
v -0.040807 0.015834 -0.031792
v 0.040527 0.015162 -0.032510
v -0.022175 0.014879 0.047141
v 0.051567 -0.011899 0.012115
v 0.022745 -0.011851 0.048014
v -0.051874 -0.011492 0.011470
v -0.041395 -0.010593 -0.033626
v 0.000226 -0.009570 -0.053399
v 0.041727 -0.011352 -0.033066
v -0.023350 -0.011543 0.047648
v 0.044800 0.033472 0.009364
v 0.020567 0.033466 0.040625
v -0.043997 0.033887 0.011183
v -0.035801 0.034555 -0.026860
v -0.000656 0.035393 -0.044528
v 0.035126 0.033982 -0.028449
v -0.018818 0.033746 0.041491
v 0.026218 0.047100 0.004813
v 0.012481 0.046946 0.023154
v -0.025113 0.047307 0.007217
v -0.020829 0.047612 -0.014315
v -0.000851 0.048334 -0.024889
v 0.019920 0.047291 -0.016447
v -0.010151 0.047252 0.024324
vn 0.7823 0.0305 0.6222
vn -0.9742 0.0444 -0.2212
vn -0.4349 0.0616 -0.8984
vn 0.4334 0.0535 -0.8996
vn 0.9746 0.0321 -0.2216
vn 0.0003 0.0332 0.9994
vn -0.7805 0.0348 0.6241
vn -0.9301 0.3088 -0.1988
vn 0.4061 0.3177 -0.8568
vn 0.0159 0.2979 0.9545
vn 0.7526 0.2957 0.5884
vn -0.4261 0.3250 -0.8443
vn 0.9280 0.2972 -0.2246
vn -0.7369 0.2999 0.6058
vn -0.4665 0.7898 0.3982
vn 0.0073 0.9998 0.0178
vn 0.5955 0.7889 -0.1516
vn -0.2883 0.8053 -0.5181
vn 0.4888 0.7869 0.3767
vn 0.0276 0.7883 0.6147
vn 0.2668 0.8015 -0.5351
vn -0.5945 0.7963 -0.1115
vt 0.164062 0.210938
vt 0.164062 0.484375
vt 0.000000 0.500000
vt 0.000000 0.195312
vt 0.507812 0.687500
vt 0.554688 0.960938
vt 0.390625 1.000000
vt 0.343750 0.695312
vt 0.882812 0.507812
vt 0.835938 0.687500
vt 0.671875 0.695312
vt 0.718750 0.492188
vt 0.882812 0.960938
vt 0.718750 1.000000
vt 0.234375 0.039062
vt 0.078125 -0.000000
vt 0.234375 0.656250
vt 0.078125 0.695312
vt 0.554688 0.507812
vt 0.390625 0.492188
vt 0.640625 0.695312
vt 0.671875 0.914062
vt 0.960938 0.695312
vt 1.000000 0.914062
vt 0.289062 0.453125
vt 0.343750 0.593750
vt 0.289062 0.234375
vt 1.000000 0.546875
vt 0.343750 0.101562
vt 0.671875 0.546875
vt 0.437500 0.445312
vt 0.343750 0.250000
vt 0.484375 0.250000
vt 0.523438 0.335938
vt 0.703125 0.296875
vt 0.625000 0.359375
vt 0.523438 0.156250
vt 0.625000 0.132812
vt 0.703125 0.195312
vt 0.656250 -0.000000
vt 0.828125 0.140625
vt 0.828125 0.359375
vt 0.656250 0.492188
vt 0.437500 0.046875
s 0
usemtl Core
f 2/1/1 3/2/1 9/3/1 8/4/1
f 4/5/2 5/6/2 11/7/2 10/8/2
f 5/9/3 1/10/3 12/11/3 11/12/3
f 1/10/4 6/13/4 13/14/4 12/11/4
f 6/15/5 2/1/5 8/4/5 13/16/5
f 3/2/6 7/17/6 14/18/6 9/3/6
f 7/19/7 4/5/7 10/8/7 14/20/7
f 5/6/8 4/5/8 17/21/8 18/22/8
f 6/13/9 1/10/9 19/23/9 20/24/9
f 7/17/10 3/2/10 16/25/10 21/26/10
f 3/2/11 2/1/11 15/27/11 16/25/11
f 1/10/12 5/9/12 18/28/12 19/23/12
f 2/1/13 6/15/13 20/29/13 15/27/13
f 4/5/14 7/19/14 21/30/14 17/21/14
f 17/31/15 21/32/15 28/33/15 24/34/15
f 26/35/16 25/36/16 24/34/16 28/33/16 23/37/16 22/38/16 27/39/16
f 15/40/17 20/41/17 27/39/17 22/38/17
f 19/42/18 18/43/18 25/36/18 26/35/18
f 16/44/19 15/40/19 22/38/19 23/37/19
f 21/32/20 16/44/20 23/37/20 28/33/20
f 20/41/21 19/42/21 26/35/21 27/39/21
f 18/43/22 17/31/22 24/34/22 25/36/22

Binary file not shown.

Binary file not shown.

BIN
asset_dev/grunk_nodes/alarm/alarm_core_uv_layout.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
asset_dev/sfx/spray.aup3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,48 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://60ks4l42qxia"
path="res://.godot/imported/alarm.gltf-ea2bfae4f9486e264df32529eb23ab63.scn"
[deps]
source_file="res://assets/grunk/alarm/alarm.gltf"
dest_files=["res://.godot/imported/alarm.gltf-ea2bfae4f9486e264df32529eb23ab63.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
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=""
_subresources={
"materials": {
"Core": {
"use_external/enabled": true,
"use_external/path": "uid://cdpvcruywnp4x"
},
"Grunk": {
"use_external/enabled": true,
"use_external/path": "uid://bmab6i16v748m"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
assets/grunk/alarm/alarm_core_C.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d30fv8koa7l76"
path="res://.godot/imported/alarm_core_C.png-6c19be146ce7f3b1082c3b4a14ec6e5e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/grunk/alarm/alarm_core_C.png"
dest_files=["res://.godot/imported/alarm_core_C.png-6c19be146ce7f3b1082c3b4a14ec6e5e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
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/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

BIN
assets/grunk/alarm/alarm_core_N.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b60qme57nn45u"
path="res://.godot/imported/alarm_core_N.png-bf83d4de4dda39cecd12ded93e8065ae.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/grunk/alarm/alarm_core_N.png"
dest_files=["res://.godot/imported/alarm_core_N.png-bf83d4de4dda39cecd12ded93e8065ae.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/grunk/alarm/alarm_core_N.png"
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

BIN
assets/grunk/alarm/alarm_core_R.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c3310lmvwfp7g"
path="res://.godot/imported/alarm_core_R.png-3ece2da6b8a3ee0dce1c204c687f2929.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/grunk/alarm/alarm_core_R.png"
dest_files=["res://.godot/imported/alarm_core_R.png-3ece2da6b8a3ee0dce1c204c687f2929.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
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/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

Binary file not shown.

View File

@ -0,0 +1,2 @@
# Blender 4.3.2 MTL File: 'trash_can.blend'
# www.blender.org

View File

@ -0,0 +1,107 @@
# Blender 4.3.2
# www.blender.org
mtllib trash_can.mtl
o Cylinder
v 0.000000 -0.500000 -0.400000
v 0.282843 -0.500000 -0.282843
v 0.400000 -0.500000 0.000000
v 0.282843 -0.500000 0.282843
v 0.000000 -0.500000 0.400000
v -0.282843 -0.500000 0.282843
v -0.400000 -0.500000 0.000000
v -0.282843 -0.500000 -0.282843
v -0.000000 0.500000 -0.350113
v 0.000000 0.400000 -0.400000
v 0.247567 0.500000 -0.247567
v 0.282843 0.400000 -0.282843
v 0.350113 0.500000 -0.000000
v 0.400000 0.400000 0.000000
v 0.247567 0.500000 0.247567
v 0.282843 0.400000 0.282843
v 0.000000 0.500000 0.350113
v 0.000000 0.400000 0.400000
v -0.247567 0.500000 0.247567
v -0.282843 0.400000 0.282843
v -0.350113 0.500000 0.000000
v -0.400000 0.400000 0.000000
v -0.247567 0.500000 -0.247567
v -0.282843 0.400000 -0.282843
vn -0.3827 -0.0000 -0.9239
vn 0.9239 -0.0000 0.3827
vn 0.3827 -0.0000 0.9239
vn -0.3827 -0.0000 0.9239
vn -0.9239 -0.0000 0.3827
vn -0.9239 -0.0000 -0.3827
vn 0.3827 -0.0000 -0.9239
vn 0.9239 -0.0000 -0.3827
vn -0.0000 -1.0000 -0.0000
vn 0.3475 0.4186 -0.8391
vn 0.8390 0.4186 -0.3475
vn 0.8390 0.4186 0.3475
vn 0.3475 0.4186 0.8390
vn -0.3475 0.4186 0.8391
vn -0.8390 0.4186 0.3475
vn -0.8391 0.4186 -0.3475
vn -0.3475 0.4186 -0.8390
vn -0.0000 1.0000 -0.0000
vt 0.125000 0.500000
vt 0.125000 0.953125
vt 0.000000 0.953125
vt 0.000000 0.500000
vt 0.750000 0.500000
vt 0.750000 0.953125
vt 0.625000 0.953125
vt 0.625000 0.500000
vt 0.500000 0.953125
vt 0.500000 0.500000
vt 0.375000 0.953125
vt 0.375000 0.500000
vt 0.250000 0.953125
vt 0.250000 0.500000
vt 1.000000 0.500000
vt 1.000000 0.953125
vt 0.875000 0.953125
vt 0.875000 0.500000
vt 0.843750 0.468750
vt 0.968750 0.343750
vt 0.968750 0.156250
vt 0.843750 0.031250
vt 0.656250 0.031250
vt 0.531250 0.156250
vt 0.531250 0.343750
vt 0.656250 0.468750
vt 0.468750 0.343750
vt 0.343750 0.468750
vt 0.312500 0.406250
vt 0.406250 0.312500
vt 0.468750 0.156250
vt 0.406250 0.187500
vt 0.343750 0.031250
vt 0.312500 0.093750
vt 0.156250 0.031250
vt 0.187500 0.093750
vt 0.031250 0.156250
vt 0.093750 0.187500
vt 0.031250 0.343750
vt 0.093750 0.312500
vt 0.156250 0.468750
vt 0.187500 0.406250
s 0
f 8/1/1 24/2/1 10/3/1 1/4/1
f 3/5/2 14/6/2 16/7/2 4/8/2
f 4/8/3 16/7/3 18/9/3 5/10/3
f 5/10/4 18/9/4 20/11/4 6/12/4
f 6/12/5 20/11/5 22/13/5 7/14/5
f 7/14/6 22/13/6 24/2/6 8/1/6
f 1/15/7 10/16/7 12/17/7 2/18/7
f 2/18/8 12/17/8 14/6/8 3/5/8
f 1/19/9 2/20/9 3/21/9 4/22/9 5/23/9 6/24/9 7/25/9 8/26/9
f 12/27/10 10/28/10 9/29/10 11/30/10
f 14/31/11 12/27/11 11/30/11 13/32/11
f 16/33/12 14/31/12 13/32/12 15/34/12
f 18/35/13 16/33/13 15/34/13 17/36/13
f 20/37/14 18/35/14 17/36/14 19/38/14
f 22/39/15 20/37/15 19/38/15 21/40/15
f 24/41/16 22/39/16 21/40/16 23/42/16
f 10/28/17 24/41/17 23/42/17 9/29/17
f 11/30/18 9/29/18 23/42/18 21/40/18 19/38/18 17/36/18 15/34/18 13/32/18

View File

@ -0,0 +1,25 @@
[remap]
importer="wavefront_obj"
importer_version=1
type="Mesh"
uid="uid://c1npli5k7cmt1"
path="res://.godot/imported/trash_can.obj-daca2c883ec044fd1a69cd27cd4a3490.mesh"
[deps]
files=["res://.godot/imported/trash_can.obj-daca2c883ec044fd1a69cd27cd4a3490.mesh"]
source_file="res://assets/props/trash_can/trash_can.obj"
dest_files=["res://.godot/imported/trash_can.obj-daca2c883ec044fd1a69cd27cd4a3490.mesh", "res://.godot/imported/trash_can.obj-daca2c883ec044fd1a69cd27cd4a3490.mesh"]
[params]
generate_tangents=true
generate_lods=true
generate_shadow_mesh=true
generate_lightmap_uv2=false
generate_lightmap_uv2_texel_size=0.2
scale_mesh=Vector3(1, 1, 1)
offset_mesh=Vector3(0, 0, 0)
force_disable_mesh_compression=false

BIN
assets/props/trash_can/trash_can_C.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dg01fg62km4fq"
path="res://.godot/imported/trash_can_C.png-a513828346c1391ee7f543c9bc5b98e7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/props/trash_can/trash_can_C.png"
dest_files=["res://.godot/imported/trash_can_C.png-a513828346c1391ee7f543c9bc5b98e7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
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/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

BIN
assets/props/trash_can/trash_can_M.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dhj3w5ujnikf6"
path="res://.godot/imported/trash_can_M.png-7d498cc43ffebcd3f67598f6f4d903c1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/props/trash_can/trash_can_M.png"
dest_files=["res://.godot/imported/trash_can_M.png-7d498cc43ffebcd3f67598f6f4d903c1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
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/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

BIN
assets/props/trash_can/trash_can_N.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c1ksjm73dg0jy"
path="res://.godot/imported/trash_can_N.png-0c251a62a2ee8a3c06fe8fc4bc763ee2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/props/trash_can/trash_can_N.png"
dest_files=["res://.godot/imported/trash_can_N.png-0c251a62a2ee8a3c06fe8fc4bc763ee2.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/props/trash_can/trash_can_N.png"
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

BIN
assets/props/trash_can/trash_can_R.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b8wb1tr3lpdap"
path="res://.godot/imported/trash_can_R.png-de97399a2f6bce07f3860d2832d8e1ae.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/props/trash_can/trash_can_R.png"
dest_files=["res://.godot/imported/trash_can_R.png-de97399a2f6bce07f3860d2832d8e1ae.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
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/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

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://di0e1l1l6l3qc"
path="res://.godot/imported/metal1.wav-abec163e69d3b8c2b88c018c6d6fd53a.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal1.wav"
dest_files=["res://.godot/imported/metal1.wav-abec163e69d3b8c2b88c018c6d6fd53a.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://btiyoi1ipofd"
path="res://.godot/imported/metal10.wav-f330161b601abcba2af8d992baf863cd.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal10.wav"
dest_files=["res://.godot/imported/metal10.wav-f330161b601abcba2af8d992baf863cd.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://eagr344y4coh"
path="res://.godot/imported/metal11.wav-50429a719453f9b3167e120d3c968fde.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal11.wav"
dest_files=["res://.godot/imported/metal11.wav-50429a719453f9b3167e120d3c968fde.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bguwbr0nlhgkl"
path="res://.godot/imported/metal2.wav-994ad8bf412d1693eee9a314cb45b716.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal2.wav"
dest_files=["res://.godot/imported/metal2.wav-994ad8bf412d1693eee9a314cb45b716.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bv00dudic2mvp"
path="res://.godot/imported/metal3.wav-dfc0f68dda580cc92a343cd9775b7f25.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal3.wav"
dest_files=["res://.godot/imported/metal3.wav-dfc0f68dda580cc92a343cd9775b7f25.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://co83ygaa4d65u"
path="res://.godot/imported/metal4.wav-821733427b3229063559b57480349a37.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal4.wav"
dest_files=["res://.godot/imported/metal4.wav-821733427b3229063559b57480349a37.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://befqnsqlbpca7"
path="res://.godot/imported/metal5.wav-effadb87795f8e91effd78440f2ce271.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal5.wav"
dest_files=["res://.godot/imported/metal5.wav-effadb87795f8e91effd78440f2ce271.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dkx88wqwfvfst"
path="res://.godot/imported/metal6.wav-e276d8badb061ea92d2662d46f8e2976.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal6.wav"
dest_files=["res://.godot/imported/metal6.wav-e276d8badb061ea92d2662d46f8e2976.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c6wnc7kqtvujm"
path="res://.godot/imported/metal7.wav-aaf6b6fab7966db31f58a82a4ea7bf49.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal7.wav"
dest_files=["res://.godot/imported/metal7.wav-aaf6b6fab7966db31f58a82a4ea7bf49.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bo3klycfvvq2q"
path="res://.godot/imported/metal8.wav-89eebabbdb41236dfc3c37d668cb34d6.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal8.wav"
dest_files=["res://.godot/imported/metal8.wav-89eebabbdb41236dfc3c37d668cb34d6.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bpdnw4qgbp6kj"
path="res://.godot/imported/metal9.wav-1c009f88e12c346351f2a83e27df0786.sample"
[deps]
source_file="res://assets/sfx/footsteps/metal/metal9.wav"
dest_files=["res://.godot/imported/metal9.wav-1c009f88e12c346351f2a83e27df0786.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://pltp1s1x8q6u"
path="res://.godot/imported/beam_loop.wav-e0261eabd9510078d8b64ea2e8c4efe8.sample"
[deps]
source_file="res://assets/sfx/tools/beam_loop.wav"
dest_files=["res://.godot/imported/beam_loop.wav-e0261eabd9510078d8b64ea2e8c4efe8.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=2
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

BIN
assets/sfx/tools/spray.wav Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b5ik76jgl8mex"
path="res://.godot/imported/spray.wav-7cfa0acfe728bc004ce67c19ceb0c018.sample"
[deps]
source_file="res://assets/sfx/tools/spray.wav"
dest_files=["res://.godot/imported/spray.wav-7cfa0acfe728bc004ce67c19ceb0c018.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=2
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

15
default_bus_layout.tres Normal file
View File

@ -0,0 +1,15 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://caten2l7w1h6w"]
[resource]
bus/1/name = &"Music"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = 0.0
bus/1/send = &"Master"
bus/2/name = &"SFX"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = 0.0
bus/2/send = &"Master"

View File

@ -29,7 +29,7 @@ ssao_intensity = 2.5
ssil_enabled = true ssil_enabled = true
ssil_radius = 0.4 ssil_radius = 0.4
sdfgi_enabled = true sdfgi_enabled = true
sdfgi_use_occlusion = true sdfgi_cascades = 7
glow_enabled = true glow_enabled = true
glow_strength = 0.7 glow_strength = 0.7
glow_blend_mode = 0 glow_blend_mode = 0

File diff suppressed because one or more lines are too long

View File

@ -186,6 +186,9 @@ transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107,
[node name="GunkRelay" parent="TriggerNetWall/Puzzle" instance=ExtResource("9_d4a3d")] [node name="GunkRelay" parent="TriggerNetWall/Puzzle" instance=ExtResource("9_d4a3d")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.45, -2.62268e-08, -0.6) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.45, -2.62268e-08, -0.6)
[node name="GunkRelay5" parent="TriggerNetWall/Puzzle" instance=ExtResource("9_d4a3d")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.05, -4.80825e-08, -1.1)
[node name="GunkRelay2" parent="TriggerNetWall/Puzzle" instance=ExtResource("9_d4a3d")] [node name="GunkRelay2" parent="TriggerNetWall/Puzzle" instance=ExtResource("9_d4a3d")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.15, -1.09278e-08, -0.25) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.15, -1.09278e-08, -0.25)
@ -196,7 +199,7 @@ transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.2, -
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.2, 2.18558e-09, 0.05) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.2, 2.18558e-09, 0.05)
[node name="GunkAlarm" parent="TriggerNetWall/Puzzle" instance=ExtResource("10_l8xa5")] [node name="GunkAlarm" parent="TriggerNetWall/Puzzle" instance=ExtResource("10_l8xa5")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.9, -1.09278e-08, -0.25) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.9, 0, -0.25)
[node name="PulseNetWall" type="MeshInstance3D" parent="."] [node name="PulseNetWall" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 3.5, 1.5, 0) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 3.5, 1.5, 0)
@ -238,6 +241,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -4.37114e-08, -1)
[connection signal="destroyed" from="TriggerNetWall/Puzzle/GunkTrigger" to="TriggerNetWall/Puzzle/GunkRelay" method="trigger"] [connection signal="destroyed" from="TriggerNetWall/Puzzle/GunkTrigger" to="TriggerNetWall/Puzzle/GunkRelay" method="trigger"]
[connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay" to="TriggerNetWall/Puzzle/GunkRelay2" method="trigger"] [connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay" to="TriggerNetWall/Puzzle/GunkRelay2" method="trigger"]
[connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay5" to="TriggerNetWall/Puzzle/GunkRelay2" method="trigger"]
[connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay2" to="TriggerNetWall/Puzzle/GunkRelay3" method="trigger"] [connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay2" to="TriggerNetWall/Puzzle/GunkRelay3" method="trigger"]
[connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay2" to="TriggerNetWall/Puzzle/GunkRelay4" method="trigger"] [connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay2" to="TriggerNetWall/Puzzle/GunkRelay4" method="trigger"]
[connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay3" to="TriggerNetWall/Puzzle/GunkAlarm" method="trigger"] [connection signal="triggered" from="TriggerNetWall/Puzzle/GunkRelay3" to="TriggerNetWall/Puzzle/GunkAlarm" method="trigger"]

View File

@ -175,7 +175,7 @@ locale/translations=PackedStringArray("res://assets/text/text.en.translation")
3d_render/layer_2="HUD" 3d_render/layer_2="HUD"
3d_physics/layer_1="Physics" 3d_physics/layer_1="Physics"
3d_physics/layer_2="Interactive" 3d_physics/layer_2="Interactive"
3d_physics/layer_3="Grunkable" 3d_physics/layer_3="Sprayable"
[rendering] [rendering]

View File

@ -0,0 +1,30 @@
class_name BeamSFX extends AudioStreamPlayer3D
## Audio player that pitches up each frame `activate` is called, and pitches down any other time.
const MAX_PITCH := 1.0
const MIN_PITCH := 0.001
@export var pitch_increment := 3.236
@export var pitch_decrement := 1.618
var _active_this_frame := false
func activate() -> void:
_active_this_frame = true
if not playing:
playing = true
func _process(delta: float) -> void:
if not playing:
return
if _active_this_frame:
pitch_scale = min(MAX_PITCH, pitch_scale + pitch_increment * delta)
else:
pitch_scale = max(MIN_PITCH, pitch_scale - pitch_decrement * delta)
if pitch_scale <= MIN_PITCH:
playing = false
_active_this_frame = false

View File

@ -0,0 +1 @@
uid://7mp6lj3f6srq

View File

@ -0,0 +1,11 @@
[gd_scene load_steps=3 format=3 uid="uid://5y7gcq6igjpf"]
[ext_resource type="AudioStream" uid="uid://pltp1s1x8q6u" path="res://assets/sfx/tools/beam_loop.wav" id="1_hbyr8"]
[ext_resource type="Script" uid="uid://7mp6lj3f6srq" path="res://src/equipment/beam_sfx/beam_sfx.gd" id="2_qwosj"]
[node name="BeamSFX" type="AudioStreamPlayer3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
stream = ExtResource("1_hbyr8")
pitch_scale = 0.01
bus = &"SFX"
script = ExtResource("2_qwosj")

View File

@ -0,0 +1,18 @@
class_name SpraySFX extends AudioStreamPlayer3D
## Plays only as long as `activate` is called every frame.
var _active_this_frame := false
func activate() -> void:
_active_this_frame = true
func _process(_delta: float) -> void:
if _active_this_frame:
if not playing:
play()
else:
stop()
_active_this_frame = false

View File

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

View File

@ -0,0 +1,12 @@
[gd_scene load_steps=3 format=3 uid="uid://btq11kil0jcql"]
[ext_resource type="AudioStream" uid="uid://b5ik76jgl8mex" path="res://assets/sfx/tools/spray.wav" id="1_575yt"]
[ext_resource type="Script" uid="uid://bhvkgqpm7sglw" path="res://src/equipment/beam_sfx/spray_sfx.gd" id="2_yajv7"]
[node name="SpraySFX" type="AudioStreamPlayer3D"]
stream = ExtResource("1_575yt")
attenuation_model = 1
volume_db = -2.0
unit_size = 1.0
bus = &"SFX"
script = ExtResource("2_yajv7")

View File

@ -0,0 +1,25 @@
[gd_resource type="AudioStreamInteractive" load_steps=2 format=3 uid="uid://dhuioidbjemkx"]
[ext_resource type="AudioStream" uid="uid://pltp1s1x8q6u" path="res://assets/sfx/tools/beam_loop.wav" id="1_h7js2"]
[resource]
clip_count = 2
clip_0/name = &"silence"
clip_0/auto_advance = 0
clip_1/name = &"Beam Loop"
clip_1/stream = ExtResource("1_h7js2")
clip_1/auto_advance = 0
_transitions = {
Vector2i(0, 1): {
"fade_beats": 1.0,
"fade_mode": 1,
"from_time": 0,
"to_time": 2
},
Vector2i(1, 0): {
"fade_beats": 1.0,
"fade_mode": 2,
"from_time": 0,
"to_time": 1
}
}

View File

@ -12,11 +12,12 @@ const NORMAL_OFFSET = 0.05
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
if is_colliding() and parent_tool.firing: if is_colliding() and parent_tool.firing:
var child_pos := get_collision_point() + get_collision_normal() * NORMAL_OFFSET var child_pos := get_collision_point() + get_collision_normal() * NORMAL_OFFSET
for c: Node in get_children():
if c is Node3D:
(c as Node3D).global_position = child_pos
laser_dust.global_position = child_pos
laser_dust.emitting = true laser_dust.emitting = true
glow_light.global_position = child_pos
glow_light.visible = true # TODO: tween maybe? glow_light.visible = true # TODO: tween maybe?
else: else:
laser_dust.emitting = false laser_dust.emitting = false

View File

@ -5,10 +5,13 @@ class_name PointSpray extends Spray
@export var damage := 0.3334 @export var damage := 0.3334
@onready var laser: LaserCast = %LaserCast @onready var laser: LaserCast = %LaserCast
@onready var spray_sfx: SpraySFX = %SpraySFX
func _spray() -> void: func _spray() -> void:
if laser.is_colliding(): if laser.is_colliding():
spray_sfx.activate()
var collider := laser.get_collider() var collider := laser.get_collider()
if collider is GunkBody: if collider is GunkBody:
var point := laser.get_collision_point() var point := laser.get_collision_point()

View File

@ -1,10 +1,12 @@
[gd_scene load_steps=14 format=3 uid="uid://cc102xko0u6yj"] [gd_scene load_steps=16 format=3 uid="uid://cc102xko0u6yj"]
[ext_resource type="Script" uid="uid://dngia2ldbccv7" path="res://src/equipment/point_spray/point_spray.gd" id="1_2yl2v"] [ext_resource type="Script" uid="uid://dngia2ldbccv7" path="res://src/equipment/point_spray/point_spray.gd" id="1_2yl2v"]
[ext_resource type="Material" uid="uid://c00gndxoepuqh" path="res://assets/materials/laser_spray.tres" id="2_0pfy3"] [ext_resource type="Material" uid="uid://c00gndxoepuqh" path="res://assets/materials/laser_spray.tres" id="2_0pfy3"]
[ext_resource type="Texture2D" uid="uid://bn0gcsy37ahto" path="res://assets/ui/hud/reticle_large.png" id="2_qcl8j"] [ext_resource type="Texture2D" uid="uid://bn0gcsy37ahto" path="res://assets/ui/hud/reticle_large.png" id="2_qcl8j"]
[ext_resource type="PackedScene" uid="uid://btq11kil0jcql" path="res://src/equipment/beam_sfx/spray_sfx.tscn" id="3_5h54c"]
[ext_resource type="PackedScene" uid="uid://b8vradbaw61ga" path="res://src/equipment/laser_cast/laser_cast.tscn" id="3_qmoff"] [ext_resource type="PackedScene" uid="uid://b8vradbaw61ga" path="res://src/equipment/laser_cast/laser_cast.tscn" id="3_qmoff"]
[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="5_k4cg5"] [ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="5_k4cg5"]
[ext_resource type="PackedScene" uid="uid://5y7gcq6igjpf" path="res://src/equipment/beam_sfx/beam_sfx.tscn" id="5_tpavj"]
[ext_resource type="Script" uid="uid://dj2x7x5qkbym1" path="res://src/ui/canvas_projector.gd" id="6_h2fjt"] [ext_resource type="Script" uid="uid://dj2x7x5qkbym1" path="res://src/ui/canvas_projector.gd" id="6_h2fjt"]
[ext_resource type="Texture2D" uid="uid://brcxorcpe2g56" path="res://assets/ui/hud/tools/point_sprayer.png" id="6_otnek"] [ext_resource type="Texture2D" uid="uid://brcxorcpe2g56" path="res://assets/ui/hud/tools/point_sprayer.png" id="6_otnek"]
@ -62,6 +64,10 @@ unique_name_in_owner = true
target_position = Vector3(0, 0, -3) target_position = Vector3(0, 0, -3)
parent_tool = NodePath("../..") parent_tool = NodePath("../..")
[node name="SpraySFX" parent="Muzzle/LaserCast" instance=ExtResource("3_5h54c")]
unique_name_in_owner = true
attenuation_model = 0
[node name="SprayEffect" type="MeshInstance3D" parent="Muzzle"] [node name="SprayEffect" type="MeshInstance3D" parent="Muzzle"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, -4.47035e-08, -1, 0, 1, -4.47035e-08, 0, 0, -1.6) transform = Transform3D(1, 0, 0, 0, -4.47035e-08, -1, 0, 1, -4.47035e-08, 0, 0, -1.6)
@ -96,6 +102,9 @@ texture_albedo = ExtResource("2_qcl8j")
texture_emission = ExtResource("2_qcl8j") texture_emission = ExtResource("2_qcl8j")
cull_mask = 1048573 cull_mask = 1048573
[node name="BeamSFX" parent="Muzzle" instance=ExtResource("5_tpavj")]
unique_name_in_owner = true
[node name="HUDTool" type="Node3D" parent="."] [node name="HUDTool" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true

View File

@ -8,6 +8,7 @@ const RUMBLE_DROPOFF = 0.8
@onready var beam_particles_1: GPUParticles3D = %BeamParticles1 @onready var beam_particles_1: GPUParticles3D = %BeamParticles1
@onready var beam_particles_2: GPUParticles3D = %BeamParticles2 @onready var beam_particles_2: GPUParticles3D = %BeamParticles2
@onready var rumbler: Rumbler3D = %Rumbler @onready var rumbler: Rumbler3D = %Rumbler
@onready var beam_sfx: BeamSFX = %BeamSFX
func _spray() -> void: func _spray() -> void:
@ -28,6 +29,8 @@ func _fire() -> void:
beam_particles_1.emitting = true beam_particles_1.emitting = true
beam_particles_2.emitting = true beam_particles_2.emitting = true
beam_sfx.activate()
func _idle() -> void: func _idle() -> void:
spray_effect.visible = false spray_effect.visible = false

View File

@ -12,6 +12,7 @@ var _busy := false
@onready var spray_casts: Node3D = %SprayCasts @onready var spray_casts: Node3D = %SprayCasts
@onready var animation_player: AnimationPlayer = %AnimationPlayer @onready var animation_player: AnimationPlayer = %AnimationPlayer
@onready var spray_sfx: SpraySFX = %SpraySFX
func switch_mode() -> void: func switch_mode() -> void:
@ -41,6 +42,8 @@ func _spray() -> void:
for laser: LaserCast in spray_casts.get_children(): for laser: LaserCast in spray_casts.get_children():
if laser.is_colliding(): if laser.is_colliding():
spray_sfx.activate()
var collider := laser.get_collider() var collider := laser.get_collider()
if collider is GunkBody: if collider is GunkBody:
var target := collider as GunkBody var target := collider as GunkBody

View File

@ -1,11 +1,13 @@
[gd_scene load_steps=20 format=3 uid="uid://d2hnxr5l6w2x4"] [gd_scene load_steps=22 format=3 uid="uid://d2hnxr5l6w2x4"]
[ext_resource type="Script" uid="uid://dv40fyim2g2fa" path="res://src/equipment/wide_spray/wide_spray.gd" id="1_ggkto"] [ext_resource type="Script" uid="uid://dv40fyim2g2fa" path="res://src/equipment/wide_spray/wide_spray.gd" id="1_ggkto"]
[ext_resource type="Material" uid="uid://c00gndxoepuqh" path="res://assets/materials/laser_spray.tres" id="2_26efp"] [ext_resource type="Material" uid="uid://c00gndxoepuqh" path="res://assets/materials/laser_spray.tres" id="2_26efp"]
[ext_resource type="Texture2D" uid="uid://cx28sj02y31kj" path="res://assets/ui/hud/reticle_crosshair.png" id="3_78jy6"] [ext_resource type="Texture2D" uid="uid://cx28sj02y31kj" path="res://assets/ui/hud/reticle_crosshair.png" id="3_78jy6"]
[ext_resource type="PackedScene" uid="uid://btq11kil0jcql" path="res://src/equipment/beam_sfx/spray_sfx.tscn" id="3_v0jnx"]
[ext_resource type="PackedScene" uid="uid://b8vradbaw61ga" path="res://src/equipment/laser_cast/laser_cast.tscn" id="3_xahet"] [ext_resource type="PackedScene" uid="uid://b8vradbaw61ga" path="res://src/equipment/laser_cast/laser_cast.tscn" id="3_xahet"]
[ext_resource type="Texture2D" uid="uid://carrggw6kp14w" path="res://assets/ui/hud/reticle_left.png" id="4_rotxf"] [ext_resource type="Texture2D" uid="uid://carrggw6kp14w" path="res://assets/ui/hud/reticle_left.png" id="4_rotxf"]
[ext_resource type="Texture2D" uid="uid://wp03nuwt8hp5" path="res://assets/ui/hud/reticle_right.png" id="5_xo3vu"] [ext_resource type="Texture2D" uid="uid://wp03nuwt8hp5" path="res://assets/ui/hud/reticle_right.png" id="5_xo3vu"]
[ext_resource type="PackedScene" uid="uid://5y7gcq6igjpf" path="res://src/equipment/beam_sfx/beam_sfx.tscn" id="7_hv82w"]
[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="7_ku0nd"] [ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="7_ku0nd"]
[ext_resource type="Script" uid="uid://dj2x7x5qkbym1" path="res://src/ui/canvas_projector.gd" id="8_j7ker"] [ext_resource type="Script" uid="uid://dj2x7x5qkbym1" path="res://src/ui/canvas_projector.gd" id="8_j7ker"]
[ext_resource type="Texture2D" uid="uid://dxjwpai3or1hw" path="res://assets/ui/hud/tools/wide_sprayer.png" id="9_8vo2h"] [ext_resource type="Texture2D" uid="uid://dxjwpai3or1hw" path="res://assets/ui/hud/tools/wide_sprayer.png" id="9_8vo2h"]
@ -189,6 +191,10 @@ parent_tool = NodePath("../../../..")
[node name="LaserCast4" parent="Muzzle/Pivot/SprayCasts" node_paths=PackedStringArray("parent_tool") instance=ExtResource("3_xahet")] [node name="LaserCast4" parent="Muzzle/Pivot/SprayCasts" node_paths=PackedStringArray("parent_tool") instance=ExtResource("3_xahet")]
parent_tool = NodePath("../../../..") parent_tool = NodePath("../../../..")
[node name="SpraySFX" parent="Muzzle/Pivot/SprayCasts/LaserCast4" instance=ExtResource("3_v0jnx")]
unique_name_in_owner = true
attenuation_model = 0
[node name="LaserCast5" parent="Muzzle/Pivot/SprayCasts" node_paths=PackedStringArray("parent_tool") instance=ExtResource("3_xahet")] [node name="LaserCast5" parent="Muzzle/Pivot/SprayCasts" node_paths=PackedStringArray("parent_tool") instance=ExtResource("3_xahet")]
target_position = Vector3(0.167, 0, -2) target_position = Vector3(0.167, 0, -2)
parent_tool = NodePath("../../../..") parent_tool = NodePath("../../../..")
@ -257,6 +263,9 @@ local_coords = true
process_material = SubResource("ParticleProcessMaterial_lyk2j") process_material = SubResource("ParticleProcessMaterial_lyk2j")
draw_pass_1 = SubResource("QuadMesh_trcry") draw_pass_1 = SubResource("QuadMesh_trcry")
[node name="BeamSFX" parent="Muzzle" instance=ExtResource("7_hv82w")]
unique_name_in_owner = true
[node name="HUDTool" type="Node3D" parent="."] [node name="HUDTool" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true

View File

@ -18,9 +18,9 @@ func _unhandled_input(event: InputEvent) -> void:
func camera_motion(motion: Vector2) -> void: func camera_motion(motion: Vector2) -> void:
var x_sensitivity: float = ProjectSettings.get_setting("game/config/input/mouse_sensitivity_x") var x_sensitivity: float = Game.settings.mouse_sensitivity_x
var y_sensitivity: float = ProjectSettings.get_setting("game/config/input/mouse_sensitivity_y") var y_sensitivity: float = Game.settings.mouse_sensitivity_y
var invert_pitch: bool = ProjectSettings.get_setting("game/config/input/invert_pitch") var invert_pitch: bool = Game.settings.invert_pitch
if player.firing: if player.firing:
# Focus movement when firing # Focus movement when firing
# Game mechanic, should not be user-configurable. # Game mechanic, should not be user-configurable.
@ -36,9 +36,7 @@ func camera_motion(motion: Vector2) -> void:
func _physics_process(_delta: float) -> void: func _physics_process(_delta: float) -> void:
var mouse_accel: float = ( var mouse_accel: float = Game.settings.mouse_acceleration / 60.0
ProjectSettings.get_setting("game/config/input/mouse_acceleration") / 60.0
)
if player.firing: if player.firing:
mouse_accel = FOCUS_ACCELERATION / 60.0 mouse_accel = FOCUS_ACCELERATION / 60.0
rotation.y = lerp_angle(rotation.y, _target.y, mouse_accel) rotation.y = lerp_angle(rotation.y, _target.y, mouse_accel)

View File

@ -0,0 +1,23 @@
class_name FootController extends Node3D
enum SurfaceMaterial {
UNKNOWN,
GRUNK,
PLASTIC,
METAL,
}
@onready var metal: AudioStreamPlayer3D = $Metal
func get_player_for_material(surface_material: SurfaceMaterial) -> AudioStreamPlayer3D:
match surface_material:
SurfaceMaterial.GRUNK:
pass # TODO
SurfaceMaterial.PLASTIC:
pass # TODO
SurfaceMaterial.METAL:
return metal
SurfaceMaterial.UNKNOWN:
pass
return null

View File

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

View File

@ -0,0 +1,27 @@
class_name FootstepController extends Node3D
const BASE_VOLUME := -42.0
const MUTE_VELOCITY := 1.0
const VELOCITY_FACTOR := 2.0
var _on_right_foot := false
@onready var player: Player = owner
@onready var left_foot: FootController = %LeftFoot
@onready var right_foot: FootController = %RightFoot
func play_footstep() -> void:
var foot := right_foot if _on_right_foot else left_foot
var relative_speed := player.velocity.length() - MUTE_VELOCITY
if relative_speed < 0:
return
# TODO: detect surface material
var sfx := foot.get_player_for_material(FootController.SurfaceMaterial.METAL)
sfx.volume_db = BASE_VOLUME + relative_speed * VELOCITY_FACTOR
sfx.play()
_on_right_foot = not _on_right_foot

View File

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

View File

@ -0,0 +1,37 @@
extends AnimationTree
const BLEND_ACCELERATION := 10.0
const VELOCITY_BLEND_FACTOR := 0.0643
const VELOCITY_TIMESCALE_FACTOR := 0.25
var blend: float:
set(value):
self["parameters/blend/blend_amount"] = value
get:
return self["parameters/blend/blend_amount"]
var timescale: float:
set(value):
self["parameters/timescale/scale"] = value
get:
return self["parameters/timescale/scale"]
@onready var player: Player = owner
func _process(delta: float) -> void:
var speed := player.velocity.length()
if player.is_on_floor():
var timescale_target := speed * VELOCITY_TIMESCALE_FACTOR
timescale = lerpf(timescale, timescale_target, BLEND_ACCELERATION * delta)
else:
timescale = 0.0
if Game.settings.enable_head_bob:
var blend_target := 0.0
if player.is_on_floor():
blend_target = speed * VELOCITY_BLEND_FACTOR
blend = lerpf(blend, blend_target, BLEND_ACCELERATION * delta)
else:
blend = 0.0

View File

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

View File

@ -4,7 +4,9 @@ const FOCUS_SPEED := 30.0
const RUN_SPEED := 80.0 const RUN_SPEED := 80.0
const SPRINT_SPEED := 160.0 const SPRINT_SPEED := 160.0
const AIR_SPEED := 10.0 const AIR_SPEED := 10.0
const JUMP_FORCE := 4.5 const JUMP_FORCE := 4.5
const GROUND_FRICTION := 0.3 const GROUND_FRICTION := 0.3
const AIR_FRICTION := 0.03 const AIR_FRICTION := 0.03
@ -109,10 +111,8 @@ func _physics_process(delta: float) -> void:
# Input movement # Input movement
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back") var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
var direction := ( var rel_input := input_dir.rotated(-camera_pivot.global_rotation.y)
(camera_pivot.global_basis * Vector3(input_dir.x, 0, input_dir.y) * Vector3(1, 0, 1)) var direction := Vector3(rel_input.x, 0, rel_input.y).normalized()
. normalized()
)
var movement := direction * get_speed() * delta var movement := direction * get_speed() * delta
velocity.x += movement.x velocity.x += movement.x
velocity.z += movement.z velocity.z += movement.z

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://bwe2jdmvinhqd"] [gd_scene load_steps=36 format=3 uid="uid://bwe2jdmvinhqd"]
[ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"]
[ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"]
@ -7,11 +7,180 @@
[ext_resource type="Script" uid="uid://cwy3akimaeib" path="res://src/player/tool_mount.gd" id="3_jiejy"] [ext_resource type="Script" uid="uid://cwy3akimaeib" path="res://src/player/tool_mount.gd" id="3_jiejy"]
[ext_resource type="PackedScene" uid="uid://dq1x21tq06dud" path="res://src/ui/hud/player_hud.tscn" id="5_jvafu"] [ext_resource type="PackedScene" uid="uid://dq1x21tq06dud" path="res://src/ui/hud/player_hud.tscn" id="5_jvafu"]
[ext_resource type="PackedScene" uid="uid://qknkdy6aics1" path="res://src/equipment/toothbrush/toothbrush.tscn" id="6_o822w"] [ext_resource type="PackedScene" uid="uid://qknkdy6aics1" path="res://src/equipment/toothbrush/toothbrush.tscn" id="6_o822w"]
[ext_resource type="Script" uid="uid://b1vyq7e81nyt0" path="res://src/player/headbob_controller.gd" id="7_x42xx"]
[ext_resource type="Script" uid="uid://ecrhsueph7at" path="res://src/player/footsteps/footstep_controller.gd" id="9_hja65"]
[ext_resource type="Script" uid="uid://brqa2wbtaspw4" path="res://src/player/footsteps/foot_controller.gd" id="9_l271a"]
[ext_resource type="AudioStream" uid="uid://di0e1l1l6l3qc" path="res://assets/sfx/footsteps/metal/metal1.wav" id="10_jcdrv"]
[ext_resource type="AudioStream" uid="uid://bv00dudic2mvp" path="res://assets/sfx/footsteps/metal/metal3.wav" id="11_hja65"]
[ext_resource type="AudioStream" uid="uid://befqnsqlbpca7" path="res://assets/sfx/footsteps/metal/metal5.wav" id="12_5shm8"]
[ext_resource type="AudioStream" uid="uid://c6wnc7kqtvujm" path="res://assets/sfx/footsteps/metal/metal7.wav" id="13_5efpn"]
[ext_resource type="AudioStream" uid="uid://bpdnw4qgbp6kj" path="res://assets/sfx/footsteps/metal/metal9.wav" id="14_4uy46"]
[ext_resource type="AudioStream" uid="uid://eagr344y4coh" path="res://assets/sfx/footsteps/metal/metal11.wav" id="15_k60ra"]
[ext_resource type="AudioStream" uid="uid://bguwbr0nlhgkl" path="res://assets/sfx/footsteps/metal/metal2.wav" id="16_a4vah"]
[ext_resource type="AudioStream" uid="uid://co83ygaa4d65u" path="res://assets/sfx/footsteps/metal/metal4.wav" id="17_vwi60"]
[ext_resource type="AudioStream" uid="uid://dkx88wqwfvfst" path="res://assets/sfx/footsteps/metal/metal6.wav" id="18_o04tx"]
[ext_resource type="AudioStream" uid="uid://bo3klycfvvq2q" path="res://assets/sfx/footsteps/metal/metal8.wav" id="19_j2873"]
[ext_resource type="AudioStream" uid="uid://btiyoi1ipofd" path="res://assets/sfx/footsteps/metal/metal10.wav" id="20_dpt0q"]
[sub_resource type="Animation" id="Animation_x42xx"]
length = 0.001
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:position:x")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".:position:y")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".:position:z")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
[sub_resource type="Animation" id="Animation_hja65"]
resource_name = "footstep_sfx"
loop_mode = 1
step = 0.01
tracks/0/type = "method"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("%FootstepController")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.35, 0.85),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [],
"method": &"play_footstep"
}, {
"args": [],
"method": &"play_footstep"
}]
}
[sub_resource type="Animation" id="Animation_o822w"]
resource_name = "head_bob"
loop_mode = 1
step = 0.005
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:position:x")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.125, 0.05, 0.05, -0.125, 0, 0.25, 0, -0.05, -0.25, 0, 0.125, 0, 0, -0.125, -0.05, 0.25, 0),
"times": PackedFloat32Array(0, 0.25, 0.75, 1)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".:position:y")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0),
"points": PackedFloat32Array(0, -0.25, 0, 0.031, 0.04, 0.081, -0.062, 0, 0.125, 0, -0.081, -0.125, 0, 0.125, 0, 0.081, -0.125, 0, 0.125, 0, -0.081, -0.125, 0, 0.063, 0, 0.00176717, -0.031, -0.04, 0.125, 0),
"times": PackedFloat32Array(0, 0.13, 0.375, 0.625, 0.875, 1)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath(".:position:z")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_l271a"]
_data = {
&"RESET": SubResource("Animation_x42xx"),
&"footstep_sfx": SubResource("Animation_hja65"),
&"head_bob": SubResource("Animation_o822w")
}
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_o822w"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_x42xx"]
animation = &"head_bob"
[sub_resource type="AnimationNodeAdd2" id="AnimationNodeAdd2_hja65"]
sync = true
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_5shm8"]
animation = &"footstep_sfx"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_l271a"]
animation = &"RESET"
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_8ydov"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ylhto"]
graph_offset = Vector2(-33.7273, -38.6364)
nodes/blend/node = SubResource("AnimationNodeBlend2_o822w")
nodes/blend/position = Vector2(779, 166)
nodes/bob_anim/node = SubResource("AnimationNodeAnimation_x42xx")
nodes/bob_anim/position = Vector2(540, 260)
nodes/output/position = Vector2(1460, 140)
nodes/sfx_add/node = SubResource("AnimationNodeAdd2_hja65")
nodes/sfx_add/position = Vector2(1020, 160)
nodes/sfx_anim/node = SubResource("AnimationNodeAnimation_5shm8")
nodes/sfx_anim/position = Vector2(540, 520)
nodes/still_anim/node = SubResource("AnimationNodeAnimation_l271a")
nodes/still_anim/position = Vector2(540, 40)
nodes/timescale/node = SubResource("AnimationNodeTimeScale_8ydov")
nodes/timescale/position = Vector2(1240, 120)
node_connections = [&"blend", 0, &"still_anim", &"blend", 1, &"bob_anim", &"output", 0, &"timescale", &"sfx_add", 0, &"blend", &"sfx_add", 1, &"sfx_anim", &"timescale", 0, &"sfx_add"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s7f0r"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s7f0r"]
radius = 0.4 radius = 0.4
height = 1.9 height = 1.9
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_8ydov"]
random_pitch = 1.1
streams_count = 6
stream_0/stream = ExtResource("10_jcdrv")
stream_1/stream = ExtResource("11_hja65")
stream_2/stream = ExtResource("12_5shm8")
stream_3/stream = ExtResource("13_5efpn")
stream_4/stream = ExtResource("14_4uy46")
stream_5/stream = ExtResource("15_k60ra")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_ylhto"]
random_pitch = 1.1
streams_count = 5
stream_0/stream = ExtResource("16_a4vah")
stream_1/stream = ExtResource("17_vwi60")
stream_2/stream = ExtResource("18_o04tx")
stream_3/stream = ExtResource("19_j2873")
stream_4/stream = ExtResource("20_dpt0q")
[node name="Player" type="CharacterBody3D"] [node name="Player" type="CharacterBody3D"]
script = ExtResource("1_npueo") script = ExtResource("1_npueo")
@ -37,22 +206,44 @@ visible = false
unique_name_in_owner = true unique_name_in_owner = true
visible = false visible = false
[node name="Camera3D" type="Camera3D" parent="CameraPivot"] [node name="CameraPosition" type="Node3D" parent="CameraPivot"]
[node name="Camera3D" type="Camera3D" parent="CameraPivot/CameraPosition"]
current = true current = true
[node name="InteractRay" type="RayCast3D" parent="CameraPivot/Camera3D"] [node name="InteractRay" type="RayCast3D" parent="CameraPivot/CameraPosition/Camera3D"]
unique_name_in_owner = true unique_name_in_owner = true
target_position = Vector3(0, 0, -1.5) target_position = Vector3(0, 0, -1.5)
collision_mask = 2 collision_mask = 2
[node name="OmniLight3D" type="OmniLight3D" parent="CameraPivot/Camera3D"] [node name="FarLight" type="OmniLight3D" parent="CameraPivot/CameraPosition/Camera3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.1) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.1)
light_energy = 0.08 light_energy = 0.05
light_indirect_energy = 4.0
light_specular = 0.01 light_specular = 0.01
light_cull_mask = 4294967293 light_cull_mask = 4294967293
omni_range = 60.0 omni_range = 50.0
omni_attenuation = 0.2 omni_attenuation = 0.0
[node name="NearLight" type="OmniLight3D" parent="CameraPivot/CameraPosition/Camera3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.1)
light_specular = 0.01
light_cull_mask = 4294967293
omni_range = 2.0
[node name="HeadbobAnimation" type="AnimationPlayer" parent="CameraPivot/CameraPosition/Camera3D"]
libraries = {
&"": SubResource("AnimationLibrary_l271a")
}
[node name="HeadbobController" type="AnimationTree" parent="CameraPivot/CameraPosition/Camera3D/HeadbobAnimation"]
unique_name_in_owner = true
root_node = NodePath("%HeadbobController/../..")
tree_root = SubResource("AnimationNodeBlendTree_ylhto")
anim_player = NodePath("..")
parameters/blend/blend_amount = 0.0
parameters/sfx_add/add_amount = 1.0
parameters/timescale/scale = false
script = ExtResource("7_x42xx")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
@ -60,3 +251,28 @@ shape = SubResource("CapsuleShape3D_s7f0r")
[node name="PlayerHUD" parent="." instance=ExtResource("5_jvafu")] [node name="PlayerHUD" parent="." instance=ExtResource("5_jvafu")]
unique_name_in_owner = true unique_name_in_owner = true
[node name="FootstepController" type="Node3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
script = ExtResource("9_hja65")
[node name="LeftFoot" type="Node3D" parent="FootstepController"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0, 0)
script = ExtResource("9_l271a")
[node name="Metal" type="AudioStreamPlayer3D" parent="FootstepController/LeftFoot"]
stream = SubResource("AudioStreamRandomizer_8ydov")
volume_db = -42.0
bus = &"SFX"
[node name="RightFoot" type="Node3D" parent="FootstepController"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0, 0)
script = ExtResource("9_l271a")
[node name="Metal" type="AudioStreamPlayer3D" parent="FootstepController/RightFoot"]
stream = SubResource("AudioStreamRandomizer_ylhto")
volume_db = -42.0
bus = &"SFX"

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=16 format=4 uid="uid://d2feet02a603e"] [gd_scene load_steps=21 format=4 uid="uid://d2feet02a603e"]
[ext_resource type="Script" uid="uid://gg4c132d2xwj" path="res://src/props/overhead_light/overhead_light.gd" id="1_210ch"] [ext_resource type="Script" uid="uid://gg4c132d2xwj" path="res://src/props/overhead_light/overhead_light.gd" id="1_210ch"]
[ext_resource type="Texture2D" uid="uid://bne1d0r5a8nn6" path="res://assets/props/overhead_light/overhead_light_C.png" id="1_whqf3"] [ext_resource type="Texture2D" uid="uid://bne1d0r5a8nn6" path="res://assets/props/overhead_light/overhead_light_C.png" id="1_whqf3"]
@ -7,7 +7,9 @@
[ext_resource type="Texture2D" uid="uid://no4s7dsg8tih" path="res://assets/props/overhead_light/overhead_light_N.png" id="4_3gl0p"] [ext_resource type="Texture2D" uid="uid://no4s7dsg8tih" path="res://assets/props/overhead_light/overhead_light_N.png" id="4_3gl0p"]
[ext_resource type="Texture2D" uid="uid://cr5e4hk33wmwf" path="res://assets/props/overhead_light/overhead_light_R.png" id="5_210ch"] [ext_resource type="Texture2D" uid="uid://cr5e4hk33wmwf" path="res://assets/props/overhead_light/overhead_light_R.png" id="5_210ch"]
[ext_resource type="PackedScene" uid="uid://c2omlx4ptrc01" path="res://src/world/gunk_body/gunk_body.tscn" id="6_3gl0p"] [ext_resource type="PackedScene" uid="uid://c2omlx4ptrc01" path="res://src/world/gunk_body/gunk_body.tscn" id="6_3gl0p"]
[ext_resource type="Material" uid="uid://dutkfm4ek0ysh" path="res://assets/materials/gunk_bright.material" id="8_3gl0p"] [ext_resource type="Shader" uid="uid://ckxc0ngd37rtk" path="res://src/shaders/gunk.gdshader" id="8_ljcul"]
[ext_resource type="Texture2D" uid="uid://cm1jrvx7ftx4c" path="res://assets/black.png" id="9_cmugl"]
[ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="10_jdrpd"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ljcul"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ljcul"]
albedo_texture = ExtResource("1_whqf3") albedo_texture = ExtResource("1_whqf3")
@ -117,6 +119,45 @@ _data = {
&"flicker": SubResource("Animation_whqf3") &"flicker": SubResource("Animation_whqf3")
} }
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_2roq2"]
width = 256
height = 256
depth = 32
seamless = true
seamless_blend_skirt = 0.5
noise = ExtResource("10_jdrpd")
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_fk1xc"]
width = 256
height = 256
depth = 32
seamless = true
seamless_blend_skirt = 0.5
noise = ExtResource("10_jdrpd")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_rve3b"]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("8_ljcul")
shader_parameter/color_1 = Color(0, 0.03, 0.1, 1)
shader_parameter/color_2 = Color(0, 0.1, 0.3, 1)
shader_parameter/emission_color = Color(0.66, 0.943333, 1, 1)
shader_parameter/pixellation = 128.0
shader_parameter/time_pixellation = 30.0
shader_parameter/roughness = 0.15
shader_parameter/specular_contribution = 0.8
shader_parameter/emission_strength = 0.04
shader_parameter/uv_scale = Vector2(2, 2)
shader_parameter/time_scale = 0.2
shader_parameter/edge_bleed = 0.25
shader_parameter/gunk_mask = ExtResource("9_cmugl")
shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2")
shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc")
shader_parameter/jitter_magnitude = 0.0
shader_parameter/jitter_time_scale = 0.1
shader_parameter/vertex_inflation = 0.0
shader_parameter/inflation_pixellation = 10.0
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_jdrpd"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_jdrpd"]
data = PackedVector3Array(0.4, -0.1, 0.75, 0.3, -0.2, 0.75, 0.4, 0, 0.75, 0.4, 0, 0.75, 0.3, -0.2, 0.75, -0.4, 0, 0.75, -0.4, 0, 0.75, 0.3, -0.2, 0.75, -0.4, -0.1, 0.75, -0.4, -0.1, 0.75, 0.3, -0.2, 0.75, -0.3, -0.2, 0.75, 0.4, 0, -0.75, 0.4, -0.1, -0.75, 0.4, 0, 0.75, 0.4, 0, 0.75, 0.4, -0.1, -0.75, 0.4, -0.1, 0.75, -0.4, -0.1, -0.75, -0.3, -0.2, -0.75, -0.4, 0, -0.75, -0.4, 0, -0.75, -0.3, -0.2, -0.75, 0.4, 0, -0.75, 0.4, 0, -0.75, -0.3, -0.2, -0.75, 0.4, -0.1, -0.75, 0.4, -0.1, -0.75, -0.3, -0.2, -0.75, 0.3, -0.2, -0.75, -0.4, 0, 0.75, -0.4, -0.1, 0.75, -0.4, 0, -0.75, -0.4, 0, -0.75, -0.4, -0.1, 0.75, -0.4, -0.1, -0.75, -0.4, 0, -0.75, 0.4, 0, -0.75, -0.4, 0, 0.75, -0.4, 0, 0.75, 0.4, 0, -0.75, 0.4, 0, 0.75, -0.3, -0.2, 0.75, -0.3, -0.2, -0.75, -0.4, -0.1, 0.75, -0.4, -0.1, 0.75, -0.3, -0.2, -0.75, -0.4, -0.1, -0.75, 0.3, -0.2, -0.75, 0.3, -0.2, 0.75, 0.4, -0.1, -0.75, 0.4, -0.1, -0.75, 0.3, -0.2, 0.75, 0.4, -0.1, 0.75, 0.3, -0.2, -0.75, -0.3, -0.2, -0.75, 0.3, -0.2, 0.75, 0.3, -0.2, 0.75, -0.3, -0.2, -0.75, -0.3, -0.2, 0.75) data = PackedVector3Array(0.4, -0.1, 0.75, 0.3, -0.2, 0.75, 0.4, 0, 0.75, 0.4, 0, 0.75, 0.3, -0.2, 0.75, -0.4, 0, 0.75, -0.4, 0, 0.75, 0.3, -0.2, 0.75, -0.4, -0.1, 0.75, -0.4, -0.1, 0.75, 0.3, -0.2, 0.75, -0.3, -0.2, 0.75, 0.4, 0, -0.75, 0.4, -0.1, -0.75, 0.4, 0, 0.75, 0.4, 0, 0.75, 0.4, -0.1, -0.75, 0.4, -0.1, 0.75, -0.4, -0.1, -0.75, -0.3, -0.2, -0.75, -0.4, 0, -0.75, -0.4, 0, -0.75, -0.3, -0.2, -0.75, 0.4, 0, -0.75, 0.4, 0, -0.75, -0.3, -0.2, -0.75, 0.4, -0.1, -0.75, 0.4, -0.1, -0.75, -0.3, -0.2, -0.75, 0.3, -0.2, -0.75, -0.4, 0, 0.75, -0.4, -0.1, 0.75, -0.4, 0, -0.75, -0.4, 0, -0.75, -0.4, -0.1, 0.75, -0.4, -0.1, -0.75, -0.4, 0, -0.75, 0.4, 0, -0.75, -0.4, 0, 0.75, -0.4, 0, 0.75, 0.4, 0, -0.75, 0.4, 0, 0.75, -0.3, -0.2, 0.75, -0.3, -0.2, -0.75, -0.4, -0.1, 0.75, -0.4, -0.1, 0.75, -0.3, -0.2, -0.75, -0.4, -0.1, -0.75, 0.3, -0.2, -0.75, 0.3, -0.2, 0.75, 0.4, -0.1, -0.75, 0.4, -0.1, -0.75, 0.3, -0.2, 0.75, 0.4, -0.1, 0.75, 0.3, -0.2, -0.75, -0.3, -0.2, -0.75, 0.3, -0.2, 0.75, 0.3, -0.2, 0.75, -0.3, -0.2, -0.75, -0.3, -0.2, 0.75)
@ -132,7 +173,7 @@ light_energy = 2.0
light_specular = 1.0 light_specular = 1.0
spot_range = 16.0 spot_range = 16.0
spot_attenuation = 0.5 spot_attenuation = 0.5
spot_angle = 80.0 spot_angle = 98.0
spot_angle_attenuation = 1.55871 spot_angle_attenuation = 1.55871
[node name="MeshInstance3D" type="MeshInstance3D" parent="."] [node name="MeshInstance3D" type="MeshInstance3D" parent="."]
@ -146,7 +187,7 @@ autoplay = "flicker"
[node name="GunkBody" parent="MeshInstance3D" instance=ExtResource("6_3gl0p")] [node name="GunkBody" parent="MeshInstance3D" instance=ExtResource("6_3gl0p")]
mask_dim = 32 mask_dim = 32
source_gunk_material = ExtResource("8_3gl0p") source_gunk_material = SubResource("ShaderMaterial_rve3b")
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/GunkBody"] [node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/GunkBody"]
shape = SubResource("ConcavePolygonShape3D_jdrpd") shape = SubResource("ConcavePolygonShape3D_jdrpd")

View File

@ -1,8 +1,8 @@
[gd_scene load_steps=7 format=4 uid="uid://2yqi5u5eo025"] [gd_scene load_steps=7 format=4 uid="uid://2yqi5u5eo025"]
[ext_resource type="Script" uid="uid://07t7yhijru8f" path="res://src/world/gunk_node/grunk_nodule.gd" id="1_m8r0a"] [ext_resource type="Script" uid="uid://07t7yhijru8f" path="res://src/world/gunk_node/grunk_nodule.gd" id="1_iyr82"]
[ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="2_530fq"] [ext_resource type="PackedScene" uid="uid://xlt78xc1tmkl" path="res://src/effects/grunk_splatter.tscn" id="2_m8r0a"]
[ext_resource type="PackedScene" uid="uid://xlt78xc1tmkl" path="res://src/effects/grunk_splatter.tscn" id="2_iyr82"] [ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="3_eu6j6"]
[sub_resource type="ArrayMesh" id="ArrayMesh_24j8i"] [sub_resource type="ArrayMesh" id="ArrayMesh_24j8i"]
_surfaces = [{ _surfaces = [{
@ -26,7 +26,7 @@ _surfaces = [{
"format": 34896613399, "format": 34896613399,
"index_count": 60, "index_count": 60,
"index_data": PackedByteArray("AAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsA"), "index_data": PackedByteArray("AAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsA"),
"material": ExtResource("2_530fq"), "material": ExtResource("3_eu6j6"),
"name": "Icosphere", "name": "Icosphere",
"primitive": 3, "primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0), "uv_scale": Vector4(0, 0, 0, 0),
@ -41,8 +41,8 @@ data = PackedVector3Array(0.7236, -0.4472, 0.5257, 0, -1, 0, -0.2764, -0.4472, 0
[node name="GrunkNodule" type="StaticBody3D"] [node name="GrunkNodule" type="StaticBody3D"]
collision_layer = 5 collision_layer = 5
script = ExtResource("1_m8r0a") script = ExtResource("1_iyr82")
splatter_scene = ExtResource("2_iyr82") splatter_scene = ExtResource("2_m8r0a")
durability = 3.0 durability = 3.0
metadata/_custom_type_script = "uid://bypgxi0gy56yk" metadata/_custom_type_script = "uid://bypgxi0gy56yk"

Binary file not shown.

View File

@ -1,16 +1,20 @@
@tool
class_name GunkAlarm extends SignalNode class_name GunkAlarm extends SignalNode
## Raises the grunk alert when triggered. ## Raises the grunk alert when triggered.
const ALERT_DELTA := 1 const ALERT_DELTA := 1
const JITTER_SCALE_FACTOR := 0.15
const JITTER_INFLATION_FACTOR := 1.5
## Time to wait for a pulse signal before triggering. ## Time to wait for a pulse signal before triggering.
@export var pulse_timeout := 6.0 @export var pulse_timeout := 6.0
var _busy := false var _busy := false
@onready var mesh_instance_3d: MeshInstance3D = %MeshInstance3D
@onready var animation_player: AnimationPlayer = %AnimationPlayer
@onready var pulse_listener_timer: Timer = %PulseListenerTimer @onready var pulse_listener_timer: Timer = %PulseListenerTimer
@onready var animation_player: AnimationPlayer = $FrameSkipper/AlarmMesh/AnimationPlayer
@onready var bud: MeshInstance3D = $FrameSkipper/AlarmMesh/Armature/Skeleton3D/Bud
## Trigger this alarm. ## Trigger this alarm.
@ -32,12 +36,15 @@ func pulse() -> void:
func _process(delta: float) -> void: func _process(delta: float) -> void:
if Engine.is_editor_hint():
return
super._process(delta) super._process(delta)
# TODO actual model & animation # TODO actual model & animation
var material: StandardMaterial3D = mesh_instance_3d.mesh.surface_get_material(0) var shader: ShaderMaterial = bud.mesh.surface_get_material(0)
var value := 1.0 - pct_damage() var damage := pct_damage()
material.albedo_color = Color(value, value, value) shader.set_shader_parameter("jitter_time_scale", pow(damage * JITTER_SCALE_FACTOR, 1.2))
shader.set_shader_parameter("vertex_inflation", pow(damage * JITTER_INFLATION_FACTOR, 3))
# TODO pulse animation # TODO pulse animation

File diff suppressed because one or more lines are too long

View File

@ -67,6 +67,6 @@ static func find_path(
func _editor_connect(node: SignalNode) -> void: func _editor_connect(node: SignalNode) -> void:
self.connect("triggered", node.trigger, CONNECT_PERSIST) self.triggered.connect(node.trigger, CONNECT_PERSIST)
self.connect("pulsed", node.pulse, CONNECT_PERSIST) self.pulsed.connect(node.trigger, CONNECT_PERSIST)
self.notify_property_list_changed() self.notify_property_list_changed()

View File

@ -111,7 +111,6 @@ _data = {
[node name="GunkRelay" type="StaticBody3D"] [node name="GunkRelay" type="StaticBody3D"]
collision_layer = 5 collision_layer = 5
script = ExtResource("1_rdv5j") script = ExtResource("1_rdv5j")
durability = 0.8
value = 800.0 value = 800.0
[node name="MeshInstance3D" type="MeshInstance3D" parent="."] [node name="MeshInstance3D" type="MeshInstance3D" parent="."]

Some files were not shown because too many files have changed in this diff Show More