Initial commit

pull/1/head
Kenney 2023-09-25 19:51:51 +07:00
commit 6956b02bcf
98 changed files with 1915 additions and 0 deletions

2
.gitattributes vendored

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

18
.gitignore vendored

@ -0,0 +1,18 @@
# Godot 4+ specific ignores
.godot/
# Godot-specific ignores
.import/
export.cfg
export_presets.cfg
# Imported translations (automatically generated from CSV files)
*.translation
# Mono-specific ignores
.mono/
data_*/
mono_crash.*.json
# Kenney ignores
build/

@ -0,0 +1,2 @@
# Starter-Kit-FPS

@ -0,0 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://b411hfkru5vs7"]
[ext_resource type="PackedScene" uid="uid://b2p7bbkuxf7m" path="res://models/blaster.glb" id="1_yqvvx"]
[node name="blaster" instance=ExtResource("1_yqvvx")]
[node name="blaster2" parent="." index="0"]
layers = 2

@ -0,0 +1,47 @@
[gd_scene load_steps=6 format=3 uid="uid://d2g78tpqbyf5g"]
[ext_resource type="PackedScene" uid="uid://lde2xq3vq635" path="res://models/enemy-flying.glb" id="1_3v8nl"]
[ext_resource type="Script" path="res://scripts/enemy.gd" id="1_jg24b"]
[ext_resource type="SpriteFrames" uid="uid://dbv3sy5qjatnl" path="res://sprites/burst_animation.tres" id="3_iblw5"]
[ext_resource type="Texture2D" uid="uid://diluv5007my5w" path="res://sprites/tracer.png" id="4_pknwg"]
[sub_resource type="SphereShape3D" id="SphereShape3D_iix87"]
radius = 0.75
[node name="enemy-flying" type="Area3D"]
script = ExtResource("1_jg24b")
[node name="enemy-flying" parent="." instance=ExtResource("1_3v8nl")]
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0)
shape = SubResource("SphereShape3D_iix87")
[node name="RayCast" type="RayCast3D" parent="."]
target_position = Vector3(0, 0, 5)
[node name="BurstA" type="AnimatedSprite3D" parent="."]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -0.45, 0.3, 0.4)
sprite_frames = ExtResource("3_iblw5")
frame = 2
[node name="BurstB" type="AnimatedSprite3D" parent="."]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0.45, 0.3, 0.4)
sprite_frames = ExtResource("3_iblw5")
frame = 2
[node name="Timer" type="Timer" parent="."]
wait_time = 0.25
autostart = true
[node name="Sprite3D" type="Sprite3D" parent="."]
transform = Transform3D(-4.37114e-08, -0.5, 4.37114e-08, 0, -2.18557e-08, -1, 1, -2.18557e-08, 1.91069e-15, -0.458562, 0.296903, 2.63393)
visible = false
texture = ExtResource("4_pknwg")
[node name="Sprite3D2" type="Sprite3D" parent="."]
transform = Transform3D(-4.37114e-08, -0.5, 4.37114e-08, 0, -2.18557e-08, -1, 1, -2.18557e-08, 1.91069e-15, 0.452015, 0.296903, 2.63393)
visible = false
texture = ExtResource("4_pknwg")
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]

