Compare commits

..

8 Commits

84 changed files with 1277 additions and 85 deletions

120
asset_credits.org Normal file
View File

@ -0,0 +1,120 @@
GFOLF: Combat Golf Action
Asset credits
* Graphics
** Clear Sea Water
*** Retrieved from https://www.the3rdsequence.com/texturedb/texture/44/clear+sea+water/
*** Author: the3rdSequence
*** License: CC BY 4.0
* Fonts
** Dokdo
*** Retrieved from https://fonts.google.com/specimen/Dokdo
*** Author: FONTRIX
*** License: OFL 1.1
** Geo
*** Retrieved from https://fonts.google.com/specimen/Geo
*** Author: Ben Weiner
*** License: OFL 1.1
** Racing Sans One
*** Retrieved from https://fonts.google.com/specimen/Racing+Sans+One
*** Author: Impallari Type
*** License: OFL 1.1
* Sound
** drive1.wav
*** Retrieved from https://freesound.org/people/zolopher/sounds/75203/
*** Author: zolopher
*** License: CC0
** drive2.wav
*** Retrieved from https://freesound.org/people/zolopher/sounds/75214/
*** Author: zolopher
*** License: CC0
** drive3.wav
*** Retrieved from https://freesound.org/people/zolopher/sounds/75204/
*** Author: zolopher
*** License: CC0
** drive4.wav
*** Retrieved from https://freesound.org/people/13FPanska_Marval_Lukas/sounds/379328/
*** Author: 13FPanska_Marval_Lukas
*** License: CC0
** hole.wav
*** Retrieved from https://freesound.org/people/inbeeld/sounds/21878/
*** Author: inbeeld
*** License: CC0
** putt1.wav
*** Retrieved from https://freesound.org/people/lmbubec/sounds/119451/
*** Author: lmbubec
*** License: CC0
** grass1.wav - grass5.wav
*** Retrieved from https://freesound.org/people/mmmtoop/sounds/674030/
*** Author: mmmtoop
*** License: CC0
** sand1.wav - sand3.wav
*** Retrieved from https://freesound.org/people/Elements-Library/sounds/683785/
*** Author: Elements-Library
*** License: CC0
** explosion.mp3
*** Retrieved from https://pixabay.com/sound-effects/grenade-explosion-14-190266/
*** Author: DavidDumaisAudio
*** License: Pixabay
** ecofuture.wav
*** Retrieved from https://freesound.org/people/soneproject/sounds/346425/
*** Author: soneproject
*** License: CC BY 3.0

BIN
asset_dev/audio/366597__jittels__golf-ball-bounce.wav (Stored with Git LFS) Normal file

Binary file not shown.

