Compare commits

..

No commits in common. "cd9a58a66000f6c87a42e37c3250a9a2104ee7b6" and "1be3617c74b97346aaac971ad04e61687bcec954" have entirely different histories.

65 changed files with 88 additions and 1641 deletions

View File

@ -1,18 +0,0 @@
Copyright (c) Mikael Hermansson and Godot Jolt contributors.
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.

View File

@ -1,91 +0,0 @@
Godot Jolt incorporates third-party material from the projects listed below.
Godot Engine (https://github.com/godotengine/godot)
Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md).
Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.
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.
godot-cpp (https://github.com/godot-jolt/godot-cpp)
Copyright (c) 2017-present Godot Engine contributors.
Copyright (c) 2022-present Mikael Hermansson.
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.
Jolt Physics (https://github.com/godot-jolt/jolt)
Copyright (c) 2021 Jorrit Rouwe.
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.
mimalloc (https://github.com/godot-jolt/mimalloc)
Copyright (c) 2018-2021 Microsoft Corporation, Daan Leijen.
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.

View File

@ -1,41 +0,0 @@
[godot-jolt]
version = "0.14.0-stable"
build = "3392156fab"
[configuration]
entry_symbol = "godot_jolt_main"
compatibility_minimum = "4.3"
compatibility_maximum = "4.3"
[libraries]
windows.release.single.x86_64 = "windows/godot-jolt_windows-x64.dll"
windows.debug.single.x86_64 = "windows/godot-jolt_windows-x64_editor.dll"
windows.release.single.x86_32 = "windows/godot-jolt_windows-x86.dll"
windows.debug.single.x86_32 = "windows/godot-jolt_windows-x86_editor.dll"
linux.release.single.x86_64 = "linux/godot-jolt_linux-x64.so"
linux.debug.single.x86_64 = "linux/godot-jolt_linux-x64_editor.so"
linux.release.single.x86_32 = "linux/godot-jolt_linux-x86.so"
linux.debug.single.x86_32 = "linux/godot-jolt_linux-x86_editor.so"
macos.release.single = "macos/godot-jolt_macos.framework"
macos.debug.single = "macos/godot-jolt_macos_editor.framework"
ios.release.single = "ios/godot-jolt_ios.framework"
ios.debug.single = "ios/godot-jolt_ios_editor.framework"
android.release.single.arm64 = "android/libgodot-jolt_android-arm64.so"
android.debug.single.arm64 = "android/libgodot-jolt_android-arm64_editor.so"
android.release.single.arm32 = "android/libgodot-jolt_android-arm32.so"
android.debug.single.arm32 = "android/libgodot-jolt_android-arm32_editor.so"
android.release.single.x86_64 = "android/libgodot-jolt_android-x64.so"
android.debug.single.x86_64 = "android/libgodot-jolt_android-x64_editor.so"
android.release.single.x86_32 = "android/libgodot-jolt_android-x86.so"
android.debug.single.x86_32 = "android/libgodot-jolt_android-x86_editor.so"

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>godot-jolt_ios</string>
<key>CFBundleName</key>
<string>Godot Jolt</string>
<key>CFBundleDisplayName</key>
<string>Godot Jolt</string>
<key>CFBundleIdentifier</key>
<string>org.godot-jolt.godot-jolt</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) Mikael Hermansson and Godot Jolt contributors.</string>
<key>CFBundleVersion</key>
<string>0.14.0</string>
<key>CFBundleShortVersionString</key>
<string>0.14.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>iPhoneOS</string>
</array>
<key>CSResourcesFileMapped</key>
<true/>
<key>DTPlatformName</key>
<string>iphoneos</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
<!--
HACK(mihe): This is to work around a bug in Godot 4.3-beta1, where it treats Framework
bundles the same as XCFramework bundles, and expects there to be an `AvailableLibraries`
entry, which is really only a thing in XCFramework bundles. Note that we also lie about the
binary path having a `.dylib` extension in order for Godot to correctly identify this as a
dynamically linked bundle.
-->
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>godot-jolt_ios.dylib</string>
</dict>
</array>
</dict>
</plist>

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>godot-jolt_ios_editor</string>
<key>CFBundleName</key>
<string>Godot Jolt</string>
<key>CFBundleDisplayName</key>
<string>Godot Jolt</string>
<key>CFBundleIdentifier</key>
<string>org.godot-jolt.godot-jolt</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) Mikael Hermansson and Godot Jolt contributors.</string>
<key>CFBundleVersion</key>
<string>0.14.0</string>
<key>CFBundleShortVersionString</key>
<string>0.14.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>iPhoneOS</string>
</array>
<key>CSResourcesFileMapped</key>
<true/>
<key>DTPlatformName</key>
<string>iphoneos</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
<!--
HACK(mihe): This is to work around a bug in Godot 4.3-beta1, where it treats Framework
bundles the same as XCFramework bundles, and expects there to be an `AvailableLibraries`
entry, which is really only a thing in XCFramework bundles. Note that we also lie about the
binary path having a `.dylib` extension in order for Godot to correctly identify this as a
dynamically linked bundle.
-->
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>godot-jolt_ios_editor.dylib</string>
</dict>
</array>
</dict>
</plist>

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>godot-jolt_macos</string>
<key>CFBundleName</key>
<string>Godot Jolt</string>
<key>CFBundleDisplayName</key>
<string>Godot Jolt</string>
<key>CFBundleIdentifier</key>
<string>org.godot-jolt.godot-jolt</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) Mikael Hermansson and Godot Jolt contributors.</string>
<key>CFBundleVersion</key>
<string>0.14.0</string>
<key>CFBundleShortVersionString</key>
<string>0.14.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CSResourcesFileMapped</key>
<true/>
<key>DTPlatformName</key>
<string>macosx</string>
<key>LSMinimumSystemVersion</key>
<string>10.12</string>
</dict>
</plist>

View File

@ -1,128 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Resources/Info.plist</key>
<data>
et0C7sxAlu4eIDcq2ihFQ2BhDSk=
</data>
</dict>
<key>files2</key>
<dict>
<key>Resources/Info.plist</key>
<dict>
<key>hash2</key>
<data>
ZnG0hD4DciikOVWrf1Ai1Qedz9hESuIFvUujZAebHRY=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>godot-jolt_macos_editor</string>
<key>CFBundleName</key>
<string>Godot Jolt</string>
<key>CFBundleDisplayName</key>
<string>Godot Jolt</string>
<key>CFBundleIdentifier</key>
<string>org.godot-jolt.godot-jolt</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) Mikael Hermansson and Godot Jolt contributors.</string>
<key>CFBundleVersion</key>
<string>0.14.0</string>
<key>CFBundleShortVersionString</key>
<string>0.14.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CSResourcesFileMapped</key>
<true/>
<key>DTPlatformName</key>
<string>macosx</string>
<key>LSMinimumSystemVersion</key>
<string>10.12</string>
</dict>
</plist>

View File

@ -1,128 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Resources/Info.plist</key>
<data>
oIAzxlQz4Hun6JnLVOu9jafYxGE=
</data>
</dict>
<key>files2</key>
<dict>
<key>Resources/Info.plist</key>
<dict>
<key>hash2</key>
<data>
FA6I/u5+Ww0DzXAvawYXs792eum+8Bim8uHBbg98jqY=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

Binary file not shown.

View File

