Compare commits

...

10 Commits

42 changed files with 517 additions and 95 deletions

1
.gitignore vendored
View File

@ -3,6 +3,7 @@
/android/
/art/*
/build/*
!.gdignore

View File

@ -4,6 +4,8 @@ The theme was **Tiny creatures**. Insects are pretty tiny. So I decided to make
If you want to clone the repo, make sure you have [Git LFS](https://git-lfs.com/) installed.
I post updates in our [Twitter](https://twitter.com/23cmline) and [Bluesky](https://bsky.app/profile/23cmline.com).
## Tools used
### For development
- Game engine - Godot

BIN
assets/audio/units/aphid_poop_1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://4jawklhwlrav"
path="res://.godot/imported/aphid_poop_1.wav-33f37c4812e25b8962c552b6a1c0fc52.sample"
[deps]
source_file="res://assets/audio/units/aphid_poop_1.wav"
dest_files=["res://.godot/imported/aphid_poop_1.wav-33f37c4812e25b8962c552b6a1c0fc52.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=0

BIN
assets/audio/units/aphid_poop_2.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dqf8u6iyp2gyj"
path="res://.godot/imported/aphid_poop_2.wav-83a83cce31a628fbc3073b451ac4b57f.sample"
[deps]
source_file="res://assets/audio/units/aphid_poop_2.wav"
dest_files=["res://.godot/imported/aphid_poop_2.wav-83a83cce31a628fbc3073b451ac4b57f.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=0

BIN
assets/audio/units/aphid_poop_3.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://d3r846ccllj1i"
path="res://.godot/imported/aphid_poop_3.wav-72f748591dc8803d12958e3ee9523e7c.sample"
[deps]
source_file="res://assets/audio/units/aphid_poop_3.wav"
dest_files=["res://.godot/imported/aphid_poop_3.wav-72f748591dc8803d12958e3ee9523e7c.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=0

BIN
assets/audio/units/aphid_poop_4.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bv1qc7ig8kcov"
path="res://.godot/imported/aphid_poop_4.wav-65fe0cbebdfa264fc54f1fa70e2d9785.sample"
[deps]
source_file="res://assets/audio/units/aphid_poop_4.wav"
dest_files=["res://.godot/imported/aphid_poop_4.wav-65fe0cbebdfa264fc54f1fa70e2d9785.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=0

BIN
assets/audio/units/aphid_poop_5.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dygm3jfrbsnl3"
path="res://.godot/imported/aphid_poop_5.wav-457add9ec6ed9d68fec96c6c4624adde.sample"
[deps]
source_file="res://assets/audio/units/aphid_poop_5.wav"
dest_files=["res://.godot/imported/aphid_poop_5.wav-457add9ec6ed9d68fec96c6c4624adde.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=0

BIN
assets/audio/units/aphid_poop_6.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c1536rlvmor6l"
path="res://.godot/imported/aphid_poop_6.wav-c99d1a6bae426c9c90ffc4a2e3355f35.sample"
[deps]
source_file="res://assets/audio/units/aphid_poop_6.wav"
dest_files=["res://.godot/imported/aphid_poop_6.wav-c99d1a6bae426c9c90ffc4a2e3355f35.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=0

BIN
assets/models/ant.glb (Stored with Git LFS)

Binary file not shown.

BIN
assets/models/anthill.glb (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,43 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b0koc3o63etu1"
path="res://.godot/imported/anthill.glb-5b6c8f58d961f196bcc8e93454476786.scn"
[deps]
source_file="res://assets/models/anthill.glb"
dest_files=["res://.godot/imported/anthill.glb-5b6c8f58d961f196bcc8e93454476786.scn"]
[params]
nodes/root_type=""
nodes/root_name="Anthill"
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={
"materials": {
"anthill_mat": {
"use_external/enabled": true,
"use_external/path": "res://resources/materials/anthill_material.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
assets/models/aphid.glb (Stored with Git LFS)

Binary file not shown.

BIN
assets/textures/structures/anthill_albedo.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -2,8 +2,8 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cn2v03dkwjdbd"
path.s3tc="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.s3tc.ctex"
uid="uid://b7m104tc2wch3"
path.bptc="res://.godot/imported/anthill_albedo.png-bbaa35e5b6a354eec93c815c4147a0e5.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
@ -11,13 +11,13 @@ metadata={
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.s3tc.ctex"]
source_file="res://assets/textures/structures/anthill_albedo.png"
dest_files=["res://.godot/imported/anthill_albedo.png-bbaa35e5b6a354eec93c815c4147a0e5.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
@ -33,6 +33,3 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

0
build/.gdignore Normal file
View File

64
export_presets.cfg Normal file
View File

@ -0,0 +1,64 @@
[preset.0]
name="Windows Desktop"
platform="Windows Desktop"
runnable=true
advanced_options=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="build/windows/tli.exe"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
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
$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}'"

BIN
icon.png (Stored with Git LFS) Normal file

Binary file not shown.

34
icon.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://be03qpceooh16"
path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.png"
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 994 B

View File

@ -16,7 +16,7 @@ run/main_scene="res://scenes/world.tscn"
config/features=PackedStringArray("4.3", "Forward Plus")
boot_splash/bg_color=Color(0, 0, 0, 1)
boot_splash/show_image=false
config/icon="res://icon.svg"
config/icon="res://icon.png"
[autoload]
@ -50,6 +50,10 @@ window/stretch/aspect="expand"
mouse_cursor/custom_image="res://assets/textures/gui/cursor.png"
mouse_cursor/custom_image_hotspot=Vector2(32, 32)
[editor]
movie_writer/movie_file="E:/Projects/Games/tli/build/recording.avi"
[filesystem]
import/fbx2gltf/enabled=false

View File

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bgc0omqgojp6n"]
[ext_resource type="Texture2D" uid="uid://b7m104tc2wch3" path="res://assets/textures/structures/anthill_albedo.png" id="1_3h7nr"]
[resource]
shading_mode = 0
albedo_texture = ExtResource("1_3h7nr")

View File

@ -37,6 +37,6 @@ mesh = SubResource("QuadMesh_qwehm")
[node name="Decal" type="Decal" parent="."]
size = Vector3(0.5, 0.5, 0.5)
texture_albedo = ExtResource("4_goini")
modulate = Color(0, 0, 0, 1)
modulate = Color(0.242208, 0.2075, 0.25, 1)
albedo_mix = 0.25
cull_mask = 32

View File

@ -3,8 +3,7 @@
[ext_resource type="Script" path="res://scripts/anthill.gd" id="1_8k02d"]
[ext_resource type="Material" uid="uid://f0nlf4tdpvbd" path="res://resources/materials/indicators/hover_indicator_mat.tres" id="2_44p2d"]
[ext_resource type="Script" path="res://scripts/sound_effects_player.gd" id="3_vp3nf"]
[sub_resource type="CapsuleMesh" id="CapsuleMesh_x8apu"]
[ext_resource type="PackedScene" uid="uid://b0koc3o63etu1" path="res://assets/models/anthill.glb" id="4_tp2c4"]
[sub_resource type="BoxShape3D" id="BoxShape3D_ruupa"]
@ -17,24 +16,31 @@ orientation = 1
collision_mask = 0
script = ExtResource("1_8k02d")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("CapsuleMesh_x8apu")
[node name="Anthill" parent="." instance=ExtResource("4_tp2c4")]
[node name="Anthill" parent="Anthill" index="0"]
layers = 32
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("BoxShape3D_ruupa")
[node name="UiOrigin" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.15587, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0356, 0)
[node name="HoverIndicator" type="MeshInstance3D" parent="."]
transform = Transform3D(1.62268, 0, 0, 0, 1.62268, 0, 0, 0, 1.62268, 0, 0, 0)
transform = Transform3D(2.703, 0, 0, 0, 2.703, 0, 0, 0, 2.703, 0, 0, 0)
cast_shadow = 0
mesh = SubResource("QuadMesh_2gykr")
[node name="NavigationObstacle3D" type="NavigationObstacle3D" parent="."]
radius = 0.57
[node name="SoundEffectsPlayer" type="AudioStreamPlayer3D" parent="."]
unit_size = 20.0
script = ExtResource("3_vp3nf")
script = ExtResource("3_vp3nf")
[node name="NavigationObstacle3D" type="NavigationObstacle3D" parent="."]
radius = 0.6
[node name="DepositPoint" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.102205, 0.382582, 0.248212)
[editable path="Anthill"]

View File

@ -1,30 +1,50 @@
[gd_scene load_steps=11 format=3 uid="uid://lbs0vilymbum"]
[gd_scene load_steps=14 format=3 uid="uid://lbs0vilymbum"]
[ext_resource type="PackedScene" uid="uid://cidd3q2tet7ku" path="res://scenes/units/abstract/controlled_unit.tscn" id="1_66kao"]
[ext_resource type="Script" path="res://scripts/units/abstract/controlled_ant_unit.gd" id="2_77pj2"]
[ext_resource type="PackedScene" uid="uid://bi231xk2sp410" path="res://assets/models/ant.glb" id="2_e21vo"]
[ext_resource type="AudioStream" uid="uid://ds7c5gkf1mssj" path="res://assets/audio/units/ant_move.wav" id="4_80pw8"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_jem3o"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lip5d"]
animation = &"idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_f5jro"]
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_7c5f2"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_0h55w"]
animation = &"plop_down"
[sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_wsc5y"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Body", "Armature/Skeleton3D:Leg_back_mid_L", "Armature/Skeleton3D:Leg_back_mid_R", "Armature/Skeleton3D:Leg_back_root_L", "Armature/Skeleton3D:Leg_back_root_R", "Armature/Skeleton3D:Leg_back_tip_L", "Armature/Skeleton3D:Leg_back_tip_R", "Armature/Skeleton3D:Leg_front_mid_L", "Armature/Skeleton3D:Leg_front_mid_R", "Armature/Skeleton3D:Leg_front_root_L", "Armature/Skeleton3D:Leg_front_root_R", "Armature/Skeleton3D:Leg_front_tip_L", "Armature/Skeleton3D:Leg_front_tip_R", "Armature/Skeleton3D:Leg_mid_mid_L", "Armature/Skeleton3D:Leg_mid_mid_R", "Armature/Skeleton3D:Leg_mid_root_L", "Armature/Skeleton3D:Leg_mid_root_R", "Armature/Skeleton3D:Leg_mid_tip_L", "Armature/Skeleton3D:Leg_mid_tip_R"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3qepx"]
animation = &"plop_up"
[sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_4ftkg"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Body", "Armature/Skeleton3D:Leg_back_mid_L", "Armature/Skeleton3D:Leg_back_mid_R", "Armature/Skeleton3D:Leg_back_root_L", "Armature/Skeleton3D:Leg_back_root_R", "Armature/Skeleton3D:Leg_back_tip_L", "Armature/Skeleton3D:Leg_back_tip_R", "Armature/Skeleton3D:Leg_front_mid_L", "Armature/Skeleton3D:Leg_front_mid_R", "Armature/Skeleton3D:Leg_front_root_L", "Armature/Skeleton3D:Leg_front_root_R", "Armature/Skeleton3D:Leg_front_tip_L", "Armature/Skeleton3D:Leg_front_tip_R", "Armature/Skeleton3D:Leg_mid_mid_L", "Armature/Skeleton3D:Leg_mid_mid_R", "Armature/Skeleton3D:Leg_mid_root_L", "Armature/Skeleton3D:Leg_mid_root_R", "Armature/Skeleton3D:Leg_mid_tip_L", "Armature/Skeleton3D:Leg_mid_tip_R"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_grmq1"]
animation = &"walk"
[sub_resource type="AnimationNodeBlendSpace1D" id="AnimationNodeBlendSpace1D_0mwos"]
blend_point_0/node = SubResource("AnimationNodeAnimation_jem3o")
blend_point_0/pos = 0.0
blend_point_1/node = SubResource("AnimationNodeAnimation_f5jro")
blend_point_1/pos = 1.0
min_space = 0.0
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_pwnkm"]
advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_v8drs"]
states/locomotion/node = SubResource("AnimationNodeBlendSpace1D_0mwos")
states/locomotion/position = Vector2(334, 100)
transitions = ["Start", "locomotion", SubResource("AnimationNodeStateMachineTransition_pwnkm")]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_4gyt5"]
graph_offset = Vector2(-327.784, 80.2142)
nodes/idle_anim/node = SubResource("AnimationNodeAnimation_lip5d")
nodes/idle_anim/position = Vector2(-320, 80)
nodes/locomotion_blend/node = SubResource("AnimationNodeBlend2_7c5f2")
nodes/locomotion_blend/position = Vector2(-100, 120)
nodes/output/position = Vector2(680, 160)
nodes/plop_down_anim/node = SubResource("AnimationNodeAnimation_0h55w")
nodes/plop_down_anim/position = Vector2(-40, 360)
nodes/plop_down_oneshot/node = SubResource("AnimationNodeOneShot_wsc5y")
nodes/plop_down_oneshot/position = Vector2(180, 140)
nodes/plop_up_anim/node = SubResource("AnimationNodeAnimation_3qepx")
nodes/plop_up_anim/position = Vector2(260, 400)
nodes/plop_up_oneshot/node = SubResource("AnimationNodeOneShot_4ftkg")
nodes/plop_up_oneshot/position = Vector2(440, 140)
nodes/walk_anim/node = SubResource("AnimationNodeAnimation_grmq1")
nodes/walk_anim/position = Vector2(-320, 220)
node_connections = [&"locomotion_blend", 0, &"idle_anim", &"locomotion_blend", 1, &"walk_anim", &"output", 0, &"plop_up_oneshot", &"plop_down_oneshot", 0, &"locomotion_blend", &"plop_down_oneshot", 1, &"plop_down_anim", &"plop_up_oneshot", 0, &"plop_down_oneshot", &"plop_up_oneshot", 1, &"plop_up_anim"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_8admi"]
height = 0.5
@ -40,20 +60,37 @@ bones/6/rotation = Quaternion(0.330686, -3.0116e-14, -4.44141e-07, 0.943741)
bones/9/rotation = Quaternion(0.587858, 5.43255e-07, 3.94772e-07, 0.808964)
bones/11/rotation = Quaternion(0.330686, 3.0116e-14, 4.44141e-07, 0.943741)
bones/14/rotation = Quaternion(4.60304e-08, 0.0294697, 0.999566, -5.43234e-07)
bones/14/scale = Vector3(1, 1, 1)
bones/15/rotation = Quaternion(4.55913e-08, 0.0294697, 0.999566, -4.34329e-07)
bones/15/scale = Vector3(1, 1, 1)
bones/16/rotation = Quaternion(4.55913e-08, 0.0294697, 0.999566, -4.34329e-07)
bones/16/scale = Vector3(1, 1, 1)
bones/18/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/19/rotation = Quaternion(0.0294712, -5.33139e-15, 4.35675e-07, 0.999566)
bones/20/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/21/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/22/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/23/rotation = Quaternion(0.0294712, -5.33139e-15, 4.35675e-07, 0.999566)
bones/24/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/25/rotation = Quaternion(0.0294712, -5.33139e-15, 4.35675e-07, 0.999566)
bones/26/rotation = Quaternion(-0.221628, 0.221633, -0.671475, 0.671477)
bones/27/rotation = Quaternion(0.583948, -8.29882e-08, 2.36539e-06, 0.811791)
bones/27/scale = Vector3(1, 1, 1)
bones/28/rotation = Quaternion(-0.84146, 6.60837e-08, -6.26108e-06, 0.54032)
bones/30/rotation = Quaternion(0.583949, -2.24752e-07, 2.46641e-06, 0.811791)
bones/31/rotation = Quaternion(-0.84146, 1.69298e-07, -6.42962e-06, 0.54032)
bones/32/scale = Vector3(1, 1, 1)
bones/34/rotation = Quaternion(-0.841459, 1.31575e-07, -6.3826e-06, 0.540321)
bones/34/scale = Vector3(1, 1, 1)
bones/35/rotation = Quaternion(-0.221628, -0.221633, 0.671475, 0.671477)
bones/36/rotation = Quaternion(0.583948, 8.29882e-08, -2.36539e-06, 0.811791)
bones/36/scale = Vector3(1, 1, 1)
bones/37/rotation = Quaternion(-0.84146, -6.60837e-08, 6.26108e-06, 0.54032)
bones/39/rotation = Quaternion(0.583949, 2.24752e-07, -2.46641e-06, 0.811791)
bones/40/rotation = Quaternion(-0.84146, -1.69298e-07, 6.42962e-06, 0.54032)
bones/41/scale = Vector3(1, 1, 1)
bones/43/rotation = Quaternion(-0.841459, -1.31575e-07, 6.3826e-06, 0.540321)
bones/43/scale = Vector3(1, 1, 1)
[node name="GathererMesh" parent="AntModel/Armature/Skeleton3D" index="0"]
visible = false
@ -61,11 +98,20 @@ visible = false
[node name="NitwitMesh" parent="AntModel/Armature/Skeleton3D" index="1"]
visible = false
[node name="AnimationPlayer" parent="AntModel" index="1"]
deterministic = true
[node name="AnimationTree" parent="." index="1"]
root_node = NodePath("../AntModel")
tree_root = SubResource("AnimationNodeStateMachine_v8drs")
tree_root = SubResource("AnimationNodeBlendTree_4gyt5")
anim_player = NodePath("../AntModel/AnimationPlayer")
parameters/locomotion/blend_position = 0.023431
parameters/locomotion_blend/blend_amount = 0
parameters/plop_down_oneshot/active = false
parameters/plop_down_oneshot/internal_active = false
parameters/plop_down_oneshot/request = 0
parameters/plop_up_oneshot/active = false
parameters/plop_up_oneshot/internal_active = false
parameters/plop_up_oneshot/request = 0
[node name="CollisionShape3D" parent="." index="2"]
shape = SubResource("CylinderShape3D_8admi")
@ -82,10 +128,11 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.65, 0)
[node name="SelectionIndicator" parent="." index="7"]
transform = Transform3D(0.772715, 0, 0, 0, 0.772715, 0, 0, 0, 0.772715, 0, 0, 0)
[node name="MoveSoundPlayer" parent="." index="10"]
[node name="MoveSoundPlayer" parent="." index="11"]
stream = ExtResource("4_80pw8")
attenuation_filter_db = 0.0
[node name="Decal" parent="." index="11"]
[node name="Decal" parent="." index="12"]
size = Vector3(1.5, 1, 1.5)
[editable path="AntModel"]

View File

@ -48,16 +48,16 @@ mesh = SubResource("BoxMesh_hvf81")
[node name="SoundEffectsPlayer" type="AudioStreamPlayer3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0)
attenuation_model = 1
script = ExtResource("3_wl62h")
[node name="MoveSoundPlayer" type="AudioStreamPlayer3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0)
attenuation_model = 1
attenuation_filter_db = 0.0
[node name="Decal" type="Decal" parent="."]
size = Vector3(1, 1, 1)
texture_albedo = ExtResource("4_iixjt")
modulate = Color(0, 0, 0, 1)
modulate = Color(0.242208, 0.2075, 0.25, 1)
albedo_mix = 0.5
cull_mask = 32

View File

@ -11,27 +11,6 @@ radius = 15.0
[node name="AntGatherer" instance=ExtResource("1_m5yy7")]
script = ExtResource("2_7pblm")
[node name="Skeleton3D" parent="AntModel/Armature" index="0"]
bones/14/scale = Vector3(1, 1, 1)
bones/15/scale = Vector3(1, 1, 1)
bones/16/scale = Vector3(1, 1, 1)
bones/18/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/19/rotation = Quaternion(0.0294712, -5.33139e-15, 4.35675e-07, 0.999566)
bones/20/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/21/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/22/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/23/rotation = Quaternion(0.0294712, -5.33139e-15, 4.35675e-07, 0.999566)
bones/24/rotation = Quaternion(0.0294712, -6.21995e-15, 4.35675e-07, 0.999566)
bones/25/rotation = Quaternion(0.0294712, -5.33139e-15, 4.35675e-07, 0.999566)
bones/26/scale = Vector3(1, 1, 1)
bones/27/scale = Vector3(1, 1, 1)
bones/32/scale = Vector3(1, 1, 1)
bones/34/scale = Vector3(1, 1, 1)
bones/35/scale = Vector3(1, 1, 1)
bones/36/scale = Vector3(1, 1, 1)
bones/41/scale = Vector3(1, 1, 1)
bones/43/scale = Vector3(1, 1, 1)
[node name="GathererMesh" parent="AntModel/Armature/Skeleton3D" index="0"]
visible = true

View File

@ -1,30 +1,39 @@
[gd_scene load_steps=11 format=3 uid="uid://bw8cabkva3k4f"]
[gd_scene load_steps=12 format=3 uid="uid://bw8cabkva3k4f"]
[ext_resource type="PackedScene" uid="uid://c70vx0utm5knp" path="res://scenes/units/abstract/unit.tscn" id="1_ghhpv"]
[ext_resource type="Script" path="res://scripts/units/aphid.gd" id="2_c6sy4"]
[ext_resource type="PackedScene" uid="uid://ch02ae8fj2lhh" path="res://assets/models/aphid.glb" id="2_vtmi4"]
[ext_resource type="AudioStream" uid="uid://bqt1xdorarhoi" path="res://assets/audio/units/aphid_move.wav" id="5_f4mon"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_f1f0e"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_vr4bn"]
animation = &"idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_mfl87"]
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_6hdai"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_la1j2"]
animation = &"plop"
[sub_resource type="AnimationNodeOneShot" id="AnimationNodeOneShot_qspit"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Root"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_g6qll"]
animation = &"walk"
[sub_resource type="AnimationNodeBlendSpace1D" id="AnimationNodeBlendSpace1D_lgt8u"]
blend_point_0/node = SubResource("AnimationNodeAnimation_f1f0e")
blend_point_0/pos = 0.0
blend_point_1/node = SubResource("AnimationNodeAnimation_mfl87")
blend_point_1/pos = 1.0
min_space = 0.0
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_17r08"]
advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_38sa4"]
states/locomotion/node = SubResource("AnimationNodeBlendSpace1D_lgt8u")
states/locomotion/position = Vector2(333, 100)
transitions = ["Start", "locomotion", SubResource("AnimationNodeStateMachineTransition_17r08")]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_a3xja"]
graph_offset = Vector2(-418.868, 27.0018)
nodes/idle_anim/node = SubResource("AnimationNodeAnimation_vr4bn")
nodes/idle_anim/position = Vector2(-180, 100)
nodes/locomotion_blend/node = SubResource("AnimationNodeBlend2_6hdai")
nodes/locomotion_blend/position = Vector2(20, 140)
nodes/output/position = Vector2(500, 160)
nodes/plop_anim/node = SubResource("AnimationNodeAnimation_la1j2")
nodes/plop_anim/position = Vector2(100, 380)
nodes/plop_oneshot/node = SubResource("AnimationNodeOneShot_qspit")
nodes/plop_oneshot/position = Vector2(300, 220)
nodes/walk_anim/node = SubResource("AnimationNodeAnimation_g6qll")
nodes/walk_anim/position = Vector2(-180, 260)
node_connections = [&"locomotion_blend", 0, &"idle_anim", &"locomotion_blend", 1, &"walk_anim", &"output", 0, &"plop_oneshot", &"plop_oneshot", 0, &"locomotion_blend", &"plop_oneshot", 1, &"plop_anim"]
[sub_resource type="SphereShape3D" id="SphereShape3D_t1vrx"]
radius = 0.3
@ -46,11 +55,17 @@ bones/13/rotation = Quaternion(-0.235443, -0.235445, 0.666758, 0.666758)
bones/14/rotation = Quaternion(-0.235443, -0.235445, 0.666758, 0.666758)
bones/15/scale = Vector3(1, 1, 1)
[node name="AnimationPlayer" parent="AphidModel" index="1"]
deterministic = true
[node name="AnimationTree" parent="." index="1"]
root_node = NodePath("../AphidModel")
tree_root = SubResource("AnimationNodeStateMachine_38sa4")
tree_root = SubResource("AnimationNodeBlendTree_a3xja")
anim_player = NodePath("../AphidModel/AnimationPlayer")
parameters/locomotion/blend_position = 0
parameters/locomotion_blend/blend_amount = 0.0
parameters/plop_oneshot/active = false
parameters/plop_oneshot/internal_active = false
parameters/plop_oneshot/request = 0
[node name="CollisionShape3D" parent="." index="2"]
shape = SubResource("SphereShape3D_t1vrx")

View File

@ -1,6 +1,6 @@
extends AudioStreamPlayer
const ZOOMED_IN_CUTOFF = 10000
const ZOOMED_IN_CUTOFF = 7500
const ZOOMED_OUT_CUTOFF = 0
var _audio_1 := preload("res://assets/audio/ambient/ambient_1.ogg")

View File

@ -13,6 +13,8 @@ var _nitwit_scene := preload("res://scenes/units/ant_nitwit.tscn")
var _gatherer_scene := preload("res://scenes/units/ant_gatherer.tscn")
@onready var ui_origin: Node3D = $UiOrigin
@onready var deposit_point: Node3D = $DepositPoint
@onready var animation_player: AnimationPlayer = $Anthill/AnimationPlayer
@onready var audio_player: SoundEffectsPlayer = (
$SoundEffectsPlayer
)
@ -39,6 +41,8 @@ func deposit_honeydew(amount: int) -> int:
leftover = new_honeydew_amount - max_honeydew
else:
honeydew = new_honeydew_amount
animation_player.stop()
animation_player.play("plop_down")
return leftover
@ -84,5 +88,8 @@ func _create_unit(
)
if ding:
audio_player.play_sound(SoundManager.ding())
animation_player.stop()
animation_player.play("plop_up")
buy_ant.emit()
return new_unit

View File

@ -1,6 +1,8 @@
extends Node
## Handles selection of units.
signal deselect
const MIN_DRAG_DISTANCE: float = 15
const UNIT_SELECT_OFFSET: float = 0.25
@ -50,6 +52,7 @@ func _input(event: InputEvent) -> void:
_selection_rect.size = Vector2.ZERO
elif selecting:
_set_selection_state(false)
deselect.emit()
if event is InputEventMouseMotion:
if _mouse_pressed:
@ -73,6 +76,11 @@ func remove_unit_from_visible(unit: Unit) -> void:
_visible_units.erase(unit_id)
func is_unit_visible(unit: Unit) -> bool:
var unit_id := unit.get_instance_id()
return _visible_units.keys().has(unit_id)
func _handle_advance_anim_step() -> void:
var remapped_unclamped := remap(
_visible_units.size(),

View File

@ -66,6 +66,15 @@ var _press_up_streams: Array[AudioStream] = [
preload("res://assets/audio/ui/press_up_6.wav"),
]
var _aphid_poop_streams: Array[AudioStream] = [
preload("res://assets/audio/units/aphid_poop_1.wav"),
preload("res://assets/audio/units/aphid_poop_2.wav"),
preload("res://assets/audio/units/aphid_poop_3.wav"),
preload("res://assets/audio/units/aphid_poop_4.wav"),
preload("res://assets/audio/units/aphid_poop_5.wav"),
preload("res://assets/audio/units/aphid_poop_6.wav"),
]
func _ready() -> void:
process_mode = Node.PROCESS_MODE_ALWAYS
@ -101,3 +110,7 @@ func press_down() -> AudioStream:
func press_up() -> AudioStream:
return _press_up_streams.pick_random()
func aphid_poop() -> AudioStream:
return _aphid_poop_streams.pick_random()

View File

@ -65,6 +65,7 @@ func _ready() -> void:
assert(listener != null, "listener missing!")
_target_position = StaticNodesManager.player_anthill.global_position
listener.make_current()
UiManager.unit_info.closed.connect(_on_unit_info_closed)
func _process(delta: float) -> void:
@ -90,7 +91,6 @@ func _process(delta: float) -> void:
listener.global_position = _target_position + (Vector3.UP * distance)
listener.global_rotation = global_rotation
UiManager.unit_info.closed.connect(_on_unit_info_closed)
DebugManager.marker("mc_target", _target_position, 0.05)
DebugManager.marker("mc_listener", listener.global_position, 0.05, Color.GREEN)

View File

@ -28,6 +28,7 @@ func _init() -> void:
func _ready() -> void:
assert(selection_indicator != null, "selection_indicator missing!")
nav_agent.navigation_finished.connect(_on_nav_agent_navigation_finished)
SelectionManager.deselect.connect(_on_selection_manager_deselect)
super._ready()
@ -98,3 +99,8 @@ func _click_raycast(mouse_pos: Vector2) -> Vector3:
func _on_nav_agent_navigation_finished() -> void:
_wandering_center = nav_agent.get_final_position()
func _on_selection_manager_deselect() -> void:
if _selected and not SelectionManager.is_unit_visible(self):
set_selected(false)

View File

@ -113,7 +113,7 @@ func _handle_animation(delta: float) -> void:
velocity.length() / _move_speed,
delta * LOCOMOTION_CHANGE_SPEED
)
animation_tree.set("parameters/locomotion/blend_position", _locomotion_value)
animation_tree["parameters/locomotion_blend/blend_amount"] = _locomotion_value
_advance_anim_delta_accum += delta

View File

@ -9,7 +9,7 @@ const BONE_SCALE_VARIATION: float = 0.25
const HONEYDEW_INTERVAL_MIN: float = 5
const HONEYDEW_INTERVAL_MAX: float = 60
const HONEYDEW_SPAWN_SPREAD: float = 0.5
const HONEYDEW_SPAWN_SPREAD: float = 0.25
const HONEYDEWS_MAX: int = 5
var state: State = State.WANDERING
@ -87,6 +87,11 @@ func _handle_honeydew_spawn(delta: float) -> void:
new_honeydew.global_position = global_position + new_pos
_put_honeydew(new_honeydew)
audio_player.play_sound(SoundManager.aphid_poop())
animation_tree["parameters/plop_oneshot/request"] = (
AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE
)
_set_spawn_timer()

View File

@ -146,8 +146,15 @@ func _pick_up() -> void:
_get_nth_pile_pos(_carrying_items.size() - 1)
).tween_finished
audio_player.play_sound(SoundManager.pop())
_unit.animation_tree["parameters/plop_down_oneshot/request"] = (
AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE
)
await get_tree().create_timer(_pickup_interval).timeout
if state == State.STOP:
return
var nearest := _find_nearest(_nearby_items.values())
if _carrying_items.size() == _max_carrying or nearest == null:
_go_deposit()
@ -157,7 +164,6 @@ func _pick_up() -> void:
func _deposit() -> void:
await get_tree().create_timer(0.5).timeout
while _carrying_items.size() > 0:
if state != State.DEPOSITING:
return
@ -167,9 +173,14 @@ func _deposit() -> void:
return
var item := _carrying_items.pop_back() as Honeydew
_unit.animation_tree["parameters/plop_up_oneshot/request"] = (
AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE
)
audio_player.play_sound(SoundManager.swoosh())
await item.start_tweening(_unit.anthill.global_position).tween_finished
await item.start_tweening(
_unit.anthill.deposit_point.global_position
).tween_finished
audio_player.play_sound(SoundManager.tok())
item.remove_from_spawner()
@ -178,6 +189,9 @@ func _deposit() -> void:
_unit.anthill.deposit_honeydew(1)
await get_tree().create_timer(_drop_interval).timeout
if state == State.STOP:
return
var nearest := _find_nearest(_nearby_items.values())
if nearest == null:
state = State.WAITING_FOR_NEW_ITEMS
@ -242,7 +256,7 @@ func _on_nav_agent_navigation_finished() -> void:
if (
state == State.DEPOSITING
and global_position.distance_to(_unit.anthill.global_position) < 2
# and global_position.distance_to(_unit.anthill.global_position) < 2
):
_deposit()