Initial commit (release)

This commit is contained in:
2026-02-08 12:20:45 -03:00
commit 1497a225cc
51 changed files with 1618 additions and 0 deletions

4
.editorconfig Normal file
View File

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

18
.gitignore vendored Normal file
View File

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

22
LICENSE Normal file
View File

@@ -0,0 +1,22 @@
MIT License
Copyright (c) 2026 wanp
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

BIN
assets/arrow.glb Normal file

Binary file not shown.

42
assets/arrow.glb.import Normal file
View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://cwtmdaxfjpek5"
path="res://.godot/imported/arrow.glb-fbbbd1f233a05b386bf12d76bd49138b.scn"
[deps]
source_file="res://assets/arrow.glb"
dest_files=["res://.godot/imported/arrow.glb-fbbbd1f233a05b386bf12d76bd49138b.scn"]
[params]
nodes/root_type=""
nodes/root_name="Arrow"
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
assets/button.glb Normal file

Binary file not shown.

42
assets/button.glb.import Normal file
View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://fbqbcvko5rla"
path="res://.godot/imported/button.glb-c091fb4dc2edb443cfd7c3e13491944b.scn"
[deps]
source_file="res://assets/button.glb"
dest_files=["res://.godot/imported/button.glb-c091fb4dc2edb443cfd7c3e13491944b.scn"]
[params]
nodes/root_type=""
nodes/root_name="Button"
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
assets/button.wav Normal file

Binary file not shown.

