My first 3D game with Godot 4.4

This commit is contained in:
2025-08-18 18:48:02 -04:00
commit aef6af1eca
89 changed files with 10495 additions and 0 deletions

4
.editorconfig Normal file
View File

@@ -0,0 +1,4 @@
root = true
[*]
charset = utf-8

2
.gitattributes vendored Normal file
View File

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

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
# Godot 4+ specific ignores
.godot/
/android/

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"godotTools.editorPath.godot4": "/home/elaina/.local/opt/godot4/Godot_v4.4.1-stable_linux.x86_64"
}

8
bridge.tres Normal file
View File

@@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://ba7yoi5ia0isy"]
[ext_resource type="Texture2D" uid="uid://cei1u6horkbiu" path="res://level/checkboard.png" id="1_miuk6"]
[resource]
albedo_color = Color(0.396967, 0.760667, 0.973092, 1)
albedo_texture = ExtResource("1_miuk6")
uv1_triplanar = true

362
export_presets.cfg Normal file
View File

@@ -0,0 +1,362 @@
[preset.0]
name="Linux"
platform="Linux"
runnable=true
advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../../ShootahGame3D.x86_64"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=true
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
[preset.1]
name="Windows Desktop"
platform="Windows Desktop"
runnable=true
advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../../ShootahGame3D.exe"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.1.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
codesign/timestamp_server_url=""
codesign/digest_algorithm=1
codesign/description=""
codesign/custom_options=PackedStringArray()
application/modify_resources=true
application/icon=""
application/console_wrapper_icon=""
application/icon_interpolation=4
application/file_version=""
application/product_version=""
application/company_name=""
application/product_name=""
application/file_description=""
application/copyright=""
application/trademarks=""
application/export_angle=0
application/export_d3d12=0
application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
Start-ScheduledTask -TaskName godot_remote_debug
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
[preset.2]
name="macOS"
platform="macOS"
runnable=true
advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../../ShootahGame3D.zip"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.2.options]
export/distribution_type=1
binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="me.chtm.ShootahGame3D"
application/signature=""
application/app_category="Games"
application/short_version=""
application/version=""
application/copyright=""
application/copyright_localized={}
application/min_macos_version_x86_64="10.12"
application/min_macos_version_arm64="11.00"
application/export_angle=0
display/high_res=true
application/additional_plist_content=""
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
xcode/sdk_name="macosx13.1"
xcode/xcode_version="1420"
xcode/xcode_build="14C18"
codesign/codesign=1
codesign/installer_identity=""
codesign/apple_team_id=""
codesign/identity=""
codesign/entitlements/custom_file=""
codesign/entitlements/allow_jit_code_execution=false
codesign/entitlements/allow_unsigned_executable_memory=false
codesign/entitlements/allow_dyld_environment_variables=false
codesign/entitlements/disable_library_validation=false
codesign/entitlements/audio_input=false
codesign/entitlements/camera=false
codesign/entitlements/location=false
codesign/entitlements/address_book=false
codesign/entitlements/calendars=false
codesign/entitlements/photos_library=false
codesign/entitlements/apple_events=false
codesign/entitlements/debugging=false
codesign/entitlements/app_sandbox/enabled=true
codesign/entitlements/app_sandbox/network_server=false
codesign/entitlements/app_sandbox/network_client=false
codesign/entitlements/app_sandbox/device_usb=false
codesign/entitlements/app_sandbox/device_bluetooth=false
codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
codesign/entitlements/app_sandbox/files_user_selected=0
codesign/entitlements/app_sandbox/helper_executables=[]
codesign/entitlements/additional=""
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description=""
privacy/microphone_usage_description_localized={}
privacy/camera_usage_description=""
privacy/camera_usage_description_localized={}
privacy/location_usage_description=""
privacy/location_usage_description_localized={}
privacy/address_book_usage_description=""
privacy/address_book_usage_description_localized={}
privacy/calendar_usage_description=""
privacy/calendar_usage_description_localized={}
privacy/photos_library_usage_description=""
privacy/photos_library_usage_description_localized={}
privacy/desktop_folder_usage_description=""
privacy/desktop_folder_usage_description_localized={}
privacy/documents_folder_usage_description=""
privacy/documents_folder_usage_description_localized={}
privacy/downloads_folder_usage_description=""
privacy/downloads_folder_usage_description_localized={}
privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
privacy/tracking_enabled=false
privacy/tracking_domains=PackedStringArray()
privacy/collected_data/name/collected=false
privacy/collected_data/name/linked_to_user=false
privacy/collected_data/name/used_for_tracking=false
privacy/collected_data/name/collection_purposes=0
privacy/collected_data/email_address/collected=false
privacy/collected_data/email_address/linked_to_user=false
privacy/collected_data/email_address/used_for_tracking=false
privacy/collected_data/email_address/collection_purposes=0
privacy/collected_data/phone_number/collected=false
privacy/collected_data/phone_number/linked_to_user=false
privacy/collected_data/phone_number/used_for_tracking=false
privacy/collected_data/phone_number/collection_purposes=0
privacy/collected_data/physical_address/collected=false
privacy/collected_data/physical_address/linked_to_user=false
privacy/collected_data/physical_address/used_for_tracking=false
privacy/collected_data/physical_address/collection_purposes=0
privacy/collected_data/other_contact_info/collected=false
privacy/collected_data/other_contact_info/linked_to_user=false
privacy/collected_data/other_contact_info/used_for_tracking=false
privacy/collected_data/other_contact_info/collection_purposes=0
privacy/collected_data/health/collected=false
privacy/collected_data/health/linked_to_user=false
privacy/collected_data/health/used_for_tracking=false
privacy/collected_data/health/collection_purposes=0
privacy/collected_data/fitness/collected=false
privacy/collected_data/fitness/linked_to_user=false
privacy/collected_data/fitness/used_for_tracking=false
privacy/collected_data/fitness/collection_purposes=0
privacy/collected_data/payment_info/collected=false
privacy/collected_data/payment_info/linked_to_user=false
privacy/collected_data/payment_info/used_for_tracking=false
privacy/collected_data/payment_info/collection_purposes=0
privacy/collected_data/credit_info/collected=false
privacy/collected_data/credit_info/linked_to_user=false
privacy/collected_data/credit_info/used_for_tracking=false
privacy/collected_data/credit_info/collection_purposes=0
privacy/collected_data/other_financial_info/collected=false
privacy/collected_data/other_financial_info/linked_to_user=false
privacy/collected_data/other_financial_info/used_for_tracking=false
privacy/collected_data/other_financial_info/collection_purposes=0
privacy/collected_data/precise_location/collected=false
privacy/collected_data/precise_location/linked_to_user=false
privacy/collected_data/precise_location/used_for_tracking=false
privacy/collected_data/precise_location/collection_purposes=0
privacy/collected_data/coarse_location/collected=false
privacy/collected_data/coarse_location/linked_to_user=false
privacy/collected_data/coarse_location/used_for_tracking=false
privacy/collected_data/coarse_location/collection_purposes=0
privacy/collected_data/sensitive_info/collected=false
privacy/collected_data/sensitive_info/linked_to_user=false
privacy/collected_data/sensitive_info/used_for_tracking=false
privacy/collected_data/sensitive_info/collection_purposes=0
privacy/collected_data/contacts/collected=false
privacy/collected_data/contacts/linked_to_user=false
privacy/collected_data/contacts/used_for_tracking=false
privacy/collected_data/contacts/collection_purposes=0
privacy/collected_data/emails_or_text_messages/collected=false
privacy/collected_data/emails_or_text_messages/linked_to_user=false
privacy/collected_data/emails_or_text_messages/used_for_tracking=false
privacy/collected_data/emails_or_text_messages/collection_purposes=0
privacy/collected_data/photos_or_videos/collected=false
privacy/collected_data/photos_or_videos/linked_to_user=false
privacy/collected_data/photos_or_videos/used_for_tracking=false
privacy/collected_data/photos_or_videos/collection_purposes=0
privacy/collected_data/audio_data/collected=false
privacy/collected_data/audio_data/linked_to_user=false
privacy/collected_data/audio_data/used_for_tracking=false
privacy/collected_data/audio_data/collection_purposes=0
privacy/collected_data/gameplay_content/collected=false
privacy/collected_data/gameplay_content/linked_to_user=false
privacy/collected_data/gameplay_content/used_for_tracking=false
privacy/collected_data/gameplay_content/collection_purposes=0
privacy/collected_data/customer_support/collected=false
privacy/collected_data/customer_support/linked_to_user=false
privacy/collected_data/customer_support/used_for_tracking=false
privacy/collected_data/customer_support/collection_purposes=0
privacy/collected_data/other_user_content/collected=false
privacy/collected_data/other_user_content/linked_to_user=false
privacy/collected_data/other_user_content/used_for_tracking=false
privacy/collected_data/other_user_content/collection_purposes=0
privacy/collected_data/browsing_history/collected=false
privacy/collected_data/browsing_history/linked_to_user=false
privacy/collected_data/browsing_history/used_for_tracking=false
privacy/collected_data/browsing_history/collection_purposes=0
privacy/collected_data/search_hhistory/collected=false
privacy/collected_data/search_hhistory/linked_to_user=false
privacy/collected_data/search_hhistory/used_for_tracking=false
privacy/collected_data/search_hhistory/collection_purposes=0
privacy/collected_data/user_id/collected=false
privacy/collected_data/user_id/linked_to_user=false
privacy/collected_data/user_id/used_for_tracking=false
privacy/collected_data/user_id/collection_purposes=0
privacy/collected_data/device_id/collected=false
privacy/collected_data/device_id/linked_to_user=false
privacy/collected_data/device_id/used_for_tracking=false
privacy/collected_data/device_id/collection_purposes=0
privacy/collected_data/purchase_history/collected=false
privacy/collected_data/purchase_history/linked_to_user=false
privacy/collected_data/purchase_history/used_for_tracking=false
privacy/collected_data/purchase_history/collection_purposes=0
privacy/collected_data/product_interaction/collected=false
privacy/collected_data/product_interaction/linked_to_user=false
privacy/collected_data/product_interaction/used_for_tracking=false
privacy/collected_data/product_interaction/collection_purposes=0
privacy/collected_data/advertising_data/collected=false
privacy/collected_data/advertising_data/linked_to_user=false
privacy/collected_data/advertising_data/used_for_tracking=false
privacy/collected_data/advertising_data/collection_purposes=0
privacy/collected_data/other_usage_data/collected=false
privacy/collected_data/other_usage_data/linked_to_user=false
privacy/collected_data/other_usage_data/used_for_tracking=false
privacy/collected_data/other_usage_data/collection_purposes=0
privacy/collected_data/crash_data/collected=false
privacy/collected_data/crash_data/linked_to_user=false
privacy/collected_data/crash_data/used_for_tracking=false
privacy/collected_data/crash_data/collection_purposes=0
privacy/collected_data/performance_data/collected=false
privacy/collected_data/performance_data/linked_to_user=false
privacy/collected_data/performance_data/used_for_tracking=false
privacy/collected_data/performance_data/collection_purposes=0
privacy/collected_data/other_diagnostic_data/collected=false
privacy/collected_data/other_diagnostic_data/linked_to_user=false
privacy/collected_data/other_diagnostic_data/used_for_tracking=false
privacy/collected_data/other_diagnostic_data/collection_purposes=0
privacy/collected_data/environment_scanning/collected=false
privacy/collected_data/environment_scanning/linked_to_user=false
privacy/collected_data/environment_scanning/used_for_tracking=false
privacy/collected_data/environment_scanning/collection_purposes=0
privacy/collected_data/hands/collected=false
privacy/collected_data/hands/linked_to_user=false
privacy/collected_data/hands/used_for_tracking=false
privacy/collected_data/hands/collection_purposes=0
privacy/collected_data/head/collected=false
privacy/collected_data/head/linked_to_user=false
privacy/collected_data/head/used_for_tracking=false
privacy/collected_data/head/collection_purposes=0
privacy/collected_data/other_data_types/collected=false
privacy/collected_data/other_data_types/linked_to_user=false
privacy/collected_data/other_data_types/used_for_tracking=false
privacy/collected_data/other_data_types/collection_purposes=0
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""

8
floor.tres Normal file
View File

