bullet feels better, added spike traps
This commit is contained in:
BIN
assets/Models/SPIKES v1.blend
Normal file
BIN
assets/Models/SPIKES v1.blend
Normal file
Binary file not shown.
51
assets/Models/SPIKES v1.blend.import
Normal file
51
assets/Models/SPIKES v1.blend.import
Normal file
@@ -0,0 +1,51 @@
|
||||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://bl5aj1buejws7"
|
||||
path="res://.godot/imported/SPIKES v1.blend-165c61adade1d508c27426515383d32b.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/Models/SPIKES v1.blend"
|
||||
dest_files=["res://.godot/imported/SPIKES v1.blend-165c61adade1d508c27426515383d32b.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
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={}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
BIN
assets/Models/SPIKES v1.blend1
Normal file
BIN
assets/Models/SPIKES v1.blend1
Normal file
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=84 format=4 uid="uid://6agmt1hqlhww"]
|
||||
[gd_scene load_steps=89 format=4 uid="uid://6agmt1hqlhww"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/LevelManager.gd" id="1_sbpvn"]
|
||||
[ext_resource type="PackedScene" uid="uid://brl0bsqjl5dg3" path="res://assets/mac_10.tscn" id="2_fn4vb"]
|
||||
@@ -22,6 +22,7 @@
|
||||
[ext_resource type="PackedScene" uid="uid://c6bpysq1tjhy4" path="res://vendingmahcine.tscn" id="10_8qgs0"]
|
||||
[ext_resource type="PackedScene" uid="uid://clu76sc4uoswn" path="res://assets/rocketlauncher_pickup.tscn" id="11_6de2k"]
|
||||
[ext_resource type="PackedScene" uid="uid://cnfc8rtk6l1d8" path="res://assets/crate1.tscn" id="12_30nle"]
|
||||
[ext_resource type="PackedScene" uid="uid://dt4t2a48204v1" path="res://assets/spikes_1.tscn" id="12_w4dk0"]
|
||||
[ext_resource type="PackedScene" uid="uid://cgo4qyul7ix5p" path="res://assets/ladder.tscn" id="13_qu8oi"]
|
||||
[ext_resource type="PackedScene" uid="uid://cdpxctwwi12j" path="res://assets/ladder_collision_check.tscn" id="14_gijx0"]
|
||||
[ext_resource type="PackedScene" uid="uid://b3t8fra7evqfb" path="res://assets/Models/building_1.tscn" id="15_ds1t8"]
|
||||
@@ -45,6 +46,7 @@ ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
|
||||
sky_material = SubResource("ProceduralSkyMaterial_eiud5")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_b2qms"]
|
||||
background_mode = 1
|
||||
sky = SubResource("Sky_vk48o")
|
||||
tonemap_mode = 2
|
||||
ssr_enabled = true
|
||||
@@ -747,6 +749,73 @@ _data = {
|
||||
"movingswitch": SubResource("Animation_xdrt1")
|
||||
}
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gcdr3"]
|
||||
albedo_color = Color(0.336608, 0.336608, 0.336608, 1)
|
||||
metallic = 1.0
|
||||
roughness = 0.35
|
||||
|
||||
[sub_resource type="Animation" id="Animation_m0b4w"]
|
||||
resource_name = "HallSpikes"
|
||||
length = 1.5
|
||||
loop_mode = 1
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("../../Hallway1/Spikes 1:position")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.6, 1.5),
|
||||
"transitions": PackedFloat32Array(1, 1, 1),
|
||||
"update": 0,
|
||||
"values": [Vector3(42.1175, 19.0112, 71.9478), Vector3(31.7096, 19.0112, 71.9478), Vector3(42.1175, 19.0112, 71.9478)]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("../../Hallway1/Spikes 2:position")
|
||||
tracks/1/interp = 2
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0, 0.6, 1.5),
|
||||
"transitions": PackedFloat32Array(1, 1, 1),
|
||||
"update": 0,
|
||||
"values": [Vector3(13.7458, 19.0112, 71.9478), Vector3(26.6885, 19.0112, 71.9478), Vector3(13.7458, 19.0112, 71.9478)]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_3oaw1"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("../../Hallway1/Spikes 1:position")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(42.1175, 19.0112, 71.9478)]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("../../Hallway1/Spikes 2:position")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(13.7458, 19.0112, 71.9478)]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_c4l4t"]
|
||||
_data = {
|
||||
"HallSpikes": SubResource("Animation_m0b4w"),
|
||||
"RESET": SubResource("Animation_3oaw1")
|
||||
}
|
||||
|
||||
[node name="BLOCKOUT2Test" type="Node3D" node_paths=PackedStringArray("player")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.016016, 0.0225029, -0.0192337)
|
||||
script = ExtResource("1_sbpvn")
|
||||
@@ -906,6 +975,9 @@ skeleton = NodePath("")
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="NavigationRegion3D/blockout2/Thing/StaticBody3D"]
|
||||
shape = SubResource("ConcavePolygonShape3D_eyfj3")
|
||||
|
||||
[node name="Spikes 1" parent="NavigationRegion3D" instance=ExtResource("12_w4dk0")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -27.1833, -5.75175, 34.3513)
|
||||
|
||||
[node name="EnemyHivemind" parent="." instance=ExtResource("7_nut1a")]
|
||||
|
||||
[node name="spider" parent="EnemyHivemind" instance=ExtResource("8_h7fp0")]
|
||||
@@ -1744,7 +1816,53 @@ libraries = {
|
||||
}
|
||||
autoplay = "movingswitch"
|
||||
|
||||
[node name="switch2" type="MeshInstance3D" parent="Switch 1" groups=["interact", "switch", "switch_override"]]
|
||||
transform = Transform3D(1.655, 0, 0, 0, 1.655, 0, 0, 0, 1.655, -11.1755, 28.5571, 15.622)
|
||||
mesh = SubResource("SphereMesh_wh8x7")
|
||||
skeleton = NodePath("../..")
|
||||
script = ExtResource("35_ybetb")
|
||||
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="Switch 1/switch2" groups=["interact", "switch"]]
|
||||
collision_layer = 3
|
||||
script = ExtResource("36_fuepo")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Switch 1/switch2/StaticBody3D"]
|
||||
shape = SubResource("SphereShape3D_w8su1")
|
||||
|
||||
[node name="rocketlauncher1_pickup2" parent="." instance=ExtResource("11_6de2k")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.7453, -2.8486, 37.7796)
|
||||
|
||||
[node name="Hallway1" type="Node" parent="."]
|
||||
|
||||
[node name="Spikes 1" parent="Hallway1" instance=ExtResource("12_w4dk0")]
|
||||
transform = Transform3D(-1.09278e-07, -2.5, 0, 2.5, -1.09278e-07, 0, 0, 0, 2.5, 42.1175, 19.0112, 71.9478)
|
||||
pushback = 20.0
|
||||
|
||||
[node name="CSGBox3D" type="CSGBox3D" parent="Hallway1/Spikes 1"]
|
||||
transform = Transform3D(-1.74846e-08, 0.4, 0, -0.4, -1.74846e-08, 0, 0, 0, 0.4, 0.00845242, -5.03143, -0.0302448)
|
||||
use_collision = true
|
||||
size = Vector3(25.8188, 3.86572, 3.14655)
|
||||
material = SubResource("StandardMaterial3D_gcdr3")
|
||||
|
||||
[node name="Spikes 2" parent="Hallway1" instance=ExtResource("12_w4dk0")]
|
||||
transform = Transform3D(1.09278e-07, 2.5, -2.18557e-07, 2.5, -1.09278e-07, 0, -9.55343e-15, -2.18557e-07, -2.5, 13.7458, 19.0112, 71.9478)
|
||||
pushback = 20.0
|
||||
|
||||
[node name="CSGBox3D2" type="CSGBox3D" parent="Hallway1/Spikes 2"]
|
||||
transform = Transform3D(1.74846e-08, 0.4, -1.52855e-15, 0.4, -1.74846e-08, -3.49691e-08, -3.49691e-08, 3.78932e-21, -0.4, 0.00845337, -3.6799, 0.0302448)
|
||||
use_collision = true
|
||||
size = Vector3(17.7919, 3.86572, 3.14655)
|
||||
material = SubResource("StandardMaterial3D_gcdr3")
|
||||
|
||||
[node name="Spikes 3" parent="Hallway1/Spikes 2" instance=ExtResource("12_w4dk0")]
|
||||
transform = Transform3D(-1, 8.74228e-08, 1.27055e-21, -8.74228e-08, -1, -7.10543e-15, 1.69407e-21, -7.10543e-15, 1, -4.76837e-07, -7.29667, 0)
|
||||
|
||||
[node name="HallSpikes1" type="AnimationPlayer" parent="Hallway1"]
|
||||
root_node = NodePath("../../Plants_pt19/Plant1_base")
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_c4l4t")
|
||||
}
|
||||
autoplay = "HallSpikes"
|
||||
|
||||
[connection signal="switch_hit" from="Switch 1/switch/StaticBody3D" to="Switch 1/switch" method="_on_static_body_3d_switch_hit"]
|
||||
[connection signal="switch_hit" from="Switch 1/switch2/StaticBody3D" to="Switch 1/switch2" method="_on_static_body_3d_switch_hit"]
|
||||
|
||||
@@ -133,7 +133,7 @@ transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0,
|
||||
shape = SubResource("CylinderShape3D_tqvit")
|
||||
|
||||
[node name="RayCast3D" type="RayCast3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.47877)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.781848)
|
||||
target_position = Vector3(0, 0, -3)
|
||||
collision_mask = 105
|
||||
collide_with_areas = true
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -5,6 +5,7 @@
|
||||
|
||||
[node name="enemyTaunt" type="Label3D" groups=["spawned"]]
|
||||
billboard = 2
|
||||
no_depth_test = true
|
||||
text = "1
|
||||
"
|
||||
font = ExtResource("1_vuoli")
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
[gd_scene load_steps=24 format=4 uid="uid://brl0bsqjl5dg3"]
|
||||
[gd_scene load_steps=25 format=4 uid="uid://brl0bsqjl5dg3"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://c33b6ldlxxfro" path="res://assets/Models/mac10.blend" id="1_nb4p5"]
|
||||
[ext_resource type="Script" path="res://scripts/gun.gd" id="2_6i1l4"]
|
||||
[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_pyl20"]
|
||||
[ext_resource type="Script" path="res://scripts/gun.gd" id="2_tskiy"]
|
||||
[ext_resource type="PackedScene" uid="uid://nq5nq2hjc4ec" path="res://assets/bullet_fake.tscn" id="3_heo3y"]
|
||||
[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_xr8co"]
|
||||
[ext_resource type="PackedScene" uid="uid://crvohhc6kgshn" path="res://assets/bullet_hole.tscn" id="4_eleuq"]
|
||||
[ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="4_ji2hu"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="4_kpr3h"]
|
||||
@@ -401,17 +402,14 @@ _data = {
|
||||
}
|
||||
|
||||
[node name="mac10" node_paths=PackedStringArray("flare_light", "anim_player", "barrel_raycast", "casing_ejector", "mag_ejector", "audio_fire", "audio_empty", "audio_reload") instance=ExtResource("1_nb4p5")]
|
||||
script = ExtResource("2_6i1l4")
|
||||
script = ExtResource("2_tskiy")
|
||||
gun_name = "Mac 10"
|
||||
max_ammo = 30
|
||||
start_mags = 300
|
||||
max_ammo = 20
|
||||
bullet_damage = 2
|
||||
bullet_speed = 300
|
||||
bullet_drop = 0.01
|
||||
random_spread_amt = 0.5
|
||||
fire_pitch_scale_amt = 0.05
|
||||
flare_light = NodePath("mac10/SpotLight3D")
|
||||
bullet = ExtResource("3_pyl20")
|
||||
bullet_speed = 1500
|
||||
flare_light = NodePath("mac10/flare")
|
||||
bullet = ExtResource("3_xr8co")
|
||||
bullet_fake = ExtResource("3_heo3y")
|
||||
bullethole = ExtResource("4_eleuq")
|
||||
casing = ExtResource("4_kpr3h")
|
||||
mag = ExtResource("4_ji2hu")
|
||||
|
||||
8
assets/materials/OutlineMat.tres
Normal file
8
assets/materials/OutlineMat.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="ORMMaterial3D" format=3 uid="uid://cc0el8wu0au85"]
|
||||
|
||||
[resource]
|
||||
transparency = 1
|
||||
albedo_color = Color(1, 0, 0, 1)
|
||||
emission_enabled = true
|
||||
emission = Color(1, 0, 0, 1)
|
||||
emission_energy_multiplier = 2.0
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=25 format=3 uid="uid://drwae3loscbw7"]
|
||||
[gd_scene load_steps=26 format=3 uid="uid://drwae3loscbw7"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/player.gd" id="1_x7wms"]
|
||||
[ext_resource type="Script" path="res://scripts/recoil.gd" id="3_405jc"]
|
||||
@@ -9,6 +9,7 @@
|
||||
[ext_resource type="Script" path="res://scripts/StaminaCounter.gd" id="6_bgi8o"]
|
||||
[ext_resource type="Script" path="res://scripts/UIScreenAdjust.gd" id="7_pnp4a"]
|
||||
[ext_resource type="AudioStream" uid="uid://bki17g7j4kqn4" path="res://assets/Audio/PickupSound Mixdown 3.wav" id="8_dwqsx"]
|
||||
[ext_resource type="Script" path="res://scripts/bullet_ray.gd" id="10_ektr6"]
|
||||
[ext_resource type="AudioStream" uid="uid://dyd272r7n2ecd" path="res://assets/Audio/footsteps-shoes-jump-land-beach-sand-SBA-300118001.wav" id="10_tn0pn"]
|
||||
[ext_resource type="AudioStream" uid="uid://bl8yg1d3bsxs3" path="res://assets/Audio/constant-natural-strong-wind-looping-SBA-300062687.wav" id="11_he7p5"]
|
||||
[ext_resource type="AudioStream" uid="uid://cy150nsjqp7lt" path="res://assets/Audio/grunt-male-SBA-300282985.wav" id="12_f51u4"]
|
||||
@@ -110,6 +111,8 @@ light_color = Color(1, 1, 0.898039, 1)
|
||||
light_energy = 0.0
|
||||
light_projector = ExtResource("4_x670l")
|
||||
shadow_enabled = true
|
||||
distance_fade_enabled = true
|
||||
distance_fade_begin = 5.0
|
||||
spot_range = 30.0
|
||||
|
||||
[node name="FlashlightButton" type="AudioStreamPlayer3D" parent="Head/Recoil/Camera3D/WeaponHolder"]
|
||||
@@ -166,8 +169,9 @@ script = ExtResource("7_pnp4a")
|
||||
[node name="BulletRay" type="RayCast3D" parent="Head/Recoil/Camera3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.487738)
|
||||
target_position = Vector3(0, 0, -200)
|
||||
collision_mask = 5
|
||||
collision_mask = 105
|
||||
collide_with_areas = true
|
||||
script = ExtResource("10_ektr6")
|
||||
|
||||
[node name="InteractRay" type="RayCast3D" parent="Head/Recoil/Camera3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00322104, -0.0232438)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=69 format=4 uid="uid://b5eclfg0cmmal"]
|
||||
[gd_scene load_steps=67 format=4 uid="uid://b5eclfg0cmmal"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dgogd08c0ubt6" path="res://assets/Models/revolver1.blend" id="1_i5f84"]
|
||||
[ext_resource type="Script" path="res://scripts/revolver_1.gd" id="2_7rsti"]
|
||||
@@ -8,7 +8,7 @@
|
||||
[ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="5_m3vsl"]
|
||||
[ext_resource type="Texture2D" uid="uid://dit5pj07jr02y" path="res://assets/Models/revolver1.albedo.png" id="6_acf6f"]
|
||||
[ext_resource type="AudioStream" uid="uid://dywuxr61pit5t" path="res://assets/Audio/Weapons/38 SPL Revolver/Gunshots/38 SPL Revolver - Gunshot B 001.wav" id="7_ve411"]
|
||||
[ext_resource type="Texture2D" uid="uid://blcxok1w8f4xu" path="res://assets/Models/revolver1.roughness.png" id="7_w8q3k"]
|
||||
[ext_resource type="Texture2D" uid="uid://b36a5av7x827o" path="res://assets/Models/revolver1.roughness.png" id="7_w8q3k"]
|
||||
[ext_resource type="Texture2D" uid="uid://l6vsalcx12qr" path="res://assets/Models/textures/revolver1.normal.png" id="8_72uoo"]
|
||||
[ext_resource type="Texture2D" uid="uid://bvsqe82hirgbj" path="res://assets/Models/revolver1.wood.png" id="9_5hgip"]
|
||||
[ext_resource type="AudioStream" uid="uid://2rhacxv8tm6j" path="res://assets/Audio/Weapons/38 SPL Revolver/Foley/38 SPL Revolver - Unloading 001.wav" id="9_ob87h"]
|
||||
@@ -741,13 +741,6 @@ _surfaces = [{
|
||||
blend_shape_mode = 0
|
||||
shadow_mesh = SubResource("ArrayMesh_0sgiw")
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r3lw3"]
|
||||
albedo_color = Color(0.859131, 0.597594, 0.456011, 1)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_7fcc1"]
|
||||
material = SubResource("StandardMaterial3D_r3lw3")
|
||||
size = Vector3(0.1, 0.1, 1)
|
||||
|
||||
[sub_resource type="Animation" id="Animation_8akx8"]
|
||||
resource_name = "empty"
|
||||
length = 0.3
|
||||
@@ -1212,12 +1205,6 @@ spot_range = 7.0
|
||||
spot_angle = 70.0
|
||||
spot_angle_attenuation = 0.353554
|
||||
|
||||
[node name="armStandin" type="MeshInstance3D" parent="revolver1" index="6"]
|
||||
transform = Transform3D(2.01151e-05, -5.55667, -1.75852e-12, -5.55667, -2.01151e-05, 4.85779e-07, -4.85779e-07, 0, -5.55667, 0.502168, 0.0410088, 2.79972)
|
||||
visible = false
|
||||
mesh = SubResource("BoxMesh_7fcc1")
|
||||
skeleton = NodePath("../../../../../../../..")
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="1"]
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_2kb78")
|
||||
|
||||
File diff suppressed because one or more lines are too long
95
assets/spikes_1.tscn
Normal file
95
assets/spikes_1.tscn
Normal file
File diff suppressed because one or more lines are too long
@@ -22,7 +22,7 @@ var bullet_active = true
|
||||
func _ready():
|
||||
|
||||
visible = false
|
||||
linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed)
|
||||
linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _physics_process(delta):
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
extends Node3D
|
||||
|
||||
const recoil_amount : Vector3 = Vector3(.5,.1,.1)
|
||||
|
||||
var bullet_speed
|
||||
var bullet_drop
|
||||
var random_spread_amt
|
||||
@@ -43,17 +41,8 @@ func _process(delta):
|
||||
|
||||
if ray.is_colliding() and ray.get_collider() != null:
|
||||
if ray.get_collider().is_in_group("player"):
|
||||
var player = ray.get_collider()
|
||||
var snap_amount = 10
|
||||
var speed_amount = 10
|
||||
player.level_control.health -= bullet_damage
|
||||
player.recoil.add_recoil(recoil_amount,snap_amount,speed_amount)
|
||||
|
||||
if player.level_control.health <= bullet_damage:
|
||||
player.level_control.last_hit = fired_by
|
||||
player.hurt_audio.play()
|
||||
else:
|
||||
queue_free()
|
||||
ray.get_collider().hit(bullet_damage,fired_by)
|
||||
queue_free()
|
||||
|
||||
if ray.is_colliding() and ray.get_collider() != null:
|
||||
|
||||
|
||||
41
scripts/bullet_fake.gd
Normal file
41
scripts/bullet_fake.gd
Normal file
@@ -0,0 +1,41 @@
|
||||
extends Node3D
|
||||
|
||||
var bullet_speed
|
||||
var bullet_drop
|
||||
var random_spread_amt
|
||||
var bullet_damage
|
||||
var instance_bullethole
|
||||
var bullet_force_mod = 1.0
|
||||
var distance_from_player
|
||||
var player_position
|
||||
var player_velocity
|
||||
var bullet_active = true
|
||||
|
||||
@onready var mesh = $gunbullet1/Cylinder
|
||||
@onready var particles = $GPUParticles3D
|
||||
@onready var enemy_particles = $GPUParticlesEnemy
|
||||
@onready var hit_indicator = $Audio/HitIndicator
|
||||
@onready var ray: RayCast3D = $RayCast3D
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
|
||||
visible = false
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _physics_process(delta):
|
||||
|
||||
position += transform.basis * Vector3(0, 0, -bullet_speed) * delta
|
||||
distance_from_player = abs(self.global_position - player_position)
|
||||
|
||||
if distance_from_player.length() > 1.5:
|
||||
visible = true
|
||||
|
||||
if ray.is_colliding() and !ray.get_collider().is_in_group("player"):
|
||||
|
||||
mesh.visible = false
|
||||
ray.enabled = false
|
||||
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
queue_free()
|
||||
42
scripts/bullet_ray.gd
Normal file
42
scripts/bullet_ray.gd
Normal file
@@ -0,0 +1,42 @@
|
||||
extends RayCast3D
|
||||
|
||||
@onready var hit_indicator: AudioStreamPlayer = $"../../../../Audio/HitIndicator"
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
|
||||
func hitscan_fire(bullet_damage,bullet_force_mod,bullethole):
|
||||
|
||||
if is_colliding():
|
||||
|
||||
#bullethole effect
|
||||
var instance_bullethole = bullethole.instantiate()
|
||||
get_collider().add_child(instance_bullethole)
|
||||
instance_bullethole.global_transform.origin = get_collision_point()
|
||||
if (abs(get_collision_normal().y) > 0.99):
|
||||
instance_bullethole.look_at(get_collision_point() + get_collision_normal(), Vector3(0,0,1))
|
||||
else:
|
||||
instance_bullethole.look_at(get_collision_point() + get_collision_normal())
|
||||
|
||||
#move rigidbodies
|
||||
if get_collider().is_in_group("scene_rigidbody"):
|
||||
get_collider().linear_velocity += rotation * Vector3(0,0,-bullet_force_mod)
|
||||
|
||||
if get_collider().is_in_group("breakable"):
|
||||
get_collider().breaking( Vector3(0,0,-bullet_force_mod))
|
||||
|
||||
|
||||
if get_collider().is_in_group("enemy_target"):
|
||||
emit_signal("enemy_hit")
|
||||
get_collider().hit(bullet_damage)
|
||||
|
||||
if get_collider().is_in_group("switch"):
|
||||
get_collider().hit()
|
||||
|
||||
@@ -107,7 +107,6 @@ func _process(delta):
|
||||
|
||||
func _on_timer_timeout():
|
||||
anim_step += 1
|
||||
print("ANIM STEP " +str(anim_step))
|
||||
|
||||
func reload_level():
|
||||
get_tree().reload_current_scene()
|
||||
|
||||
@@ -4,6 +4,7 @@ extends Node3D
|
||||
@export_group("Gun Feel")
|
||||
@export var gun_name : String
|
||||
@export_enum("Auto", "Single", "Burst") var fire_mode: int
|
||||
@export var hitscan_enabled : bool = false
|
||||
@export var fov_zoom_amt = .98
|
||||
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
|
||||
@export var max_ammo = 15
|
||||
@@ -18,6 +19,7 @@ extends Node3D
|
||||
@export_subgroup("Main Assets")
|
||||
@export var flare_light : Node
|
||||
@export var bullet : Resource
|
||||
@export var bullet_fake : Resource
|
||||
@export var bullethole : Resource
|
||||
@export var casing : Resource
|
||||
@export var mag : Resource
|
||||
@@ -83,34 +85,15 @@ func shoot(delta):
|
||||
if level_control.ammo_current[gun_index] > 0 and cycle_count > 0:
|
||||
if !anim_player.is_playing():
|
||||
level_control.ammo_current[gun_index] -= 1
|
||||
#RECOIL --- fix later to happen over a period of time
|
||||
#(ADD PLAYER KICK HERE. RELATIVE TO GUN POSITION)
|
||||
#audio and anims
|
||||
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
|
||||
audio_fire.play()
|
||||
anim_player.play("shoot")
|
||||
# instance bullet
|
||||
var instance_bullet = bullet.instantiate()
|
||||
instance_bullet.position = player.bullet_ray.global_position
|
||||
#shoot bullet from real gun if gun is folded up
|
||||
if player.gun_folded == false:
|
||||
instance_bullet.transform.basis = player.bullet_ray.global_transform.basis
|
||||
else:
|
||||
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
|
||||
instance_bullet.bullet_speed = bullet_speed
|
||||
instance_bullet.player_velocity = player.velocity
|
||||
instance_bullet.bullet_drop = bullet_drop
|
||||
instance_bullet.random_spread_amt = random_spread_amt
|
||||
instance_bullet.bullet_damage = bullet_damage
|
||||
instance_bullet.bullet_force_mod = bullet_force_mod
|
||||
instance_bullet.instance_bullethole = bullethole.instantiate()
|
||||
instance_bullet.player_position = player.global_position
|
||||
get_tree().current_scene.add_child(instance_bullet)
|
||||
|
||||
# Casing transform
|
||||
var instance_casing = casing.instantiate()
|
||||
instance_casing.position = casing_ejector.global_position
|
||||
instance_casing.transform.basis = casing_ejector.global_transform.basis
|
||||
get_tree().get_root().add_child(instance_casing)
|
||||
bullet_fire()
|
||||
hitscan_fire()
|
||||
spawn_casing()
|
||||
|
||||
player.recoil.add_recoil(recoil_amount,10,10)
|
||||
if fire_mode != 0:
|
||||
cycle_count -= 1
|
||||
@@ -136,5 +119,42 @@ func spawn_mag():
|
||||
instance_mag.transform.basis = mag_ejector.global_transform.basis
|
||||
get_tree().get_root().add_child(instance_mag)
|
||||
|
||||
func spawn_casing():
|
||||
# Casing transform
|
||||
var instance_casing = casing.instantiate()
|
||||
instance_casing.position = casing_ejector.global_position
|
||||
instance_casing.transform.basis = casing_ejector.global_transform.basis
|
||||
get_tree().get_root().add_child(instance_casing)
|
||||
|
||||
func bullet_fire():
|
||||
var instance_bullet
|
||||
if hitscan_enabled:
|
||||
instance_bullet = bullet_fake.instantiate()
|
||||
else:
|
||||
instance_bullet = bullet.instantiate()
|
||||
instance_bullet.position = player.bullet_ray.global_position
|
||||
#shoot bullet from real gun if gun is folded up
|
||||
if player.gun_folded == false:
|
||||
instance_bullet.transform.basis = player.bullet_ray.global_transform.basis
|
||||
else:
|
||||
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
|
||||
instance_bullet.bullet_speed = bullet_speed
|
||||
instance_bullet.player_velocity = player.velocity * transform.basis
|
||||
instance_bullet.bullet_drop = bullet_drop
|
||||
instance_bullet.random_spread_amt = random_spread_amt
|
||||
instance_bullet.bullet_damage = bullet_damage
|
||||
instance_bullet.bullet_force_mod = bullet_force_mod
|
||||
instance_bullet.instance_bullethole = bullethole.instantiate()
|
||||
instance_bullet.player_position = player.global_position
|
||||
get_tree().current_scene.add_child(instance_bullet)
|
||||
|
||||
func hitscan_fire():
|
||||
if hitscan_enabled:
|
||||
# Fire hitscan
|
||||
if player.gun_folded == false:
|
||||
player.bullet_ray.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
|
||||
else:
|
||||
barrel_raycast.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
|
||||
|
||||
func swapped_out():
|
||||
queue_free()
|
||||
|
||||
153
scripts/gun_hitscan.gd
Normal file
153
scripts/gun_hitscan.gd
Normal file
@@ -0,0 +1,153 @@
|
||||
extends Node3D
|
||||
|
||||
|
||||
@export_group("Gun Feel")
|
||||
@export var gun_name : String
|
||||
@export_enum("Auto", "Single", "Burst") var fire_mode: int
|
||||
@export var fov_zoom_amt = .98
|
||||
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
|
||||
@export var max_ammo = 15
|
||||
@export var start_mags = 3
|
||||
@export var bullet_damage = 1
|
||||
@export var bullet_force_mod = 5.0
|
||||
@export var bullet_speed = 150
|
||||
@export var bullet_drop = .3
|
||||
@export var random_spread_amt = 1.0
|
||||
@export var fire_pitch_scale_amt = .2
|
||||
@export_group("Gun Assets")
|
||||
@export_subgroup("Main Assets")
|
||||
@export var flare_light : Node
|
||||
@export var bullet : Resource
|
||||
@export var bullethole : Resource
|
||||
@export var casing : Resource
|
||||
@export var mag : Resource
|
||||
@export_subgroup("Raycast Nodes")
|
||||
@export var anim_player : Node
|
||||
@export var barrel_raycast : Node
|
||||
@export var casing_ejector : Node
|
||||
@export var mag_ejector : Node
|
||||
@export_subgroup("Audio Clips")
|
||||
@export var audio_fire : Node
|
||||
@export var audio_empty : Node
|
||||
@export var audio_reload : Node
|
||||
|
||||
@onready var player = get_tree().current_scene.player
|
||||
@onready var level_control = get_tree().current_scene
|
||||
@onready var ammo_current
|
||||
|
||||
var start_position
|
||||
var start_rotation
|
||||
var random_spread_start
|
||||
var cycle_count_start
|
||||
var cycle_count
|
||||
var rng = RandomNumberGenerator.new()
|
||||
var gun_index
|
||||
#var ammo_current
|
||||
var ammo_reserve
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
random_spread_start = random_spread_amt
|
||||
|
||||
ammo_current = level_control.ammo_current[gun_index]
|
||||
ammo_reserve = level_control.ammo_reserve[gun_index]
|
||||
|
||||
|
||||
if fire_mode == 0:
|
||||
cycle_count = 1
|
||||
cycle_count_start = 1
|
||||
elif fire_mode == 1:
|
||||
cycle_count = 1
|
||||
cycle_count_start = 1
|
||||
elif fire_mode == 2:
|
||||
cycle_count = 3
|
||||
cycle_count_start = 3
|
||||
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(_delta):
|
||||
pass
|
||||
|
||||
|
||||
func reload_finished():
|
||||
if level_control.ammo_reserve[gun_index] >= max_ammo:
|
||||
level_control.ammo_current[gun_index] += max_ammo
|
||||
level_control.ammo_reserve[gun_index] -= max_ammo
|
||||
else:
|
||||
level_control.ammo_current[gun_index] += level_control.ammo_reserve[gun_index]
|
||||
level_control.ammo_reserve[gun_index] -= level_control.ammo_reserve[gun_index]
|
||||
|
||||
func shoot(delta):
|
||||
|
||||
if level_control.ammo_current[gun_index] > 0 and cycle_count > 0:
|
||||
if !anim_player.is_playing():
|
||||
#Audio and Animations
|
||||
level_control.ammo_current[gun_index] -= 1
|
||||
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
|
||||
audio_fire.play()
|
||||
anim_player.play("shoot")
|
||||
|
||||
# instance fake bullet
|
||||
bullet_fire()
|
||||
|
||||
# Fire hitscan
|
||||
if player.gun_folded == false:
|
||||
player.bullet_ray.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
|
||||
else:
|
||||
barrel_raycast.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
|
||||
|
||||
spawn_casing()
|
||||
|
||||
if fire_mode != 0:
|
||||
cycle_count -= 1
|
||||
|
||||
elif !anim_player.is_playing() and cycle_count != 0:
|
||||
anim_player.play("empty")
|
||||
audio_empty.play()
|
||||
|
||||
func reload(delta):
|
||||
if level_control.ammo_current[gun_index] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and level_control.ammo_reserve[gun_index] > 0:
|
||||
#player.reloading = true
|
||||
anim_player.play("reload")
|
||||
audio_reload.play()
|
||||
if anim_player.is_playing() and anim_player.current_animation == "reload":
|
||||
if level_control.ammo_current[gun_index] == 0:
|
||||
level_control.ammo_current[gun_index] = 0
|
||||
else:
|
||||
level_control.ammo_current[gun_index] = 1
|
||||
|
||||
func spawn_mag():
|
||||
var instance_mag = mag.instantiate()
|
||||
instance_mag.position = mag_ejector.global_position
|
||||
instance_mag.transform.basis = mag_ejector.global_transform.basis
|
||||
get_tree().get_root().add_child(instance_mag)
|
||||
|
||||
func swapped_out():
|
||||
queue_free()
|
||||
|
||||
func bullet_fire():
|
||||
var instance_bullet = bullet.instantiate()
|
||||
instance_bullet.position = player.bullet_ray.global_position
|
||||
instance_bullet.bullet_speed = bullet_speed
|
||||
instance_bullet.player_velocity = player.velocity
|
||||
instance_bullet.bullet_drop = bullet_drop
|
||||
instance_bullet.random_spread_amt = random_spread_amt
|
||||
instance_bullet.bullet_damage = bullet_damage
|
||||
instance_bullet.bullet_force_mod = bullet_force_mod
|
||||
instance_bullet.instance_bullethole = bullethole.instantiate()
|
||||
instance_bullet.player_position = player.global_position
|
||||
#shoot bullet from real gun if gun is folded up
|
||||
if player.gun_folded == false:
|
||||
instance_bullet.transform.basis = player.bullet_ray.global_transform.basis
|
||||
else:
|
||||
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
|
||||
get_tree().current_scene.add_child(instance_bullet)
|
||||
|
||||
func spawn_casing():
|
||||
# Casing transform
|
||||
var instance_casing = casing.instantiate()
|
||||
instance_casing.position = casing_ejector.global_position
|
||||
instance_casing.transform.basis = casing_ejector.global_transform.basis
|
||||
get_tree().get_root().add_child(instance_casing)
|
||||
player.recoil.add_recoil(recoil_amount,10,10)
|
||||
@@ -465,3 +465,9 @@ func release_moveable():
|
||||
held_item.mass = held_item_mass_cache
|
||||
held_item.set_constant_force(Vector3(0,0,0))
|
||||
held_item = null
|
||||
|
||||
func hit(damage,fired_by):
|
||||
level_control.health -= damage
|
||||
level_control.last_hit = fired_by
|
||||
recoil.add_recoil(Vector3(.5,.1,.1),10,10)
|
||||
hurt_audio.play()
|
||||
|
||||
@@ -154,7 +154,7 @@ func fire(delta):
|
||||
instance_bullet.random_spread_amt = random_spread_amt
|
||||
instance_bullet.bullet_force_mod = bullet_force_mod
|
||||
instance_bullet.player_position = player.global_position
|
||||
instance_bullet.player_velocity = player.velocity
|
||||
instance_bullet.player_velocity = (player.velocity * player.transform.basis)
|
||||
instance_bullet.instance_bullethole = bullethole.instantiate()
|
||||
get_tree().get_root().add_child(instance_bullet)
|
||||
player.recoil.add_recoil(recoil_amount,10,recoil_speed_change)
|
||||
|
||||
21
scripts/spikes_1.gd
Normal file
21
scripts/spikes_1.gd
Normal file
@@ -0,0 +1,21 @@
|
||||
extends Node3D
|
||||
|
||||
@export var damage : float = 1
|
||||
@export var pushback : float = 5
|
||||
@onready var outline_meshes = [$Spikes1/MeshInstance3D]
|
||||
|
||||
@onready var ray_cast: RayCast3D = $RayCast3D
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
|
||||
func _on_area_3d_body_entered(body: Node3D) -> void:
|
||||
if body.is_in_group("player"):
|
||||
body.hit(damage,self)
|
||||
body.velocity = ray_cast.global_transform.basis * Vector3(0,0,-pushback)
|
||||
Reference in New Issue
Block a user