24
assets/button.wav.import Normal file
View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://btiwfrsqwqpb0"
path="res://.godot/imported/button_button-colors.png-b3e694bdad4006b8b5e9e9231b641088.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "6ca987e3bee41277db70025faf205a39"
}
[deps]
source_file="res://assets/button_button-colors.png"
dest_files=["res://.godot/imported/button_button-colors.png-b3e694bdad4006b8b5e9e9231b641088.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

View File

@@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://bj2ksich3ki3b"
path="res://.godot/imported/fandanguillo-de-almeria-la-argentinita.ogg-3985f6350437735c282d8ee732a6fb86.oggvorbisstr"
[deps]
source_file="res://assets/fandanguillo-de-almeria-la-argentinita.ogg"
dest_files=["res://.godot/imported/fandanguillo-de-almeria-la-argentinita.ogg-3985f6350437735c282d8ee732a6fb86.oggvorbisstr"]
[params]
loop=true
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

BIN
assets/ghost1.glb Normal file

Binary file not shown.

50
assets/ghost1.glb.import Normal file
View File

@@ -0,0 +1,50 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bjwne0uhljtcp"
path="res://.godot/imported/ghost1.glb-8fe4d028afe8ef41f60711efaaf7caf8.scn"
[deps]
source_file="res://assets/ghost1.glb"
dest_files=["res://.godot/imported/ghost1.glb-8fe4d028afe8ef41f60711efaaf7caf8.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={
"materials": {
"Material.001": {
"use_external/enabled": true,
"use_external/fallback_path": "res://src/game/ghost_material.tres",
"use_external/path": "uid://b2fsxx7piy766"
}
}
}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
assets/ghost2.glb Normal file

Binary file not shown.

50
assets/ghost2.glb.import Normal file
View File

@@ -0,0 +1,50 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://nvmmfbhcsklr"
path="res://.godot/imported/ghost2.glb-51f8285307a2f55adc2c16c906db0392.scn"
[deps]
source_file="res://assets/ghost2.glb"
dest_files=["res://.godot/imported/ghost2.glb-51f8285307a2f55adc2c16c906db0392.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={
"materials": {
"Material.001": {
"use_external/enabled": true,
"use_external/fallback_path": "res://src/game/ghost_material.tres",
"use_external/path": "uid://b2fsxx7piy766"
}
}
}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
assets/ghost3.glb Normal file

Binary file not shown.

50
assets/ghost3.glb.import Normal file
View File

@@ -0,0 +1,50 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://vwimm7jky61f"
path="res://.godot/imported/ghost3.glb-a8268a4246a419d28e073c28b06c2a75.scn"
[deps]
source_file="res://assets/ghost3.glb"
dest_files=["res://.godot/imported/ghost3.glb-a8268a4246a419d28e073c28b06c2a75.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
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=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={
"materials": {
"Material.001": {
"use_external/enabled": true,
"use_external/fallback_path": "res://src/game/ghost_material.tres",
"use_external/path": "uid://b2fsxx7piy766"
}
}
}
gltf/naming_version=2
gltf/embedded_image_handling=1

BIN
assets/in.wav Normal file

Binary file not shown.

24
assets/in.wav.import Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://g5227ljhgxba"
path="res://.godot/imported/in.wav-93008283f2cdf3bf14c9d1270f0829b3.sample"
[deps]
source_file="res://assets/in.wav"
dest_files=["res://.godot/imported/in.wav-93008283f2cdf3bf14c9d1270f0829b3.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
assets/out.wav Normal file

Binary file not shown.

24
assets/out.wav.import Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cb2cly1p33pue"
path="res://.godot/imported/out.wav-f7d74ab5eb384260957d2d1fa6b3aa06.sample"
[deps]
source_file="res://assets/out.wav"
dest_files=["res://.godot/imported/out.wav-f7d74ab5eb384260957d2d1fa6b3aa06.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
assets/rhodium-libre.ttf Normal file

Binary file not shown.

View File

@@ -0,0 +1,36 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://c4p2j3cqdcx8x"
path="res://.godot/imported/rhodium-libre.ttf-3f99e6a93d6b7f0d5d26ada6d8f419af.fontdata"
[deps]
source_file="res://assets/rhodium-libre.ttf"
dest_files=["res://.godot/imported/rhodium-libre.ttf-3f99e6a93d6b7f0d5d26ada6d8f419af.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
modulate_color_glyphs=false
hinting=1
subpixel_positioning=4
keep_rounding_remainders=true
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

BIN
assets/slam.wav Normal file

Binary file not shown.

24
assets/slam.wav.import Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c1stp6572r2qg"
path="res://.godot/imported/slam.wav-07138e7f1e045a7cc6aaf4d7bfd42d12.sample"
[deps]
source_file="res://assets/slam.wav"
dest_files=["res://.godot/imported/slam.wav-07138e7f1e045a7cc6aaf4d7bfd42d12.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
assets/splat.wav Normal file

Binary file not shown.

24
assets/splat.wav.import Normal file
View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://d2fttu4hq27nb"
path="res://.godot/imported/splat.wav-be60c91081f5190f812703dd3fac1124.sample"
[deps]
source_file="res://assets/splat.wav"
dest_files=["res://.godot/imported/splat.wav-be60c91081f5190f812703dd3fac1124.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
assets/the-nautigal.ttf Normal file

Binary file not shown.

View File

@@ -0,0 +1,36 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dsnbywa4hscr0"
path="res://.godot/imported/the-nautigal.ttf-b9354cb802dd9bb9fa65eac1a923ace4.fontdata"
[deps]
source_file="res://assets/the-nautigal.ttf"
dest_files=["res://.godot/imported/the-nautigal.ttf-b9354cb802dd9bb9fa65eac1a923ace4.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
modulate_color_glyphs=false
hinting=1
subpixel_positioning=4
keep_rounding_remainders=true
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

27
default_bus_layout.tres Normal file
View File

@@ -0,0 +1,27 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://cg8ko5gj8ec6t"]
[sub_resource type="AudioEffectLimiter" id="AudioEffectLimiter_j3pel"]
resource_name = "Limiter"
[sub_resource type="AudioEffectReverb" id="AudioEffectReverb_j3pel"]
resource_name = "Reverb"
room_size = 0.01
damping = 0.8
[resource]
bus/1/name = &"music"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = 0.0
bus/1/send = &"Master"
bus/2/name = &"sfx"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = -6.0044775
bus/2/send = &"Master"
bus/2/effect/0/effect = SubResource("AudioEffectLimiter_j3pel")
bus/2/effect/0/enabled = true
bus/2/effect/1/effect = SubResource("AudioEffectReverb_j3pel")
bus/2/effect/1/enabled = true

49
export_presets.cfg Normal file
View File

@@ -0,0 +1,49 @@
[preset.0]
name="Web"
platform="Web"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="dist/index.html"
patches=PackedStringArray()
patch_delta_encoding=false
patch_delta_compression_level_zstd=19
patch_delta_min_reduction=0.1
patch_delta_include_filters="*"
patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
variant/extensions_support=false
variant/thread_support=false
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=false
html/custom_html_shell=""
html/head_include=""
html/canvas_resize_policy=2
html/focus_canvas_on_start=true
html/experimental_virtual_keyboard=false
progressive_web_app/enabled=false
progressive_web_app/ensure_cross_origin_isolation_headers=true
progressive_web_app/offline_page=""
progressive_web_app/display=1
progressive_web_app/orientation=0
progressive_web_app/icon_144x144=""
progressive_web_app/icon_180x180=""
progressive_web_app/icon_512x512=""
progressive_web_app/background_color=Color(0, 0, 0, 1)
threads/emscripten_pool_size=8
threads/godot_pool_size=4

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: 995 B

43
icon.svg.import Normal file
View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://wf6nm2xuxq6r"
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/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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

73
project.godot Normal file
View File

@@ -0,0 +1,73 @@
; 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
[animation]
compatibility/default_parent_skeleton_in_mesh_instance_3d=true
[application]
config/name="D'n'J Crusher"
run/main_scene="uid://0t1khpumpjk6"
config/features=PackedStringArray("4.6", "GL Compatibility")
boot_splash/bg_color=Color(0, 0, 0, 1)
boot_splash/show_image=false
config/icon="res://icon.svg"
[audio]
buses/default_bus_layout="uid://cg8ko5gj8ec6t"
general/default_playback_type.web=0
[display]
window/size/viewport_width=800
window/size/viewport_height=600
window/stretch/mode="canvas_items"
[global_group]
ghosts=""
[input]
d_act={
"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":68,"physical_keycode":0,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
]
}
j_act={
"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":74,"physical_keycode":0,"key_label":0,"unicode":106,"location":0,"echo":false,"script":null)
]
}
pause={
"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":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, 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":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
[physics]
3d/run_on_separate_thread=true
2d/physics_engine="Dummy"
3d/physics_engine="Dummy"
common/physics_interpolation=true
[rendering]
rendering_device/driver.windows="d3d12"
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
lights_and_shadows/positional_shadow/soft_shadow_filter_quality=0
shading/overrides/force_vertex_shading=true
limits/opengl/max_renderable_elements=4096
limits/opengl/max_renderable_lights=8

8
src/game/basic.gdshader Normal file
View File

@@ -0,0 +1,8 @@
shader_type spatial;
uniform sampler2D texture_image : source_color;
uniform vec3 tint : source_color = vec3(1, 1, 1);
void fragment() {
ALBEDO = texture(texture_image, UV).rgb * tint.rgb;
}

View File

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

View File

@@ -0,0 +1,8 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://b6qswdhurj1l6"]
[ext_resource type="Shader" uid="uid://bvemv1371ggkd" path="res://src/game/basic.gdshader" id="1_mml0d"]
[resource]
render_priority = 0
shader = ExtResource("1_mml0d")
shader_parameter/tint = Color(1, 0.81666666, 0, 1)

120
src/game/game.gd Normal file
View File

@@ -0,0 +1,120 @@
extends Node3D
enum TutorialStep {
PRESS_J,
PRESS_D,
DONE,
}
@export var _ui_layer: CanvasLayer
@export var _press_d_prompt: Node3D
@export var _press_j_prompt: Node3D
@export var _d_anim: AnimationPlayer
@export var _d_button: Node3D
@export var _j_anim: AnimationPlayer
@export var _j_button: Node3D
@onready var _d_button_anim: AnimationPlayer = _d_button.get_node("AnimationPlayer")
@onready var _j_button_anim: AnimationPlayer = _j_button.get_node("AnimationPlayer")
var _tutorial_step := TutorialStep.PRESS_J
func _ready() -> void:
_press_d_prompt.hide()
_press_j_prompt.hide()
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("d_act"):
_d_anim.play("press")
_d_button_anim.play("press")
_crusher_deactivate()
return
if event.is_action_pressed("j_act"):
_j_anim.play("press")
_j_button_anim.play("press")
_crusher_activate()
return
func _physics_process(_delta: float) -> void:
if _tutorial_step != TutorialStep.DONE:
match _tutorial_step:
TutorialStep.PRESS_J:
if _crusher_is_active:
_tutorial_step = (_tutorial_step + 1) as TutorialStep
else:
_press_d_prompt.hide()
_press_j_prompt.show()
TutorialStep.PRESS_D:
if not _crusher_is_active:
_tutorial_step = (_tutorial_step + 1) as TutorialStep
else:
_press_d_prompt.show()
_press_j_prompt.hide()
# was set in one of the match cases
if _tutorial_step == TutorialStep.DONE:
_ui_layer.hide()
_press_d_prompt.hide()
_press_j_prompt.hide()
_ghost_spawn_timer.start()
#region Ghosts
@export var _ghost_spawn_timer: Timer
@export var _ghost_scene: PackedScene
func _on_ghost_spawn_timer_timeout() -> void:
var ghost: Node3D = _ghost_scene.instantiate()
add_child(ghost)
ghost.position = Vector3(randf_range(-1, 1), -4, 0)
_ghost_spawn_timer.wait_time = randf_range(0.3, 1.3)
#endregion
#region Crusher
@export var _crusher: Node3D
@export var _slam_sfx: AudioStreamPlayer3D
@export var _splat_sfx: AudioStreamPlayer3D
@export var _crusher_anim: AnimationPlayer
@onready var _crush_range_start = _crusher.position.y + 1.8
@onready var _crush_range_end = _crusher.position.y + -1.4
# can't reactivate until deactivated, and vice versa
var _crusher_is_active := false
func _crusher_activate() -> void:
if _crusher_anim.is_playing() or _crusher_is_active:
return
_crusher_is_active = true
_crusher_anim.play("crush")
func _crusher_deactivate() -> void:
if _crusher_anim.is_playing() or not _crusher_is_active:
return
_crusher_is_active = false
_crusher_anim.play("uncrush")
func crusher_crush() -> void:
var ghosts := get_tree().get_nodes_in_group("ghosts")
var crushed_any := false
for ghost: Ghost in ghosts:
if ghost.is_crushed:
continue
if ghost.position.y > _crush_range_start or ghost.position.y < _crush_range_end:
continue
ghost.crush(0)
crushed_any = true
_slam_sfx.play()
if crushed_any:
_splat_sfx.play()
#endregion

1
src/game/game.gd.uid Normal file
View File

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

646
src/game/game.tscn Normal file
View File

@@ -0,0 +1,646 @@
[gd_scene format=3 uid="uid://0t1khpumpjk6"]
[ext_resource type="Script" uid="uid://cagqlqi6ahncv" path="res://src/game/game.gd" id="1_s6lek"]
[ext_resource type="Material" uid="uid://b6qswdhurj1l6" path="res://src/game/basic_untinted_material.tres" id="2_kgj8g"]
[ext_resource type="PackedScene" uid="uid://sdd62ogittlq" path="res://src/game/ghost.tscn" id="2_l80un"]
[ext_resource type="Material" uid="uid://di0etogxlb5dq" path="res://src/game/wall_material.tres" id="2_s6lek"]
[ext_resource type="AudioStream" uid="uid://bj2ksich3ki3b" path="res://assets/fandanguillo-de-almeria-la-argentinita.ogg" id="3_htx8b"]
[ext_resource type="FontFile" uid="uid://dsnbywa4hscr0" path="res://assets/the-nautigal.ttf" id="4_etvrb"]
[ext_resource type="PackedScene" uid="uid://fbqbcvko5rla" path="res://assets/button.glb" id="4_xptat"]
[ext_resource type="AudioStream" uid="uid://l3eewf8v21rl" path="res://assets/button.wav" id="5_6kr85"]
[ext_resource type="AudioStream" uid="uid://c1stp6572r2qg" path="res://assets/slam.wav" id="6_jhw8o"]
[ext_resource type="PackedScene" uid="uid://cwtmdaxfjpek5" path="res://assets/arrow.glb" id="6_yarin"]
[ext_resource type="AudioStream" uid="uid://g5227ljhgxba" path="res://assets/in.wav" id="7_7r0dx"]
[ext_resource type="AudioStream" uid="uid://d2fttu4hq27nb" path="res://assets/splat.wav" id="7_n7s5x"]
[ext_resource type="AudioStream" uid="uid://cb2cly1p33pue" path="res://assets/out.wav" id="8_htx8b"]
[ext_resource type="FontFile" uid="uid://c4p2j3cqdcx8x" path="res://assets/rhodium-libre.ttf" id="12_ueio8"]
[sub_resource type="Environment" id="Environment_jn5yv"]
background_mode = 1
ambient_light_source = 1
reflected_light_source = 1
[sub_resource type="Animation" id="Animation_clwl7"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:light_energy")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [3.0]
}
[sub_resource type="Animation" id="Animation_7r0dx"]
resource_name = "flicker"
length = 0.8
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:light_energy")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.4),
"transitions": PackedFloat32Array(0.5, 1),
"update": 0,
"values": [3.0, 5.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_htx8b"]
_data = {
&"RESET": SubResource("Animation_clwl7"),
&"flicker": SubResource("Animation_7r0dx")
}
[sub_resource type="CylinderMesh" id="CylinderMesh_s6lek"]
top_radius = 1.0
radial_segments = 6
rings = 0
[sub_resource type="PlaneMesh" id="PlaneMesh_qnjlk"]
material = ExtResource("2_s6lek")
size = Vector2(15, 15)
[sub_resource type="Animation" id="Animation_jhw8o"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Hand:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(-0.4000001, -0.100000024, 0.30000004)]
}
[sub_resource type="Animation" id="Animation_yarin"]
resource_name = "press"
length = 0.1667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Hand:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.033333335, 0.16666667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(-0.4000001, -0.100000024, 0.30000004), Vector3(-0.4000001, -0.30000007, 0.30000004), Vector3(-0.4000001, -0.100000024, 0.30000004)]
}
tracks/1/type = "audio"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Button/ButtonSfx")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("5_6kr85")
}],
"times": PackedFloat32Array(0.033333335)
}
tracks/1/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_jhw8o"]
_data = {
&"RESET": SubResource("Animation_jhw8o"),
&"press": SubResource("Animation_yarin")
}
[sub_resource type="SphereMesh" id="SphereMesh_kgj8g"]
lightmap_size_hint = Vector2i(14, 8)
material = ExtResource("2_kgj8g")
radius = 0.4
height = 0.8
radial_segments = 8
rings = 6
[sub_resource type="Gradient" id="Gradient_s6lek"]
interpolation_mode = 1
offsets = PackedFloat32Array(0, 0.6)
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_kgj8g"]
gradient = SubResource("Gradient_s6lek")
width = 8
height = 16
fill = 1
fill_from = Vector2(0.5, 0.5)
[sub_resource type="SphereMesh" id="SphereMesh_l80un"]
material = ExtResource("2_kgj8g")
radius = 0.1
height = 0.2
radial_segments = 8
rings = 6
[sub_resource type="Animation" id="Animation_6kr85"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Hand:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.4, -0.1, 0.3)]
}
[sub_resource type="Animation" id="Animation_n7s5x"]
resource_name = "press"
length = 0.1667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Hand:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.033333335, 0.16666667),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0.4, -0.1, 0.3), Vector3(0.4000001, -0.30000007, 0.3), Vector3(0.4, -0.1, 0.3)]
}
tracks/1/type = "audio"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Button/ButtonSfx")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("5_6kr85")
}],
"times": PackedFloat32Array(0.033333335)
}
tracks/1/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_6kr85"]
_data = {
&"RESET": SubResource("Animation_6kr85"),
&"press": SubResource("Animation_n7s5x")
}
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_jhw8o"]
random_pitch = 1.122462
streams_count = 1
stream_0/stream = ExtResource("7_n7s5x")
[sub_resource type="Animation" id="Animation_l80un"]
length = 0.001
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TubeLeft")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, -10, 0, 0)
tracks/1/type = "position_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("TubeRight")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 10, 0, 0)
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("TubeLeft:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(-10, 0, 0)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("TubeRight:position")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(10, 0, 0)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("TubeLeft/MashyPlate:scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("TubeRight/MashyPlate:scale")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
[sub_resource type="Animation" id="Animation_s6lek"]
resource_name = "crush"
length = 0.13333334
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TubeLeft:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0666, 0.13333334),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(-10, 0, 0), Vector3(-4.157, 0, 0), Vector3(-4.19, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("TubeRight:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.0666, 0.13333334),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(10, 0, 0), Vector3(4.15, 0, 0), Vector3(4.2, 0, 0)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("TubeLeft/MashyPlate:scale")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.06666667, 0.13333334),
"transitions": PackedFloat32Array(0, 1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(0.6, 1.4, 1), Vector3(1, 1, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("TubeRight/MashyPlate:scale")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.06666667, 0.13333334),
"transitions": PackedFloat32Array(0, 1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(0.6, 1.4, 1), Vector3(1, 1, 1)]
}
tracks/4/type = "method"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("..")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.06666667),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"crusher_crush"
}]
}
tracks/5/type = "audio"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("MoveSfx")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("7_7r0dx")
}],
"times": PackedFloat32Array(0)
}
tracks/5/use_blend = true
[sub_resource type="Animation" id="Animation_kgj8g"]
resource_name = "idle"
length = 0.001
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TubeLeft")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, -10, 0, 0)
tracks/1/type = "position_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("TubeRight")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 10, 0, 0)
[sub_resource type="Animation" id="Animation_xptat"]
resource_name = "uncrush"
length = 0.1998
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TubeLeft:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1998),
"transitions": PackedFloat32Array(3.5, 1),
"update": 0,
"values": [Vector3(-4.209, 0, 0), Vector3(-10, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("TubeRight:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1998),
"transitions": PackedFloat32Array(3.5, 1),
"update": 0,
"values": [Vector3(4.2, 0, 0), Vector3(10, 0, 0)]
}
tracks/2/type = "audio"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("MoveSfx")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"clips": [{
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("8_htx8b")
}],
"times": PackedFloat32Array(0)
}
tracks/2/use_blend = true
[sub_resource type="AnimationLibrary" id="AnimationLibrary_kgj8g"]
_data = {
&"RESET": SubResource("Animation_l80un"),
&"crush": SubResource("Animation_s6lek"),
&"idle": SubResource("Animation_kgj8g"),
&"uncrush": SubResource("Animation_xptat")
}
[sub_resource type="BoxMesh" id="BoxMesh_qnjlk"]
size = Vector3(8, 0.2, 0.2)
[sub_resource type="BoxMesh" id="BoxMesh_s6lek"]
size = Vector3(0.205, 2.5, 1.5)
[sub_resource type="TextMesh" id="TextMesh_xptat"]
material = ExtResource("2_kgj8g")
text = "Press J"
font = ExtResource("12_ueio8")
font_size = 64
[sub_resource type="TextMesh" id="TextMesh_yarin"]
material = ExtResource("2_kgj8g")
text = "Press D"
font = ExtResource("12_ueio8")
font_size = 64
[node name="Game" type="Node3D" unique_id=133158643 node_paths=PackedStringArray("_ui_layer", "_press_d_prompt", "_press_j_prompt", "_d_anim", "_d_button", "_j_anim", "_j_button", "_ghost_spawn_timer", "_crusher", "_slam_sfx", "_splat_sfx", "_crusher_anim")]
script = ExtResource("1_s6lek")
_ui_layer = NodePath("UI")
_press_d_prompt = NodePath("PressDPrompt")
_press_j_prompt = NodePath("PressJPrompt")
_d_anim = NodePath("D/AnimationPlayer")
_d_button = NodePath("D/Button")
_j_anim = NodePath("J/AnimationPlayer")
_j_button = NodePath("J/Button")
_ghost_spawn_timer = NodePath("GhostSpawnTimer")
_ghost_scene = ExtResource("2_l80un")
_crusher = NodePath("Crusher")
_slam_sfx = NodePath("Crusher/SlamSfx")
_splat_sfx = NodePath("Crusher/SplatSfx")
_crusher_anim = NodePath("Crusher/AnimationPlayer")
[node name="MusicPlayer" type="AudioStreamPlayer" parent="." unique_id=220746864]
stream = ExtResource("3_htx8b")
autoplay = true
bus = &"music"
[node name="UI" type="CanvasLayer" parent="." unique_id=697702645]
[node name="TitleLabel" type="Label" parent="UI" unique_id=1741345152]
offset_left = 8.0
offset_top = 12.0
offset_right = 170.0
offset_bottom = 40.0
theme_override_fonts/font = ExtResource("4_etvrb")
theme_override_font_sizes/font_size = 72
text = "“D 'n' J Crusher”"
[node name="WanpLabel" type="Label" parent="UI" unique_id=531736359]
offset_left = 17.0
offset_top = 100.0
offset_right = 179.0
offset_bottom = 128.0
theme_override_fonts/font = ExtResource("12_ueio8")
text = "manifested by wanp"
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1729807054]
environment = SubResource("Environment_jn5yv")
[node name="Camera3D" type="Camera3D" parent="." unique_id=1917918356]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 4)
[node name="OmniLight3D" type="OmniLight3D" parent="." unique_id=1281532038]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.6)
light_color = Color(1, 0.75, 0, 1)
light_energy = 2.0
omni_shadow_mode = 0
[node name="OmniLight3D2" type="OmniLight3D" parent="." unique_id=387250400]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3000001, 1.6)
light_color = Color(1, 0.75, 0, 1)
light_energy = 2.0
omni_shadow_mode = 0
[node name="OmniLight3D3" type="OmniLight3D" parent="." unique_id=1580815460]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2.6999998, 0.100000024)
light_color = Color(1, 0.18333334, 0, 1)
light_energy = 3.0
omni_shadow_mode = 0
[node name="AnimationPlayer" type="AnimationPlayer" parent="OmniLight3D3" unique_id=1586322282]
libraries/ = SubResource("AnimationLibrary_htx8b")
autoplay = &"flicker"
[node name="PlatformLeft" type="MeshInstance3D" parent="." unique_id=1783405889]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -2.7, 0)
mesh = SubResource("CylinderMesh_s6lek")
[node name="PlatformRight" type="MeshInstance3D" parent="." unique_id=1346653145]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -2.7, 0)
mesh = SubResource("CylinderMesh_s6lek")
[node name="Wall" type="MeshInstance3D" parent="." unique_id=1308282145]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, -1, -2)
mesh = SubResource("PlaneMesh_qnjlk")
[node name="D" type="Node3D" parent="." unique_id=928869159]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -1.3000001, 0.20000002)
[node name="AnimationPlayer" type="AnimationPlayer" parent="D" unique_id=7005501]
libraries/ = SubResource("AnimationLibrary_jhw8o")
[node name="Orb" type="MeshInstance3D" parent="D" unique_id=762810288]
mesh = SubResource("SphereMesh_kgj8g")
skeleton = NodePath("../..")
[node name="Eye" type="Sprite3D" parent="D" unique_id=1973646501]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.100000024, 0.100000024, 0.29999998)
pixel_size = 0.02
billboard = 1
no_depth_test = true
texture_filter = 0
texture = SubResource("GradientTexture2D_kgj8g")
[node name="Eye2" type="Sprite3D" parent="D" unique_id=1067064441]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.20000005, 0.4)
pixel_size = 0.02
billboard = 1
no_depth_test = true
texture_filter = 0
texture = SubResource("GradientTexture2D_kgj8g")
[node name="Hand" type="MeshInstance3D" parent="D" unique_id=179301020]
transform = Transform3D(1, 0, 0, 0, 1.0000001, 0, 0, 0, 1, -0.4000001, -0.100000024, 0.30000004)
mesh = SubResource("SphereMesh_l80un")
[node name="Button" parent="D" unique_id=1703705526 instance=ExtResource("4_xptat")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3849659, -0.39247894, 0.30321684)
[node name="ButtonSfx" type="AudioStreamPlayer3D" parent="D/Button" unique_id=1459135632]
panning_strength = 2.0
bus = &"sfx"
[node name="J" type="Node3D" parent="." unique_id=794820390]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -1.3, 0.2)
[node name="AnimationPlayer" type="AnimationPlayer" parent="J" unique_id=1956217934]
libraries/ = SubResource("AnimationLibrary_6kr85")
[node name="Orb" type="MeshInstance3D" parent="J" unique_id=1264857338]
mesh = SubResource("SphereMesh_kgj8g")
skeleton = NodePath("../..")
[node name="Eye" type="Sprite3D" parent="J" unique_id=1330761631]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1, 0.1, 0.3)
pixel_size = 0.02
billboard = 1
no_depth_test = true
texture_filter = 0
texture = SubResource("GradientTexture2D_kgj8g")
[node name="Eye2" type="Sprite3D" parent="J" unique_id=1441343203]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.2, 0.4)
pixel_size = 0.02
billboard = 1
no_depth_test = true
texture_filter = 0
texture = SubResource("GradientTexture2D_kgj8g")
[node name="Hand" type="MeshInstance3D" parent="J" unique_id=2003843339]
transform = Transform3D(1, 0, 0, 0, 1.0000001, 0, 0, 0, 1, 0.4, -0.1, 0.3)
mesh = SubResource("SphereMesh_l80un")
skeleton = NodePath("../../D")
[node name="Button" parent="J" unique_id=1343560287 instance=ExtResource("4_xptat")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.385, -0.392, 0.303)
[node name="ButtonSfx" type="AudioStreamPlayer3D" parent="J/Button" unique_id=2054923244]
panning_strength = 2.0
bus = &"sfx"
[node name="Crusher" type="Node3D" parent="." unique_id=135343329]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.7, 0)
[node name="MoveSfx" type="AudioStreamPlayer3D" parent="Crusher" unique_id=154564713]
bus = &"sfx"
[node name="SlamSfx" type="AudioStreamPlayer3D" parent="Crusher" unique_id=1867676118]
stream = ExtResource("6_jhw8o")
volume_db = -9.0
bus = &"sfx"
[node name="SplatSfx" type="AudioStreamPlayer3D" parent="Crusher" unique_id=995157383]
stream = SubResource("AudioStreamRandomizer_jhw8o")
volume_db = -8.0
bus = &"sfx"
[node name="AnimationPlayer" type="AnimationPlayer" parent="Crusher" unique_id=1632097092]
libraries/ = SubResource("AnimationLibrary_kgj8g")
[node name="TubeLeft" type="MeshInstance3D" parent="Crusher" unique_id=5559250]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 0)
mesh = SubResource("BoxMesh_qnjlk")
[node name="MashyPlate" type="MeshInstance3D" parent="Crusher/TubeLeft" unique_id=1333803171]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.1, 0, 0)
mesh = SubResource("BoxMesh_s6lek")
[node name="TubeRight" type="MeshInstance3D" parent="Crusher" unique_id=1854970319]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0)
mesh = SubResource("BoxMesh_qnjlk")
[node name="MashyPlate" type="MeshInstance3D" parent="Crusher/TubeRight" unique_id=773801297]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.1, 0, 0)
mesh = SubResource("BoxMesh_s6lek")
skeleton = NodePath("../../TubeLeft")
[node name="GhostSpawnTimer" type="Timer" parent="." unique_id=1851782317]
[node name="PressJPrompt" type="MeshInstance3D" parent="." unique_id=1875037720]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6, 0.2, 0)
mesh = SubResource("TextMesh_xptat")
[node name="Arrow" parent="PressJPrompt" unique_id=1726557209 instance=ExtResource("6_yarin")]
transform = Transform3D(0.93969274, 0.34202018, 0, -0.34202018, 0.93969274, 0, 0, 0, 1, 0.8000001, -0.6000001, 0)
[node name="PressDPrompt" type="MeshInstance3D" parent="." unique_id=1772110792]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.6, 0.2, 0)
mesh = SubResource("TextMesh_yarin")
[node name="Arrow" parent="PressDPrompt" unique_id=596720032 instance=ExtResource("6_yarin")]
transform = Transform3D(0.76604456, 0.64278764, 0, -0.64278764, 0.76604456, 0, 0, 0, 1, 0.6000002, -0.6000001, 0)
[connection signal="timeout" from="GhostSpawnTimer" to="." method="_on_ghost_spawn_timer_timeout"]