@@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://c15gyykabf16x"]
[ext_resource type="Texture2D" uid="uid://cei1u6horkbiu" path="res://level/checkboard.png" id="1_tikia"]
[resource]
albedo_color = Color(0.888626, 0.624795, 0.760052, 1)
albedo_texture = ExtResource("1_tikia")
uv1_triplanar = true

20
game.gd Normal file
View File

@@ -0,0 +1,20 @@
extends Node3D
@onready var score_label: Label = %ScoreLabel
var score = 0
func increase_score():
score += 1
score_label.text = "Score: " + str(score)
func _on_mob_spawner_3d_mob_spawned(mob: Node) -> void:
if mob.has_signal("died"):
mob.died.connect(increase_score)
else:
print("this mob cannot die! (probably a bug)")
func _on_kill_plane_body_entered(body: Node3D) -> void:
print("kill plane triggered")
get_tree().reload_current_scene.call_deferred()

1
game.gd.uid Normal file
View File

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

205
game.tscn Normal file
View File

@@ -0,0 +1,205 @@
[gd_scene load_steps=12 format=3 uid="uid://bc23rfm57cbjk"]
[ext_resource type="PackedScene" uid="uid://h8tyroiwkr42" path="res://mob/player.tscn" id="1_80nbo"]
[ext_resource type="Script" uid="uid://pnp0k1jmvccp" path="res://game.gd" id="1_eow3j"]
[ext_resource type="Material" uid="uid://c23xehahalr4v" path="res://start_location.tres" id="1_fc0e3"]
[ext_resource type="Material" uid="uid://c15gyykabf16x" path="res://floor.tres" id="2_7jktm"]
[ext_resource type="Material" uid="uid://ba7yoi5ia0isy" path="res://bridge.tres" id="3_ryrav"]
[ext_resource type="PackedScene" uid="uid://3t7u0llrbbi" path="res://mob/bat_mob.tscn" id="5_7jktm"]
[ext_resource type="PackedScene" uid="uid://c0ky5ie5cfgh2" path="res://mob/spawner/mob_spawner_3d.tscn" id="6_ryrav"]
[ext_resource type="PackedScene" uid="uid://ht0ktfrqr1ef" path="res://player/cookie_3d.tscn" id="8_j5wjh"]
[sub_resource type="Environment" id="Environment_80nbo"]
background_mode = 1
background_color = Color(0.15376, 0.719055, 0.829417, 1)
ambient_light_source = 2
ambient_light_color = Color(0.852816, 0.773674, 0.634462, 1)
tonemap_mode = 2
fog_enabled = true
fog_light_color = Color(0.0437325, 0.398574, 0.495351, 1)
fog_density = 0.0013
fog_height = -5.0
fog_height_density = 0.625
volumetric_fog_density = 0.0125
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_eow3j"]
[sub_resource type="LabelSettings" id="LabelSettings_ryrav"]
font_size = 56
shadow_size = 4
shadow_color = Color(0, 0, 0, 1)
[node name="Game" type="Node3D"]
script = ExtResource("1_eow3j")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_80nbo")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.816218, 0.385055, 0.430721, -0.572746, 0.441435, 0.690722, 0.0758305, -0.810474, 0.580846, 0, 11.331, 0)
shadow_enabled = true
[node name="BatMob" parent="." instance=ExtResource("5_7jktm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23, 2, -31)
[node name="MobSpawner3D" parent="." instance=ExtResource("6_ryrav")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23, 0, -47)
mob_to_spawn = ExtResource("5_7jktm")
[node name="MobSpawner3D2" parent="." instance=ExtResource("6_ryrav")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -40, 0, -52)
mob_to_spawn = ExtResource("5_7jktm")
[node name="MobSpawner3D3" parent="." instance=ExtResource("6_ryrav")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -48, 0, -27)
mob_to_spawn = ExtResource("5_7jktm")
[node name="KillPlane" type="Area3D" parent="."]
collision_layer = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="KillPlane"]
transform = Transform3D(6.4, 0, 0, 0, 6.4, 0, 0, 0, 6.4, -28, -7, -22)
shape = SubResource("WorldBoundaryShape3D_eow3j")
debug_color = Color(0.635294, 0.34902, 0.988235, 0.792157)
[node name="Player" parent="." instance=ExtResource("1_80nbo")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24, 2, -19)
[node name="ScoreLabel" type="Label" parent="."]
unique_name_in_owner = true
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -106.0
offset_top = 24.0
offset_right = 106.0
offset_bottom = 101.0
grow_horizontal = 2
text = "Score: 0"
label_settings = SubResource("LabelSettings_ryrav")
[node name="cookie_3d" parent="." instance=ExtResource("8_j5wjh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0, -4)
[node name="cookie_3d_2" parent="." instance=ExtResource("8_j5wjh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -51, 0, -53)
[node name="CSGBox3D" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -7.5, -5)
material_override = ExtResource("1_fc0e3")
use_collision = true
size = Vector3(10, 15, 10)
material = ExtResource("2_7jktm")
[node name="CSGBox3D6" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -51, -7.5, -53)
use_collision = true
size = Vector3(10, 15, 10)
material = ExtResource("1_fc0e3")
[node name="CSGBox3D3" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5, -7, -22)
use_collision = true
size = Vector3(5, 14, 20)
material = ExtResource("2_7jktm")
[node name="CSGBox3D8" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5, -7.5, -38)
material_override = ExtResource("3_ryrav")
use_collision = true
size = Vector3(5, 15, 12)
material = ExtResource("2_7jktm")
[node name="CSGBox3D15" type="CSGBox3D" parent="."]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -33.5, -7.5, -54)
material_override = ExtResource("3_ryrav")
use_collision = true
size = Vector3(5, 15, 7)
material = ExtResource("2_7jktm")
[node name="CSGBox3D10" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -40.5, -1, -35.35)
use_collision = true
size = Vector3(5, 2, 4.1)
material = ExtResource("3_ryrav")
[node name="CSGBox3D12" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -51.5, -7.5, -35)
material_override = ExtResource("3_ryrav")
use_collision = true
size = Vector3(1, 15, 4)
material = ExtResource("2_7jktm")
[node name="CSGBox3D13" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -54.5, -7.5, -40)
material_override = ExtResource("3_ryrav")
use_collision = true
size = Vector3(1, 15, 4)
material = ExtResource("2_7jktm")
[node name="CSGBox3D14" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -51.5, -7.5, -44)
material_override = ExtResource("3_ryrav")
use_collision = true
size = Vector3(1, 15, 4)
material = ExtResource("2_7jktm")
[node name="CSGBox3D11" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -40.5, -1, -42.15)
use_collision = true
size = Vector3(5, 2, 4.3)
material = ExtResource("3_ryrav")
[node name="CSGBox3D9" type="CSGBox3D" parent="."]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -11.5, -7.5, -24)
material_override = ExtResource("3_ryrav")
use_collision = true
size = Vector3(5, 15, 9)
material = ExtResource("2_7jktm")
[node name="CSGBox3D5" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -40.5, -7.5, -53.5)
use_collision = true
size = Vector3(7, 15, 15)
material = ExtResource("2_7jktm")
[node name="CSGBox3D2" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5, -7.5, -26.5)
use_collision = true
size = Vector3(15, 15, 11)
material = ExtResource("2_7jktm")
[node name="CSGBox3D16" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5, -6.5, -15.5)
use_collision = true
size = Vector3(15, 17, 11)
material = ExtResource("2_7jktm")
[node name="CSGBox3D7" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -43, -7.5, -26.5)
use_collision = true
size = Vector3(24, 15, 11)
material = ExtResource("2_7jktm")
[node name="CSGBox3D4" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23, -7.5, -53)
use_collision = true
size = Vector3(14, 15, 18)
material = ExtResource("2_7jktm")
[node name="CSGBox3D17" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -36.5, 7.5, -26.5)
use_collision = true
size = Vector3(3, 15, 3)
material = ExtResource("2_7jktm")
[node name="CSGBox3D18" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5, 7.5, -51.5)
use_collision = true
size = Vector3(3, 15, 3)
material = ExtResource("2_7jktm")
[connection signal="mob_spawned" from="MobSpawner3D" to="." method="_on_mob_spawner_3d_mob_spawned"]
[connection signal="mob_spawned" from="MobSpawner3D2" to="." method="_on_mob_spawner_3d_mob_spawned"]
[connection signal="mob_spawned" from="MobSpawner3D3" to="." method="_on_mob_spawner_3d_mob_spawned"]
[connection signal="body_entered" from="KillPlane" to="." method="_on_kill_plane_body_entered"]

1
icon.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>

After

Width:  |  Height:  |  Size: 994 B

37
icon.svg.import Normal file
View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bobgb52o2hrj6"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

BIN
level/checkboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

View File

@@ -0,0 +1,36 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cei1u6horkbiu"
path.s3tc="res://.godot/imported/checkboard.png-130d133a6029e1ca9a92686e2c703873.s3tc.ctex"
path.etc2="res://.godot/imported/checkboard.png-130d133a6029e1ca9a92686e2c703873.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://level/checkboard.png"
dest_files=["res://.godot/imported/checkboard.png-130d133a6029e1ca9a92686e2c703873.s3tc.ctex", "res://.godot/imported/checkboard.png-130d133a6029e1ca9a92686e2c703873.etc2.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

10
level/sky.gdshader Normal file
View File

@@ -0,0 +1,10 @@
shader_type sky;
uniform vec3 top_color : source_color = vec3(1.0);
uniform vec3 bottom_color : source_color = vec3(1.0);
uniform sampler2D gradient_curve;
void sky() {
// gradient
COLOR = mix(top_color.rgb, bottom_color.rgb, texture(gradient_curve, vec2(SKY_COORDS.y, 0.0)).x);
}

1
level/sky.gdshader.uid Normal file
View File

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

View File

@@ -0,0 +1,86 @@
[gd_scene load_steps=7 format=3 uid="uid://dp7sxe5xl5shk"]
[ext_resource type="Texture2D" uid="uid://cei1u6horkbiu" path="res://level/checkboard.png" id="1_cig4d"]
[ext_resource type="PackedScene" uid="uid://h8tyroiwkr42" path="res://mob/player.tscn" id="2_bc4qa"]
[sub_resource type="Environment" id="Environment_pev5d"]
background_mode = 1
background_color = Color(0, 0.807843, 1, 1)
ambient_light_source = 2
ambient_light_color = Color(0.815625, 0.702063, 0.54125, 1)
ambient_light_sky_contribution = 0.31
tonemap_mode = 2
tonemap_exposure = 1.05
tonemap_white = 0.95
ssao_intensity = 1.0
glow_normalized = true
glow_intensity = 0.2
fog_enabled = true
fog_light_color = Color(0, 0.478431, 0.764706, 1)
fog_density = 0.002
fog_height = 0.52
fog_height_density = 0.1319
volumetric_fog_density = 0.1525
volumetric_fog_albedo = Color(0.203922, 0.203922, 1, 1)
volumetric_fog_emission = Color(0.0431373, 0.0431373, 0.0431373, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ooyhk"]
albedo_color = Color(1, 0.717647, 0.188235, 1)
albedo_texture = ExtResource("1_cig4d")
uv1_triplanar = true
uv1_triplanar_sharpness = 4.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pixig"]
albedo_color = Color(0.286275, 0.682353, 0.427451, 1)
albedo_texture = ExtResource("1_cig4d")
uv1_triplanar = true
uv1_triplanar_sharpness = 4.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_7l0sc"]
albedo_color = Color(0.286275, 0.682353, 0.427451, 1)
albedo_texture = ExtResource("1_cig4d")
uv1_triplanar = true
uv1_triplanar_sharpness = 4.0
[node name="TemporaryLevel" type="Node3D"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_pev5d")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.707107, -0.612373, 0.353553, 0, 0.5, 0.866026, -0.707107, -0.612373, 0.353553, 0, 10, 0)
shadow_enabled = true
directional_shadow_max_distance = 40.0
[node name="Bridge2" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10.5)
use_collision = true
size = Vector3(4, 1, 3)
material = SubResource("StandardMaterial3D_ooyhk")
[node name="Bridge5" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 14.5)
use_collision = true
size = Vector3(4, 1, 3)
material = SubResource("StandardMaterial3D_ooyhk")
[node name="Bridge6" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 18.5)
use_collision = true
size = Vector3(4, 1, 3)
material = SubResource("StandardMaterial3D_ooyhk")
[node name="Platform6" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -5, 0)
use_collision = true
size = Vector3(17, 11, 15)
material = SubResource("StandardMaterial3D_pixig")
[node name="Platform7" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -5, 26)
use_collision = true
size = Vector3(9, 11, 9)
material = SubResource("StandardMaterial3D_7l0sc")
[node name="CharacterBody3D" parent="." instance=ExtResource("2_bc4qa")]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0.292204, 1.5, 0.259768)

10
mob/bat/bat_mob_mat.tres Normal file
View File

@@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://vxjmb87ocrs3"]
[ext_resource type="Texture2D" uid="uid://2qvp3lxbf3ae" path="res://mob/bat/bat_model_bat_palette.png" id="1_sri6l"]
[resource]
resource_local_to_scene = true
resource_name = "bat_mat"
cull_mode = 2
albedo_texture = ExtResource("1_sri6l")
roughness = 0.427273

BIN
mob/bat/bat_model.glb Normal file

Binary file not shown.

1839
mob/bat/bat_model.glb.import Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

View File

@@ -0,0 +1,36 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2qvp3lxbf3ae"
path.s3tc="res://.godot/imported/bat_model_bat_palette.png-7ad9c3c193e1d543015fac56e3d622e5.s3tc.ctex"
path.etc2="res://.godot/imported/bat_model_bat_palette.png-7ad9c3c193e1d543015fac56e3d622e5.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://mob/bat/bat_model_bat_palette.png"
dest_files=["res://.godot/imported/bat_model_bat_palette.png-7ad9c3c193e1d543015fac56e3d622e5.s3tc.ctex", "res://.godot/imported/bat_model_bat_palette.png-7ad9c3c193e1d543015fac56e3d622e5.etc2.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

47
mob/bat_mob.gd Normal file
View File

@@ -0,0 +1,47 @@
extends RigidBody3D
signal died
@onready var bat_model: Node3D = %bat_model
@onready var player: CharacterBody3D = get_node("/root/Game/Player")
@onready var corpse_timer: Timer = $CorpseTimer
@onready var hurt_box: Area3D = %HurtBox
var speed = randf_range(2.0, 4.0)
var health = 100.0
func take_damage(damage: float = 25.0) -> void:
if is_zero_approx(health):
return # catch shooting mob on ground and stopping it from despawning
else:
%HurtSound.play()
bat_model.hurt()
health = clampf((health - damage), 0.0, health)
if is_zero_approx(health):
# TODO: do more with this
set_physics_process(false)
gravity_scale = 1.0
%DieSound.play()
var die_direction = global_position.direction_to(player.global_position) * -1.0
var blerg_force = Vector3.UP * randf_range(2.0, 5.0)
apply_central_impulse(die_direction * 8.0 + blerg_force)
died.emit()
corpse_timer.start()
func _on_corpse_timer_timeout() -> void:
queue_free()
func _physics_process(delta: float) -> void:
var direction: Vector3 = global_position.direction_to(player.global_position)
direction.y = 0.0
linear_velocity = direction * speed
bat_model.rotation.y = Vector3.MODEL_FRONT.signed_angle_to(direction, Vector3.UP)
var targets = hurt_box.get_overlapping_bodies()
if not targets.is_empty():
for t in targets:
if t.has_method("hurt"):
t.hurt(5*delta)

1
mob/bat_mob.gd.uid Normal file
View File

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

81
mob/bat_mob.tscn Normal file
View File

@@ -0,0 +1,81 @@
[gd_scene load_steps=9 format=3 uid="uid://3t7u0llrbbi"]
[ext_resource type="Script" uid="uid://c0nx5q5ppfatt" path="res://mob/bat_mob.gd" id="1_0ebaf"]
[ext_resource type="PackedScene" uid="uid://gvin6dmn1uk8" path="res://mob/bat_model.tscn" id="1_1xugm"]
[ext_resource type="Texture2D" uid="uid://2qvp3lxbf3ae" path="res://mob/bat/bat_model_bat_palette.png" id="3_yuo4x"]
[ext_resource type="AudioStream" uid="uid://cvge1n06euj5o" path="res://mob/mob_take_damage.wav" id="4_mjy8e"]
[ext_resource type="AudioStream" uid="uid://hghb3bqm52oh" path="res://mob/mob_ko.wav" id="5_5et38"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_0ebaf"]
height = 1.4
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_iwjed"]
resource_local_to_scene = true
resource_name = "bat_mat"
cull_mode = 2
albedo_texture = ExtResource("3_yuo4x")
roughness = 0.427273
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_yuo4x"]
height = 1.6
[node name="BatMob" type="RigidBody3D"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
collision_layer = 2
gravity_scale = 0.0
script = ExtResource("1_0ebaf")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(-2.62268e-08, 0.6, 0, -0.6, -2.62268e-08, 0, 0, 0, 0.6, 0, 0, 0)
shape = SubResource("CapsuleShape3D_0ebaf")
[node name="bat_model" parent="." instance=ExtResource("1_1xugm")]
unique_name_in_owner = true
[node name="Skeleton3D" parent="bat_model/Armature" index="0"]
bones/0/position = Vector3(0, -0.0173995, 0)
bones/1/rotation = Quaternion(0.0455521, 0.109607, -0.618641, 0.776656)
bones/2/rotation = Quaternion(-0.129224, -0.0444413, 0.324096, 0.936102)
bones/3/rotation = Quaternion(-0.201664, -0.00156411, 0.238139, 0.950063)
bones/4/rotation = Quaternion(0.0455521, -0.109607, 0.618641, 0.776656)
bones/5/rotation = Quaternion(-0.129224, 0.0444413, -0.324096, 0.936102)
bones/6/rotation = Quaternion(-0.201664, 0.00156411, -0.238139, 0.950063)
bones/7/position = Vector3(0.130992, -0.227392, -0.0878515)
bones/7/rotation = Quaternion(0.261968, 0.0834552, 0.265751, 0.924005)
bones/8/rotation = Quaternion(3.46134e-08, 0.550375, 0.834917, 2.3571e-08)
bones/10/position = Vector3(-0.130992, -0.227392, -0.0878515)
bones/10/rotation = Quaternion(0.261968, -0.0834552, -0.265751, 0.924005)
bones/11/rotation = Quaternion(2.41321e-08, 0.550375, 0.834917, 3.92162e-08)
[node name="bat" parent="bat_model/Armature/Skeleton3D" index="0"]
surface_material_override/0 = SubResource("StandardMaterial3D_iwjed")
[node name="CorpseTimer" type="Timer" parent="."]
wait_time = 5.0
one_shot = true
[node name="HurtSound" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
stream = ExtResource("4_mjy8e")
volume_db = -20.0
max_db = 1.0
[node name="DieSound" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
stream = ExtResource("5_5et38")
volume_db = -20.0
max_db = 1.0
[node name="HurtBox" type="Area3D" parent="."]
unique_name_in_owner = true
collision_layer = 0
collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="HurtBox"]
transform = Transform3D(0.45, -3.93403e-08, 3.93403e-08, 3.93403e-08, -1.96701e-08, -0.45, 3.93403e-08, 0.45, -1.96701e-08, -1.74846e-08, 0, 0.2)
shape = SubResource("CapsuleShape3D_yuo4x")
debug_color = Color(0.894118, 0.254902, 0.482353, 0.607843)
[connection signal="timeout" from="CorpseTimer" to="." method="_on_corpse_timer_timeout"]
[editable path="bat_model"]

10
mob/bat_model.gd Normal file
View File

@@ -0,0 +1,10 @@
extends Node3D
@onready var animation_tree: AnimationTree = %AnimationTree
@onready var animation_player: AnimationPlayer = $AnimationPlayer
func hurt() -> void:
animation_tree.set("parameters/OneShot/request", true)
func die() -> void:
animation_player.pause()

1
mob/bat_model.gd.uid Normal file
View File

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

223
mob/bat_model.tscn Normal file
View File

@@ -0,0 +1,223 @@
[gd_scene load_steps=13 format=3 uid="uid://gvin6dmn1uk8"]
[ext_resource type="PackedScene" uid="uid://hglc5k68m7d1" path="res://mob/bat/bat_model.glb" id="1_12yrx"]
[ext_resource type="Script" uid="uid://cgv01dthn7641" path="res://mob/bat_model.gd" id="2_dmdl0"]
[ext_resource type="Material" uid="uid://vxjmb87ocrs3" path="res://mob/bat/bat_mob_mat.tres" id="2_vofu1"]
[sub_resource type="Animation" id="Animation_0gbdx"]
resource_name = "Idle"
length = 1.33333
loop_mode = 1
tracks/0/type = "position_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:body")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, -0.0074, 0, 0.0333333, 1, 0, -0.0142, 0, 0.0666667, 1, 0, -0.0198, 0, 0.1, 1, 0, -0.0236, 0, 0.166667, 1, 0, -0.0236, 0, 0.2, 1, 0, -0.0198, 0, 0.233333, 1, 0, -0.0142, 0, 0.266667, 1, 0, -0.0074, 0, 0.333333, 1, 0, 0.00739999, 0, 0.366667, 1, 0, 0.0142, 0, 0.4, 1, 0, 0.0198, 0, 0.433333, 1, 0, 0.0236, 0, 0.5, 1, 0, 0.0236, 0, 0.533333, 1, 0, 0.0198, 0, 0.566667, 1, 0, 0.0142, 0, 0.6, 1, 0, 0.00739999, 0, 0.666667, 1, 0, -0.0074, 0, 0.7, 1, 0, -0.0142, 0, 0.733333, 1, 0, -0.0198, 0, 0.766667, 1, 0, -0.0236, 0, 0.833333, 1, 0, -0.0236, 0, 0.866667, 1, 0, -0.0198, 0, 0.9, 1, 0, -0.0142, 0, 0.933333, 1, 0, -0.0074, 0, 1, 1, 0, 0.00739999, 0, 1.03333, 1, 0, 0.0142, 0, 1.06667, 1, 0, 0.0198, 0, 1.1, 1, 0, 0.0236, 0, 1.16667, 1, 0, 0.0236, 0, 1.2, 1, 0, 0.0198, 0, 1.23333, 1, 0, 0.0142, 0, 1.26667, 1, 0, 0.00739999, 0, 1.33333, 1, 0, -0.0074, 0)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:wing_1.L")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, -0.0286549, 0.188485, -0.686718, 0.701478, 0.0333333, 1, -0.0506094, 0.208724, -0.677509, 0.703459, 0.0666667, 1, -0.0610847, 0.215431, -0.666256, 0.71131, 0.1, 1, -0.05709, 0.207045, -0.655256, 0.724233, 0.133333, 1, -0.0396006, 0.186493, -0.644631, 0.74034, 0.166667, 1, -0.0107812, 0.157663, -0.633842, 0.757147, 0.2, 1, 0.0267386, 0.12419, -0.622616, 0.772147, 0.266667, 1, 0.114195, 0.0556545, -0.600903, 0.789163, 0.3, 1, 0.155982, 0.0253652, -0.59312, 0.789452, 0.333333, 1, 0.190651, 6.60251e-05, -0.590026, 0.784552, 0.366667, 1, 0.213966, -0.0185891, -0.593371, 0.775747, 0.4, 1, 0.222174, -0.0279345, -0.602828, 0.765805, 0.433333, 1, 0.213282, -0.0252487, -0.61726, 0.756877, 0.466667, 1, 0.19033, -0.0110549, -0.634785, 0.7488, 0.5, 1, 0.157487, 0.0130927, -0.653025, 0.740665, 0.533333, 1, 0.118744, 0.045142, -0.669545, 0.731827, 0.6, 1, 0.0378164, 0.121276, -0.689637, 0.712925, 0.633333, 1, 0.001578, 0.158023, -0.691096, 0.705275, 0.666667, 1, -0.0286549, 0.188485, -0.686718, 0.701478, 0.7, 1, -0.0506094, 0.208724, -0.677509, 0.703459, 0.733333, 1, -0.0610847, 0.215431, -0.666256, 0.71131, 0.766667, 1, -0.05709, 0.207045, -0.655256, 0.724233, 0.8, 1, -0.0396006, 0.186493, -0.644631, 0.74034, 0.833333, 1, -0.0107812, 0.157663, -0.633842, 0.757147, 0.866667, 1, 0.0267386, 0.12419, -0.622616, 0.772147, 0.933333, 1, 0.114195, 0.0556545, -0.600903, 0.789163, 0.966667, 1, 0.155982, 0.0253652, -0.59312, 0.789452, 1, 1, 0.190651, 6.60251e-05, -0.590026, 0.784552, 1.03333, 1, 0.213966, -0.0185891, -0.593371, 0.775747, 1.06667, 1, 0.222174, -0.0279345, -0.602828, 0.765805, 1.1, 1, 0.213282, -0.0252487, -0.61726, 0.756877, 1.13333, 1, 0.19033, -0.0110549, -0.634785, 0.7488, 1.16667, 1, 0.157487, 0.0130927, -0.653025, 0.740665, 1.2, 1, 0.118744, 0.045142, -0.669545, 0.731827, 1.26667, 1, 0.0378164, 0.121276, -0.689637, 0.712925, 1.3, 1, 0.001578, 0.158023, -0.691096, 0.705275, 1.33333, 1, -0.0286549, 0.188485, -0.686718, 0.701478)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:wing_2.L")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, -0.0560155, -0.016041, 0.274838, 0.959724, 0.0333333, 1, -0.107724, -0.0293087, 0.260889, 0.958892, 0.0666667, 1, -0.150109, -0.0400536, 0.254681, 0.954464, 0.1, 1, -0.178377, -0.0485314, 0.258005, 0.948293, 0.133333, 1, -0.188128, -0.0538743, 0.269983, 0.94277, 0.166667, 1, -0.176689, -0.0543572, 0.288976, 0.939318, 0.2, 1, -0.147367, -0.0491943, 0.312801, 0.937026, 0.233333, 1, -0.104947, -0.0380736, 0.338908, 0.934172, 0.266667, 1, -0.0542423, -0.0212793, 0.364585, 0.929345, 0.3, 1, 4.35922e-07, 2.55374e-07, 0.387197, 0.921997, 0.333333, 1, 0.0532716, 0.023607, 0.404457, 0.912699, 0.366667, 1, 0.101459, 0.0465808, 0.414628, 0.903117, 0.4, 1, 0.140874, 0.0655118, 0.416552, 0.895738, 0.433333, 1, 0.168002, 0.0771313, 0.410045, 0.893134, 0.466667, 1, 0.178911, 0.0792831, 0.397312, 0.896576, 0.5, 1, 0.170442, 0.0715782, 0.380524, 0.906106, 0.533333, 1, 0.14463, 0.056739, 0.360771, 0.919623, 0.566667, 1, 0.104948, 0.0380741, 0.338908, 0.934172, 0.6, 1, 0.0552696, 0.0184505, 0.316108, 0.946932, 0.633333, 1, 3.97739e-07, 2.93199e-07, 0.294044, 0.955792, 0.666667, 1, -0.0560155, -0.016041, 0.274838, 0.959724, 0.7, 1, -0.107724, -0.0293087, 0.260889, 0.958892, 0.733333, 1, -0.150109, -0.0400536, 0.254681, 0.954464, 0.766667, 1, -0.178377, -0.0485314, 0.258005, 0.948293, 0.8, 1, -0.188128, -0.0538743, 0.269983, 0.94277, 0.833333, 1, -0.176689, -0.0543572, 0.288976, 0.939318, 0.866667, 1, -0.147367, -0.0491943, 0.312801, 0.937026, 0.9, 1, -0.104947, -0.0380736, 0.338908, 0.934172, 0.933333, 1, -0.0542423, -0.0212793, 0.364585, 0.929345, 0.966667, 1, 4.35922e-07, 2.55374e-07, 0.387197, 0.921997, 1, 1, 0.0532716, 0.023607, 0.404457, 0.912699, 1.03333, 1, 0.101459, 0.0465808, 0.414628, 0.903117, 1.06667, 1, 0.140874, 0.0655118, 0.416552, 0.895738, 1.1, 1, 0.168002, 0.0771313, 0.410045, 0.893134, 1.13333, 1, 0.178911, 0.0792831, 0.397312, 0.896576, 1.16667, 1, 0.170442, 0.0715782, 0.380524, 0.906106, 1.2, 1, 0.14463, 0.056739, 0.360771, 0.919623, 1.23333, 1, 0.104948, 0.0380741, 0.338908, 0.934172, 1.26667, 1, 0.0552696, 0.0184505, 0.316108, 0.946932, 1.3, 1, 3.97739e-07, 2.93199e-07, 0.294044, 0.955792, 1.33333, 1, -0.0560155, -0.016041, 0.274838, 0.959723)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:wing_3.L")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, 0.0412136, 0.059985, 0.264753, 0.961566, 0.0333333, 1, -0.0159354, 0.0440908, 0.244883, 0.968419, 0.0666667, 1, -0.073461, 0.0305335, 0.228073, 0.970389, 0.1, 1, -0.126218, 0.0194948, 0.21651, 0.967891, 0.133333, 1, -0.169154, 0.0105836, 0.212432, 0.962366, 0.166667, 1, -0.197486, 0.00342183, 0.217359, 0.955899, 0.2, 1, -0.20688, -0.00128304, 0.230104, 0.950921, 0.233333, 1, -0.194684, -0.00193852, 0.248813, 0.948782, 0.266667, 1, -0.164213, 0.00231133, 0.271453, 0.948336, 0.3, 1, -0.120273, 0.011884, 0.29574, 0.947592, 0.333333, 1, -0.0677396, 0.0266105, 0.319228, 0.944879, 0.366667, 1, -0.0114933, 0.0454515, 0.339527, 0.939427, 0.4, 1, 0.0437561, 0.0664394, 0.354556, 0.931645, 0.433333, 1, 0.0936447, 0.086843, 0.362736, 0.923099, 0.466667, 1, 0.134205, 0.103508, 0.36302, 0.916238, 0.5, 1, 0.161688, 0.113444, 0.355316, 0.91364, 0.533333, 1, 0.172105, 0.114807, 0.34197, 0.916655, 0.566667, 1, 0.162369, 0.107434, 0.325273, 0.925361, 0.6, 1, 0.134745, 0.0938879, 0.306267, 0.937672, 0.633333, 1, 0.0929822, 0.077208, 0.285731, 0.950658, 0.666667, 1, 0.0412136, 0.059985, 0.264753, 0.961566, 0.7, 1, -0.0159354, 0.0440908, 0.244883, 0.968419, 0.733333, 1, -0.073461, 0.0305335, 0.228073, 0.970389, 0.766667, 1, -0.126218, 0.0194948, 0.21651, 0.967891, 0.8, 1, -0.169154, 0.0105836, 0.212432, 0.962366, 0.833333, 1, -0.197486, 0.00342183, 0.217359, 0.955899, 0.866667, 1, -0.20688, -0.00128304, 0.230104, 0.950921, 0.9, 1, -0.194684, -0.00193852, 0.248813, 0.948782, 0.933333, 1, -0.164213, 0.00231133, 0.271453, 0.948336, 0.966667, 1, -0.120273, 0.011884, 0.29574, 0.947592, 1, 1, -0.0677396, 0.0266105, 0.319228, 0.944879, 1.03333, 1, -0.0114933, 0.0454515, 0.339527, 0.939427, 1.06667, 1, 0.0437561, 0.0664394, 0.354556, 0.931645, 1.1, 1, 0.0936447, 0.086843, 0.362736, 0.923099, 1.13333, 1, 0.134205, 0.103508, 0.36302, 0.916238, 1.16667, 1, 0.161688, 0.113444, 0.355316, 0.91364, 1.2, 1, 0.172105, 0.114807, 0.34197, 0.916655, 1.23333, 1, 0.162369, 0.107434, 0.325273, 0.925361, 1.26667, 1, 0.134745, 0.0938879, 0.306267, 0.937672, 1.3, 1, 0.0929822, 0.077208, 0.285731, 0.950658, 1.33333, 1, 0.0412136, 0.059985, 0.264753, 0.961566)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:wing_1.R")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.0286549, -0.188485, 0.686718, 0.701478, 0.0333333, 1, -0.0506094, -0.208724, 0.677509, 0.703459, 0.0666667, 1, -0.0610847, -0.215431, 0.666256, 0.71131, 0.1, 1, -0.05709, -0.207045, 0.655256, 0.724233, 0.133333, 1, -0.0396006, -0.186493, 0.644631, 0.74034, 0.166667, 1, -0.0107812, -0.157663, 0.633842, 0.757147, 0.2, 1, 0.0267386, -0.12419, 0.622616, 0.772147, 0.266667, 1, 0.114195, -0.0556545, 0.600903, 0.789163, 0.3, 1, 0.155982, -0.0253652, 0.59312, 0.789452, 0.333333, 1, 0.190651, -6.60251e-05, 0.590026, 0.784552, 0.366667, 1, 0.213966, 0.0185891, 0.593371, 0.775747, 0.4, 1, 0.222174, 0.0279345, 0.602828, 0.765805, 0.433333, 1, 0.213282, 0.0252487, 0.61726, 0.756877, 0.466667, 1, 0.19033, 0.0110549, 0.634785, 0.7488, 0.5, 1, 0.157487, -0.0130927, 0.653025, 0.740665, 0.533333, 1, 0.118744, -0.045142, 0.669545, 0.731827, 0.6, 1, 0.0378164, -0.121276, 0.689637, 0.712925, 0.633333, 1, 0.001578, -0.158023, 0.691096, 0.705275, 0.666667, 1, -0.0286549, -0.188485, 0.686718, 0.701478, 0.7, 1, -0.0506094, -0.208724, 0.677509, 0.703459, 0.733333, 1, -0.0610847, -0.215431, 0.666256, 0.71131, 0.766667, 1, -0.05709, -0.207045, 0.655256, 0.724233, 0.8, 1, -0.0396006, -0.186493, 0.644631, 0.74034, 0.833333, 1, -0.0107812, -0.157663, 0.633842, 0.757147, 0.866667, 1, 0.0267386, -0.12419, 0.622616, 0.772147, 0.933333, 1, 0.114195, -0.0556545, 0.600903, 0.789163, 0.966667, 1, 0.155982, -0.0253652, 0.59312, 0.789452, 1, 1, 0.190651, -6.60251e-05, 0.590026, 0.784552, 1.03333, 1, 0.213966, 0.0185891, 0.593371, 0.775747, 1.06667, 1, 0.222174, 0.0279345, 0.602828, 0.765805, 1.1, 1, 0.213282, 0.0252487, 0.61726, 0.756877, 1.13333, 1, 0.19033, 0.0110549, 0.634785, 0.7488, 1.16667, 1, 0.157487, -0.0130927, 0.653025, 0.740665, 1.2, 1, 0.118744, -0.045142, 0.669545, 0.731827, 1.26667, 1, 0.0378164, -0.121276, 0.689637, 0.712925, 1.3, 1, 0.001578, -0.158023, 0.691096, 0.705275, 1.33333, 1, -0.0286549, -0.188485, 0.686718, 0.701478)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:wing_2.R")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.0560155, 0.016041, -0.274838, 0.959724, 0.0333333, 1, -0.107724, 0.0293087, -0.260889, 0.958892, 0.0666667, 1, -0.150109, 0.0400536, -0.254681, 0.954464, 0.1, 1, -0.178377, 0.0485314, -0.258005, 0.948293, 0.133333, 1, -0.188128, 0.0538743, -0.269983, 0.94277, 0.166667, 1, -0.176689, 0.0543572, -0.288976, 0.939318, 0.2, 1, -0.147367, 0.0491943, -0.312801, 0.937026, 0.233333, 1, -0.104947, 0.0380736, -0.338908, 0.934172, 0.266667, 1, -0.0542423, 0.0212793, -0.364585, 0.929345, 0.3, 1, 4.35922e-07, -2.55374e-07, -0.387197, 0.921997, 0.333333, 1, 0.0532716, -0.023607, -0.404457, 0.912699, 0.366667, 1, 0.101459, -0.0465808, -0.414628, 0.903117, 0.4, 1, 0.140874, -0.0655118, -0.416552, 0.895738, 0.433333, 1, 0.168002, -0.0771313, -0.410045, 0.893134, 0.466667, 1, 0.178911, -0.0792831, -0.397312, 0.896576, 0.5, 1, 0.170442, -0.0715782, -0.380524, 0.906106, 0.533333, 1, 0.14463, -0.056739, -0.360771, 0.919623, 0.566667, 1, 0.104948, -0.0380741, -0.338908, 0.934172, 0.6, 1, 0.0552696, -0.0184505, -0.316108, 0.946932, 0.633333, 1, 3.97739e-07, -2.93199e-07, -0.294044, 0.955792, 0.666667, 1, -0.0560155, 0.016041, -0.274838, 0.959724, 0.7, 1, -0.107724, 0.0293087, -0.260889, 0.958892, 0.733333, 1, -0.150109, 0.0400536, -0.254681, 0.954464, 0.766667, 1, -0.178377, 0.0485314, -0.258005, 0.948293, 0.8, 1, -0.188128, 0.0538743, -0.269983, 0.94277, 0.833333, 1, -0.176689, 0.0543572, -0.288976, 0.939318, 0.866667, 1, -0.147367, 0.0491943, -0.312801, 0.937026, 0.9, 1, -0.104947, 0.0380736, -0.338908, 0.934172, 0.933333, 1, -0.0542423, 0.0212793, -0.364585, 0.929345, 0.966667, 1, 4.35922e-07, -2.55374e-07, -0.387197, 0.921997, 1, 1, 0.0532716, -0.023607, -0.404457, 0.912699, 1.03333, 1, 0.101459, -0.0465808, -0.414628, 0.903117, 1.06667, 1, 0.140874, -0.0655118, -0.416552, 0.895738, 1.1, 1, 0.168002, -0.0771313, -0.410045, 0.893134, 1.13333, 1, 0.178911, -0.0792831, -0.397312, 0.896576, 1.16667, 1, 0.170442, -0.0715782, -0.380524, 0.906106, 1.2, 1, 0.14463, -0.056739, -0.360771, 0.919623, 1.23333, 1, 0.104948, -0.0380741, -0.338908, 0.934172, 1.26667, 1, 0.0552696, -0.0184505, -0.316108, 0.946932, 1.3, 1, 3.97739e-07, -2.93199e-07, -0.294044, 0.955792, 1.33333, 1, -0.0560155, 0.016041, -0.274838, 0.959723)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:wing_3.R")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, 0.0412136, -0.059985, -0.264753, 0.961566, 0.0333333, 1, -0.0159354, -0.0440908, -0.244883, 0.968419, 0.0666667, 1, -0.073461, -0.0305335, -0.228073, 0.970389, 0.1, 1, -0.126218, -0.0194948, -0.21651, 0.967891, 0.133333, 1, -0.169154, -0.0105836, -0.212432, 0.962366, 0.166667, 1, -0.197486, -0.00342183, -0.217359, 0.955899, 0.2, 1, -0.20688, 0.00128304, -0.230104, 0.950921, 0.233333, 1, -0.194684, 0.00193852, -0.248813, 0.948782, 0.266667, 1, -0.164213, -0.00231133, -0.271453, 0.948336, 0.3, 1, -0.120273, -0.011884, -0.29574, 0.947592, 0.333333, 1, -0.0677396, -0.0266105, -0.319228, 0.944879, 0.366667, 1, -0.0114933, -0.0454515, -0.339527, 0.939427, 0.4, 1, 0.0437561, -0.0664394, -0.354556, 0.931645, 0.433333, 1, 0.0936447, -0.086843, -0.362736, 0.923099, 0.466667, 1, 0.134205, -0.103508, -0.36302, 0.916238, 0.5, 1, 0.161688, -0.113444, -0.355316, 0.91364, 0.533333, 1, 0.172105, -0.114807, -0.34197, 0.916655, 0.566667, 1, 0.162369, -0.107434, -0.325273, 0.925361, 0.6, 1, 0.134745, -0.0938879, -0.306267, 0.937672, 0.633333, 1, 0.0929822, -0.077208, -0.285731, 0.950658, 0.666667, 1, 0.0412136, -0.059985, -0.264753, 0.961566, 0.7, 1, -0.0159354, -0.0440908, -0.244883, 0.968419, 0.733333, 1, -0.073461, -0.0305335, -0.228073, 0.970389, 0.766667, 1, -0.126218, -0.0194948, -0.21651, 0.967891, 0.8, 1, -0.169154, -0.0105836, -0.212432, 0.962366, 0.833333, 1, -0.197486, -0.00342183, -0.217359, 0.955899, 0.866667, 1, -0.20688, 0.00128304, -0.230104, 0.950921, 0.9, 1, -0.194684, 0.00193852, -0.248813, 0.948782, 0.933333, 1, -0.164213, -0.00231133, -0.271453, 0.948336, 0.966667, 1, -0.120273, -0.011884, -0.29574, 0.947592, 1, 1, -0.0677396, -0.0266105, -0.319228, 0.944879, 1.03333, 1, -0.0114933, -0.0454515, -0.339527, 0.939427, 1.06667, 1, 0.0437561, -0.0664394, -0.354556, 0.931645, 1.1, 1, 0.0936447, -0.086843, -0.362736, 0.923099, 1.13333, 1, 0.134205, -0.103508, -0.36302, 0.916238, 1.16667, 1, 0.161688, -0.113444, -0.355316, 0.91364, 1.2, 1, 0.172105, -0.114807, -0.34197, 0.916655, 1.23333, 1, 0.162369, -0.107434, -0.325273, 0.925361, 1.26667, 1, 0.134745, -0.0938879, -0.306267, 0.937672, 1.3, 1, 0.0929822, -0.077208, -0.285731, 0.950658, 1.33333, 1, 0.0412136, -0.059985, -0.264753, 0.961566)
tracks/7/type = "position_3d"
tracks/7/imported = true
tracks/7/enabled = true
tracks/7/path = NodePath("Armature/Skeleton3D:foot.L")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = PackedFloat32Array(0, 1, 0.130992, -0.227392, -0.0878515)
tracks/8/type = "rotation_3d"
tracks/8/imported = true
tracks/8/enabled = true
tracks/8/path = NodePath("Armature/Skeleton3D:foot.L")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = PackedFloat32Array(0, 1, 0.261968, 0.0834551, 0.265751, 0.924004)
tracks/9/type = "rotation_3d"
tracks/9/imported = true
tracks/9/enabled = true
tracks/9/path = NodePath("Armature/Skeleton3D:foot_2.L")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = PackedFloat32Array(0, 1, 3.84334e-08, 0.690882, 0.722967, 1.64515e-08, 0.0333333, 1, 3.55166e-08, 0.673012, 0.739631, 2.06281e-08, 0.0666667, 1, 4.017e-08, 0.650774, 0.759271, 2.5428e-08, 0.133333, 1, 3.47263e-08, 0.60042, 0.799685, 2.08202e-08, 0.166667, 1, 3.25479e-08, 0.576432, 0.817145, 1.90111e-08, 0.2, 1, 3.92535e-08, 0.556296, 0.830985, 2.60857e-08, 0.233333, 1, 2.84263e-08, 0.542441, 0.840094, 2.02176e-08, 0.3, 1, 2.84263e-08, 0.542441, 0.840094, 2.02176e-08, 0.333333, 1, 3.40507e-08, 0.556296, 0.830985, 2.08829e-08, 0.366667, 1, 3.25479e-08, 0.576432, 0.817145, 1.90111e-08, 0.4, 1, 1.85956e-08, 0.60042, 0.799685, 2.6308e-08, 0.466667, 1, 4.017e-08, 0.650774, 0.759271, 2.5428e-08, 0.5, 1, 3.55166e-08, 0.673012, 0.739631, 2.06281e-08, 0.533333, 1, 3.33283e-08, 0.690882, 0.722967, 2.18859e-08, 0.566667, 1, 3.86219e-08, 0.702774, 0.711413, 2.28649e-08, 0.633333, 1, 3.82926e-08, 0.702774, 0.711413, 2.25356e-08, 0.666667, 1, 3.84334e-08, 0.690882, 0.722967, 1.64515e-08, 0.7, 1, 3.55166e-08, 0.673012, 0.739631, 2.06281e-08, 0.733333, 1, 4.017e-08, 0.650774, 0.759271, 2.5428e-08, 0.8, 1, 3.47263e-08, 0.60042, 0.799685, 2.08202e-08, 0.833333, 1, 3.25479e-08, 0.576432, 0.817145, 1.90111e-08, 0.866667, 1, 3.92535e-08, 0.556296, 0.830985, 2.60857e-08, 0.9, 1, 2.84263e-08, 0.542441, 0.840094, 2.02176e-08, 0.966667, 1, 2.84263e-08, 0.542441, 0.840094, 2.02176e-08, 1, 1, 3.40507e-08, 0.556296, 0.830985, 2.08829e-08, 1.03333, 1, 3.25479e-08, 0.576432, 0.817145, 1.90111e-08, 1.06667, 1, 1.85956e-08, 0.60042, 0.799685, 2.6308e-08, 1.13333, 1, 4.017e-08, 0.650774, 0.759271, 2.5428e-08, 1.16667, 1, 3.55166e-08, 0.673012, 0.739631, 2.06281e-08, 1.2, 1, 3.33283e-08, 0.690882, 0.722967, 2.18859e-08, 1.23333, 1, 3.86219e-08, 0.702774, 0.711413, 2.28649e-08, 1.3, 1, 3.82926e-08, 0.702774, 0.711413, 2.25356e-08, 1.33333, 1, 3.84334e-08, 0.690882, 0.722967, 1.64515e-08)
tracks/10/type = "position_3d"
tracks/10/imported = true
tracks/10/enabled = true
tracks/10/path = NodePath("Armature/Skeleton3D:foot.R")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = PackedFloat32Array(0, 1, -0.130992, -0.227392, -0.0878515)
tracks/11/type = "rotation_3d"
tracks/11/imported = true
tracks/11/enabled = true
tracks/11/path = NodePath("Armature/Skeleton3D:foot.R")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = PackedFloat32Array(0, 1, 0.261968, -0.0834551, -0.265751, 0.924004)
tracks/12/type = "rotation_3d"
tracks/12/imported = true
tracks/12/enabled = true
tracks/12/path = NodePath("Armature/Skeleton3D:foot_2.R")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = PackedFloat32Array(0, 1, 2.54238e-08, 0.690882, 0.722967, 3.63776e-08, 0.0333333, 1, 2.11774e-08, 0.673013, 0.739631, 4.78233e-08, 0.0666667, 1, 2.49787e-08, 0.650774, 0.759271, 3.23632e-08, 0.133333, 1, 3.67218e-08, 0.60042, 0.799685, 4.70949e-08, 0.166667, 1, 2.63662e-08, 0.576432, 0.817145, 4.85832e-08, 0.2, 1, 2.33095e-08, 0.556296, 0.830984, 3.56522e-08, 0.233333, 1, 2.52265e-08, 0.542441, 0.840094, 4.39632e-08, 0.3, 1, 2.52265e-08, 0.542441, 0.840094, 4.39632e-08, 0.333333, 1, 2.31416e-08, 0.556296, 0.830984, 3.54843e-08, 0.366667, 1, 2.63662e-08, 0.576432, 0.817145, 4.85832e-08, 0.4, 1, 3.15666e-08, 0.60042, 0.799685, 3.09642e-08, 0.466667, 1, 2.49787e-08, 0.650774, 0.759271, 3.23632e-08, 0.5, 1, 2.11774e-08, 0.673013, 0.739631, 4.78233e-08, 0.533333, 1, 2.52591e-08, 0.690882, 0.722967, 3.62129e-08, 0.566667, 1, 2.11702e-08, 0.702774, 0.711413, 3.50482e-08, 0.633333, 1, 2.14994e-08, 0.702774, 0.711413, 3.53775e-08, 0.666667, 1, 2.54238e-08, 0.690882, 0.722967, 3.63776e-08, 0.7, 1, 2.11774e-08, 0.673013, 0.739631, 4.78233e-08, 0.733333, 1, 2.49787e-08, 0.650774, 0.759271, 3.23632e-08, 0.8, 1, 3.67218e-08, 0.60042, 0.799685, 4.70949e-08, 0.833333, 1, 2.63662e-08, 0.576432, 0.817145, 4.85832e-08, 0.866667, 1, 2.33095e-08, 0.556296, 0.830984, 3.56522e-08, 0.9, 1, 2.52265e-08, 0.542441, 0.840094, 4.39632e-08, 0.966667, 1, 2.52265e-08, 0.542441, 0.840094, 4.39632e-08, 1, 1, 2.31416e-08, 0.556296, 0.830984, 3.54843e-08, 1.03333, 1, 2.63662e-08, 0.576432, 0.817145, 4.85832e-08, 1.06667, 1, 3.15666e-08, 0.60042, 0.799685, 3.09642e-08, 1.13333, 1, 2.49787e-08, 0.650774, 0.759271, 3.23632e-08, 1.16667, 1, 2.11774e-08, 0.673013, 0.739631, 4.78233e-08, 1.2, 1, 2.52591e-08, 0.690882, 0.722967, 3.62129e-08, 1.23333, 1, 2.11702e-08, 0.702774, 0.711413, 3.50482e-08, 1.3, 1, 2.14994e-08, 0.702774, 0.711413, 3.53775e-08, 1.33333, 1, 2.54238e-08, 0.690882, 0.722967, 3.63776e-08)
[sub_resource type="Animation" id="Animation_dmdl0"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D/bat:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D/bat:surface_material_override/0:albedo_color")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_2h6wp"]
_data = {
&"Idle": SubResource("Animation_0gbdx"),
&"RESET": SubResource("Animation_dmdl0")
}
[sub_resource type="Animation" id="Animation_xl0h5"]
length = 0.2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D/bat:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(1.3, 1.3, 1.3), Vector3(1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D/bat:surface_material_override/0:albedo_color")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1, 0.199951),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Color(1, 1, 1, 1), Color(0.843431, 0.0363174, 0.22484, 1), Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xjlni"]
_data = {
&"hurt": SubResource("Animation_xl0h5")
}
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_1xugm"]
animation = &"Idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_0ebaf"]
animation = &"GodotBatMob/hurt"
[sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_a7d3o"]
mix_mode = 1
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_xl0h5"]
graph_offset = Vector2(-446.039, -41.214)
"nodes/Idle Loop/node" = SubResource("AnimationNodeAnimation_1xugm")
"nodes/Idle Loop/position" = Vector2(200, 60)
"nodes/Mob Hurt/node" = SubResource("AnimationNodeAnimation_0ebaf")
"nodes/Mob Hurt/position" = Vector2(200, 240)
nodes/OneShot/node = SubResource("AnimationNodeOneShot_a7d3o")
nodes/OneShot/position = Vector2(440, 20)
nodes/output/position = Vector2(640, 160)
node_connections = [&"OneShot", 0, &"Idle Loop", &"OneShot", 1, &"Mob Hurt", &"output", 0, &"OneShot"]
[node name="bat_model" instance=ExtResource("1_12yrx")]
script = ExtResource("2_dmdl0")
[node name="Skeleton3D" parent="Armature" index="0"]
bones/0/position = Vector3(0, -0.0172648, 0)
bones/1/rotation = Quaternion(0.0466063, 0.108788, -0.618407, 0.776895)
bones/2/rotation = Quaternion(-0.128204, -0.0441741, 0.324725, 0.936037)
bones/3/rotation = Quaternion(-0.201371, -0.00157988, 0.238589, 0.950012)
bones/4/rotation = Quaternion(0.0466063, -0.108788, 0.618407, 0.776895)
bones/5/rotation = Quaternion(-0.128204, 0.0441741, -0.324725, 0.936037)
bones/6/rotation = Quaternion(-0.201371, 0.00157988, -0.238589, 0.950012)
bones/7/position = Vector3(0.130992, -0.227392, -0.0878515)
bones/7/rotation = Quaternion(0.261968, 0.0834552, 0.265751, 0.924005)
bones/8/rotation = Quaternion(3.43531e-08, 0.550042, 0.835137, 2.34299e-08)
bones/10/position = Vector3(-0.130992, -0.227392, -0.0878515)
bones/10/rotation = Quaternion(0.261968, -0.0834552, -0.265751, 0.924005)
bones/11/rotation = Quaternion(2.41782e-08, 0.550043, 0.835137, 3.9416e-08)
[node name="bat" parent="Armature/Skeleton3D" index="0"]
surface_material_override/0 = ExtResource("2_vofu1")
[node name="AnimationPlayer" parent="." index="1"]
libraries = {
&"": SubResource("AnimationLibrary_2h6wp"),
&"GodotBatMob": SubResource("AnimationLibrary_xjlni")
}
autoplay = "Idle"
[node name="AnimationTree" type="AnimationTree" parent="." index="2"]
unique_name_in_owner = true
root_node = NodePath("%AnimationTree/..")
tree_root = SubResource("AnimationNodeBlendTree_xl0h5")
anim_player = NodePath("../AnimationPlayer")
parameters/OneShot/active = false
parameters/OneShot/internal_active = false
parameters/OneShot/request = 0

BIN
mob/gun_shoot.wav Normal file

Binary file not shown.

24
mob/gun_shoot.wav.import Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cmavoyb45x73f"
path="res://.godot/imported/gun_shoot.wav-f8b83b393a231b2e7b3abfb1a84846ed.sample"
[deps]
source_file="res://mob/gun_shoot.wav"
dest_files=["res://.godot/imported/gun_shoot.wav-f8b83b393a231b2e7b3abfb1a84846ed.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

BIN
mob/mob_ko.wav Normal file

Binary file not shown.

24
mob/mob_ko.wav.import Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://hghb3bqm52oh"
path="res://.godot/imported/mob_ko.wav-a84710604b4b98be9d6d7dfe1978d9ee.sample"
[deps]
source_file="res://mob/mob_ko.wav"
dest_files=["res://.godot/imported/mob_ko.wav-a84710604b4b98be9d6d7dfe1978d9ee.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

BIN
mob/mob_take_damage.wav Normal file

Binary file not shown.

View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cvge1n06euj5o"
path="res://.godot/imported/mob_take_damage.wav-1cdfbd77e9c3f3326daadc27788f65ff.sample"
[deps]
source_file="res://mob/mob_take_damage.wav"
dest_files=["res://.godot/imported/mob_take_damage.wav-1cdfbd77e9c3f3326daadc27788f65ff.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

70
mob/player.tscn Normal file
View File

@@ -0,0 +1,70 @@
[gd_scene load_steps=8 format=3 uid="uid://h8tyroiwkr42"]
[ext_resource type="Script" uid="uid://l1gxoouxv4bc" path="res://player/player.gd" id="1_rkbax"]
[ext_resource type="PackedScene" uid="uid://dkb2mu7n4t308" path="res://player/gun_model.tscn" id="3_8441p"]
[ext_resource type="Texture2D" uid="uid://daxb87ykphjeh" path="res://player/reticle.png" id="3_g1dw6"]
[ext_resource type="AudioStream" uid="uid://cmavoyb45x73f" path="res://mob/gun_shoot.wav" id="4_th40c"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_kqu6x"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_th40c"]
bg_color = Color(0.223529, 0.223529, 0.223529, 0.729412)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8441p"]
bg_color = Color(0.179649, 0.626318, 0.30983, 1)
[node name="Player" type="CharacterBody3D"]
collision_layer = 5
collision_mask = 3
script = ExtResource("1_rkbax")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_kqu6x")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.51802, 0)
[node name="gun_model" parent="Camera3D" instance=ExtResource("3_8441p")]
transform = Transform3D(-0.399518, 0.00318013, -0.0193816, 0.000692473, 0.396757, 0.0508259, 0.0196285, 0.050731, -0.396284, 0.493558, -0.233074, -0.568753)
[node name="Marker3D" type="Marker3D" parent="Camera3D/gun_model"]
unique_name_in_owner = true
transform = Transform3D(-0.999988, 0.00484524, 0.000349712, 0.00485513, 0.994434, 0.105259, 0.000162303, 0.10526, -0.994445, 0.0103973, 0.00791597, 0.639051)
[node name="ShootTimer" type="Timer" parent="Camera3D/gun_model"]
wait_time = 0.2
[node name="Reticle" type="TextureRect" parent="."]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -23.0
offset_top = -23.0
offset_right = 23.0
offset_bottom = 23.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("3_g1dw6")
expand_mode = 1
[node name="HealthBar" type="ProgressBar" parent="."]
unique_name_in_owner = true
offset_left = 30.0
offset_top = 30.0
offset_right = 280.0
offset_bottom = 50.0
theme_override_styles/background = SubResource("StyleBoxFlat_th40c")
theme_override_styles/fill = SubResource("StyleBoxFlat_8441p")
value = 50.0
rounded = true
show_percentage = false
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("4_th40c")
volume_db = -5.0
[connection signal="timeout" from="Camera3D/gun_model/ShootTimer" to="." method="_on_shoot_timer_timeout"]

View File

@@ -0,0 +1,70 @@
shader_type spatial;
render_mode shadows_disabled, cull_back;
uniform vec3 albedo : source_color;
varying float voronoi_value;
uniform float progress = 0.0;
uniform float smoothness = 0.01;
uniform float ease = 2.0;
uniform float base_scale = 1.0;
uniform float deformation_scale = 1.0;
uniform float texture_offset = 0.0;
uniform float fresnel_offset = 1.0;
uniform float global_alpha = 1.0;
// Voronoi method credit:
// The MIT License
// Copyright © 2013 Inigo Quilez
// https://www.shadertoy.com/view/ldl3Dl
vec3 hash( vec3 x ){
x = vec3( dot(x,vec3(127.1,311.7, 74.7)),
dot(x,vec3(269.5,183.3,246.1)),
dot(x,vec3(113.5,271.9,124.6)));
return fract(sin(x)*43758.5453123);
}
vec3 voronoi( in vec3 x ){
vec3 p = floor( x );
vec3 f = fract( x );
float id = 0.0;
vec2 res = vec2( 100.0 );
for( int k=-1; k<=1; k++ )
for( int j=-1; j<=1; j++ )
for( int i=-1; i<=1; i++ ) {
vec3 b = vec3( float(i), float(j), float(k) );
vec3 r = vec3( b ) - f + hash( p + b );
float d = dot( r, r );
if( d < res.x ) {
id = dot( p+b, vec3(1.0,57.0,113.0 ) );
res = vec2( d, res.x );
} else if( d < res.y ) {
res.y = d;
}
}
return vec3( sqrt( res ), abs(id) );
}
float fresnel(vec3 normal, vec3 view, float amount){
return pow(1.0 - clamp(dot(normal, view), 0.0, 1.0), amount);
}
void vertex() {
float smooth_df = deformation_scale;
voronoi_value = voronoi(VERTEX + texture_offset).x;
VERTEX += NORMAL * (1.0 - pow(voronoi_value, ease)) * smooth_df;
VERTEX *= base_scale;
}
void fragment(){
ALBEDO = albedo;
EMISSION = albedo * 0.5;
ALPHA = 1.0 - fresnel(NORMAL, VIEW, 2.0 * fresnel_offset);
ALPHA *= global_alpha;
}

View File

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

View File

@@ -0,0 +1,17 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://dr7gyunhpjiwf"]
[ext_resource type="Shader" path="res://mob/smoke_puff/material/inner_smoke.gdshader" id="1_6ucfb"]
[resource]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("1_6ucfb")
shader_parameter/albedo = Color(1, 0.537255, 0.792157, 1)
shader_parameter/progress = 0.0
shader_parameter/smoothness = 0.01
shader_parameter/ease = 2.0
shader_parameter/base_scale = 1.1
shader_parameter/deformation_scale = 1.0
shader_parameter/texture_offset = 0.1
shader_parameter/fresnel_offset = 0.5
shader_parameter/global_alpha = 0.0

View File

@@ -0,0 +1,64 @@
shader_type spatial;
render_mode shadows_disabled, cull_disabled;
uniform vec3 albedo : source_color;
varying float voronoi_value;
uniform float progress = 0.0;
uniform float smoothness = 0.01;
uniform float ease = 2.0;
uniform float base_scale = 1.0;
uniform float deformation_scale = 1.0;
uniform float texture_offset = 0.0;
// Voronoi method credit:
// The MIT License
// Copyright © 2013 Inigo Quilez
// https://www.shadertoy.com/view/ldl3Dl
vec3 hash( vec3 x ){
x = vec3( dot(x,vec3(127.1,311.7, 74.7)),
dot(x,vec3(269.5,183.3,246.1)),
dot(x,vec3(113.5,271.9,124.6)));
return fract(sin(x)*43758.5453123);
}
vec3 voronoi( in vec3 x ){
vec3 p = floor( x );
vec3 f = fract( x );
float id = 0.0;
vec2 res = vec2( 100.0 );
for( int k=-1; k<=1; k++ )
for( int j=-1; j<=1; j++ )
for( int i=-1; i<=1; i++ ) {
vec3 b = vec3( float(i), float(j), float(k) );
vec3 r = vec3( b ) - f + hash( p + b );
float d = dot( r, r );
if( d < res.x ) {
id = dot( p+b, vec3(1.0,57.0,113.0 ) );
res = vec2( d, res.x );
} else if( d < res.y ) {
res.y = d;
}
}
return vec3( sqrt( res ), abs(id) );
}
void vertex() {
float smooth_df = deformation_scale;
voronoi_value = voronoi(VERTEX + texture_offset).x;
VERTEX += NORMAL * (1.0 - pow(voronoi_value, ease)) * smooth_df;
VERTEX *= base_scale;
}
void fragment(){
ALBEDO = albedo;
EMISSION = albedo * 0.5;
ALPHA = smoothstep(progress - smoothness, progress + smoothness, voronoi_value);
ALPHA_SCISSOR_THRESHOLD = 0.5;
}

View File

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

View File

@@ -0,0 +1,15 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://ctnipgxo3l72h"]
[ext_resource type="Shader" path="res://mob/smoke_puff/material/outer_smoke.gdshader" id="1_0emiy"]
[resource]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("1_0emiy")
shader_parameter/albedo = Color(0.937255, 0.698039, 1, 1)
shader_parameter/progress = 1.8
shader_parameter/smoothness = 0.1
shader_parameter/ease = 3.0
shader_parameter/base_scale = 1.2
shader_parameter/deformation_scale = 1.5
shader_parameter/texture_offset = -0.5

BIN
mob/smoke_puff/poof.res Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://ki0nh5lgryca"
path="res://.godot/imported/poof_sound.wav-36d715cee95c69d05b3317b1fcb4cc24.sample"
[deps]
source_file="res://mob/smoke_puff/poof_sound.wav"
dest_files=["res://.godot/imported/poof_sound.wav-36d715cee95c69d05b3317b1fcb4cc24.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

View File

@@ -0,0 +1,34 @@
[gd_scene load_steps=7 format=3 uid="uid://cjk3frr43yesb"]
[ext_resource type="Material" uid="uid://ctnipgxo3l72h" path="res://mob/smoke_puff/material/outer_smoke.tres" id="2_1f3c4"]
[ext_resource type="ArrayMesh" uid="uid://cxh3afoly2pv6" path="res://mob/smoke_puff/smoke_sphere.obj" id="3_2ucfv"]
[ext_resource type="Material" uid="uid://dr7gyunhpjiwf" path="res://mob/smoke_puff/material/inner_smoke.tres" id="4_8vcwr"]
[ext_resource type="Animation" uid="uid://drrd257af7jpy" path="res://mob/smoke_puff/poof.res" id="5_yvyul"]
[ext_resource type="AudioStream" uid="uid://dyj752n6nuwa6" path="res://mob/smoke_puff/poof_sound.wav" id="6_8rosm"]
[sub_resource type="AnimationLibrary" id="AnimationLibrary_a08pi"]
_data = {
"poof": ExtResource("5_yvyul")
}
[node name="smoke_puff" type="Node3D"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
[node name="OuterSmoke" type="MeshInstance3D" parent="."]
material_override = ExtResource("2_1f3c4")
mesh = ExtResource("3_2ucfv")
[node name="InnerSmoke" type="MeshInstance3D" parent="."]
material_override = ExtResource("4_8vcwr")
mesh = ExtResource("3_2ucfv")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {
"": SubResource("AnimationLibrary_a08pi")
}
autoplay = "poof"
[node name="Sound" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
stream = ExtResource("6_8rosm")

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
[remap]
importer="wavefront_obj"
importer_version=1
type="Mesh"
uid="uid://vsovom3bufqe"
path="res://.godot/imported/smoke_sphere.obj-7dec537f94ed12354ea65934deb2dc4e.mesh"
[deps]
files=["res://.godot/imported/smoke_sphere.obj-7dec537f94ed12354ea65934deb2dc4e.mesh"]
source_file="res://mob/smoke_puff/smoke_sphere.obj"
dest_files=["res://.godot/imported/smoke_sphere.obj-7dec537f94ed12354ea65934deb2dc4e.mesh", "res://.godot/imported/smoke_sphere.obj-7dec537f94ed12354ea65934deb2dc4e.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

View File

@@ -0,0 +1,16 @@
extends Node3D
@export var mob_to_spawn: PackedScene = null
signal mob_spawned(mob: Node)
@onready var marker_3d: Marker3D = %Marker3D
@onready var timer: Timer = %Timer
func _on_timer_timeout() -> void:
var new_mob := mob_to_spawn.instantiate()
add_child(new_mob)
new_mob.global_transform = marker_3d.global_transform
mob_spawned.emit(new_mob)

View File

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

View File

@@ -0,0 +1,21 @@
[gd_scene load_steps=3 format=3 uid="uid://c0ky5ie5cfgh2"]
[ext_resource type="Script" uid="uid://cu4e7af7nx5al" path="res://mob/spawner/mob_spawner_3d.gd" id="1_ewxdg"]
[ext_resource type="PackedScene" uid="uid://dtf66or38qi43" path="res://mob/spawner/spawner_model.tscn" id="2_ewxdg"]
[node name="MobSpawner3D" type="Node3D"]
script = ExtResource("1_ewxdg")
[node name="spawner_model" parent="." instance=ExtResource("2_ewxdg")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 2.5, 0)
[node name="Marker3D" type="Marker3D" parent="spawner_model"]
unique_name_in_owner = true
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, -1.4, 0)
[node name="Timer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 5.0
autostart = true
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]

View File

@@ -0,0 +1,17 @@
shader_type spatial;
uniform vec3 color : source_color;
float fresnel(float amount, vec3 normal, vec3 view)
{
return pow((1.0 - clamp(dot(normalize(normal), normalize(view)), 0.0, 1.0 )), amount);
}
void fragment() {
float f = fresnel(0.8, NORMAL, VIEW);
float wave = abs((sin((UV.y - TIME * 0.1) * 10.0 * PI) + 1.0) / 2.0);
ALBEDO = color;
EMISSION = color * 2.0;
ALPHA = step(UV.y, wave) * (1.0 - UV.y) * (1.0 - f);
}

View File

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

Binary file not shown.

View File

@@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://diiskgqfi7kay"
path="res://.godot/imported/spawner_model.glb-2fcf57184c75ae05a59f6df1a9d9c89b.scn"
[deps]
source_file="res://mob/spawner/spawner_model.glb"
dest_files=["res://.godot/imported/spawner_model.glb-2fcf57184c75ae05a59f6df1a9d9c89b.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={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@@ -0,0 +1,85 @@
[gd_scene load_steps=10 format=3 uid="uid://dtf66or38qi43"]
[ext_resource type="PackedScene" uid="uid://diiskgqfi7kay" path="res://mob/spawner/spawner_model.glb" id="1_bk78j"]
[ext_resource type="Shader" uid="uid://cfnwyva3u4qeb" path="res://mob/spawner/spawner_halo.gdshader" id="2_lvlhh"]
[ext_resource type="Material" uid="uid://jvnbftghahty" path="res://mob/spawner/spawner_screen_material.tres" id="3_p6j4b"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_rug3p"]
render_priority = 0
shader = ExtResource("2_lvlhh")
shader_parameter/color = Color(0.13153, 0.557624, 0.421582, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2xi82"]
albedo_color = Color(0.879323, 0.706001, 0.185322, 1)
metallic = 0.45
metallic_specular = 0.75
roughness = 0.25
rim_enabled = true
rim = 0.1
rim_tint = 0.4
clearcoat_enabled = true
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bk78j"]
albedo_color = Color(0.646029, 0.646029, 0.646029, 1)
metallic = 0.5
roughness = 0.1
rim_enabled = true
rim = 0.1
clearcoat_enabled = true
[sub_resource type="Animation" id="Animation_lvlhh"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Top:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, -2.0944, 0)]
}
[sub_resource type="Animation" id="Animation_bk78j"]
resource_name = "idle"
length = 0.5
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Top:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 6.28319, 0)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_p6j4b"]
_data = {
&"RESET": SubResource("Animation_lvlhh"),
&"idle": SubResource("Animation_bk78j")
}
[node name="spawner_model" instance=ExtResource("1_bk78j")]
[node name="halo" parent="." index="0"]
material_override = SubResource("ShaderMaterial_rug3p")
[node name="Body" parent="." index="1"]
surface_material_override/0 = SubResource("StandardMaterial3D_2xi82")
surface_material_override/1 = ExtResource("3_p6j4b")
[node name="Top" parent="." index="2"]
transform = Transform3D(-0.500004, 0, -0.866023, 0, 1, 0, 0.866023, 0, -0.500004, 0, 0.783957, 0)
material_override = SubResource("StandardMaterial3D_bk78j")
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="3"]
libraries = {
&"": SubResource("AnimationLibrary_p6j4b")
}
autoplay = "idle"

View File

@@ -0,0 +1,29 @@
shader_type spatial;
uniform vec4 screen_color : source_color;
uniform sampler2D text_sampler : filter_nearest, repeat_enable;
uniform float ratio = 1.0;
uniform float pixel_size = 20.0;
uniform float intensity = 1.5;
void fragment() {
vec2 scaled_uv = round(UV * pixel_size) / pixel_size;
vec2 grid_2d = sin(fract(UV * pixel_size + 0.5) * 3.14);
float grid = grid_2d.x * grid_2d.y;
grid = grid * 0.6 + 0.4;
float text = 1.0 - texture(text_sampler, scaled_uv * vec2(ratio, 1.0) + vec2(mod(TIME * 0.1, 1.0), 0.0)).x;
ALBEDO = vec3(0.0);
SPECULAR = 0.25;
ROUGHNESS = 0.45;
EMISSION = mix(screen_color.rgb * text, screen_color.rgb, screen_color.a) * grid * intensity;
}

View File

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

View File

@@ -0,0 +1,13 @@
[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://jvnbftghahty"]
[ext_resource type="Shader" uid="uid://dhuj314m3wv1c" path="res://mob/spawner/spawner_screen.gdshader" id="1_3sboa"]
[ext_resource type="Texture2D" uid="uid://cioq2g05svse6" path="res://mob/spawner/spawner_text.png" id="2_871b8"]
[resource]
render_priority = 0
shader = ExtResource("1_3sboa")
shader_parameter/screen_color = Color(0.336095, 0.77375, 0.569932, 0.027451)
shader_parameter/text_sampler = ExtResource("2_871b8")
shader_parameter/ratio = 0.25
shader_parameter/pixel_size = 32.0
shader_parameter/intensity = 1.5

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,36 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cioq2g05svse6"
path.s3tc="res://.godot/imported/spawner_text.png-cddf989d7fb9d0d1fac3e9ed8d7837e4.s3tc.ctex"
path.etc2="res://.godot/imported/spawner_text.png-cddf989d7fb9d0d1fac3e9ed8d7837e4.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://mob/spawner/spawner_text.png"
dest_files=["res://.godot/imported/spawner_text.png-cddf989d7fb9d0d1fac3e9ed8d7837e4.s3tc.ctex", "res://.godot/imported/spawner_text.png-cddf989d7fb9d0d1fac3e9ed8d7837e4.etc2.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

22
player/bullet_3d.gd Normal file
View File

@@ -0,0 +1,22 @@
extends Area3D
const SPEED = 55.0
const RANGE = 80.0
var travelled_distance = 0.0
func _physics_process(delta: float) -> void:
var distance = SPEED * delta
position += -transform.basis.z * distance
if travelled_distance >= RANGE:
queue_free()
else:
travelled_distance += distance
func _on_body_entered(body: Node3D) -> void:
queue_free()
if body.has_method("take_damage"):
body.take_damage(randf_range(25.0, 50.0))

1
player/bullet_3d.gd.uid Normal file
View File

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

19
player/bullet_3d.tscn Normal file
View File

@@ -0,0 +1,19 @@
[gd_scene load_steps=4 format=3 uid="uid://ct6nuuuphybba"]
[ext_resource type="Script" uid="uid://cjqjeylpmrmth" path="res://player/bullet_3d.gd" id="1_hgguu"]
[ext_resource type="PackedScene" uid="uid://b2dxu3lnx1jx5" path="res://player/projectile/projectile_3d.tscn" id="1_kixxk"]
[sub_resource type="SphereShape3D" id="SphereShape3D_hgguu"]
radius = 0.238564
[node name="Bullet3D" type="Area3D"]
top_level = true
collision_mask = 3
script = ExtResource("1_hgguu")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("SphereShape3D_hgguu")
[node name="Projectile3D" parent="." instance=ExtResource("1_kixxk")]
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

BIN
player/cookie/Cookie.glb Normal file

Binary file not shown.

View File

@@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dbnc0jij3obmp"
path="res://.godot/imported/Cookie.glb-a84f141391d2f606ef2284a88ee937af.scn"
[deps]
source_file="res://player/cookie/Cookie.glb"
dest_files=["res://.godot/imported/Cookie.glb-a84f141391d2f606ef2284a88ee937af.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={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@@ -0,0 +1,52 @@
[gd_scene load_steps=5 format=3 uid="uid://ci5254r7er0uc"]
[ext_resource type="PackedScene" uid="uid://dbnc0jij3obmp" path="res://player/cookie/Cookie.glb" id="1_nk7nc"]
[sub_resource type="Animation" id="Animation_nsu0p"]
resource_name = "idle"
length = 3.0
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Cookie:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 3),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, -0.785398), Vector3(0, 6.28319, -0.785398)]
}
[sub_resource type="Animation" id="Animation_a8ig3"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Cookie:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, -0.785398)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_2flrl"]
_data = {
&"RESET": SubResource("Animation_a8ig3"),
&"idle": SubResource("Animation_nsu0p")
}
[node name="cookie_model" type="Node3D"]
[node name="Cookie" parent="." instance=ExtResource("1_nk7nc")]
transform = Transform3D(0.0212132, 0.0212132, 0, -0.0212132, 0.0212132, 0, 0, 0, 0.03, 0, 0.6, 0)
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_2flrl")
}
autoplay = "idle"

17
player/cookie_3d.gd Normal file
View File

@@ -0,0 +1,17 @@
extends Area3D
var food_ready: bool = true
func _on_body_entered(body: Node3D) -> void:
if body.has_method("heal") and food_ready == true:
$cookie_model.visible = false
food_ready = false
body.heal()
%RespawnTimer.start()
else:
print(str(body) + " wants to eat a cookie, but doesn't know how!")
return
func _on_respawn_timer_timeout() -> void:
food_ready = true
$cookie_model.visible = true

1
player/cookie_3d.gd.uid Normal file
View File

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

24
player/cookie_3d.tscn Normal file
View File

@@ -0,0 +1,24 @@
[gd_scene load_steps=4 format=3 uid="uid://ht0ktfrqr1ef"]
[ext_resource type="Script" uid="uid://dowji2oraklfp" path="res://player/cookie_3d.gd" id="1_ta3vh"]
[ext_resource type="PackedScene" uid="uid://ci5254r7er0uc" path="res://player/cookie/cookie_model.tscn" id="1_yyge1"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ta3vh"]
height = 1.2
[node name="cookie_3d" type="Area3D"]
script = ExtResource("1_ta3vh")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0)
shape = SubResource("CapsuleShape3D_ta3vh")
[node name="cookie_model" parent="." instance=ExtResource("1_yyge1")]
[node name="RespawnTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 15.0
one_shot = true
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="timeout" from="RespawnTimer" to="." method="_on_respawn_timer_timeout"]

6
player/gun_model.gd Normal file
View File

@@ -0,0 +1,6 @@
extends Node3D
@onready var animation_player: AnimationPlayer = %AnimationPlayer
func recoil() -> void:
animation_player.play("recoil")

1
player/gun_model.gd.uid Normal file
View File

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

78
player/gun_model.tscn Normal file
View File

@@ -0,0 +1,78 @@
[gd_scene load_steps=6 format=3 uid="uid://dkb2mu7n4t308"]
[ext_resource type="PackedScene" uid="uid://buif8h7ixc1cy" path="res://player/simple_gun/gun_model.glb" id="1_81uiy"]
[ext_resource type="Script" uid="uid://dwu1ndn4oojx4" path="res://player/gun_model.gd" id="2_3tpoa"]
[sub_resource type="Animation" id="Animation_3tpoa"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlueGun:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, -1.5708, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlueGun:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, -0.299353, -0.146614)]
}
[sub_resource type="Animation" id="Animation_81uiy"]
resource_name = "recoil"
length = 0.2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlueGun:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, -1.5708, 0), Vector3(1.13133e-08, -1.5708, 0.261799), Vector3(1.85986e-08, -1.5708, 0.436332), Vector3(9.29928e-09, -1.5708, 0.218166), Vector3(0, -1.5708, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlueGun:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1, 0.15, 0.2),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, -0.299353, -0.146614), Vector3(0, -0.299353, -0.246614), Vector3(0, -0.299353, -0.196614), Vector3(0, -0.299353, -0.146614)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_3tpoa"]
_data = {
&"RESET": SubResource("Animation_3tpoa"),
&"recoil": SubResource("Animation_81uiy")
}
[node name="gun_model" instance=ExtResource("1_81uiy")]
script = ExtResource("2_3tpoa")
[node name="BlueGun" parent="." index="0"]
transform = Transform3D(-3.61999e-06, 0, -1, 0, 1, 0, 1, 0, -3.61999e-06, 0, -0.299353, -0.146614)
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="1"]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_3tpoa")
}
speed_scale = 1.25