@ -1,34 +0,0 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://comihs66wounx"
path="res://.godot/imported/Dokdo-Regular.ttf-35686d8eb3881af645d50e9f0910bc9c.fontdata"
[deps]
source_file="res://assets/fonts/Dokdo/Dokdo-Regular.ttf"
dest_files=["res://.godot/imported/Dokdo-Regular.ttf-35686d8eb3881af645d50e9f0910bc9c.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=true
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -1,93 +0,0 @@
Copyright (c) 2005-2017 FONTRIX. All Rights Reserved.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

View File

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

Binary file not shown.

View File

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

View File

@ -1,94 +0,0 @@
Copyright (c) 2000-2010, Ben Weiner (ben@readingtype.org.uk),
with Reserved Font Name Geo.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -1,94 +0,0 @@
Copyright (c) 2012, Pablo Impallari (www.impallari.com|impallari@gmail.com),Rodrigo Fuenzalida (www.rfuenzalida.com|hello@rfuenzalida.com), with Reserved Font Name Racing Sans.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -1,34 +0,0 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dsa0oh7c0h4pu"
path="res://.godot/imported/RacingSansOne-Regular.ttf-88441b5e68f4114d3d33323daa87ff86.fontdata"
[deps]
source_file="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf"
dest_files=["res://.godot/imported/RacingSansOne-Regular.ttf-88441b5e68f4114d3d33323daa87ff86.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=true
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -10,10 +10,10 @@
[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="PackedScene" uid="uid://cy7t2tc4y3b4" path="res://src/player/shot_setup/shot_setup.tscn" id="8_h44v5"] [ext_resource type="PackedScene" uid="uid://cy7t2tc4y3b4" path="res://src/player/shot_setup/shot_setup.tscn" id="8_h44v5"]
[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="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/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/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/scenery/trees/palm_tree/palm_tree.tscn" id="12_sswxf"]
[ext_resource type="PackedScene" uid="uid://c7l58wuuahn7w" path="res://src/props/flag/flag.tscn" id="13_6jtao"] [ext_resource type="PackedScene" uid="uid://c7l58wuuahn7w" path="res://src/props/flag.tscn" id="13_6jtao"]
[ext_resource type="Texture2D" uid="uid://dj60e8ri2fco" path="res://assets/models/scenery/city/concrete_building_1/concrete_building_1.png" id="14_y7s2h"] [ext_resource type="Texture2D" uid="uid://dj60e8ri2fco" path="res://assets/models/scenery/city/concrete_building_1/concrete_building_1.png" id="14_y7s2h"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_rpgb7"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_rpgb7"]
@ -41,7 +41,6 @@ _shader_parameters = {
"vertex_normals_distance": 128.0 "vertex_normals_distance": 128.0
} }
texture_filtering = 1 texture_filtering = 1
show_navigation = true
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ly4sm"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ly4sm"]
cull_mode = 2 cull_mode = 2
@ -169,7 +168,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.2, 0)
shape = SubResource("BoxShape3D_x3wvm") shape = SubResource("BoxShape3D_x3wvm")
[node name="ShotSetup" parent="." instance=ExtResource("8_h44v5")] [node name="ShotSetup" parent="." instance=ExtResource("8_h44v5")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 212.717, 4, 294.073) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 218.499, 4, 294.341)
[node name="Buildings" type="Node3D" parent="."] [node name="Buildings" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 129.404, -9.53674e-07, 309.4) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 129.404, -9.53674e-07, 309.4)
@ -200,12 +199,3 @@ mesh = SubResource("BoxMesh_20p1k")
[node name="CollisionShape3D" type="CollisionShape3D" parent="DebugTable/StaticBody3D"] [node name="CollisionShape3D" type="CollisionShape3D" parent="DebugTable/StaticBody3D"]
shape = SubResource("BoxShape3D_g31tw") shape = SubResource("BoxShape3D_g31tw")
[node name="Fairway" type="Area3D" parent="."]
script = ExtResource("9_jwlau")
terrain_angular_damping = 2.0
[node name="CollisionPolygon3D" type="CollisionPolygon3D" parent="Fairway"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 209.788, 6.20358, 256.527)
depth = 10.0
polygon = PackedVector2Array(-1.47594, 8.77969, -12.788, 19.9447, -17.7778, 31.2864, -19.2001, 41.1398, -19.2001, 55.4081, -16.3465, 66.9813, -15.7123, 75.8594, -14.9196, 82.6765, -12.383, 89.9692, -5.6736, 102.186, 2.88742, 115.027, 9.22891, 125.332, 14.7777, 133.893, 23.4973, 146.417, 35.7046, 159.893, 44.1071, 167.661, 55.8437, 178.18, 64.5632, 185.314, 69.7949, 189.753, 73.7584, 193.082, 80.734, 200.85, 94.5267, 212.899, 106.576, 221.46, 127.915, 233.827, 139.647, 240.802, 170.403, 256.181, 183.721, 262.839, 204.489, 271.717, 216.062, 274.571, 224.465, 279.485, 235.727, 283.429, 246.983, 289.929, 253.958, 290.88, 265.373, 296.27, 275.044, 298.965, 288.995, 299.282, 302.154, 299.599, 330.056, 297.063, 356.532, 289.612, 370.483, 282.636, 382.057, 270.112, 388.081, 259.648, 392.679, 245.221, 395.849, 226.989, 395.863, 185.922, 391.266, 164.52, 381.913, 148.636, 362.889, 133.417, 344.657, 121.051, 327.059, 111.063, 306.291, 103.136, 292.974, 102.66, 277.913, 102.66, 264.913, 105.99, 241.347, 117.315, 222.323, 125.558, 203.457, 127.144, 182.371, 123.973, 157.322, 119.534, 132.908, 107.644, 108.651, 86.0827, 88.8301, 59.386, 82.6471, 48.764, 75.6715, 25.7761, 65.063, 10.562, 56.819, 3.7449, 48.5751, -0.852661, 35.2579, -3.07219, 20.8311, -3.38925, 7.35541, 1.36685)

BIN
levels/debug_level/terrain_3d_storage.res (Stored with Git LFS)

Binary file not shown.

View File