43
src/game/ghost.gd Normal file
View File

@@ -0,0 +1,43 @@
class_name Ghost
extends Node3D
static var _models: Array[PackedScene] = [
load("res://assets/ghost1.glb"),
load("res://assets/ghost2.glb"),
load("res://assets/ghost3.glb"),
]
var _rise_speed := 0.0
var _turn_speed := 0.0
var _fall_velocity := 0.0
var is_crushed := false
func _ready() -> void:
add_child(_models.pick_random().instantiate())
_rise_speed = randf_range(0.06, 0.1)
_turn_speed = randf_range(0.06, 0.2) * [1, -1].pick_random()
func _physics_process(_delta: float) -> void:
if not is_crushed:
position.y += _rise_speed
rotate_y(_turn_speed)
else:
_fall_velocity += -0.002
position.y += _fall_velocity
func crush(final_position_x: float) -> void:
is_crushed = true
position.x = final_position_x
rotation.y = 0
scale.x = 0.2
scale.y = 1.4
reset_physics_interpolation()
func _on_screen_exited() -> void:
queue_free()

1
src/game/ghost.gd.uid Normal file
View File

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

7
src/game/ghost.gdshader Normal file
View File

@@ -0,0 +1,7 @@
shader_type spatial;
render_mode unshaded;
void fragment() {
ALBEDO = vec3(1);
ALPHA = 0.5;
}