83
player/player.gd Normal file
View File

@@ -0,0 +1,83 @@
extends CharacterBody3D
const SPEED: float = 7
const HEALTH_MAX: float = 100.0
const MOUSE_SENSE: float = 0.35
var health: float = 50.0
func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
func _unhandled_input(event: InputEvent) -> void:
if (Input.mouse_mode == Input.MOUSE_MODE_CAPTURED):
if (event is InputEventMouseMotion):
rotation_degrees.y -= event.relative.x * MOUSE_SENSE
$Camera3D.rotation_degrees.x -= event.relative.y * MOUSE_SENSE
$Camera3D.rotation_degrees.x = clamp(
$Camera3D.rotation_degrees.x, -85.0, 85.0
)
elif (event is InputEventMouseButton):
match event.button_index:
MOUSE_BUTTON_LEFT:
var timer: Timer = $Camera3D/gun_model/ShootTimer
if (event.is_pressed()):
print("left MB pressed")
$Camera3D/gun_model.recoil()
shoot()
timer.start()
else:
print("left MB released")
timer.stop()
_:
# unhandled mouse events
pass
else:
# other unhandled input
pass
func _input(event: InputEvent) -> void:
if event.is_action_pressed("ui_cancel"):
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
else:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
func _physics_process(delta: float) -> void:
%HealthBar.set("value", health)
# Player model camera is -Z aligned
var input_direction_2D = Input.get_vector(
"move_left", "move_right", "move_forward", "move_back"
)
var direction = transform.basis * Vector3(
input_direction_2D.x, 0.0, input_direction_2D.y
)
velocity.x = direction.x * SPEED
velocity.z = direction.z * SPEED
velocity.y -= 9.80665 * delta
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = 3.5
move_and_slide()
func shoot() -> void:
const BULLET_3D = preload("res://player/bullet_3d.tscn")
var new_bullet = BULLET_3D.instantiate()
%Marker3D.add_child(new_bullet)
new_bullet.global_transform = %Marker3D.global_transform
%AudioStreamPlayer.play()
func _on_shoot_timer_timeout() -> void:
$Camera3D/gun_model.recoil()
shoot()
func heal(amount: float = 35.0) -> void:
# TODO: add values and other fancy healing stuff, for now this works
health = clampf((health + amount), 0.0, HEALTH_MAX)
func hurt(amount: float) -> void:
health = clampf((health - amount), 0.0, HEALTH_MAX)