@ -0,0 +1,270 @@
extends CharacterBody3D
@export_subgroup("Properties")
@export var movement_speed = 250
@export var jump_strength = 7
@export_subgroup("Weapons")
@export var weapons: Array[Weapon] = []
var weapon: Weapon
var weapon_index := 0
var mouse_sensitivity = 700
var mouse_captured := true
var movement_velocity: Vector3
var rotation_target: Vector3
var input: Vector3
var input_mouse: Vector2
var gravity := 0.0
var previously_floored := false
var jump_single := true
var jump_double := true
var container_offset = Vector3(1.2, -1.1, -2.75)
var tween:Tween
@onready var sound_footsteps = $SoundFootsteps
@onready var item_container = $Head/Camera/SubViewportContainer/SubViewport/CameraItem/Container
@onready var camera = $Head/Camera
@onready var raycast = $Head/Camera/ShootCast
@onready var blaster_cooldown = $BlasterCooldown
@onready var burst = $Head/Camera/SubViewportContainer/SubViewport/CameraItem/Burst
@export var crosshair:TextureRect
# Functions
func _ready():
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
change_weapon(weapon_index)
func _process(delta):
# Handle functions
handle_controls(delta)
handle_gravity(delta)
# Movement
var applied_velocity: Vector3
movement_velocity = transform.basis * movement_velocity # Move forward
applied_velocity = velocity.lerp(movement_velocity, delta * 10)
applied_velocity.y = -gravity
velocity = applied_velocity
move_and_slide()
# Rotation
camera.rotation.z = lerp_angle(camera.rotation.z, -input_mouse.x * 1.25, delta * 5)
camera.rotation.x = lerp_angle(camera.rotation.x, rotation_target.x, delta * 25)
rotation.y = lerp_angle(rotation.y, rotation_target.y, delta * 25)
item_container.rotation.y = lerp_angle(item_container.rotation.y, -input_mouse.x * 4, delta * 5)
#item_container.rotation.x = lerp_angle(item_container.rotation.x, -rotation_target.x / 3, delta * 10)
item_container.position = lerp(item_container.position, container_offset - (applied_velocity / 30), delta * 10)
# Movement sound
sound_footsteps.stream_paused = true
if is_on_floor():
if abs(velocity.x) > 1 or abs(velocity.z) > 1:
sound_footsteps.stream_paused = false
# Landing after jump or falling
camera.position.y = lerp(camera.position.y, 0.0, delta * 5)
if is_on_floor() and gravity > 1 and !previously_floored: # Landed
Audio.play("sounds/land.ogg")
camera.position.y = -0.1
previously_floored = is_on_floor()
input_mouse = Vector2.ZERO
# Mouse movement
func _input(event):
if event is InputEventMouseMotion and mouse_captured:
input_mouse = event.relative / mouse_sensitivity
rotation_target.y -= event.relative.x / mouse_sensitivity
rotation_target.x -= event.relative.y / mouse_sensitivity
rotation_target.x = clamp(rotation_target.x, deg_to_rad(-90), deg_to_rad(90))
func handle_controls(delta):
# Mouse capture
if Input.is_action_just_pressed("mouse_capture"):
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
mouse_captured = true
if Input.is_action_just_pressed("mouse_capture_exit"):
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
mouse_captured = false
# Movement
input.x = Input.get_axis("move_left", "move_right")
input.z = Input.get_axis("move_forward", "move_back")
movement_velocity = input.normalized() * movement_speed * delta
# Shooting
if Input.is_action_pressed("shoot"):
shoot()
# Jumping
if Input.is_action_just_pressed("jump"):
if jump_single or jump_double:
Audio.play_random("sounds/jump_a.ogg, sounds/jump_b.ogg, sounds/jump_c.ogg")
if jump_double:
gravity = -jump_strength
jump_double = false
if(jump_single): jump()
# Weapon switching
if Input.is_action_just_pressed("weapon_next"):
next_weapon()
# Handle gravity
func handle_gravity(delta):
gravity += 20 * delta
if gravity > 0 and is_on_floor():
jump_single = true
gravity = 0
# Jumping
func jump():
gravity = -jump_strength
jump_single = false;
jump_double = true;
# Shooting
func shoot():
if !blaster_cooldown.is_stopped(): return
Audio.play_random(weapon.sound_shoot)
item_container.position.z += 0.25
burst.play("default")
burst.rotation_degrees.z = randf_range(-45, 45)
burst.scale = Vector3.ONE * randf_range(0.40, 0.75)
burst.position = item_container.position - Vector3(0.1, -0.4, 1.5)
blaster_cooldown.start(weapon.cooldown)
# What or where the blaster hit
for n in weapon.shot_count:
raycast.target_position.x = randf_range(-weapon.spread, weapon.spread)
raycast.target_position.y = randf_range(-weapon.spread, weapon.spread)
raycast.force_raycast_update()
if !raycast.is_colliding():
return
var collider = raycast.get_collider()
if collider.has_method("damage"):
collider.damage(weapon.damage)
var impact = preload("res://objects/impact.tscn")
var impact_instance = impact.instantiate()
impact_instance.play("shot")
get_tree().root.add_child(impact_instance)
impact_instance.position = raycast.get_collision_point() + (raycast.get_collision_normal() / 10)
impact_instance.look_at(position, Vector3.UP, true)
#impact_instance.rotation_degrees.z = randf_range(-45, 45)
# Weapons
func next_weapon():
Audio.play("sounds/blaster_change.ogg")
if weapon_index < weapons.size() - 1:
weapon_index += 1
else:
weapon_index = 0
change_weapon(weapon_index)
func change_weapon_apply():
weapon = weapons[weapon_index]
# Step 1. Remove all children in (weapon) container
for n in item_container.get_children():
item_container.remove_child(n)
# Step 2. Load new model into container
var weapon_model = weapon.model.instantiate()
item_container.add_child(weapon_model)
weapon_model.position = weapon.position
weapon_model.rotation_degrees = weapon.rotation
# Step 3. Set model to only render on layer 2
for child in weapon_model.find_children("*", "MeshInstance3D"):
child.layers = 2
# Set weapon data
raycast.target_position = Vector3(0, 0, -1) * weapon.max_distance
crosshair.texture = weapon.crosshair
func change_weapon(index):
weapon_index = index
tween = get_tree().create_tween()
tween.set_ease(Tween.EASE_OUT_IN)
tween.tween_property(item_container, "position", container_offset - Vector3(0, 1, 0), 0.1)
tween.tween_callback(change_weapon_apply)
func get_hurt():
pass