BIN
asset_dev/audio/399294__komitwav__synth-sparkle.wav (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
asset_dev/audio/drive4.wav (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View File

@ -16,7 +16,7 @@ Rendering=null
antialiasing=1 antialiasing=1
generate_mipmaps=true generate_mipmaps=true
disable_embedded_bitmaps=true disable_embedded_bitmaps=true
multichannel_signed_distance_field=false multichannel_signed_distance_field=true
msdf_pixel_range=8 msdf_pixel_range=8
msdf_size=48 msdf_size=48
allow_system_fallback=true allow_system_fallback=true

View File

@ -16,7 +16,7 @@ Rendering=null
antialiasing=1 antialiasing=1
generate_mipmaps=true generate_mipmaps=true
disable_embedded_bitmaps=true disable_embedded_bitmaps=true
multichannel_signed_distance_field=false multichannel_signed_distance_field=true
msdf_pixel_range=8 msdf_pixel_range=8
msdf_size=48 msdf_size=48
allow_system_fallback=true allow_system_fallback=true

View File

@ -16,7 +16,7 @@ Rendering=null
antialiasing=1 antialiasing=1
generate_mipmaps=true generate_mipmaps=true
disable_embedded_bitmaps=true disable_embedded_bitmaps=true
multichannel_signed_distance_field=false multichannel_signed_distance_field=true
msdf_pixel_range=8 msdf_pixel_range=8
msdf_size=48 msdf_size=48
allow_system_fallback=true allow_system_fallback=true

BIN
assets/sound/sfx/ball/concrete1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bp2iaowkqvtj8"
path="res://.godot/imported/concrete1.wav-fd53edddc2b6023804ce5ffb1713f99a.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete1.wav"
dest_files=["res://.godot/imported/concrete1.wav-fd53edddc2b6023804ce5ffb1713f99a.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/sound/sfx/ball/concrete2.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://4355dy0meqbm"
path="res://.godot/imported/concrete2.wav-ca6360ffedc83e3ef200990602e8177f.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete2.wav"
dest_files=["res://.godot/imported/concrete2.wav-ca6360ffedc83e3ef200990602e8177f.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/sound/sfx/ball/concrete3.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://orisjdcj3mes"
path="res://.godot/imported/concrete3.wav-fd28bbeb346240f5e96bc491f8e0a16f.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete3.wav"
dest_files=["res://.godot/imported/concrete3.wav-fd28bbeb346240f5e96bc491f8e0a16f.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/sound/sfx/ball/concrete4.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://o4whyv43rr1u"
path="res://.godot/imported/concrete4.wav-4a18f12d2767719d7c6842841fd8d85b.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete4.wav"
dest_files=["res://.godot/imported/concrete4.wav-4a18f12d2767719d7c6842841fd8d85b.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/sound/sfx/ball/concrete5.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://3csnnhxndt67"
path="res://.godot/imported/concrete5.wav-bfae0b04558dbd1d5e4feefb4d59d6b9.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete5.wav"
dest_files=["res://.godot/imported/concrete5.wav-bfae0b04558dbd1d5e4feefb4d59d6b9.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/sound/sfx/ball/concrete6.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://duayjxkje12ey"
path="res://.godot/imported/concrete6.wav-ba9216b4a836ae83a36866e8d77787dc.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete6.wav"
dest_files=["res://.godot/imported/concrete6.wav-ba9216b4a836ae83a36866e8d77787dc.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/sound/sfx/ball/concrete7.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bhhts1tkvv236"
path="res://.godot/imported/concrete7.wav-053d67f927d1311d4f9640a798e1807e.sample"
[deps]
source_file="res://assets/sound/sfx/ball/concrete7.wav"
dest_files=["res://.godot/imported/concrete7.wav-053d67f927d1311d4f9640a798e1807e.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/sound/sfx/ball/grass1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cwpyh41qbh8js"
path="res://.godot/imported/grass1.wav-b4216b08493666f75784d0642045864f.sample"
[deps]
source_file="res://assets/sound/sfx/ball/grass1.wav"
dest_files=["res://.godot/imported/grass1.wav-b4216b08493666f75784d0642045864f.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/sound/sfx/ball/grass2.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cayyndwmxua5x"
path="res://.godot/imported/grass2.wav-430d8da851839bd8347aa77dc113d7ff.sample"
[deps]
source_file="res://assets/sound/sfx/ball/grass2.wav"
dest_files=["res://.godot/imported/grass2.wav-430d8da851839bd8347aa77dc113d7ff.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/sound/sfx/ball/grass3.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b87bneqvovibi"
path="res://.godot/imported/grass3.wav-1d9817728f47ac5124105d7c1f50eeb0.sample"
[deps]
source_file="res://assets/sound/sfx/ball/grass3.wav"
dest_files=["res://.godot/imported/grass3.wav-1d9817728f47ac5124105d7c1f50eeb0.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/sound/sfx/ball/grass4.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b0fup7btd0b1k"
path="res://.godot/imported/grass4.wav-29729dac6e9ca8db822b77925ab1a78e.sample"
[deps]
source_file="res://assets/sound/sfx/ball/grass4.wav"
dest_files=["res://.godot/imported/grass4.wav-29729dac6e9ca8db822b77925ab1a78e.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/sound/sfx/ball/grass5.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c6d1rse1aveiy"
path="res://.godot/imported/grass5.wav-c1b5dcb7a89369922bcbafb0da9e769f.sample"
[deps]
source_file="res://assets/sound/sfx/ball/grass5.wav"
dest_files=["res://.godot/imported/grass5.wav-c1b5dcb7a89369922bcbafb0da9e769f.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/sound/sfx/ball/sand1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bbbp6wrkuhkek"
path="res://.godot/imported/sand1.wav-adf26d7ca3003a8860fb46cc0758e7bd.sample"
[deps]
source_file="res://assets/sound/sfx/ball/sand1.wav"
dest_files=["res://.godot/imported/sand1.wav-adf26d7ca3003a8860fb46cc0758e7bd.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/sound/sfx/ball/sand2.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b5xx5t050i4p"
path="res://.godot/imported/sand2.wav-8556fd9b18e6810c91fc69b1f24a839b.sample"
[deps]
source_file="res://assets/sound/sfx/ball/sand2.wav"
dest_files=["res://.godot/imported/sand2.wav-8556fd9b18e6810c91fc69b1f24a839b.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/sound/sfx/ball/sand3.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c35jy105xr640"
path="res://.godot/imported/sand3.wav-708a3206418fb40e4b4f401186c037b1.sample"
[deps]
source_file="res://assets/sound/sfx/ball/sand3.wav"
dest_files=["res://.godot/imported/sand3.wav-708a3206418fb40e4b4f401186c037b1.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/sound/sfx/player/drive1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cllhgumv1fkju"
path="res://.godot/imported/drive1.wav-37a2ebf3422caee7737ed14d066e94ec.sample"
[deps]
source_file="res://assets/sound/sfx/player/drive1.wav"
dest_files=["res://.godot/imported/drive1.wav-37a2ebf3422caee7737ed14d066e94ec.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/sound/sfx/player/drive2.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c8vouau0488fh"
path="res://.godot/imported/drive2.wav-40bb0e3487bcffb646233c3e9c9465a1.sample"
[deps]
source_file="res://assets/sound/sfx/player/drive2.wav"
dest_files=["res://.godot/imported/drive2.wav-40bb0e3487bcffb646233c3e9c9465a1.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/sound/sfx/player/drive3.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cskhg5l86yvkw"
path="res://.godot/imported/drive3.wav-cc637d549cbfcb948c40cc777dca0600.sample"
[deps]
source_file="res://assets/sound/sfx/player/drive3.wav"
dest_files=["res://.godot/imported/drive3.wav-cc637d549cbfcb948c40cc777dca0600.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/sound/sfx/player/drive4.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bkd8py2e7yfat"
path="res://.godot/imported/drive4.wav-b79415fd0bf467327ac8875e2a0a8c6a.sample"
[deps]
source_file="res://assets/sound/sfx/player/drive4.wav"
dest_files=["res://.godot/imported/drive4.wav-b79415fd0bf467327ac8875e2a0a8c6a.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/sound/sfx/player/explosion.mp3 (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://cvsv02inxvsyw"
path="res://.godot/imported/explosion.mp3-7499f525d153013b4f2692e529312448.mp3str"
[deps]
source_file="res://assets/sound/sfx/player/explosion.mp3"
dest_files=["res://.godot/imported/explosion.mp3-7499f525d153013b4f2692e529312448.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
assets/sound/sfx/player/hole.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b1pnbcsi0jrlf"
path="res://.godot/imported/hole.wav-084f4e3629b5927d5a661d5f59a9d3e7.sample"
[deps]
source_file="res://assets/sound/sfx/player/hole.wav"
dest_files=["res://.godot/imported/hole.wav-084f4e3629b5927d5a661d5f59a9d3e7.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/sound/sfx/player/putt1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://j54ssyodqnn3"
path="res://.godot/imported/putt1.wav-f5b4cf94df3968330049619e9410ebd1.sample"
[deps]
source_file="res://assets/sound/sfx/player/putt1.wav"
dest_files=["res://.godot/imported/putt1.wav-f5b4cf94df3968330049619e9410ebd1.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/sound/sfx/player/sparkle.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bvl3vpj3bg04r"
path="res://.godot/imported/sparkle.wav-e0e2ee28a5f3eebbbd6eb43c0562e56d.sample"
[deps]
source_file="res://assets/sound/sfx/player/sparkle.wav"
dest_files=["res://.godot/imported/sparkle.wav-e0e2ee28a5f3eebbbd6eb43c0562e56d.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/sound/sfx/ui/ecofuture1.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dxoo3qgkkhbpj"
path="res://.godot/imported/ecofuture1.wav-1ce9e72eda25c7270fd356e129c3353b.sample"
[deps]
source_file="res://assets/sound/sfx/ui/ecofuture1.wav"
dest_files=["res://.godot/imported/ecofuture1.wav-1ce9e72eda25c7270fd356e129c3353b.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/sound/sfx/ui/ecofuture2.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://8uynlpios7u1"
path="res://.godot/imported/ecofuture2.wav-72a1f01a22cb0f38074ccdef6e2dc37f.sample"
[deps]
source_file="res://assets/sound/sfx/ui/ecofuture2.wav"
dest_files=["res://.godot/imported/ecofuture2.wav-72a1f01a22cb0f38074ccdef6e2dc37f.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/sound/sfx/ui/ecofuture3.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c8bxu5lusqevv"
path="res://.godot/imported/ecofuture3.wav-cfc8eb28b0ae99aa20757172461b6439.sample"
[deps]
source_file="res://assets/sound/sfx/ui/ecofuture3.wav"
dest_files=["res://.godot/imported/ecofuture3.wav-cfc8eb28b0ae99aa20757172461b6439.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/sound/sfx/ui/ecofuture4.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cuupx50lrp02p"
path="res://.godot/imported/ecofuture4.wav-5123fe535484e1633f20122f24129c06.sample"
[deps]
source_file="res://assets/sound/sfx/ui/ecofuture4.wav"
dest_files=["res://.godot/imported/ecofuture4.wav-5123fe535484e1633f20122f24129c06.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/textures/grass_green/grass_green_albedo.dds (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/textures/grass_green/grass_green_normal.dds (Stored with Git LFS) Normal file

Binary file not shown.

15
default_bus_layout.tres Normal file
View File

@ -0,0 +1,15 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://cwxndi28bii8d"]
[resource]
bus/1/name = &"SFX"
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 = &"Music"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = 0.0
bus/2/send = &"Master"

View File

@ -1,17 +1,10 @@
[gd_scene load_steps=51 format=3 uid="uid://bm2o3mex10v11"] [gd_scene load_steps=37 format=3 uid="uid://bm2o3mex10v11"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_fairway/grass_fairway_albedo.dds" id="2_e4m27"] [ext_resource type="Terrain3DAssets" uid="uid://cwl34gstabgrx" path="res://levels/debug_level/terrain_assets.res" id="1_5smdk"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_rough/grass_rough_albedo.dds" id="4_p0awb"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_rough/grass_rough_normal.dds" id="4_yhjhv"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_fairway/grass_fairway_normal.dds" id="5_o361t"]
[ext_resource type="Shader" path="res://src/shaders/psx_water.gdshader" id="6_0efu4"] [ext_resource type="Shader" path="res://src/shaders/psx_water.gdshader" id="6_0efu4"]
[ext_resource type="Texture2D" uid="uid://c47ern0l2d50r" path="res://assets/vista_2.png" id="6_ectru"] [ext_resource type="Texture2D" uid="uid://c47ern0l2d50r" path="res://assets/vista_2.png" id="6_ectru"]
[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_albedo.dds" id="6_nlea7"]
[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_normal.dds" id="7_f25dn"]
[ext_resource type="Texture2D" uid="uid://con5a36t6n6sq" path="res://assets/textures/clear_sea_water_2048x2048.png" id="7_t86h2"] [ext_resource type="Texture2D" uid="uid://con5a36t6n6sq" path="res://assets/textures/clear_sea_water_2048x2048.png" id="7_t86h2"]
[ext_resource type="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_albedo.dds" id="8_ujbjy"]
[ext_resource type="Script" path="res://src/world/ball_zone/ball_zone.gd" id="9_jwlau"] [ext_resource type="Script" path="res://src/world/ball_zone/ball_zone.gd" id="9_jwlau"]
[ext_resource type="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_normal.dds" id="9_rrguh"]
[ext_resource type="PackedScene" uid="uid://dagh38vap4t1d" path="res://src/props/scenery/city/concrete_building_1.tscn" id="10_lf15j"] [ext_resource type="PackedScene" uid="uid://dagh38vap4t1d" path="res://src/props/scenery/city/concrete_building_1.tscn" id="10_lf15j"]
[ext_resource type="PackedScene" uid="uid://cjubxs7peir5k" path="res://src/props/scenery/city/kana_signboard.tscn" id="11_evxup"] [ext_resource type="PackedScene" uid="uid://cjubxs7peir5k" path="res://src/props/scenery/city/kana_signboard.tscn" id="11_evxup"]
[ext_resource type="PackedScene" uid="uid://di7aql54lksn7" path="res://src/props/scenery/trees/palm_tree/palm_tree.tscn" id="12_sswxf"] [ext_resource type="PackedScene" uid="uid://di7aql54lksn7" path="res://src/props/scenery/trees/palm_tree/palm_tree.tscn" id="12_sswxf"]
@ -34,7 +27,7 @@ noise = SubResource("FastNoiseLite_rpgb7")
[sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_woy2k"] [sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_woy2k"]
_shader_parameters = { _shader_parameters = {
"auto_base_texture": 3, "auto_base_texture": 4,
"auto_height_reduction": 0.1, "auto_height_reduction": 0.1,
"auto_overlay_texture": 0, "auto_overlay_texture": 0,
"auto_slope": 0.41, "auto_slope": 0.41,
@ -61,53 +54,6 @@ world_background = 2
texture_filtering = 1 texture_filtering = 1
auto_shader = true auto_shader = true
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_l1sla"]
transparency = 4
cull_mode = 2
vertex_color_use_as_albedo = true
backlight_enabled = true
backlight = Color(0.5, 0.5, 0.5, 1)
distance_fade_mode = 1
distance_fade_min_distance = 960.0
distance_fade_max_distance = 480.0
[sub_resource type="Terrain3DMeshAsset" id="Terrain3DMeshAsset_iaq2t"]
height_offset = 0.5
density = 10.0
material_override = SubResource("StandardMaterial3D_l1sla")
generated_type = 1
[sub_resource type="Terrain3DTextureAsset" id="Terrain3DTextureAsset_kocfk"]
name = "Rough Grass"
albedo_texture = ExtResource("4_p0awb")
normal_texture = ExtResource("4_yhjhv")
uv_scale = 0.01
[sub_resource type="Terrain3DTextureAsset" id="Terrain3DTextureAsset_vmhlw"]
name = "Fairway Grass"
id = 1
albedo_texture = ExtResource("2_e4m27")
normal_texture = ExtResource("5_o361t")
uv_scale = 0.01
[sub_resource type="Terrain3DTextureAsset" id="Terrain3DTextureAsset_k6h8c"]
name = "sand_trap_albedo"
id = 2
albedo_texture = ExtResource("6_nlea7")
normal_texture = ExtResource("7_f25dn")
uv_scale = 0.01
[sub_resource type="Terrain3DTextureAsset" id="Terrain3DTextureAsset_13d2a"]
name = "mountain_rock_albedo"
id = 3
albedo_texture = ExtResource("8_ujbjy")
normal_texture = ExtResource("9_rrguh")
uv_scale = 0.02
[sub_resource type="Terrain3DAssets" id="Terrain3DAssets_eq5uw"]
mesh_list = Array[Terrain3DMeshAsset]([SubResource("Terrain3DMeshAsset_iaq2t")])
texture_list = Array[Terrain3DTextureAsset]([SubResource("Terrain3DTextureAsset_kocfk"), SubResource("Terrain3DTextureAsset_vmhlw"), SubResource("Terrain3DTextureAsset_k6h8c"), SubResource("Terrain3DTextureAsset_13d2a")])
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_h8tes"] [sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_h8tes"]
panorama = ExtResource("6_ectru") panorama = ExtResource("6_ectru")
@ -243,7 +189,7 @@ point_count = 5
[node name="Terrain3D" type="Terrain3D" parent="."] [node name="Terrain3D" type="Terrain3D" parent="."]
data_directory = "res://levels/debug_level/terrain_3d_data" data_directory = "res://levels/debug_level/terrain_3d_data"
material = SubResource("Terrain3DMaterial_woy2k") material = SubResource("Terrain3DMaterial_woy2k")
assets = SubResource("Terrain3DAssets_eq5uw") assets = ExtResource("1_5smdk")
mesh_size = 64 mesh_size = 64
top_level = true top_level = true
metadata/_edit_lock_ = true metadata/_edit_lock_ = true
@ -260,6 +206,8 @@ shadow_blur = 4.0
[node name="Course" type="Node3D" parent="."] [node name="Course" type="Node3D" parent="."]
[node name="Fairway" type="Area3D" parent="Course"] [node name="Fairway" type="Area3D" parent="Course"]
gravity_point_center = Vector3(0, 1, 0)
gravity_direction = Vector3(0, 1, 0)
script = ExtResource("9_jwlau") script = ExtResource("9_jwlau")
terrain_angular_damping = 2.0 terrain_angular_damping = 2.0

Binary file not shown.

BIN
levels/debug_level/terrain_assets.res (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -197,6 +197,12 @@ ball_previous={
3d_physics/layer_1="Collision Geometry" 3d_physics/layer_1="Collision Geometry"
3d_physics/layer_2="Layer 3" 3d_physics/layer_2="Layer 3"
3d_physics/layer_27="Glass Material"
3d_physics/layer_28="Metal Material"
3d_physics/layer_29="Rock Material"
3d_physics/layer_30="Wood Material"
3d_physics/layer_31="Sand Material"
3d_physics/layer_32="Grass Material"
[physics] [physics]

View File

@ -0,0 +1,37 @@
class_name BallSFX extends Node3D
## Controller for ball sound effects.
const BASE_VOLUME := -36.0
const MAX_VOLUME := 3.0
const VELOCITY_ATTENUATION_SCALE := 400.0
@onready var parent: GameBall = $".."
@onready var grass_sfx_player: AudioStreamPlayer3D = %GrassSFXPlayer
@onready var concrete_sfx_player: AudioStreamPlayer3D = %ConcreteSFXPlayer
@onready var sand_sfx_player: AudioStreamPlayer3D = %SandSFXPlayer
func _force_attenuated_volume() -> float:
# Attenuate volume based on impact force
return lerpf(
BASE_VOLUME,
MAX_VOLUME,
clampf(parent.linear_velocity.length_squared() / VELOCITY_ATTENUATION_SCALE, 0, 1)
)
func _play(player: AudioStreamPlayer3D) -> void:
player.volume_db = _force_attenuated_volume()
print("PLAYING: ", player, "... VOLUME: ", player.volume_db)
player.play()
func play_sfx(terrain: Terrain.Type) -> void:
match terrain:
Terrain.Type.ROUGH, Terrain.Type.GREEN, Terrain.Type.FAIRWAY:
_play(grass_sfx_player)
Terrain.Type.CONCRETE, Terrain.Type.ROCK:
_play(concrete_sfx_player)
Terrain.Type.SAND:
_play(sand_sfx_player)

View File

@ -52,6 +52,8 @@ var _position_on_last_wake: Vector3
var _awake := false var _awake := false
var _zones: Array[BallZone] = [] var _zones: Array[BallZone] = []
@onready var sfx: BallSFX = %SFX
@onready var normal_physics: PhysicsMaterial = preload( @onready var normal_physics: PhysicsMaterial = preload(
"res://src/equipment/balls/physics_ball/normal_physics.tres" "res://src/equipment/balls/physics_ball/normal_physics.tres"
) )
@ -142,3 +144,14 @@ func _on_sleeping_state_changed() -> void:
if sleeping: if sleeping:
# Trigger to reassign on wake # Trigger to reassign on wake
_awake = false _awake = false
func _on_collision(body: Node) -> void:
if body is Terrain3D:
sfx.play_sfx(Terrain.at_position(global_position, body as Terrain3D))
elif body is CSGShape3D:
sfx.play_sfx(Terrain.from_physical_layer((body as CSGShape3D).collision_layer))
elif body is CollisionObject3D:
sfx.play_sfx(Terrain.from_physical_layer((body as CollisionObject3D).collision_layer))
else:
print_debug("COLLIDER: ", body)

View File

@ -1,9 +1,16 @@
[gd_scene load_steps=9 format=3 uid="uid://dfttci386ohip"] [gd_scene load_steps=19 format=3 uid="uid://dfttci386ohip"]
[ext_resource type="Script" path="res://src/equipment/balls/physics_ball/game_ball.gd" id="1_iwh2u"] [ext_resource type="Script" path="res://src/equipment/balls/physics_ball/game_ball.gd" id="1_iwh2u"]
[ext_resource type="PhysicsMaterial" uid="uid://3bih72l068ic" path="res://src/equipment/balls/physics_ball/normal_physics.tres" id="1_l23pw"] [ext_resource type="PhysicsMaterial" uid="uid://3bih72l068ic" path="res://src/equipment/balls/physics_ball/normal_physics.tres" id="1_l23pw"]
[ext_resource type="Texture2D" uid="uid://ckhiq6rfjv63u" path="res://assets/textures/gfolfball/gfolfball.png" id="1_y3q5j"] [ext_resource type="Texture2D" uid="uid://ckhiq6rfjv63u" path="res://assets/textures/gfolfball/gfolfball.png" id="1_y3q5j"]
[ext_resource type="Texture2D" uid="uid://btntjs7mbdigu" path="res://assets/textures/gfolfball/gfolfball_normal.png" id="2_mx7l6"] [ext_resource type="Texture2D" uid="uid://btntjs7mbdigu" path="res://assets/textures/gfolfball/gfolfball_normal.png" id="2_mx7l6"]
[ext_resource type="Script" path="res://src/equipment/balls/physics_ball/ball_sfx.gd" id="5_bhshl"]
[ext_resource type="AudioStream" uid="uid://cayyndwmxua5x" path="res://assets/sound/sfx/ball/grass2.wav" id="7_l22cv"]
[ext_resource type="AudioStream" uid="uid://orisjdcj3mes" path="res://assets/sound/sfx/ball/concrete3.wav" id="7_t2ak2"]
[ext_resource type="AudioStream" uid="uid://o4whyv43rr1u" path="res://assets/sound/sfx/ball/concrete4.wav" id="8_0anjl"]
[ext_resource type="AudioStream" uid="uid://3csnnhxndt67" path="res://assets/sound/sfx/ball/concrete5.wav" id="9_p0lmw"]
[ext_resource type="AudioStream" uid="uid://bbbp6wrkuhkek" path="res://assets/sound/sfx/ball/sand1.wav" id="10_b64mx"]
[ext_resource type="AudioStream" uid="uid://b5xx5t050i4p" path="res://assets/sound/sfx/ball/sand2.wav" id="11_ed8je"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xqofq"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xqofq"]
albedo_texture = ExtResource("1_y3q5j") albedo_texture = ExtResource("1_y3q5j")
@ -66,6 +73,25 @@ func _draw() -> void:
draw_line(start, end, COLOR_MAGNUS, WIDTH) draw_line(start, end, COLOR_MAGNUS, WIDTH)
" "
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_gc38m"]
playback_mode = 1
random_pitch = 1.1
streams_count = 1
stream_0/stream = ExtResource("7_l22cv")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_tg0n0"]
random_pitch = 1.1
streams_count = 3
stream_0/stream = ExtResource("7_t2ak2")
stream_1/stream = ExtResource("8_0anjl")
stream_2/stream = ExtResource("9_p0lmw")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_uu1f8"]
playback_mode = 1
streams_count = 2
stream_0/stream = ExtResource("10_b64mx")
stream_1/stream = ExtResource("11_ed8je")
[node name="PhysicsBall" type="RigidBody3D"] [node name="PhysicsBall" type="RigidBody3D"]
mass = 0.05 mass = 0.05
physics_material_override = ExtResource("1_l23pw") physics_material_override = ExtResource("1_l23pw")
@ -97,4 +123,28 @@ grow_vertical = 2
script = SubResource("GDScript_p4v7o") script = SubResource("GDScript_p4v7o")
draw_reoriented_basis = false draw_reoriented_basis = false
[node name="SFX" type="Node3D" parent="."]
unique_name_in_owner = true
script = ExtResource("5_bhshl")
[node name="GrassSFXPlayer" type="AudioStreamPlayer3D" parent="SFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_gc38m")
unit_size = 40.0
bus = &"SFX"
[node name="ConcreteSFXPlayer" type="AudioStreamPlayer3D" parent="SFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_tg0n0")
unit_size = 40.0
bus = &"SFX"
[node name="SandSFXPlayer" type="AudioStreamPlayer3D" parent="SFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_uu1f8")
unit_size = 40.0
max_db = 0.0
bus = &"SFX"
[connection signal="body_entered" from="." to="." method="_on_collision"]
[connection signal="sleeping_state_changed" from="." to="." method="_on_sleeping_state_changed"] [connection signal="sleeping_state_changed" from="." to="." method="_on_sleeping_state_changed"]

View File

@ -184,10 +184,12 @@ stretch = true
script = ExtResource("3_rmm5i") script = ExtResource("3_rmm5i")
[node name="Viewport" type="SubViewport" parent="RootControl/Rumbler/ViewportContainer"] [node name="Viewport" type="SubViewport" parent="RootControl/Rumbler/ViewportContainer"]
unique_name_in_owner = true
handle_input_locally = false handle_input_locally = false
msaa_3d = 3 msaa_3d = 3
screen_space_aa = 1 screen_space_aa = 1
use_taa = true use_taa = true
audio_listener_enable_3d = true
size = Vector2i(1920, 1080) size = Vector2i(1920, 1080)
render_target_update_mode = 4 render_target_update_mode = 4

View File

@ -140,6 +140,7 @@ var _tracking_camera: OrbitalCamera
@onready var character: CharacterController = $PlayerPivot/GfolfGirl @onready var character: CharacterController = $PlayerPivot/GfolfGirl
@onready var shot_animation: AnimationPlayer = %ShotAnimation @onready var shot_animation: AnimationPlayer = %ShotAnimation
@onready var shot_sfx: ShotSFX = %ShotSFX
@onready var arrow: Node3D = %Arrow @onready var arrow: Node3D = %Arrow
@onready var arrow_pivot: Node3D = %ArrowPivot @onready var arrow_pivot: Node3D = %ArrowPivot
@ -161,6 +162,7 @@ var _tracking_camera: OrbitalCamera
@onready var ball_return_timer: Timer = %BallReturnTimer @onready var ball_return_timer: Timer = %BallReturnTimer
@onready var explosion_animation: AnimationPlayer = %ExplosionAnimation @onready var explosion_animation: AnimationPlayer = %ExplosionAnimation
@onready var player_label: Label3D = %PlayerLabel
@onready var camera_distance := zoom.position.z: @onready var camera_distance := zoom.position.z:
set = _set_camera_distance set = _set_camera_distance
@ -180,6 +182,12 @@ func _ready() -> void:
ball_type = initial_ball ball_type = initial_ball
club = initial_club club = initial_club
character.set_color(player.color) character.set_color(player.color)
# Set up player 3D label
player_label.text = player.name
player_label.modulate = player.color
player_label.outline_modulate = ColorTools.get_bg_color(player.color)
_on_phase_change(phase) _on_phase_change(phase)
@ -223,6 +231,10 @@ func is_active() -> bool:
return phase != Phase.FINISHED return phase != Phase.FINISHED
func is_shot_good() -> bool:
return abs(shot_curve) <= NICE_THRESHOLD
func finish_downswing() -> void: func finish_downswing() -> void:
phase = Phase.SHOT phase = Phase.SHOT
@ -235,13 +247,14 @@ func take_shot() -> void:
# Impact screenshake & hitlag # Impact screenshake & hitlag
if game: if game:
if shot_power > BIG_POWER_THRESHOLD: if shot_power > BIG_POWER_THRESHOLD:
game.viewport.hit_lag_big() #game.viewport.hit_lag_big()
var shake_intensity: float = ( var shake_intensity: float = (
10.0 * (shot_power - BIG_POWER_THRESHOLD) / (1.0 - BIG_POWER_THRESHOLD) 10.0 * (shot_power - BIG_POWER_THRESHOLD) / (1.0 - BIG_POWER_THRESHOLD)
) )
game.viewport.screen_shake(shake_intensity, 1.0) game.viewport.screen_shake(shake_intensity, 1.0)
else: else:
game.viewport.hit_lag_small() pass
#game.viewport.hit_lag_small()
print_debug("WHACK!\nPower: ", shot_power, "\nCurve: ", shot_curve) print_debug("WHACK!\nPower: ", shot_power, "\nCurve: ", shot_curve)
@ -263,6 +276,9 @@ func take_shot() -> void:
game_ball.freeze = false game_ball.freeze = false
game_ball.apply_impulse(impulse, offset) game_ball.apply_impulse(impulse, offset)
# Play SFX
shot_sfx.play_shot_sfx(club, is_shot_good(), shot_power)
# Use a ball if a limited type is selected # Use a ball if a limited type is selected
if player.get_balls(ball_type) > 0: if player.get_balls(ball_type) > 0:
player.mutate_balls(ball_type, -1) player.mutate_balls(ball_type, -1)
@ -434,7 +450,7 @@ func _on_phase_change(new_phase: Phase) -> void:
if perfect_aim: if perfect_aim:
shot_curve = 0.0 shot_curve = 0.0
if abs(shot_curve) <= NICE_THRESHOLD: if is_shot_good():
hud.play_nice_animation() hud.play_nice_animation()
if not driving_range: if not driving_range:

View File

@ -1,13 +1,38 @@
[gd_scene load_steps=22 format=3 uid="uid://cy7t2tc4y3b4"] [gd_scene load_steps=34 format=3 uid="uid://cy7t2tc4y3b4"]
[ext_resource type="Script" path="res://src/player/shot_setup/shot_setup.gd" id="1_r6ei4"] [ext_resource type="Script" path="res://src/player/shot_setup/shot_setup.gd" id="1_r6ei4"]
[ext_resource type="Script" path="res://src/player/shot_setup/ball_point.gd" id="2_e6i3g"] [ext_resource type="Script" path="res://src/player/shot_setup/ball_point.gd" id="2_e6i3g"]
[ext_resource type="PackedScene" uid="uid://c2k88ns0h5ie1" path="res://src/ui/3d/arrow/arrow.tscn" id="2_s70wl"] [ext_resource type="PackedScene" uid="uid://c2k88ns0h5ie1" path="res://src/ui/3d/arrow/arrow.tscn" id="2_s70wl"]
[ext_resource type="Script" path="res://src/player/shot_setup/shot_sfx.gd" id="3_7vs2d"]
[ext_resource type="PackedScene" uid="uid://1s3gywmoi20e" path="res://src/characters/player_characters/gfolf_girl/gfolf_girl.tscn" id="3_e4aur"] [ext_resource type="PackedScene" uid="uid://1s3gywmoi20e" path="res://src/characters/player_characters/gfolf_girl/gfolf_girl.tscn" id="3_e4aur"]
[ext_resource type="AudioStream" uid="uid://cllhgumv1fkju" path="res://assets/sound/sfx/player/drive1.wav" id="3_em3cj"]
[ext_resource type="AudioStream" uid="uid://c8vouau0488fh" path="res://assets/sound/sfx/player/drive2.wav" id="4_4cajc"]
[ext_resource type="PackedScene" uid="uid://fht6j87o8ecr" path="res://src/ui/3d/projectile_arc/projectile_arc.tscn" id="4_ry2ho"] [ext_resource type="PackedScene" uid="uid://fht6j87o8ecr" path="res://src/ui/3d/projectile_arc/projectile_arc.tscn" id="4_ry2ho"]
[ext_resource type="AudioStream" uid="uid://cskhg5l86yvkw" path="res://assets/sound/sfx/player/drive3.wav" id="5_5lj1j"]
[ext_resource type="AudioStream" uid="uid://bkd8py2e7yfat" path="res://assets/sound/sfx/player/drive4.wav" id="6_1wnu3"]
[ext_resource type="PackedScene" uid="uid://dbdul15c4oblg" path="res://src/ui/3d/projected_target.tscn" id="6_mynqj"] [ext_resource type="PackedScene" uid="uid://dbdul15c4oblg" path="res://src/ui/3d/projected_target.tscn" id="6_mynqj"]
[ext_resource type="AudioStream" uid="uid://j54ssyodqnn3" path="res://assets/sound/sfx/player/putt1.wav" id="7_niyj5"]
[ext_resource type="Script" path="res://src/player/shot_setup/hitbox.gd" id="7_uh8kn"] [ext_resource type="Script" path="res://src/player/shot_setup/hitbox.gd" id="7_uh8kn"]
[ext_resource type="Texture2D" uid="uid://2yoipvd107t1" path="res://assets/sprites/dope_explosion/dope_explosion.tres" id="8_5ghmo"] [ext_resource type="Texture2D" uid="uid://2yoipvd107t1" path="res://assets/sprites/dope_explosion/dope_explosion.tres" id="8_5ghmo"]
[ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="9_y5iv1"]
[ext_resource type="AudioStream" uid="uid://cvsv02inxvsyw" path="res://assets/sound/sfx/player/explosion.mp3" id="15_fn6g1"]
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_gh0gi"]
random_pitch = 1.1
streams_count = 1
stream_0/stream = ExtResource("3_em3cj")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_7isox"]
random_pitch = 1.1
streams_count = 3
stream_0/stream = ExtResource("4_4cajc")
stream_1/stream = ExtResource("5_5lj1j")
stream_2/stream = ExtResource("6_1wnu3")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_wnuop"]
random_pitch = 1.1
streams_count = 1
stream_0/stream = ExtResource("7_niyj5")
[sub_resource type="Animation" id="Animation_ug2a7"] [sub_resource type="Animation" id="Animation_ug2a7"]
length = 0.001 length = 0.001
@ -218,6 +243,18 @@ tracks/1/keys = {
"update": 1, "update": 1,
"values": [false] "values": [false]
} }
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = false
tracks/2/path = NodePath("ExplosionMesh/ExplosionSFXPlayer:playing")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_bv1ov"] [sub_resource type="Animation" id="Animation_bv1ov"]
resource_name = "explode" resource_name = "explode"
@ -246,6 +283,18 @@ tracks/1/keys = {
"update": 1, "update": 1,
"values": [true, false] "values": [true, false]
} }
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("ExplosionMesh/ExplosionSFXPlayer:playing")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dg262"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_dg262"]
_data = { _data = {
@ -253,6 +302,11 @@ _data = {
"explode": SubResource("Animation_bv1ov") "explode": SubResource("Animation_bv1ov")
} }
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_8natr"]
random_pitch = 1.1
streams_count = 1
stream_0/stream = ExtResource("15_fn6g1")
[node name="ShotSetup" type="Node3D"] [node name="ShotSetup" type="Node3D"]
script = ExtResource("1_r6ei4") script = ExtResource("1_r6ei4")
@ -261,6 +315,27 @@ unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.08, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.08, 0)
script = ExtResource("2_e6i3g") script = ExtResource("2_e6i3g")
[node name="ShotSFX" type="Node3D" parent="BallPoint"]
unique_name_in_owner = true
script = ExtResource("3_7vs2d")
[node name="GoodDriveSFXPlayer" type="AudioStreamPlayer3D" parent="BallPoint/ShotSFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_gh0gi")
volume_db = -3.0
bus = &"SFX"
[node name="BadDriveSFXPlayer" type="AudioStreamPlayer3D" parent="BallPoint/ShotSFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_7isox")
volume_db = -1.0
bus = &"SFX"
[node name="PuttSFXPlayer" type="AudioStreamPlayer3D" parent="BallPoint/ShotSFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_wnuop")
bus = &"SFX"
[node name="PlayerPivot" type="Node3D" parent="."] [node name="PlayerPivot" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@ -268,7 +343,7 @@ unique_name_in_owner = true
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.555968, 0, 0.0999683) transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.555968, 0, 0.0999683)
[node name="DemoCamera" type="Camera3D" parent="PlayerPivot" groups=["DemoCamera"]] [node name="DemoCamera" type="Camera3D" parent="PlayerPivot" groups=["DemoCamera"]]
transform = Transform3D(-0.124487, 0.584637, 0.801687, 0, 0.807972, -0.589221, -0.992221, -0.0733503, -0.100582, 0.395614, 0.0284514, -0.0394773) transform = Transform3D(-0.311543, -0.0687373, 0.947743, 0, 0.99738, 0.0723374, -0.950232, 0.0225362, -0.310727, 0.845792, 0.706621, -0.383459)
[node name="Direction" type="Node3D" parent="."] [node name="Direction" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@ -422,6 +497,32 @@ libraries = {
"": SubResource("AnimationLibrary_dg262") "": SubResource("AnimationLibrary_dg262")
} }
[node name="ExplosionSFXPlayer" type="AudioStreamPlayer3D" parent="ExplosionMesh"]
stream = SubResource("AudioStreamRandomizer_8natr")
unit_size = 60.0
bus = &"SFX"
[node name="PlayerLabel" type="Label3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0)
visibility_range_begin = 50.0
visibility_range_begin_margin = 3.0
visibility_range_fade_mode = 1
pixel_size = 0.001
billboard = 1
no_depth_test = true
fixed_size = true
texture_filter = 5
render_priority = 4
outline_render_priority = 3
text = "Player Name"
font = ExtResource("9_y5iv1")
font_size = 36
outline_size = 10
line_spacing = -16.0
autowrap_mode = 2
width = 120.0
[connection signal="ball_changed" from="BallPoint" to="." method="_on_game_ball_changed"] [connection signal="ball_changed" from="BallPoint" to="." method="_on_game_ball_changed"]
[connection signal="timeout" from="DownswingTimer" to="." method="finish_downswing"] [connection signal="timeout" from="DownswingTimer" to="." method="finish_downswing"]
[connection signal="timeout" from="BallReturnTimer" to="." method="_on_ball_return_timer_timeout"] [connection signal="timeout" from="BallReturnTimer" to="." method="_on_ball_return_timer_timeout"]

View File

@ -0,0 +1,27 @@
class_name ShotSFX extends Node3D
## SFX controller for golf shots
const BASE_VOLUME := -6.0
const MAX_VOLUME := -1.0
@onready var good_drive_sfx_player: AudioStreamPlayer3D = %GoodDriveSFXPlayer
@onready var bad_drive_sfx_player: AudioStreamPlayer3D = %BadDriveSFXPlayer
@onready var putt_sfx_player: AudioStreamPlayer3D = %PuttSFXPlayer
func _attenuate_volume(power: float) -> float:
return lerpf(BASE_VOLUME, MAX_VOLUME, power)
func play_shot_sfx(club: Club.Type, good: bool, power: float) -> void:
var player: AudioStreamPlayer3D
match club:
Club.Type.PUTTER:
player = putt_sfx_player
_:
# TODO more varied SFX maybe?
player = good_drive_sfx_player if good else bad_drive_sfx_player
player.volume_db = _attenuate_volume(power)
print_debug("Playing ", player)
player.play()

View File

@ -8,6 +8,7 @@ data = PackedVector3Array(0, 0, -5.2392, -1.2315, 0, -2.5941, 1.2315, 0, -2.5941
[node name="Sailboat" instance=ExtResource("1_ivu5q")] [node name="Sailboat" instance=ExtResource("1_ivu5q")]
[node name="StaticBody3D" type="StaticBody3D" parent="." index="1"] [node name="StaticBody3D" type="StaticBody3D" parent="." index="1"]
collision_layer = 536870913
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"] [node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"]
shape = SubResource("ConcavePolygonShape3D_mrf68") shape = SubResource("ConcavePolygonShape3D_mrf68")

View File

@ -45,6 +45,7 @@ bones/10/scale = Vector3(1, 1, 1)
bones/11/rotation = Quaternion(-0.13894, 0.0183908, 0.000355869, 0.99013) bones/11/rotation = Quaternion(-0.13894, 0.0183908, 0.000355869, 0.99013)
[node name="StaticBody3D" type="StaticBody3D" parent="." index="2"] [node name="StaticBody3D" type="StaticBody3D" parent="." index="2"]
collision_layer = 2147483649
[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D" index="0"] [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D" index="0"]
shape = SubResource("ConcavePolygonShape3D_bp5t6") shape = SubResource("ConcavePolygonShape3D_bp5t6")

View File

@ -15,8 +15,8 @@ grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
size_flags_horizontal = 4 size_flags_horizontal = 4
script = ExtResource("1_p0p8j") script = ExtResource("1_p0p8j")
quantity = -1 text = "BALLTYPE"
unlimited = true quantity = 18
[node name="BallLabel" type="Label" parent="."] [node name="BallLabel" type="Label" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@ -35,34 +35,30 @@ grow_vertical = 2
theme_override_constants/outline_size = 10 theme_override_constants/outline_size = 10
theme_override_fonts/font = ExtResource("2_bu42i") theme_override_fonts/font = ExtResource("2_bu42i")
theme_override_font_sizes/font_size = 25 theme_override_font_sizes/font_size = 25
text = "BALLTYPE"
horizontal_alignment = 2 horizontal_alignment = 2
[node name="QuantityContainer" type="HBoxContainer" parent="BallLabel"] [node name="QuantityContainer" type="HBoxContainer" parent="BallLabel"]
unique_name_in_owner = true unique_name_in_owner = true
visible = false clip_contents = true
layout_mode = 1 layout_mode = 1
anchors_preset = -1 anchors_preset = -1
anchor_left = 1.0 anchor_left = 1.1
anchor_top = 0.8 anchor_top = 0.4
anchor_right = 1.0 anchor_right = 1.1
anchor_bottom = 0.8 anchor_bottom = 0.4
grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
theme_override_constants/separation = 0 theme_override_constants/separation = 0
[node name="Label" type="Label" parent="BallLabel/QuantityContainer"] [node name="Label" type="Label" parent="BallLabel/QuantityContainer"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
theme_type_variation = &"QuantityLabel" theme_type_variation = &"QuantityLabel"
theme_override_font_sizes/font_size = 22 theme_override_font_sizes/font_size = 40
text = "×" text = "×"
[node name="QuantityLabel" type="Label" parent="BallLabel/QuantityContainer"] [node name="QuantityLabel" type="Label" parent="BallLabel/QuantityContainer"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 8
theme_type_variation = &"QuantityLabel" theme_type_variation = &"QuantityLabel"
theme_override_font_sizes/font_size = 22 theme_override_font_sizes/font_size = 40
text = "-1" text = "18"

View File

@ -1,8 +1,9 @@
[gd_scene load_steps=35 format=3 uid="uid://c4ifdiohng830"] [gd_scene load_steps=36 format=3 uid="uid://c4ifdiohng830"]
[ext_resource type="Script" path="res://src/ui/shot_hud/shot_hud.gd" id="1_x5b4c"] [ext_resource type="Script" path="res://src/ui/shot_hud/shot_hud.gd" id="1_x5b4c"]
[ext_resource type="Shader" path="res://src/shaders/canvas_retro.gdshader" id="1_ybxxp"] [ext_resource type="Shader" path="res://src/shaders/canvas_retro.gdshader" id="1_ybxxp"]
[ext_resource type="PackedScene" uid="uid://445qd7m4qe2j" path="res://src/ui/shot_hud/club_selector/club_selector.tscn" id="2_1hdub"] [ext_resource type="PackedScene" uid="uid://445qd7m4qe2j" path="res://src/ui/shot_hud/club_selector/club_selector.tscn" id="2_1hdub"]
[ext_resource type="AudioStream" uid="uid://c8bxu5lusqevv" path="res://assets/sound/sfx/ui/ecofuture3.wav" id="2_5f3rs"]
[ext_resource type="Script" path="res://src/ui/decorations/rumbler.gd" id="3_6groq"] [ext_resource type="Script" path="res://src/ui/decorations/rumbler.gd" id="3_6groq"]
[ext_resource type="Texture2D" uid="uid://b5812y3pmmgg5" path="res://assets/ui/gauge_patch.png" id="4_5kcpe"] [ext_resource type="Texture2D" uid="uid://b5812y3pmmgg5" path="res://assets/ui/gauge_patch.png" id="4_5kcpe"]
[ext_resource type="Texture2D" uid="uid://76fjx2ukavqe" path="res://assets/ui/power_gauge_fill.png" id="5_3i1yq"] [ext_resource type="Texture2D" uid="uid://76fjx2ukavqe" path="res://assets/ui/power_gauge_fill.png" id="5_3i1yq"]
@ -74,6 +75,18 @@ tracks/4/keys = {
"points": PackedFloat32Array(0.5, -0.25, 0, 0.25, 0), "points": PackedFloat32Array(0.5, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = false
tracks/5/path = NodePath("AudioStreamPlayer:playing")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_cwotn"] [sub_resource type="Animation" id="Animation_cwotn"]
resource_name = "display" resource_name = "display"
@ -137,6 +150,18 @@ tracks/4/keys = {
"points": PackedFloat32Array(0.5, -0.25, 0, 0.5, -0.055, 0.5, -0.4, 0.059, 0.233, -0.456, 1.25, -0.25, 0, 0.25, 0), "points": PackedFloat32Array(0.5, -0.25, 0, 0.5, -0.055, 0.5, -0.4, 0.059, 0.233, -0.456, 1.25, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 2, 2.4) "times": PackedFloat32Array(0, 2, 2.4)
} }
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("AudioStreamPlayer:playing")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_2a0gn"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_2a0gn"]
_data = { _data = {
@ -598,6 +623,11 @@ libraries = {
"": SubResource("AnimationLibrary_2a0gn") "": SubResource("AnimationLibrary_2a0gn")
} }
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="WoahNiceFeedback"]
stream = ExtResource("2_5f3rs")
volume_db = -3.0
bus = &"SFX"
[node name="WastedFeedback" type="RichTextLabel" parent="."] [node name="WastedFeedback" type="RichTextLabel" parent="."]
visible = false visible = false
custom_minimum_size = Vector2(1400, 0) custom_minimum_size = Vector2(1400, 0)
@ -727,6 +757,7 @@ unique_name_in_owner = true
libraries = { libraries = {
"": SubResource("AnimationLibrary_dicse") "": SubResource("AnimationLibrary_dicse")
} }
speed_scale = 0.9
[node name="ClubSelector" parent="." instance=ExtResource("2_1hdub")] [node name="ClubSelector" parent="." instance=ExtResource("2_1hdub")]
unique_name_in_owner = true unique_name_in_owner = true

11
src/util/color_tools.gd Normal file
View File

@ -0,0 +1,11 @@
class_name ColorTools
## Toolkit for working with colors
const DEFAULT_LUM_THRESHOLD := 0.179
## Selects an appropriate background color for the given foreground color.
##
## Options are white or black.
static func get_bg_color(fg_color: Color, threshold: float = DEFAULT_LUM_THRESHOLD) -> Color:
return Color.BLACK if fg_color.srgb_to_linear().get_luminance() > threshold else Color.WHITE

69
src/world/terrain.gd Normal file
View File

@ -0,0 +1,69 @@
class_name Terrain
## Tools for working with different terrain types.
## This provides a unified interface to Terrain3D and regular meshes.
## Basic terrain materials
enum Type {
NONE,
ROUGH,
FAIRWAY,
GREEN,
SAND,
CONCRETE,
ROCK,
WOOD,
METAL,
GLASS,
}
## We use the upper bits of collision layers to encode material data
const PHYSICAL_LAYERS := {
1 << 31: Type.ROUGH,
1 << 30: Type.SAND,
1 << 29: Type.WOOD,
1 << 28: Type.ROCK,
1 << 27: Type.METAL,
1 << 26: Type.GLASS,
}
## Get the `Terrain.Type` value which corresponds to the given Terrain3D texture ID.
##
## Note that this relies on the ordering of textures in our Terrain3DAsset resource!
## If the order textures are defined in changes, this will break!
static func from_texture_id(tex_id: int) -> Type:
match tex_id:
0:
return Type.ROUGH
1:
return Type.FAIRWAY
2:
return Type.SAND
3:
return Type.GREEN
4:
return Type.ROCK
_:
return Type.NONE
## Get the `Terrain.Type` value encoded in the given collision layer setting.
##
## We use the upper bits in the collision layer to encode material data.
## Check the collision layer descriptions for more information.
static func from_physical_layer(collision_layer: int) -> Type:
for bit: int in PHYSICAL_LAYERS:
if collision_layer & bit:
return PHYSICAL_LAYERS[bit]
return Type.CONCRETE
## Get the `Terrain.Type` value at the given position in a Terrain3D node.
static func at_position(global_position: Vector3, terrain3d: Terrain3D) -> Type:
var blend := terrain3d.data.get_texture_id(global_position)
var id: int
if terrain3d.data.get_control_auto(global_position):
id = blend.x if blend.z > 0 else blend.y
else:
id = blend.x
return from_texture_id(id)