1
player/player.gd.uid Normal file
View File

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

View File

@@ -0,0 +1,14 @@
shader_type spatial;
render_mode ambient_light_disabled, shadows_disabled, unshaded;
uniform vec3 tail_color : source_color;
uniform vec3 head_color : source_color;
void vertex() {
float def = sin(UV.y * 2.0 * PI - TIME * 20.0) + 1.0 / 2.0;
VERTEX.xz += NORMAL.xz * def * 0.05 * UV.y * COLOR.x;
}
void fragment() {
ALBEDO = mix(head_color, tail_color, COLOR.x);
}

View File

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

View File

@@ -0,0 +1,16 @@
[gd_scene load_steps=4 format=3 uid="uid://b2dxu3lnx1jx5"]
[ext_resource type="PackedScene" uid="uid://o1s0yu8jt5h4" path="res://player/projectile/projectile_model.glb" id="1_ndq6i"]
[ext_resource type="Shader" uid="uid://b4wc5wsyakc0a" path="res://player/projectile/projectile.gdshader" id="2_chfaf"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_htc8w"]
render_priority = 0
shader = ExtResource("2_chfaf")
shader_parameter/tail_color = Color(0.863943, 0.713942, 0.177483, 1)
shader_parameter/head_color = Color(0.700086, 0.267569, 6.73831e-07, 1)
[node name="Projectile3D" instance=ExtResource("1_ndq6i")]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
[node name="Projectile" parent="." index="0"]
material_override = SubResource("ShaderMaterial_htc8w")

Binary file not shown.

View File

@@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://o1s0yu8jt5h4"
path="res://.godot/imported/projectile_model.glb-828324a605ffc923b73f3dcca1df4ac2.scn"
[deps]
source_file="res://player/projectile/projectile_model.glb"
dest_files=["res://.godot/imported/projectile_model.glb-828324a605ffc923b73f3dcca1df4ac2.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={}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
player/reticle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

34
player/reticle.png.import Normal file
View File

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

View File

@@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://buif8h7ixc1cy"
path="res://.godot/imported/gun_model.glb-1353dadf5f32e414e4a769d740e7949e.scn"
[deps]
source_file="res://player/simple_gun/gun_model.glb"
dest_files=["res://.godot/imported/gun_model.glb-1353dadf5f32e414e4a769d740e7949e.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={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 B

View File

@@ -0,0 +1,36 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d4gvfj2l8l2mj"
path.s3tc="res://.godot/imported/gun_model_gun_palette.png-5e9639c5a5afbe289b00847128bc0590.s3tc.ctex"
path.etc2="res://.godot/imported/gun_model_gun_palette.png-5e9639c5a5afbe289b00847128bc0590.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://player/simple_gun/gun_model_gun_palette.png"
dest_files=["res://.godot/imported/gun_model_gun_palette.png-5e9639c5a5afbe289b00847128bc0590.s3tc.ctex", "res://.godot/imported/gun_model_gun_palette.png-5e9639c5a5afbe289b00847128bc0590.etc2.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: 788 B

View File

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

54
project.godot Normal file
View File

@@ -0,0 +1,54 @@
; 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="ShootahGame3D"
run/main_scene="uid://bc23rfm57cbjk"
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
window/stretch/mode="viewport"
[input]
move_left={
"deadzone": 0.2,
"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,"location":0,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.2,
"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,"location":0,"echo":false,"script":null)
]
}
move_forward={
"deadzone": 0.2,
"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,"location":0,"echo":false,"script":null)
]
}
move_back={
"deadzone": 0.2,
"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,"location":0,"echo":false,"script":null)
]
}
jump={
"deadzone": 0.2,
"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,"location":0,"echo":false,"script":null)
]
}
[rendering]
textures/vram_compression/import_etc2_astc=true

8
start_location.tres Normal file
View File

@@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://c23xehahalr4v"]
[ext_resource type="Texture2D" uid="uid://cei1u6horkbiu" path="res://level/checkboard.png" id="1_fkiiv"]
[resource]
albedo_color = Color(0.993534, 0.977553, 0.984935, 1)
albedo_texture = ExtResource("1_fkiiv")
uv1_triplanar = true