@ -150,12 +150,8 @@ select_putter={
[physics] [physics]
3d/physics_engine="JoltPhysics3D" 3d/default_angular_damp=2.0
3d/sleep_threshold_linear=0.1 3d/sleep_threshold_angular=0.3
3d/sleep_threshold_angular=2.0
jolt_3d/sleep/velocity_threshold=0.1
jolt_3d/sleep/time_threshold=1.0
jolt_3d/limits/max_temporary_memory=64
[rendering] [rendering]

View File

@ -169,7 +169,7 @@ bones/23/scale = Vector3(1, 1, 1)
visible = false visible = false
[node name="BoneAttachment3D" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="6"] [node name="BoneAttachment3D" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="6"]
transform = Transform3D(-0.944824, 0.316851, -0.0831417, -0.325647, -0.936013, 0.133541, -0.0355091, 0.153247, 0.98755, -0.1687, 3.15793, 0.845315) transform = Transform3D(-0.944824, 0.316851, -0.0831417, -0.325345, -0.937238, 0.12544, -0.0381779, 0.145568, 0.988612, -0.1687, 3.1755, 0.839478)
bone_name = "Hand.R" bone_name = "Hand.R"
bone_idx = 11 bone_idx = 11

View File

@ -5,7 +5,6 @@
[sub_resource type="SphereShape3D" id="SphereShape3D_wmusx"] [sub_resource type="SphereShape3D" id="SphereShape3D_wmusx"]
[node name="FreeCamera" type="CharacterBody3D"] [node name="FreeCamera" type="CharacterBody3D"]
process_mode = 3
collision_layer = 0 collision_layer = 0
script = ExtResource("1_3gm3q") script = ExtResource("1_3gm3q")

View File

@ -2,62 +2,3 @@ class_name GameBall extends RigidBody3D
## Base class for all gfolf balls ## Base class for all gfolf balls
signal entered_water signal entered_water
const TERRAIN_DAMPING_EPSILON := 1e-6
const IRON_DAMPING := 9999.0
## Angular damping while in air
@export var air_damping := 0.0
## Angular damping while in collision with rough terrain
@export var rough_damping := 8.0
## Angular damping for iron balls
@export var iron_damping := 9999.0
## Causes the ball to act more like a brick
@export var iron_ball := false:
set(value):
if value:
physics_material_override = iron_physics
else:
physics_material_override = normal_physics
iron_ball = value
var _zones: Array[BallZone] = []
@onready
var normal_physics: PhysicsMaterial = preload("res://src/player/physics_ball/normal_physics.tres")
@onready
var iron_physics: PhysicsMaterial = preload("res://src/player/physics_ball/iron_physics.tres")
## Called by a water area when this ball enters it
func enter_water() -> void:
entered_water.emit()
func _total_terrain_angular_damping() -> float:
return _zones.reduce(
func(a: float, b: BallZone) -> float: return a + b.terrain_angular_damping, 0.0
)
func _integrate_forces(state: PhysicsDirectBodyState3D) -> void:
var damping := air_damping
if iron_ball:
damping = iron_damping
elif state.get_contact_count():
damping = _total_terrain_angular_damping()
if damping <= TERRAIN_DAMPING_EPSILON:
damping = rough_damping
angular_damp = damping
func enter_zone(zone: BallZone) -> void:
_zones.push_back(zone)
if zone.water_hazard:
entered_water.emit()
func exit_zone(zone: BallZone) -> void:
_zones.erase(zone)

View File

@ -1,7 +0,0 @@
[gd_resource type="PhysicsMaterial" format=3 uid="uid://cfd56nhaods5a"]
[resource]
friction = 0.8
rough = true
bounce = 1.0
absorbent = true

View File

@ -1,5 +0,0 @@
[gd_resource type="PhysicsMaterial" format=3 uid="uid://3bih72l068ic"]
[resource]
friction = 0.8
bounce = 0.5

View File

@ -1,10 +1,13 @@
[gd_scene load_steps=8 format=3 uid="uid://dfttci386ohip"] [gd_scene load_steps=8 format=3 uid="uid://dfttci386ohip"]
[ext_resource type="Script" path="res://src/player/physics_ball/game_ball.gd" id="1_iwh2u"] [ext_resource type="Script" path="res://src/player/physics_ball/game_ball.gd" id="1_iwh2u"]
[ext_resource type="PhysicsMaterial" uid="uid://3bih72l068ic" path="res://src/player/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"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_2gatw"]
friction = 0.2
bounce = 0.5
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xqofq"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xqofq"]
albedo_texture = ExtResource("1_y3q5j") albedo_texture = ExtResource("1_y3q5j")
albedo_texture_force_srgb = true albedo_texture_force_srgb = true
@ -29,15 +32,10 @@ radius = 0.05
[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 = SubResource("PhysicsMaterial_2gatw")
continuous_cd = true continuous_cd = true
contact_monitor = true
max_contacts_reported = 1
linear_damp_mode = 1 linear_damp_mode = 1
angular_damp_mode = 1
angular_damp = 8.0
script = ExtResource("1_iwh2u") script = ExtResource("1_iwh2u")
iron_damping = 1e+07
[node name="BallMesh" type="MeshInstance3D" parent="."] [node name="BallMesh" type="MeshInstance3D" parent="."]
mesh = SubResource("SphereMesh_y0d13") mesh = SubResource("SphereMesh_y0d13")

View File

@ -34,12 +34,6 @@ const CAMERA_SNAP_TIME := 0.3
@export var base_power := 2.5 @export var base_power := 2.5
@export var base_curve := 0.0 @export var base_curve := 0.0
@export_category("Debug")
## When enabled, the game will pause and enter free cam mode when the ball has a collision.
@export var debug_ball_impact := false
## When enabled, ignore curve meter and hit a perfect shot every time.
@export var perfect_aim := false
var base_speed: float = ProjectSettings.get_setting("game/config/controls/camera/free_camera_speed") var base_speed: float = ProjectSettings.get_setting("game/config/controls/camera/free_camera_speed")
var x_sensitivity: float = ProjectSettings.get_setting( var x_sensitivity: float = ProjectSettings.get_setting(
@ -91,9 +85,7 @@ var _tracking_camera: OrbitalCamera
@onready var shot_animation: AnimationPlayer = %ShotAnimation @onready var shot_animation: AnimationPlayer = %ShotAnimation
@onready var arrow: Node3D = %Arrow @onready var arrow: Node3D = %Arrow
@onready var arrow_pivot: Node3D = %ArrowPivot
@onready var arrow_animation: AnimationPlayer = %ArrowAnimation @onready var arrow_animation: AnimationPlayer = %ArrowAnimation
@onready var shot_projection: ProjectileArc = %ShotProjection
@onready var power_bar: ProgressBar = %PowerBar @onready var power_bar: ProgressBar = %PowerBar
@onready var power_animation: AnimationPlayer = %PowerAnimation @onready var power_animation: AnimationPlayer = %PowerAnimation
@ -102,16 +94,13 @@ var _tracking_camera: OrbitalCamera
@onready var curve_animation: AnimationPlayer = %CurveAnimation @onready var curve_animation: AnimationPlayer = %CurveAnimation
@onready var ball_point: Node3D = %BallPoint @onready var ball_point: Node3D = %BallPoint
@onready var physics_ball: GameBall = %PhysicsBall @onready var physics_ball: RigidBody3D = %PhysicsBall
@onready var drive_ref: RayCast3D = %DriveRef @onready var drive_ref: RayCast3D = %DriveRef
@onready var drive_arrow: Node3D = %DriveArrow @onready var drive_arrow: Node3D = %DriveArrow
@onready var wedge_ref: RayCast3D = %WedgeRef
@onready var wedge_arrow: Node3D = %WedgeArrow
@onready var iron_ref: RayCast3D = %IronRef
@onready var iron_arrow: Node3D = %IronArrow
@onready var putt_ref: RayCast3D = %PuttRef @onready var putt_ref: RayCast3D = %PuttRef
@onready var putt_arrow: Node3D = %PuttArrow @onready var putt_arrow: Node3D = %PuttArrow
@onready var wedge_ref: RayCast3D = %WedgeRef
@onready var club_selector: ClubSelector = %ClubSelector @onready var club_selector: ClubSelector = %ClubSelector
@ -171,15 +160,13 @@ func finish_downswing() -> void:
phase = Phase.SHOT phase = Phase.SHOT
func get_shot_impulse(meter_pct: float) -> Vector3:
return -shot_ref.global_basis.z * base_power * meter_pct
func take_shot() -> void: func take_shot() -> void:
print_debug("WHACK!\nPower: ", power_bar.value, "\nCurve: ", curve_bar.value) print("WHACK!")
print("Power: ", power_bar.value)
print("Curve: ", curve_bar.value)
var impulse := get_shot_impulse(power_bar.value) var impulse := shot_ref.global_basis.z * base_power * power_bar.value
print_debug("Shot impulse: ", impulse, "; ", impulse.length(), " N*s") print("Shot impulse: ", impulse)
ball_impulse_debug.transform = ( ball_impulse_debug.transform = (
Transform3D.IDENTITY.scaled(Vector3.ONE * impulse.length()).looking_at(impulse) Transform3D.IDENTITY.scaled(Vector3.ONE * impulse.length()).looking_at(impulse)
@ -189,21 +176,8 @@ func take_shot() -> void:
physics_ball.apply_central_impulse(impulse) physics_ball.apply_central_impulse(impulse)
## Make the shot projection widget visible, with animated transition
func _show_shot_projection() -> void:
shot_projection.initial_speed = 1
shot_projection.basis = shot_ref.basis.orthonormalized()
var shot_speed := get_shot_impulse(1.0).length() / physics_ball.mass
var tween := get_tree().create_tween()
tween.tween_property(shot_projection, "initial_speed", shot_speed, CAMERA_SNAP_TIME).set_trans(
Tween.TRANS_QUAD
)
shot_projection.show()
func insert_free_cam() -> void: func insert_free_cam() -> void:
arrow_animation.play("hide") arrow_animation.play("hide")
_show_shot_projection()
hud_state.travel("hidden") hud_state.travel("hidden")
_free_camera = FreeCamera.create(camera) _free_camera = FreeCamera.create(camera)
add_sibling(_free_camera) add_sibling(_free_camera)
@ -214,7 +188,6 @@ func insert_free_cam() -> void:
func return_free_cam() -> void: func return_free_cam() -> void:
# TODO alter shot aim based on free camera selection # TODO alter shot aim based on free camera selection
arrow_animation.play("show") arrow_animation.play("show")
#shot_projection.hide()
hud_state.travel("visible") hud_state.travel("visible")
_free_camera.queue_free() _free_camera.queue_free()
_free_camera = null _free_camera = null
@ -266,15 +239,13 @@ func _on_club_change(new_club: Club.Type) -> void:
# Hide all arrows # Hide all arrows
# TODO animate? # TODO animate?
drive_arrow.hide() drive_arrow.hide()
wedge_arrow.hide()
iron_arrow.hide()
putt_arrow.hide() putt_arrow.hide()
physics_ball.iron_ball = false
club_selector.value = new_club club_selector.value = new_club
match new_club: match new_club:
Club.Type.DRIVER: Club.Type.DRIVER:
shot_ref = drive_ref shot_ref = drive_ref
drive_arrow.show() drive_arrow.show()
# TODO get this from player loadout # TODO get this from player loadout
# TODO club change animation # TODO club change animation
character.hold_right(Club.catalog.debug_driver.get_model()) character.hold_right(Club.catalog.debug_driver.get_model())
@ -285,13 +256,12 @@ func _on_club_change(new_club: Club.Type) -> void:
Club.Type.WEDGE: Club.Type.WEDGE:
# TODO # TODO
shot_ref = wedge_ref shot_ref = wedge_ref
wedge_arrow.show() drive_arrow.show()
character.hold_right(Club.catalog.debug_wedge.get_model()) character.hold_right(Club.catalog.debug_wedge.get_model())
Club.Type.IRON: Club.Type.IRON:
# TODO # TODO
shot_ref = iron_ref shot_ref = drive_ref
iron_arrow.show() drive_arrow.show()
physics_ball.iron_ball = true
character.hold_right(Club.catalog.debug_iron.get_model()) character.hold_right(Club.catalog.debug_iron.get_model())
Club.Type.SPECIAL: Club.Type.SPECIAL:
# TODO # TODO
@ -352,9 +322,7 @@ func _process(delta: float) -> void:
pitch.rotation.x = lerp_angle(pitch.rotation.x, _target_rotation.x, delta * y_acceleration) pitch.rotation.x = lerp_angle(pitch.rotation.x, _target_rotation.x, delta * y_acceleration)
# Arrow lags behind camera control # Arrow lags behind camera control
arrow_pivot.rotation.y = lerp_angle( arrow.rotation.y = lerp_angle(arrow.rotation.y, _target_rotation.y, delta * ARROW_ACCELERATION)
arrow_pivot.rotation.y, _target_rotation.y, delta * ARROW_ACCELERATION
)
# Player lags further behind # Player lags further behind
player_pivot.rotation.y = lerp_angle( player_pivot.rotation.y = lerp_angle(
player_pivot.rotation.y, _target_rotation.y, delta * PLAYER_ACCELERATION player_pivot.rotation.y, _target_rotation.y, delta * PLAYER_ACCELERATION
@ -446,18 +414,6 @@ func _on_physics_ball_sleeping_state_changed() -> void:
func _on_ball_entered_water() -> void: func _on_ball_entered_water() -> void:
# Should only be possible during SHOT phase, but let's check just to be sure... # Should only be possible during SHOT phase, but let's check just to be sure...
if phase == Phase.SHOT: if phase == Phase.SHOT:
print("INTO THE DRINK!!")
physics_ball.freeze = true physics_ball.freeze = true
wasted_animation.play("display") wasted_animation.play("display")
func _on_physics_ball_body_entered(_body: Node) -> void:
print_debug("BONK!")
if debug_ball_impact:
get_tree().paused = true
var snap_point: Node3D = camera
if _tracking_camera:
snap_point = _tracking_camera
_free_camera = FreeCamera.create(snap_point)
add_sibling(_free_camera)
control_disabled = true
camera.current = false

View File

@ -1,12 +1,10 @@
[gd_scene load_steps=40 format=3 uid="uid://cy7t2tc4y3b4"] [gd_scene load_steps=38 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="PackedScene" uid="uid://dfttci386ohip" path="res://src/player/physics_ball/physics_ball.tscn" id="2_1i5j5"] [ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/player/physics_ball/physics_ball.tscn" id="2_1i5j5"]
[ext_resource type="PackedScene" uid="uid://c2k88ns0h5ie1" path="res://src/ui/arrow/arrow.tscn" id="2_s70wl"] [ext_resource type="PackedScene" uid="uid://c2k88ns0h5ie1" path="res://src/ui/arrow.tscn" id="2_s70wl"]
[ext_resource type="PackedScene" uid="uid://1s3gywmoi20e" path="res://src/characters/gfolf_girl/gfolf_girl.tscn" id="3_e4aur"] [ext_resource type="PackedScene" uid="uid://1s3gywmoi20e" path="res://src/characters/gfolf_girl/gfolf_girl.tscn" id="3_e4aur"]
[ext_resource type="PackedScene" uid="uid://445qd7m4qe2j" path="res://src/player/shot_setup/club_selector/club_selector.tscn" id="4_56ape"] [ext_resource type="PackedScene" uid="uid://445qd7m4qe2j" path="res://src/player/shot_setup/club_selector/club_selector.tscn" id="4_56ape"]
[ext_resource type="PackedScene" uid="uid://fht6j87o8ecr" path="res://src/ui/projectile_arc/projectile_arc.tscn" id="4_ry2ho"]
[ext_resource type="PackedScene" uid="uid://dbdul15c4oblg" path="res://src/ui/projected_target.tscn" id="6_mynqj"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnol1"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnol1"]
albedo_color = Color(0, 0.537255, 1, 1) albedo_color = Color(0, 0.537255, 1, 1)
@ -662,36 +660,27 @@ unique_name_in_owner = true
[node name="DriveRef" type="RayCast3D" parent="Direction"] [node name="DriveRef" type="RayCast3D" parent="Direction"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 0.08, 0) transform = Transform3D(-1, 6.18172e-08, -6.18172e-08, 0, 0.707107, 0.707107, 8.74228e-08, 0.707107, -0.707107, 0, 0.08, 0)
enabled = false enabled = false
target_position = Vector3(0, 0, -1) target_position = Vector3(0, 0, 1)
collision_mask = 0 collision_mask = 0
collide_with_bodies = false collide_with_bodies = false
debug_shape_thickness = 4 debug_shape_thickness = 4
[node name="WedgeRef" type="RayCast3D" parent="Direction"] [node name="WedgeRef" type="RayCast3D" parent="Direction"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(0.7, 0, 0, 0, 0.181173, -0.676148, 0, 0.676148, 0.181173, 0, 0.08, 0) transform = Transform3D(-0.7, -5.29972e-08, 3.0598e-08, 0, 0.35, 0.606218, -6.11959e-08, 0.606218, -0.35, 0, 0.08, 0)
enabled = false enabled = false
target_position = Vector3(0, 0, -1) target_position = Vector3(0, 0, 1)
collision_mask = 0
collide_with_bodies = false
debug_shape_thickness = 4
[node name="IronRef" type="RayCast3D" parent="Direction"]
unique_name_in_owner = true
transform = Transform3D(0.7, 0, 0, 0, 0.449952, -0.536231, 0, 0.536231, 0.449952, 0, 0.08, 0)
enabled = false
target_position = Vector3(0, 0, -1)
collision_mask = 0 collision_mask = 0
collide_with_bodies = false collide_with_bodies = false
debug_shape_thickness = 4 debug_shape_thickness = 4
[node name="PuttRef" type="RayCast3D" parent="Direction"] [node name="PuttRef" type="RayCast3D" parent="Direction"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0.08, 0) transform = Transform3D(-1, 0, -1.50996e-07, 0, 1, 0, 1.50996e-07, 0, -1, 0, 0.08, 0)
enabled = false enabled = false
target_position = Vector3(0, 0, -1) target_position = Vector3(0, 0, 1)
collision_mask = 0 collision_mask = 0
collide_with_bodies = false collide_with_bodies = false
debug_shape_thickness = 4 debug_shape_thickness = 4
@ -713,68 +702,35 @@ unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 2.98023e-08, 0, -2.98023e-08, 1, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 2.98023e-08, 0, -2.98023e-08, 1, 0, 0, 0)
current = true current = true
[node name="ArrowPivot" type="Node3D" parent="."] [node name="Arrow" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0) transform = Transform3D(0.001, 0, 0, 0, 0.001, 0, 0, 0, 0.001, 0, 0.1, 0)
[node name="Arrow" type="Node3D" parent="ArrowPivot"] [node name="ArrowAnimation" type="AnimationPlayer" parent="Arrow"]
unique_name_in_owner = true
transform = Transform3D(0.001, 0, 0, 0, 0.001, 0, 0, 0, 0.001, 0, 0, 0)
[node name="ArrowAnimation" type="AnimationPlayer" parent="ArrowPivot/Arrow"]
unique_name_in_owner = true unique_name_in_owner = true
libraries = { libraries = {
"": SubResource("AnimationLibrary_rw0cf") "": SubResource("AnimationLibrary_rw0cf")
} }
autoplay = "show" autoplay = "show"
[node name="DriveArrow" type="Node3D" parent="ArrowPivot/Arrow"] [node name="DriveArrow" type="Node3D" parent="Arrow"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 0, 0)
visible = false visible = false
[node name="ArrowMesh" parent="ArrowPivot/Arrow/DriveArrow" instance=ExtResource("2_s70wl")] [node name="ArrowMesh" parent="Arrow/DriveArrow" instance=ExtResource("2_s70wl")]
transform = Transform3D(0.2, 0, 0, 0, -1.74846e-08, 0.2, 0, -0.4, -8.74228e-09, 0, 0, -1) transform = Transform3D(0.2, 0, 0, 0, 0.4, 0, 0, 0, 0.2, 0, 1, 0)
loop_animation = 1 loop_animation = 1
[node name="WedgeArrow" type="Node3D" parent="ArrowPivot/Arrow"] [node name="PuttArrow" type="Node3D" parent="Arrow"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(0.7, 0, 0, 0, 0.181173, -0.676148, 0, 0.676148, 0.181173, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
visible = false visible = false
[node name="ArrowMesh" parent="ArrowPivot/Arrow/WedgeArrow" instance=ExtResource("2_s70wl")] [node name="ArrowMesh" parent="Arrow/PuttArrow" instance=ExtResource("2_s70wl")]
transform = Transform3D(0.2, 0, 0, 0, -1.74846e-08, 0.2, 0, -0.4, -8.74228e-09, 0, 0, -1) transform = Transform3D(0.2, 0, 0, 0, 0.4, 0, 0, 0, 0.2, 0, 1, 0)
loop_animation = 1 loop_animation = 1
[node name="IronArrow" type="Node3D" parent="ArrowPivot/Arrow"]
unique_name_in_owner = true
transform = Transform3D(0.7, 0, 0, 0, 0.449952, -0.536231, 0, 0.536231, 0.449952, 0, 0, 0)
visible = false
[node name="ArrowMesh" parent="ArrowPivot/Arrow/IronArrow" instance=ExtResource("2_s70wl")]
transform = Transform3D(0.2, 0, 0, 0, -1.74846e-08, 0.2, 0, -0.4, -8.74228e-09, 0, 0, -1)
loop_animation = 1
[node name="PuttArrow" type="Node3D" parent="ArrowPivot/Arrow"]
unique_name_in_owner = true
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0)
visible = false
[node name="ArrowMesh" parent="ArrowPivot/Arrow/PuttArrow" instance=ExtResource("2_s70wl")]
transform = Transform3D(0.2, 0, 0, 0, -1.74846e-08, 0.2, 0, -0.4, -8.74228e-09, 0, 0, -1)
loop_animation = 1
[node name="ShotProjection" parent="ArrowPivot" node_paths=PackedStringArray("excluded_bodies") instance=ExtResource("4_ry2ho")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, -0.02, 0)
visible = false
initial_speed = 50.0
time_step = 0.01
max_steps = 800
excluded_bodies = [NodePath("../../BallPoint/PhysicsBall")]
[node name="ProjectedTarget" parent="ArrowPivot/ShotProjection" instance=ExtResource("6_mynqj")]
[node name="ShotAnimation" type="AnimationPlayer" parent="."] [node name="ShotAnimation" type="AnimationPlayer" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
root_node = NodePath("../Direction/Elevation/Pitch/Zoom/Camera") root_node = NodePath("../Direction/Elevation/Pitch/Zoom/Camera")
@ -808,9 +764,12 @@ offset_bottom = 66.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
mouse_filter = 2 mouse_filter = 2
theme_type_variation = &"ShotFeedback" theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
theme_override_constants/shadow_offset_y = 4
theme_override_constants/shadow_offset_x = 6
theme_override_font_sizes/bold_italics_font_size = 168
bbcode_enabled = true bbcode_enabled = true
text = "[center][wave amp=64][rainbow]woah nice[/rainbow][/wave][/center]" text = "[center][wave][rainbow][i][b]WOAH NICE[/b][/i][/rainbow][/wave][/center]"
fit_content = true fit_content = true
autowrap_mode = 0 autowrap_mode = 0
visible_characters_behavior = 1 visible_characters_behavior = 1
@ -838,9 +797,12 @@ grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
pivot_offset = Vector2(100, 115) pivot_offset = Vector2(100, 115)
mouse_filter = 2 mouse_filter = 2
theme_type_variation = &"ShotFeedback" theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
theme_override_constants/shadow_offset_y = 4
theme_override_constants/shadow_offset_x = 6
theme_override_font_sizes/bold_italics_font_size = 168
bbcode_enabled = true bbcode_enabled = true
text = "[center][tornado radius=16][color=powder_blue]wasted[/color][/tornado][/center]" text = "[center][tornado radius=20][color=powder_blue][i][b]WASTED[/b][/i][/color][/tornado][/center]"
fit_content = true fit_content = true
autowrap_mode = 0 autowrap_mode = 0
visible_characters_behavior = 1 visible_characters_behavior = 1
@ -952,6 +914,5 @@ root_node = NodePath("%HUDStateMachine/..")
tree_root = SubResource("AnimationNodeStateMachine_osrbp") tree_root = SubResource("AnimationNodeStateMachine_osrbp")
anim_player = NodePath("../HUDAnimation") anim_player = NodePath("../HUDAnimation")
[connection signal="body_entered" from="BallPoint/PhysicsBall" to="." method="_on_physics_ball_body_entered"]
[connection signal="entered_water" from="BallPoint/PhysicsBall" to="." method="_on_ball_entered_water"] [connection signal="entered_water" from="BallPoint/PhysicsBall" to="." method="_on_ball_entered_water"]
[connection signal="sleeping_state_changed" from="BallPoint/PhysicsBall" to="." method="_on_physics_ball_sleeping_state_changed"] [connection signal="sleeping_state_changed" from="BallPoint/PhysicsBall" to="." method="_on_physics_ball_sleeping_state_changed"]

View File

@ -1,35 +1,11 @@
[gd_scene load_steps=5 format=3 uid="uid://c7l58wuuahn7w"] [gd_scene load_steps=3 format=3 uid="uid://c7l58wuuahn7w"]
[ext_resource type="PackedScene" uid="uid://dqj60gh364mn5" path="res://assets/models/course/flag/flag.gltf" id="1_ona6u"] [ext_resource type="PackedScene" uid="uid://dqj60gh364mn5" path="res://assets/models/course/flag/flag.gltf" id="1_ona6u"]
[ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="2_tmki0"]
[ext_resource type="Script" path="res://src/props/flag/flag.gd" id="2_wv8rd"]
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_8ynho"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_8ynho"]
data = PackedVector3Array(0, 0, -0.025, 0.0217, 4, -0.0125, 0, 4, -0.025, 0, 0, -0.025, 0.0217, 0, -0.0125, 0.0217, 4, -0.0125, 0.0217, 0, -0.0125, 0.0217, 4, 0.0125, 0.0217, 4, -0.0125, 0.0217, 0, -0.0125, 0.0217, 0, 0.0125, 0.0217, 4, 0.0125, 0.0217, 0, 0.0125, 0, 4, 0.025, 0.0217, 4, 0.0125, 0.0217, 0, 0.0125, 0, 0, 0.025, 0, 4, 0.025, 0, 0, 0.025, -0.0217, 4, 0.0125, 0, 4, 0.025, 0, 0, 0.025, -0.0217, 0, 0.0125, -0.0217, 4, 0.0125, 0.0217, 4, 0.0125, 0, 4, -0.025, 0.0217, 4, -0.0125, 0, 4, -0.025, -0.0217, 4, 0.0125, -0.0217, 4, -0.0125, -0.0217, 4, 0.0125, 0.0217, 4, 0.0125, 0, 4, 0.025, 0, 4, -0.025, 0.0217, 4, 0.0125, -0.0217, 4, 0.0125, -0.0217, 0, 0.0125, -0.0217, 4, -0.0125, -0.0217, 4, 0.0125, -0.0217, 0, 0.0125, -0.0217, 0, -0.0125, -0.0217, 4, -0.0125, -0.0217, 0, -0.0125, 0, 4, -0.025, -0.0217, 4, -0.0125, -0.0217, 0, -0.0125, 0, 0, -0.025, 0, 4, -0.025, -0.0217, 0, -0.0125, 0.0217, 0, -0.0125, 0, 0, -0.025, 0.0217, 0, -0.0125, 0, 0, 0.025, 0.0217, 0, 0.0125, 0, 0, 0.025, -0.0217, 0, -0.0125, -0.0217, 0, 0.0125, 0.0217, 0, -0.0125, -0.0217, 0, -0.0125, 0, 0, 0.025) data = PackedVector3Array(0, 0, -0.025, 0.0217, 4, -0.0125, 0, 4, -0.025, 0, 0, -0.025, 0.0217, 0, -0.0125, 0.0217, 4, -0.0125, 0.0217, 0, -0.0125, 0.0217, 4, 0.0125, 0.0217, 4, -0.0125, 0.0217, 0, -0.0125, 0.0217, 0, 0.0125, 0.0217, 4, 0.0125, 0.0217, 0, 0.0125, 0, 4, 0.025, 0.0217, 4, 0.0125, 0.0217, 0, 0.0125, 0, 0, 0.025, 0, 4, 0.025, 0, 0, 0.025, -0.0217, 4, 0.0125, 0, 4, 0.025, 0, 0, 0.025, -0.0217, 0, 0.0125, -0.0217, 4, 0.0125, 0.0217, 4, 0.0125, 0, 4, -0.025, 0.0217, 4, -0.0125, 0, 4, -0.025, -0.0217, 4, 0.0125, -0.0217, 4, -0.0125, -0.0217, 4, 0.0125, 0.0217, 4, 0.0125, 0, 4, 0.025, 0, 4, -0.025, 0.0217, 4, 0.0125, -0.0217, 4, 0.0125, -0.0217, 0, 0.0125, -0.0217, 4, -0.0125, -0.0217, 4, 0.0125, -0.0217, 0, 0.0125, -0.0217, 0, -0.0125, -0.0217, 4, -0.0125, -0.0217, 0, -0.0125, 0, 4, -0.025, -0.0217, 4, -0.0125, -0.0217, 0, -0.0125, 0, 0, -0.025, 0, 4, -0.025, -0.0217, 0, -0.0125, 0.0217, 0, -0.0125, 0, 0, -0.025, 0.0217, 0, -0.0125, 0, 0, 0.025, 0.0217, 0, 0.0125, 0, 0, 0.025, -0.0217, 0, -0.0125, -0.0217, 0, 0.0125, 0.0217, 0, -0.0125, -0.0217, 0, -0.0125, 0, 0, 0.025)
[node name="Flag" instance=ExtResource("1_ona6u")] [node name="Flag" instance=ExtResource("1_ona6u")]
script = ExtResource("2_wv8rd")
show_distance = true
[node name="DistanceLabel" type="Label3D" parent="Pole" index="0"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
visibility_range_begin = 20.0
visibility_range_begin_margin = 2.0
visibility_range_fade_mode = 1
pixel_size = 0.001
billboard = 1
no_depth_test = true
fixed_size = true
texture_filter = 5
render_priority = 3
outline_render_priority = 2
outline_modulate = Color(1, 0, 0.133333, 1)
text = "Goal!
0000 m"
font = ExtResource("2_tmki0")
outline_size = 8
line_spacing = -16.0
[node name="Skeleton3D" parent="Armature" index="0"] [node name="Skeleton3D" parent="Armature" index="0"]
bones/0/rotation = Quaternion(-0.0471389, 2.3332e-10, 0.0444053, 0.997901) bones/0/rotation = Quaternion(-0.0471389, 2.3332e-10, 0.0444053, 0.997901)

View File

@ -1,20 +0,0 @@
@tool
extends Node3D
@export var show_distance: bool:
set(value):
if distance_label:
distance_label.visible = value
get:
return distance_label.visible
@onready var distance_label: Label3D = %DistanceLabel
func _process(_delta: float) -> void:
if show_distance:
var viewport := get_viewport()
if viewport:
var camera := viewport.get_camera_3d()
if camera:
var distance := int(global_position.distance_to(camera.global_position))
distance_label.text = "Goal!\n%d m" % distance

View File

@ -1,47 +0,0 @@
// Hologram shader
// Adapted from https://godotshaders.com/shader/scifi-hologram/
shader_type spatial;
render_mode unshaded;
uniform sampler2D texture_image;
uniform mediump vec4 line_color : source_color = vec4(0.0, 1.0, 0.0, 1.0);
uniform mediump float line_width : hint_range(0, 1) = 0.005;
uniform mediump float line_blur : hint_range(0, 1) = 0.2;
uniform mediump float line_speed : hint_range(-1, 1) = 0.02;
uniform bool straight_lines = true;
uniform mediump float interrupt_width : hint_range(0, 1) = 0.5;
uniform mediump float interrupt_blur : hint_range(0, 1) = 0.25;
uniform mediump float interrupt_speed : hint_range(-1, 1) = 0.2;
uniform mediump vec4 glow_color : source_color = vec4(0.5, 0.75, 1.0, 1.0);
uniform lowp float glow_itensity : hint_range(0, 20) = 4.5;
uniform lowp float glow_amount : hint_range(0, 20) = 4.5;
uniform lowp float flickering : hint_range(0, 1) = 0.55;
vec3 fresnel_glow(float amount, float intensity, vec3 color, vec3 normal, vec3 view) {
return pow((1.0 - dot(normalize(normal), normalize(view))), amount) * color * intensity;
}
void fragment () {
vec2 canvas;
if (straight_lines) {
canvas = SCREEN_UV;
} else {
canvas = vec2(VIEW.x, VIEW.y);
}
vec2 lines = vec2(clamp(sin((TIME * line_speed + canvas.y) / line_width), line_blur, 1.0 - line_blur), canvas.x);
vec2 interupts = vec2(clamp(sin((TIME * interrupt_speed + canvas.y) / interrupt_width * 3.0), interrupt_blur, 1.0 - interrupt_blur), canvas.x);
float flicker = clamp(fract(cos(TIME) * 43758.5453123), flickering, 1.0);
vec4 imgtex = flicker * line_color * texture(texture_image, lines * interupts);
vec3 imgtex_color = vec3(imgtex.r, imgtex.g, imgtex.b);
vec3 fresnel_color = vec3(glow_color.r, glow_color.g, glow_color.b);
vec3 fresnel = fresnel_glow(glow_amount, glow_itensity, fresnel_color, NORMAL, VIEW);
ALBEDO = imgtex_color + fresnel;
EMISSION = glow_amount * vec3(glow_color.r, glow_color.g, glow_color.b);
ALPHA = lines.x * interupts.x;
}

View File

@ -1,41 +0,0 @@
// Plasma Pulse shader
// Adapted from https://godotshaders.com/shader/scifi-hologram/
shader_type spatial;
render_mode unshaded, cull_back;
uniform mediump vec3 albedo: source_color = vec3(0.9, 0.0, 0.7);
uniform bool transpose_axis = false;
uniform mediump sampler2D wave_gradient;
uniform mediump float wave_width: hint_range(0, 10) = 1;
uniform mediump float wave_speed: hint_range(-1, 1) = 0.4;
uniform mediump vec4 glow_color: source_color = vec4(0.5, 0.75, 1.0, 1.0);
uniform lowp float glow_intensity: hint_range(0, 20) = 0.618;
uniform lowp float glow_amount: hint_range(0, 20) = 4.5;
uniform mediump sampler2D pulse_gradient;
uniform mediump float pulse_speed: hint_range(0, 10) = 0.3;
vec3 fresnel_glow(float amount, float intensity, vec3 color, vec3 normal, vec3 view) {
return pow((1.0 - dot(normalize(normal), normalize(view))), amount) * color * intensity;
}
void fragment () {
float canvas = -UV.x;
if(transpose_axis) {
canvas = -UV.y;
}
float wave_value = texture(wave_gradient, vec2((canvas + TIME * wave_speed) / wave_width, 0)).r;
vec3 fresnel_color = vec3(glow_color.r, glow_color.g, glow_color.b);
vec3 fresnel = fresnel_glow(glow_amount, glow_intensity, fresnel_color, NORMAL, VIEW);
float pulse_value = texture(pulse_gradient, vec2(TIME * pulse_speed, 0)).r;
ALBEDO = albedo + fresnel;
EMISSION = glow_amount * vec3(glow_color.r, glow_color.g, glow_color.b);
ALPHA = wave_value * pulse_value;
}

View File

@ -1,7 +1,7 @@
[gd_scene load_steps=9 format=3 uid="uid://c2k88ns0h5ie1"] [gd_scene load_steps=9 format=3 uid="uid://c2k88ns0h5ie1"]
[ext_resource type="PackedScene" uid="uid://bw54bi35myvpg" path="res://assets/models/ui/arrow/arrow.glb" id="1_xifl6"] [ext_resource type="PackedScene" uid="uid://bw54bi35myvpg" path="res://assets/models/ui/arrow/arrow.glb" id="1_xifl6"]
[ext_resource type="Script" path="res://src/ui/arrow/arrow.gd" id="2_0viam"] [ext_resource type="Script" path="res://src/ui/arrow.gd" id="2_0viam"]
[ext_resource type="Material" uid="uid://d3ka0yjhxu5ks" path="res://assets/materials/gummy_material.tres" id="3_g7vwe"] [ext_resource type="Material" uid="uid://d3ka0yjhxu5ks" path="res://assets/materials/gummy_material.tres" id="3_g7vwe"]
[sub_resource type="Animation" id="Animation_hsqkd"] [sub_resource type="Animation" id="Animation_hsqkd"]

View File

@ -1,7 +1,15 @@
[gd_resource type="Theme" load_steps=3 format=3 uid="uid://diodjft5u2cck"] [gd_resource type="Theme" load_steps=3 format=3 uid="uid://diodjft5u2cck"]
[ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="1_3rv2b"] [sub_resource type="SystemFont" id="SystemFont_dpm3o"]
[ext_resource type="FontFile" uid="uid://comihs66wounx" path="res://assets/fonts/Dokdo/Dokdo-Regular.ttf" id="1_eha6a"] font_names = PackedStringArray("Sans-Serif")
font_italic = true
font_weight = 800
generate_mipmaps = true
[sub_resource type="SystemFont" id="SystemFont_2dr7l"]
font_names = PackedStringArray("Sans-Serif")
font_italic = true
font_weight = 800
[resource] [resource]
ClubSelectLabel/base_type = &"Label" ClubSelectLabel/base_type = &"Label"
@ -12,10 +20,11 @@ ClubSelectLabel/constants/outline_size = 6
ClubSelectLabel/constants/shadow_offset_x = 6 ClubSelectLabel/constants/shadow_offset_x = 6
ClubSelectLabel/constants/shadow_offset_y = 0 ClubSelectLabel/constants/shadow_offset_y = 0
ClubSelectLabel/font_sizes/font_size = 84 ClubSelectLabel/font_sizes/font_size = 84
ClubSelectLabel/fonts/font = ExtResource("1_3rv2b") ClubSelectLabel/fonts/font = SubResource("SystemFont_dpm3o")
ShotFeedback/base_type = &"RichTextLabel" ShotFeedback/base_type = &"Label"
ShotFeedback/colors/font_color = Color(0.807843, 1, 1, 1)
ShotFeedback/colors/font_shadow_color = Color(0, 0, 0, 1) ShotFeedback/colors/font_shadow_color = Color(0, 0, 0, 1)
ShotFeedback/constants/shadow_offset_x = 6 ShotFeedback/constants/shadow_offset_x = 3
ShotFeedback/constants/shadow_offset_y = 4 ShotFeedback/constants/shadow_offset_y = 2
ShotFeedback/font_sizes/normal_font_size = 272 ShotFeedback/font_sizes/font_size = 96
ShotFeedback/fonts/normal_font = ExtResource("1_eha6a") ShotFeedback/fonts/font = SubResource("SystemFont_2dr7l")

View File

@ -1,116 +0,0 @@
[gd_scene load_steps=10 format=3 uid="uid://dbdul15c4oblg"]
[ext_resource type="Shader" path="res://src/shaders/plasma.gdshader" id="1_nf38g"]
[ext_resource type="FontFile" uid="uid://b6gxwgomstkgu" path="res://assets/fonts/Geo/Geo-Italic.ttf" id="2_ckdn3"]
[sub_resource type="Gradient" id="Gradient_3oor7"]
interpolation_mode = 2
offsets = PackedFloat32Array(0, 0.5, 1)
colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_ic835"]
gradient = SubResource("Gradient_3oor7")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_msl6u"]
render_priority = 0
shader = ExtResource("1_nf38g")
shader_parameter/albedo = Color(1, 0.19, 0.2035, 1)
shader_parameter/transpose_axis = true
shader_parameter/wave_width = 0.4
shader_parameter/wave_speed = -0.3
shader_parameter/glow_color = Color(0.5, 0.75, 1, 1)
shader_parameter/glow_intensity = 0.618
shader_parameter/glow_amount = 4.5
shader_parameter/pulse_speed = 0.3
shader_parameter/wave_gradient = SubResource("GradientTexture1D_ic835")
[sub_resource type="SphereMesh" id="SphereMesh_dbo5p"]
material = SubResource("ShaderMaterial_msl6u")
radial_segments = 16
rings = 16
[sub_resource type="Animation" id="Animation_yu68k"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_npp1f"]
resource_name = "rotate"
length = 3.236
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 3.236),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, -3.14159, 0)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vm52d"]
_data = {
"RESET": SubResource("Animation_yu68k"),
"rotate": SubResource("Animation_npp1f")
}
[node name="ProjectedTarget" type="MeshInstance3D"]
mesh = SubResource("SphereMesh_dbo5p")
[node name="Pivot" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, 0)
[node name="Label3D" type="Label3D" parent="Pivot"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0.55)
pixel_size = 0.001
texture_filter = 5
modulate = Color(1, 0.188235, 0.203922, 1)
text = "DANGER"
font = ExtResource("2_ckdn3")
font_size = 64
[node name="Label3D2" type="Label3D" parent="Pivot"]
transform = Transform3D(-1, 8.74228e-08, 3.82137e-15, 0, -4.37114e-08, 1, 8.74228e-08, 1, 4.37114e-08, 0, 0, -0.55)
pixel_size = 0.001
texture_filter = 5
modulate = Color(1, 0.188235, 0.203922, 1)
text = "DANGER"
font = ExtResource("2_ckdn3")
font_size = 64
[node name="Label3D3" type="Label3D" parent="Pivot"]
transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, 0.55, 0, 0)
pixel_size = 0.001
texture_filter = 5
modulate = Color(1, 0.188235, 0.203922, 1)
text = "DANGER"
font = ExtResource("2_ckdn3")
font_size = 64
[node name="Label3D4" type="Label3D" parent="Pivot"]
transform = Transform3D(-4.37114e-08, 1, 4.37114e-08, 0, -4.37114e-08, 1, 1, 4.37114e-08, 1.91069e-15, -0.55, 0, 0)
pixel_size = 0.001
texture_filter = 5
modulate = Color(1, 0.188235, 0.203922, 1)
text = "DANGER"
font = ExtResource("2_ckdn3")
font_size = 64
[node name="AnimationPlayer" type="AnimationPlayer" parent="Pivot"]
libraries = {
"": SubResource("AnimationLibrary_vm52d")
}
autoplay = "rotate"

View File

@ -1,95 +0,0 @@
class_name ProjectileArc extends Node3D
## Visually project the arc of a projectile through space.
##
## If this node has any children, they will be positioned wherever the projection ends.
## Initial speed of the projectile, in m/s.
## The projectile's initial direction vector is the negative Z direction relative to this node.
@export var initial_speed := 1.0
@export_category("Projection")
## Time between projection steps, in seconds.
@export var time_step := 0.2
## Maximum number of steps to predict before stopping.
@export var max_steps := 50
## Ticks between each projection update. 0 means update every tick.
@export var ticks_per_update := 0
@export_category("Collision")
## Enables collision checking. Projection will end at the point where a collision is detected.
## Uses continuous collision detection.
@export var check_collision := true
## Mask for collision checking.
@export_flags_3d_physics var collision_mask := 1
## Bodies excluded from collision checking.
## This should probably include the ball!
@export var excluded_bodies: Array[CollisionObject3D] = []
var _tick_counter := 0
@onready var polygon: CSGPolygon3D = %Polygon
@onready var path: Path3D = %Path
@onready var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
@onready var gravity_vec: Vector3 = ProjectSettings.get_setting("physics/3d/default_gravity_vector")
func _process(_delta: float) -> void:
if not visible:
# Don't bother if we're not visible
return
# Short-circuit if we need to wait more ticks
if _tick_counter > 0:
_tick_counter -= 1
return
_tick_counter = ticks_per_update
# Rebuild path curve
path.global_basis = Basis.IDENTITY
path.curve.clear_points()
var space := get_world_3d().direct_space_state
var excluded_rid: Array[RID] = []
excluded_rid.assign(excluded_bodies.map(func(k: CollisionObject3D) -> RID: return k.get_rid()))
var pos := global_position
var vel := -global_basis.z * initial_speed
for t in range(0, max_steps):
# TODO: smooth curve with bezier handles
path.curve.add_point(pos - global_position)
# Integrate projectile path
vel += gravity * gravity_vec * time_step
var next_pos := pos + vel * time_step
# Collision
if check_collision:
var ray_params := PhysicsRayQueryParameters3D.create(
pos, next_pos, collision_mask, excluded_rid
)
var collision := space.intersect_ray(ray_params)
if collision:
# Set current position to collision point, so it will be added to the path
# TODO: we could project further using the surface normal here...
pos = collision["position"]
# End projection!
break
pos = next_pos
# Add terminal point (possibly collision point)
path.curve.add_point(pos - global_position)
# Reposition any children
for n: Node in get_children():
if n is Node3D and n != path:
var node_3d: Node3D = n
node_3d.global_position = pos
node_3d.global_basis = Basis.IDENTITY
func _on_visibility_changed() -> void:
# Force update as soon as visible
_tick_counter = 0

View File

@ -1,59 +0,0 @@
[gd_scene load_steps=9 format=3 uid="uid://fht6j87o8ecr"]
[ext_resource type="Script" path="res://src/ui/projectile_arc/projectile_arc.gd" id="1_vafqi"]
[ext_resource type="Shader" path="res://src/shaders/plasma.gdshader" id="2_pi36v"]
[sub_resource type="Curve3D" id="Curve3D_rfv3d"]
[sub_resource type="Gradient" id="Gradient_28hbf"]
offsets = PackedFloat32Array(0, 0.37193, 0.838596, 1)
colors = PackedColorArray(0.197937, 0.197937, 0.197937, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.197937, 0.197937, 0.197937, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_8xhfy"]
gradient = SubResource("Gradient_28hbf")
[sub_resource type="Gradient" id="Gradient_yx8sm"]
interpolation_mode = 2
offsets = PackedFloat32Array(0.0666667, 0.287719, 1)
colors = PackedColorArray(1, 1, 1, 1, 0.485904, 0.485904, 0.485904, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_l8ond"]
gradient = SubResource("Gradient_yx8sm")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ahf42"]
render_priority = 0
shader = ExtResource("2_pi36v")
shader_parameter/albedo = Color(0.9, 0, 0.7, 1)
shader_parameter/transpose_axis = false
shader_parameter/wave_width = 2.0
shader_parameter/wave_speed = 0.6
shader_parameter/glow_color = Color(0.5, 0.75, 1, 1)
shader_parameter/glow_intensity = 0.618
shader_parameter/glow_amount = 4.5
shader_parameter/pulse_speed = 0.3
shader_parameter/wave_gradient = SubResource("GradientTexture1D_l8ond")
shader_parameter/pulse_gradient = SubResource("GradientTexture1D_8xhfy")
[node name="ProjectileArc" type="Node3D"]
script = ExtResource("1_vafqi")
[node name="Path" type="Path3D" parent="."]
unique_name_in_owner = true
curve = SubResource("Curve3D_rfv3d")
[node name="Polygon" type="CSGPolygon3D" parent="Path"]
unique_name_in_owner = true
polygon = PackedVector2Array(0, -0.1, -0.2, 0, 0, 0.1, 0.2, 0)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
path_interval = 1.0
path_simplify_angle = 0.0
path_rotation = 2
path_local = true
path_continuous_u = true
path_u_distance = 1.0
path_joined = false
material = SubResource("ShaderMaterial_ahf42")
[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"]

View File

@ -1,8 +1,6 @@
class_name BallZone extends Area3D class_name BallZone extends Area3D
## A spatial area that has an effect on balls inside it. ## A spatial area that has an effect on balls inside it.
@export var terrain_angular_damping := 1.0
@export var water_hazard := false @export var water_hazard := false
@ -11,11 +9,21 @@ func _ready() -> void:
body_exited.connect(_on_body_exited) body_exited.connect(_on_body_exited)
func on_ball_entered(ball: GameBall) -> void:
if water_hazard:
ball.entered_water.emit()
func on_ball_exited(ball: GameBall) -> void:
pass
func _on_body_entered(body: Node3D) -> void: func _on_body_entered(body: Node3D) -> void:
print("BODY ENTERED ZONE: ", body)
if body is GameBall: if body is GameBall:
(body as GameBall).enter_zone(self) on_ball_entered(body as GameBall)
func _on_body_exited(body: Node3D) -> void: func _on_body_exited(body: Node3D) -> void:
if body is GameBall: if body is GameBall:
(body as GameBall).exit_zone(self) on_ball_exited(body as GameBall)