@ -0,0 +1,77 @@
[gd_scene load_steps=8 format=3 uid="uid://dl2ed4gkybggf"]
[ext_resource type="Script" path="res://actors/player.gd" id="1_ffboj"]
[ext_resource type="Resource" uid="uid://cu2gtxlcmbb34" path="res://weapons/blaster-repeater.tres" id="2_6epbw"]
[ext_resource type="Texture2D" uid="uid://8ggihh27mlrr" path="res://sprites/blob_shadow.png" id="2_b0fo8"]
[ext_resource type="Resource" uid="uid://c56y8pqoyk15f" path="res://weapons/blaster.tres" id="3_kr4p8"]
[ext_resource type="SpriteFrames" uid="uid://dbv3sy5qjatnl" path="res://sprites/burst_animation.tres" id="4_m6ukc"]
[ext_resource type="AudioStream" uid="uid://cydjn1ct3hps2" path="res://sounds/walking.ogg" id="5_ics1s"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_gdq8c"]
radius = 0.3
height = 1.0
[node name="Player" type="CharacterBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
script = ExtResource("1_ffboj")
weapons = Array[Resource("res://scripts/weapon.gd")]([ExtResource("3_kr4p8"), ExtResource("2_6epbw")])
[node name="Collider" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 0)
shape = SubResource("CapsuleShape3D_gdq8c")
[node name="Head" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
[node name="Camera" type="Camera3D" parent="Head"]
cull_mask = 1048573
current = true
fov = 80.0
[node name="SubViewportContainer" type="SubViewportContainer" parent="Head/Camera"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
stretch = true
[node name="SubViewport" type="SubViewport" parent="Head/Camera/SubViewportContainer"]
transparent_bg = true
handle_input_locally = false
msaa_3d = 1
size = Vector2i(1280, 720)
render_target_update_mode = 4
[node name="CameraItem" type="Camera3D" parent="Head/Camera/SubViewportContainer/SubViewport"]
cull_mask = 1047554
fov = 40.0
[node name="Container" type="Node3D" parent="Head/Camera/SubViewportContainer/SubViewport/CameraItem"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, -1, -2.25)
[node name="Burst" type="AnimatedSprite3D" parent="Head/Camera/SubViewportContainer/SubViewport/CameraItem"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, -0.75, -6)
layers = 2
sprite_frames = ExtResource("4_m6ukc")
frame = 2
[node name="ShootCast" type="RayCast3D" parent="Head/Camera"]
exclude_parent = false
target_position = Vector3(0, 0, -10)
collide_with_areas = true
[node name="Shadow" type="Decal" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0)
size = Vector3(1, 2, 1)
texture_albedo = ExtResource("2_b0fo8")
modulate = Color(1, 1, 1, 0.705882)
normal_fade = 0.5
[node name="SoundFootsteps" type="AudioStreamPlayer" parent="."]
stream = ExtResource("5_ics1s")
volume_db = -5.0
autoplay = true
[node name="BlasterCooldown" type="Timer" parent="."]
one_shot = true

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cpxour8a7ihec"
path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.png"
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.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=false
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=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5hxnjwvrxuji"
path.bptc="res://.godot/imported/colormap.png-c1bc3c3aabeec406ff4b53328583776a.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://models/Textures/colormap.png"
dest_files=["res://.godot/imported/colormap.png-c1bc3c3aabeec406ff4b53328583776a.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
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.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://c0fgu1f2whait"
path="res://.godot/imported/blaster-double.glb-432c9163e28f0aae29c58d0e5ca6594b.scn"
[deps]
source_file="res://models/blaster-double.glb"
dest_files=["res://.godot/imported/blaster-double.glb-432c9163e28f0aae29c58d0e5ca6594b.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b2p7bbkuxf7m"
path="res://.godot/imported/blaster.glb-865d95bc6d15a20a70b45829eaeb4dc5.scn"
[deps]
source_file="res://models/blaster.glb"
dest_files=["res://.godot/imported/blaster.glb-865d95bc6d15a20a70b45829eaeb4dc5.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://lde2xq3vq635"
path="res://.godot/imported/enemy-flying.glb-6120572f403485a0abe68ce33d56638b.scn"
[deps]
source_file="res://models/enemy-flying.glb"
dest_files=["res://.godot/imported/enemy-flying.glb-6120572f403485a0abe68ce33d56638b.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://das5fosq6auoe"
path="res://.godot/imported/grass-small.glb-0be1c06405ef2ce478dc00acb5be5be8.scn"
[deps]
source_file="res://models/grass-small.glb"
dest_files=["res://.godot/imported/grass-small.glb-0be1c06405ef2ce478dc00acb5be5be8.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://beaer7x07yif6"
path="res://.godot/imported/grass.glb-0ce858eae1c69c894a569863f13e24f1.scn"
[deps]
source_file="res://models/grass.glb"
dest_files=["res://.godot/imported/grass.glb-0ce858eae1c69c894a569863f13e24f1.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://k065rxqtim8f"
path="res://.godot/imported/platform-large-grass.glb-eba1099445789c9c9ba0b37fc57bd13f.scn"
[deps]
source_file="res://models/platform-large-grass.glb"
dest_files=["res://.godot/imported/platform-large-grass.glb-eba1099445789c9c9ba0b37fc57bd13f.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dwvcy6wtanoyy"
path="res://.godot/imported/platform.glb-3476c7cd272116fb58fd5d0a0eddb703.scn"
[deps]
source_file="res://models/platform.glb"
dest_files=["res://.godot/imported/platform.glb-3476c7cd272116fb58fd5d0a0eddb703.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://c743irj356lax"
path="res://.godot/imported/wall-high.glb-74f2e81af43ef5254fe14637810326a5.scn"
[deps]
source_file="res://models/wall-high.glb"
dest_files=["res://.godot/imported/wall-high.glb-74f2e81af43ef5254fe14637810326a5.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

Binary file not shown.

@ -0,0 +1,32 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://x08pt5dvke58"
path="res://.godot/imported/wall-low.glb-de080c69f0eef8b51181d363ed18f581.scn"
[deps]
source_file="res://models/wall-low.glb"
dest_files=["res://.godot/imported/wall-low.glb-de080c69f0eef8b51181d363ed18f581.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/embedded_image_handling=1

@ -0,0 +1,4 @@
extends Node
func _on_animation_finished():
queue_free()

@ -0,0 +1,51 @@
[gd_scene load_steps=8 format=3 uid="uid://b7070gfoko4mo"]
[ext_resource type="Texture2D" uid="uid://dh0t42ubhuv0" path="res://sprites/hit.png" id="1_mdfft"]
[ext_resource type="Script" path="res://objects/impact.gd" id="2_k826h"]
[sub_resource type="AtlasTexture" id="AtlasTexture_8c04i"]
atlas = ExtResource("1_mdfft")
region = Rect2(0, 0, 128, 128)
[sub_resource type="AtlasTexture" id="AtlasTexture_34j4g"]
atlas = ExtResource("1_mdfft")
region = Rect2(128, 0, 128, 128)
[sub_resource type="AtlasTexture" id="AtlasTexture_tk4oq"]
atlas = ExtResource("1_mdfft")
region = Rect2(0, 128, 128, 128)
[sub_resource type="AtlasTexture" id="AtlasTexture_q5m5l"]
atlas = ExtResource("1_mdfft")
region = Rect2(128, 128, 128, 128)
[sub_resource type="SpriteFrames" id="SpriteFrames_nwydm"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_8c04i")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_34j4g")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tk4oq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_q5m5l")
}],
"loop": false,
"name": &"shot",
"speed": 30.0
}]
[node name="AnimatedSprite3D" type="AnimatedSprite3D"]
cast_shadow = 0
pixel_size = 0.0025
double_sided = false
no_depth_test = true
sprite_frames = SubResource("SpriteFrames_nwydm")
animation = &"shot"
script = ExtResource("2_k826h")
[connection signal="animation_finished" from="." to="." method="_on_animation_finished"]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,110 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="Starter Kit FPS"
config/tags=PackedStringArray("starterkit")
run/main_scene="res://scenes/main.tscn"
config/features=PackedStringArray("4.1", "Forward Plus")
boot_splash/bg_color=Color(0.92549, 0.92549, 0.960784, 1)
boot_splash/image="res://splash-screen.png"
config/icon="res://icon.png"
[autoload]
Audio="*res://scripts/audio.gd"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
[input]
move_right={
"deadzone": 0.25,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
]
}
move_left={
"deadzone": 0.25,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_forward={
"deadzone": 0.25,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
]
}
move_back={
"deadzone": 0.25,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
jump={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null)
]
}
camera_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null)
]
}
camera_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null)
]
}
camera_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null)
]
}
camera_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
]
}
mouse_capture={
"deadzone": 0.5,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
mouse_capture_exit={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
shoot={
"deadzone": 0.5,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(92, 12),"global_position":Vector2(96, 55),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
weapon_next={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null)
]
}
[rendering]
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5
anti_aliasing/quality/msaa_3d=3

@ -0,0 +1,28 @@
[gd_resource type="Environment" load_steps=3 format=3 uid="uid://jvmpkdwaeaq"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_lg8b7"]
sky_horizon_color = Color(0.67451, 0.682353, 0.698039, 1)
sky_curve = 0.0175
ground_bottom_color = Color(1, 1, 1, 1)
ground_curve = 0.171484
[sub_resource type="Sky" id="Sky_7bk1c"]
sky_material = SubResource("ProceduralSkyMaterial_lg8b7")
[resource]
background_mode = 1
background_color = Color(0.360784, 0.392157, 0.462745, 1)
sky = SubResource("Sky_7bk1c")
ambient_light_source = 2
ambient_light_color = Color(0.662745, 0.694118, 0.772549, 1)
ambient_light_energy = 1.15
tonemap_mode = 2
ssao_enabled = true
ssao_radius = 0.45
ssao_intensity = 1.0
ssao_power = 5.0
glow_enabled = true
glow_levels/2 = 0.6
glow_levels/3 = 0.6
glow_levels/5 = 0.0
glow_intensity = 2.0

@ -0,0 +1,81 @@
[gd_scene load_steps=8 format=3 uid="uid://dxvvlck8lej3f"]
[ext_resource type="Environment" uid="uid://jvmpkdwaeaq" path="res://scenes/main-environment.tres" id="1_q8fpv"]
[ext_resource type="PackedScene" uid="uid://dl2ed4gkybggf" path="res://actors/player.tscn" id="2_elriq"]
[ext_resource type="PackedScene" uid="uid://dpm3l05d7fu35" path="res://objects/platform.tscn" id="5_3s40e"]
[ext_resource type="PackedScene" uid="uid://r7rt7pth4u7o" path="res://objects/wall_low.tscn" id="5_6vel1"]
[ext_resource type="PackedScene" uid="uid://c71evdjblk5wp" path="res://objects/wall_high.tscn" id="7_cabne"]
[ext_resource type="PackedScene" uid="uid://bvx5cvigosg0s" path="res://objects/platform_large_grass.tscn" id="7_wggef"]
[ext_resource type="PackedScene" uid="uid://d2g78tpqbyf5g" path="res://actors/enemy.tscn" id="8_7ty2f"]
[node name="Main" type="Node3D"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = ExtResource("1_q8fpv")
[node name="Player" parent="." node_paths=PackedStringArray("crosshair") instance=ExtResource("2_elriq")]
crosshair = NodePath("../Canvas/Crosshair")
[node name="Sun" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.422618, -0.694272, 0.582563, 0, 0.642788, 0.766044, -0.906308, 0.323744, -0.271654, 0, 0, 0)
shadow_enabled = true
shadow_opacity = 0.75
[node name="Canvas" type="CanvasLayer" parent="."]
[node name="Crosshair" type="TextureRect" parent="Canvas"]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = -20.0
offset_right = 20.0
offset_bottom = 20.0
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.35, 0.35)
pivot_offset = Vector2(64, 64)
[node name="wall-low" parent="." instance=ExtResource("5_6vel1")]
transform = Transform3D(0.965926, 0, 0.258819, 0, 1, 0, -0.258819, 0, 0.965926, -1.92088, 1.05, -6.90166)
[node name="wall-low3" parent="." instance=ExtResource("5_6vel1")]
transform = Transform3D(-1, 0, -1.19209e-07, 0, 1, 0, 1.19209e-07, 0, -1, 6.07912, 1.05, 6.59834)
[node name="platform-falling" parent="." instance=ExtResource("5_3s40e")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 0, 6.5)
[node name="platform-falling2" parent="." instance=ExtResource("5_3s40e")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.5, 2.5, -2.5)
[node name="platform-falling3" parent="." instance=ExtResource("5_3s40e")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 3, -3.5)
[node name="wall-high" parent="." instance=ExtResource("7_cabne")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, -1.5)
[node name="platform-large-grass" parent="." instance=ExtResource("7_wggef")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
[node name="platform-large-grass2" parent="." instance=ExtResource("7_wggef")]
transform = Transform3D(0.965926, 0, 0.258819, 0, 1, 0, -0.258819, 0, 0.965926, -2, 0.5, -6)
[node name="platform-large-grass3" parent="." instance=ExtResource("7_wggef")]
transform = Transform3D(0.965926, 0, -0.258819, 0, 1, 0, 0.258819, 0, 0.965926, -6, 1, 2.5)
[node name="platform-large-grass4" parent="." instance=ExtResource("7_wggef")]
transform = Transform3D(0.965926, 0, 0.258819, 0, 1, 0, -0.258819, 0, 0.965926, 5, 0.5, 5.5)
[node name="enemy-flying" parent="." node_paths=PackedStringArray("player") instance=ExtResource("8_7ty2f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.5, 2.5, -6)
player = NodePath("../Player")
[node name="enemy-flying2" parent="." node_paths=PackedStringArray("player") instance=ExtResource("8_7ty2f")]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -9.5, 2.5, 1.5)
player = NodePath("../Player")
[node name="enemy-flying3" parent="." node_paths=PackedStringArray("player") instance=ExtResource("8_7ty2f")]
transform = Transform3D(-0.707107, 0, -0.707107, 0, 1, 0, 0.707107, 0, -0.707107, 5.5, 3.5, 9)
player = NodePath("../Player")

@ -0,0 +1,43 @@
extends Node
# Code adapted from KidsCanCode
var num_players = 12
var bus = "master"
var available = [] # The available players.
var queue = [] # The queue of sounds to play.
func _ready():
for i in num_players:
var p = AudioStreamPlayer.new()
add_child(p)
available.append(p)
p.volume_db = -10
p.finished.connect(_on_stream_finished.bind(p))
p.bus = bus
func _on_stream_finished(stream):
available.append(stream)
func play(sound_path): # Path
queue.append("res://" + sound_path)
func play_random(sound_paths): # Multiple paths, separate by commas
var sounds = sound_paths.split(",")
play(sounds[randi() % sounds.size()].strip_edges())
func _process(_delta):
if not queue.is_empty() and not available.is_empty():
available[0].stream = load(queue.pop_front())
available[0].play()
available[0].pitch_scale = randf_range(0.9, 1.1)
available.pop_front()

@ -0,0 +1,58 @@
extends Node3D
@export var player:Node3D
@onready var raycast = $RayCast
@onready var burst_a = $BurstA
@onready var burst_b = $BurstB
var health := 100
var target_position:Vector3
var time := 0.0
var destroyed := false
func _ready():
target_position = position
func _process(delta):
self.look_at(player.position + Vector3(0, 0.5, 0), Vector3.UP, true)
target_position.y += (cos(time * 5) * 1) * delta # Sine movement
time += delta
position = target_position
func damage(amount):
health -= amount
Audio.play("sounds/enemy_hurt.ogg")
if health <= 0 and !destroyed:
destroy()
func destroy():
destroyed = true
Audio.play("sounds/enemy_destroy.ogg")
queue_free()
func _on_timer_timeout():
shoot()
func shoot():
raycast.force_raycast_update()
if raycast.is_colliding():
var collider = raycast.get_collider()
if collider.has_method("get_hurt"):
burst_a.frame = 0
burst_a.play("default")
burst_a.rotation_degrees.z = randf_range(-45, 45)
burst_b.frame = 0
burst_b.play("default")
burst_b.rotation_degrees.z = randf_range(-45, 45)
Audio.play("sounds/enemy_attack.ogg")

@ -0,0 +1,20 @@
extends Resource
class_name Weapon
@export_subgroup("Model")
@export var model:PackedScene
@export var position:Vector3
@export var rotation:Vector3
@export_subgroup("Properties")
@export_range(0.1, 1) var cooldown: float = 0.1
@export_range(1, 20) var max_distance: int = 10
@export_range(0, 100) var damage: float = 25
@export_range(0, 5) var spread: float = 0
@export_range(1, 5) var shot_count: int = 1
@export_subgroup("Sounds")
@export var sound_shoot: String
@export_subgroup("Crosshair")
@export var crosshair: Texture2D

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://dv8rfe827xc6j"
path="res://.godot/imported/blaster.ogg-1527ec84d518b60bb9fbaad97656d870.oggvorbisstr"
[deps]
source_file="res://sounds/blaster.ogg"
dest_files=["res://.godot/imported/blaster.ogg-1527ec84d518b60bb9fbaad97656d870.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cmc2ufr6o30gl"
path="res://.godot/imported/blaster_change.ogg-27f755a5dfe4b513b0b5bc81eb113dc3.oggvorbisstr"
[deps]
source_file="res://sounds/blaster_change.ogg"
dest_files=["res://.godot/imported/blaster_change.ogg-27f755a5dfe4b513b0b5bc81eb113dc3.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://blxqudiclpq84"
path="res://.godot/imported/enemy_attack.ogg-ad3c73e6e91698e3fc81bd6423d8fca2.oggvorbisstr"
[deps]
source_file="res://sounds/enemy_attack.ogg"
dest_files=["res://.godot/imported/enemy_attack.ogg-ad3c73e6e91698e3fc81bd6423d8fca2.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://br1ov3ld0er6r"
path="res://.godot/imported/enemy_destroy.ogg-feb8f111abab93d5fc30ec838c975232.oggvorbisstr"
[deps]
source_file="res://sounds/enemy_destroy.ogg"
dest_files=["res://.godot/imported/enemy_destroy.ogg-feb8f111abab93d5fc30ec838c975232.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cgnbyrnxj12ed"
path="res://.godot/imported/enemy_hurt.ogg-64e07bfa21b7ae57b8a0bf7357a95008.oggvorbisstr"
[deps]
source_file="res://sounds/enemy_hurt.ogg"
dest_files=["res://.godot/imported/enemy_hurt.ogg-64e07bfa21b7ae57b8a0bf7357a95008.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://x0s0tunvo0br"
path="res://.godot/imported/jump-realistic.ogg-0655f517427ef61af899d7c5ae700ab6.oggvorbisstr"
[deps]
source_file="res://sounds/jump-realistic.ogg"
dest_files=["res://.godot/imported/jump-realistic.ogg-0655f517427ef61af899d7c5ae700ab6.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://dw2m5fxhfjykq"
path="res://.godot/imported/jump.ogg-de8df8640ff526968292c23fe5ec784f.oggvorbisstr"
[deps]
source_file="res://sounds/jump.ogg"
dest_files=["res://.godot/imported/jump.ogg-de8df8640ff526968292c23fe5ec784f.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://bvnum0u73y8sv"
path="res://.godot/imported/jump_a.ogg-df3a87b422b8537163b811137ab76d0c.oggvorbisstr"
[deps]
source_file="res://sounds/jump_a.ogg"
dest_files=["res://.godot/imported/jump_a.ogg-df3a87b422b8537163b811137ab76d0c.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://5raj3p7xaecq"
path="res://.godot/imported/jump_b.ogg-f0989d7351debef348a67b21be8b7bd0.oggvorbisstr"
[deps]
source_file="res://sounds/jump_b.ogg"
dest_files=["res://.godot/imported/jump_b.ogg-f0989d7351debef348a67b21be8b7bd0.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://7tnsakv8pwa5"
path="res://.godot/imported/jump_c.ogg-6a4808f519ad4af845e78fe92b3da78c.oggvorbisstr"
[deps]
source_file="res://sounds/jump_c.ogg"
dest_files=["res://.godot/imported/jump_c.ogg-6a4808f519ad4af845e78fe92b3da78c.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://xnxidwkp46un"
path="res://.godot/imported/land.ogg-7222ba872273a4a7535937ef5cfdffd0.oggvorbisstr"
[deps]
source_file="res://sounds/land.ogg"
dest_files=["res://.godot/imported/land.ogg-7222ba872273a4a7535937ef5cfdffd0.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://br6iq2h671ery"
path="res://.godot/imported/shoot_a.ogg-527bbcaa6ffabc0e8a7820780cfc3b2c.oggvorbisstr"
[deps]
source_file="res://sounds/shoot_a.ogg"
dest_files=["res://.godot/imported/shoot_a.ogg-527bbcaa6ffabc0e8a7820780cfc3b2c.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cheg0i1wf285t"
path="res://.godot/imported/shoot_b.ogg-3fea18996921e1ae1337cf584b325ddc.oggvorbisstr"
[deps]
source_file="res://sounds/shoot_b.ogg"
dest_files=["res://.godot/imported/shoot_b.ogg-3fea18996921e1ae1337cf584b325ddc.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://k40c314uiym2"
path="res://.godot/imported/shoot_c.ogg-a309ac00957e32b88ef2a57e4294a4f4.oggvorbisstr"
[deps]
source_file="res://sounds/shoot_c.ogg"
dest_files=["res://.godot/imported/shoot_c.ogg-a309ac00957e32b88ef2a57e4294a4f4.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://dcatai5q4k77k"
path="res://.godot/imported/shoot_d.ogg-23fcf862043859225d1039fc76244edb.oggvorbisstr"
[deps]
source_file="res://sounds/shoot_d.ogg"
dest_files=["res://.godot/imported/shoot_d.ogg-23fcf862043859225d1039fc76244edb.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://b0su3bm77yrvr"
path="res://.godot/imported/shoot_shotgun.ogg-b1cdcf7bc1f47b25f622a407aa93e4d7.oggvorbisstr"
[deps]
source_file="res://sounds/shoot_shotgun.ogg"
dest_files=["res://.godot/imported/shoot_shotgun.ogg-b1cdcf7bc1f47b25f622a407aa93e4d7.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://cydjn1ct3hps2"
path="res://.godot/imported/walking.ogg-bf61e9916135189ff0d5c06a148b02ab.oggvorbisstr"
[deps]
source_file="res://sounds/walking.ogg"
dest_files=["res://.godot/imported/walking.ogg-bf61e9916135189ff0d5c06a148b02ab.oggvorbisstr"]
[params]
loop=true
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://biff4dkpfqi47"
path="res://.godot/imported/splash-screen.png-ae6c8b07e185ee8a074576008d9ccc5a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://splash-screen.png"
dest_files=["res://.godot/imported/splash-screen.png-ae6c8b07e185ee8a074576008d9ccc5a.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=false
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=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://8ggihh27mlrr"
path="res://.godot/imported/blob_shadow.png-d19f4ffceb1d99dd3331acec2dc6d7df.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/blob_shadow.png"
dest_files=["res://.godot/imported/blob_shadow.png-d19f4ffceb1d99dd3331acec2dc6d7df.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=false
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=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbfhj0tswcksm"
path="res://.godot/imported/burst.png-0ca3a873296b113f4396e0bdead4beff.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/burst.png"
dest_files=["res://.godot/imported/burst.png-0ca3a873296b113f4396e0bdead4beff.ctex"]
[params]
compress/mode=1
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=false
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

@ -0,0 +1,28 @@
[gd_resource type="SpriteFrames" load_steps=4 format=3 uid="uid://dbv3sy5qjatnl"]
[ext_resource type="Texture2D" uid="uid://cbfhj0tswcksm" path="res://sprites/burst.png" id="1_bh1wj"]
[sub_resource type="AtlasTexture" id="AtlasTexture_mdaww"]
atlas = ExtResource("1_bh1wj")
region = Rect2(0, 0, 256, 256)
[sub_resource type="AtlasTexture" id="AtlasTexture_3nr3w"]
atlas = ExtResource("1_bh1wj")
region = Rect2(256, 0, 256, 256)
[resource]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_mdaww")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3nr3w")
}, {
"duration": 1.0,
"texture": null
}],
"loop": false,
"name": &"default",
"speed": 30.0
}]

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ce3lgq7foiusl"
path="res://.godot/imported/crosshair-repeater.png-ec408225e689b23875963003728cb016.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/crosshair-repeater.png"
dest_files=["res://.godot/imported/crosshair-repeater.png-ec408225e689b23875963003728cb016.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=false
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=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2jld33y6h5pq"
path.s3tc="res://.godot/imported/crosshair.png-1281ee32d6777347e0f43a202c603c1b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://sprites/crosshair.png"
dest_files=["res://.godot/imported/crosshair.png-1281ee32d6777347e0f43a202c603c1b.s3tc.ctex"]
[params]
compress/mode=2
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.

After

Width:  |  Height:  |  Size: 3.7 KiB

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dh0t42ubhuv0"
path.s3tc="res://.godot/imported/hit.png-32857f07c817e04581303953f2545db0.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://sprites/hit.png"
dest_files=["res://.godot/imported/hit.png-32857f07c817e04581303953f2545db0.s3tc.ctex"]
[params]
compress/mode=2
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.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bs6puxrivhkk2"
path.s3tc="res://.godot/imported/particle.png-9c8c1748211b697ea72e6a5d18d7f578.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://sprites/particle.png"
dest_files=["res://.godot/imported/particle.png-9c8c1748211b697ea72e6a5d18d7f578.s3tc.ctex"]
[params]
compress/mode=2
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.

After

Width:  |  Height:  |  Size: 186 B

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://diluv5007my5w"
path.s3tc="res://.godot/imported/tracer.png-e5030356ca26a83ff0fd1b2d5a878c23.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://sprites/tracer.png"
dest_files=["res://.godot/imported/tracer.png-e5030356ca26a83ff0fd1b2d5a878c23.s3tc.ctex"]
[params]
compress/mode=2
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.

@ -0,0 +1,18 @@
[gd_resource type="Resource" script_class="Weapon" load_steps=4 format=3 uid="uid://cu2gtxlcmbb34"]
[ext_resource type="PackedScene" uid="uid://c0fgu1f2whait" path="res://models/blaster-double.glb" id="1_1mdln"]
[ext_resource type="Texture2D" uid="uid://ce3lgq7foiusl" path="res://sprites/crosshair-repeater.png" id="1_hoqei"]
[ext_resource type="Script" path="res://scripts/weapon.gd" id="1_l1atd"]
[resource]
script = ExtResource("1_l1atd")
model = ExtResource("1_1mdln")
position = Vector3(0, 0, 0)
rotation = Vector3(0, 180, 0)
cooldown = 0.1
max_distance = 10
damage = 10.0
spread = 0.5
shot_count = 1
sound_shoot = "sounds/shoot_a.ogg"
crosshair = ExtResource("1_hoqei")

@ -0,0 +1,18 @@
[gd_resource type="Resource" script_class="Weapon" load_steps=4 format=3 uid="uid://c56y8pqoyk15f"]
[ext_resource type="Texture2D" uid="uid://2jld33y6h5pq" path="res://sprites/crosshair.png" id="1_2onsr"]
[ext_resource type="PackedScene" uid="uid://b2p7bbkuxf7m" path="res://models/blaster.glb" id="1_x0glg"]
[ext_resource type="Script" path="res://scripts/weapon.gd" id="2_107w7"]
[resource]
script = ExtResource("2_107w7")
model = ExtResource("1_x0glg")
position = Vector3(0, 0, 0)
rotation = Vector3(0, 180, 0)
cooldown = 0.5
max_distance = 10
damage = 25.0
spread = 2.0
shot_count = 3
sound_shoot = "sounds/shoot_shotgun.ogg"
crosshair = ExtResource("1_2onsr")