View File

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

11
src/game/ghost.tscn Normal file
View File

@@ -0,0 +1,11 @@
[gd_scene format=3 uid="uid://sdd62ogittlq"]
[ext_resource type="Script" uid="uid://duakb2887lc64" path="res://src/game/ghost.gd" id="1_jtw1h"]
[node name="Ghost" type="Node3D" unique_id=80173777 groups=["ghosts"]]
script = ExtResource("1_jtw1h")
[node name="VisibleOnScreenNotifier3D" type="VisibleOnScreenNotifier3D" parent="." unique_id=1773071315]
aabb = AABB(-0.4, -0.4, -0.4, 0.8, 0.8, 0.8)
[connection signal="screen_exited" from="VisibleOnScreenNotifier3D" to="." method="_on_screen_exited"]

View File

@@ -0,0 +1,7 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://b2fsxx7piy766"]
[ext_resource type="Shader" uid="uid://dwh2j57d7dtt7" path="res://src/game/ghost.gdshader" id="1_n2xwl"]
[resource]
render_priority = 0
shader = ExtResource("1_n2xwl")

8
src/game/wall.gdshader Normal file
View File

@@ -0,0 +1,8 @@
shader_type spatial;
render_mode unshaded;
uniform sampler2D texture_image : source_color;
void fragment() {
ALBEDO = texture(texture_image, UV).rgb;
}

View File

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

View File

@@ -0,0 +1,30 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://di0etogxlb5dq"]
[ext_resource type="Shader" uid="uid://dyjjgyovssd7s" path="res://src/game/wall.gdshader" id="1_q0bvm"]
[sub_resource type="Gradient" id="Gradient_igrk8"]
interpolation_mode = 2
offsets = PackedFloat32Array(0.23913044, 1)
colors = PackedColorArray(0, 0, 0, 1, 0.26, 0, 0.004333267, 1)
[sub_resource type="FastNoiseLite" id="FastNoiseLite_5bnbn"]
noise_type = 2
seed = 255
frequency = 0.0879
fractal_type = 0
domain_warp_enabled = true
domain_warp_type = 2
domain_warp_fractal_gain = 0.0
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_igrk8"]
width = 64
height = 64
generate_mipmaps = false
noise = SubResource("FastNoiseLite_5bnbn")
color_ramp = SubResource("Gradient_igrk8")
seamless = true
[resource]
render_priority = 0
shader = ExtResource("1_q0bvm")
shader_parameter/texture_image = SubResource("NoiseTexture2D_igrk8")