Compare commits

..

No commits in common. "main" and "v0.0.1" have entirely different histories.
main ... v0.0.1

118 changed files with 431 additions and 5576 deletions

View File

@ -36,7 +36,7 @@ loop-variable-name: _?[a-z][a-z0-9]*(_[a-z0-9]+)*
max-file-lines: 1000 max-file-lines: 1000
max-line-length: 100 max-line-length: 100
max-public-methods: 40 max-public-methods: 40
max-returns: 99 max-returns: 6
mixed-tabs-and-spaces: null mixed-tabs-and-spaces: null
no-elif-return: null no-elif-return: null
no-else-return: null no-else-return: null

View File

@ -1,32 +0,0 @@
name: linting & formatting
run-name: ${{ gitea.actor }} is checking linting & formatting.
on:
push:
branches:
- main
- ci-test
tags:
- v*
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
run: |
git init
git remote add origin ${{ gitea.event.repository.clone_url }}
git fetch --depth 1 origin ${{ gitea.ref }}
git checkout FETCH_HEAD
git lfs pull
- name: Setup Python
uses: actions/setup-python@v5.3.0
with:
python-version: '3.11'
- name: Install gdscript-toolkit
run: pip install -r requirements.txt
- name: Run gdLint
run: gdlint src/
- name: Check formatting
run: gdformat -c src

View File

@ -1,54 +0,0 @@
# Based on https://github.com/aBARICHELLO/godot-ci/blob/master/.github/workflows/godot-ci.yml
name: GFOLF - itch.io publish action
run-name: ${{ gitea.actor }} is publishing GFOLF ${{ gitea.ref_name }} to itch.io.
on:
push:
tags:
- v*
env:
GODOT_VERSION: 4.3
EXPORT_NAME: gfolf
PROJECT_PATH: .
jobs:
build:
runs-on: ubuntu-20.04
container:
image: barichello/godot-ci:4.3
strategy:
matrix:
include:
- target: linux64
type: x86_64
- target: osx
type: app
- target: win64
type: exe
env:
BUILD_DIR: build/gfolf_${{ gitea.ref_name }}_${{ matrix.target }}
steps:
- name: Checkout repository
run: |
git init
git remote add origin ${{ gitea.event.repository.clone_url }}
git fetch --depth 1 origin ${{ gitea.ref }}
git checkout FETCH_HEAD
git lfs pull
- name: Reimport assets
# bruh are you fucking kidding me. bruhh
run: |
timeout 10 godot --headless --import || true
godot --headless --import
- name: Build project
run: |
echo "building to $BUILD_DIR"
mkdir -p $BUILD_DIR
godot --headless --export-debug ${{ matrix.target }} $BUILD_DIR/gfolf.${{ matrix.type }}
- name: Publish
run: |
echo "pushing $BUILD_DIR"
butler push $BUILD_DIR tetramorph/gfolf:${{ matrix.target }} --userversion ${{ gitea.ref_name }}
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}

2
.gitignore vendored
View File

@ -4,7 +4,7 @@
# Godot-specific ignores # Godot-specific ignores
.import/ .import/
export.cfg export.cfg
#export_presets.cfg export_presets.cfg
# Imported translations (automatically generated from CSV files) # Imported translations (automatically generated from CSV files)
*.translation *.translation

View File

@ -1,16 +1,7 @@
# Gfolf2 # Gfolf2
![Lint Status](../../../actions/workflows/lint.yaml/badge.svg)
![Publish Status](../../../actions/workflows/publish.yaml/badge.svg)
GFOLF: Combat Golf Action GFOLF: Combat Golf Action
## About
Go hit your friends with golf balls!
A prototype under active development.
## Development ## Development
see [[DEVELOPMENT.md]] see [[DEVELOPMENT.md]]

View File

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2016-2023 The Godot Engine community
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.

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +0,0 @@
[configuration]
entry_symbol = "git_plugin_init"
compatibility_minimum = "4.1.0"
[libraries]
macos.editor = "macos/libgit_plugin.macos.editor.universal.dylib"
windows.editor.x86_64 = "win64/libgit_plugin.windows.editor.x86_64.dll"
linux.editor.x86_64 = "linux/libgit_plugin.linux.editor.x86_64.so"
linux.editor.arm64 = "linux/libgit_plugin.linux.editor.arm64.so"
linux.editor.rv64 = ""

View File

@ -1,7 +0,0 @@
[plugin]
name="Godot Git Plugin"
description="This plugin lets you interact with Git without leaving the Godot editor. More information can be found at https://github.com/godotengine/godot-git-plugin/wiki"
author="twaritwaikar"
version="v3.1.1"
script="godot-git-plugin.gd"

View File

@ -11,14 +11,6 @@ Asset credits
*** License: CC BY 4.0 *** License: CC BY 4.0
** Kenney.nl particle pack
*** Retrieved from https://www.kenney.nl/assets/particle-pack
*** Author: kenney.nl
*** License: CC0
* Fonts * Fonts
** PromptFont ** PromptFont
@ -65,16 +57,6 @@ Asset credits
*** Retrieved from https://github.com/AlphaZTX/Two-Weekends-Sans *** Retrieved from https://github.com/AlphaZTX/Two-Weekends-Sans
*** Author: AlphaZTX
*** License: OFL 1.1
** CLASSIC Better VCR
*** Retrieved from https://fontstruct.com/fontstructions/show/2505236/classic-better-vcr
*** Author: Artdzyk
*** License: OFL 1.1 *** License: OFL 1.1
* Sound * Sound
@ -174,11 +156,3 @@ Asset credits
*** Author: LiamG_SFX *** Author: LiamG_SFX
*** License: CC BY 4.0 *** License: CC BY 4.0
** objectDunk1.MP3
*** Retrieved from https://freesound.org/people/rabban625/sounds/436473/
*** Author: rabban625
*** License: CC0

Binary file not shown.

BIN
asset_dev/levels/mall.blend (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
asset_dev/particles/bubble.png (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

View File

@ -1,34 +0,0 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dwy8k2w7vt64x"
path="res://.godot/imported/classic-better-vcr.otf-78a95e88b4c7ad31748ba0a4ef1b3b0b.fontdata"
[deps]
source_file="res://assets/fonts/classic-better-vcr/classic-better-vcr.otf"
dest_files=["res://.godot/imported/classic-better-vcr.otf-78a95e88b4c7ad31748ba0a4ef1b3b0b.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
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) 2024, Artdzyk
(https://fontstruct.com/fontstructors/2103201/siroutyugist)
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:
http://scripts.sil.org/OFL
-----------------------------------------------------------
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,22 +0,0 @@
The font file in this archive was created using Fontstruct the free, online
font-building tool.
This font was created by Artdzyk *.
This font has a homepage where this archive and other versions may be found:
https://fontstruct.com/fontstructions/show/2505236
*NOTE: “CLASSIC Better VCR” was originally cloned (copied) from the
FontStruction “12x16 iskra”
(https://fontstruct.com/fontstructions/show/2274822) by Artdzyk , which is
licensed under a Open Font License license
(https://fontstruct.com/fontstructions/license/2274822).
Try Fontstruct at https://fontstruct.com
Its easy and its fun.
Fontstruct is copyright ©2024 Rob Meek
LEGAL NOTICE:
In using this font you must comply with the licensing terms described in the
file “license.txt” included with this archive.
If you redistribute the font file in this archive, it must be accompanied by all
the other files from this archive, including this one.

BIN
assets/sound/sfx/ball/splash1.wav (Stored with Git LFS)

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dutumw1vj854w"
path="res://.godot/imported/splash1.wav-c515553fa6b3d442d978831ce07dccfa.sample"
[deps]
source_file="res://assets/sound/sfx/ball/splash1.wav"
dest_files=["res://.godot/imported/splash1.wav-c515553fa6b3d442d978831ce07dccfa.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/sprites/particles/bubble.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bjnil2wvvf35q"
path.s3tc="res://.godot/imported/bubble.png-c5759ab17447a1372d60f0e86df9d865.s3tc.ctex"
path.etc2="res://.godot/imported/bubble.png-c5759ab17447a1372d60f0e86df9d865.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/sprites/particles/bubble.png"
dest_files=["res://.godot/imported/bubble.png-c5759ab17447a1372d60f0e86df9d865.s3tc.ctex", "res://.godot/imported/bubble.png-c5759ab17447a1372d60f0e86df9d865.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
assets/sprites/particles/light_03.png (Stored with Git LFS)

Binary file not shown.

View File

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

BIN
assets/sprites/particles/smudge.png (Stored with Git LFS)

Binary file not shown.

View File

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

View File

@ -124,7 +124,6 @@ ACTION_club_previous,"Select previous club"
ACTION_pause,Pause ACTION_pause,Pause
ACTION_ball_next,"Select next ball" ACTION_ball_next,"Select next ball"
ACTION_ball_previous,"Select previous ball" ACTION_ball_previous,"Select previous ball"
ACTION_fast_forward,Fast-forward
, ,
ACTION_FREE_CAMERA,"Free Camera" ACTION_FREE_CAMERA,"Free Camera"
ACTION_AIM,Aim ACTION_AIM,Aim

1 keys en
124 ACTION_pause Pause
125 ACTION_ball_next Select next ball
126 ACTION_ball_previous Select previous ball
ACTION_fast_forward Fast-forward
127
128 ACTION_FREE_CAMERA Free Camera
129 ACTION_AIM Aim

View File

@ -3,27 +3,25 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://tancoet1lih5" uid="uid://tancoet1lih5"
path.s3tc="res://.godot/imported/basic_icon.png-bc904292cc126e1d3e1fd0eb1ba5acc2.s3tc.ctex" path="res://.godot/imported/basic_icon.png-bc904292cc126e1d3e1fd0eb1ba5acc2.ctex"
path.etc2="res://.godot/imported/basic_icon.png-bc904292cc126e1d3e1fd0eb1ba5acc2.etc2.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": false
"vram_texture": true
} }
[deps] [deps]
source_file="res://assets/ui/ball_icons/basic_icon.png" source_file="res://assets/ui/ball_icons/basic_icon.png"
dest_files=["res://.godot/imported/basic_icon.png-bc904292cc126e1d3e1fd0eb1ba5acc2.s3tc.ctex", "res://.godot/imported/basic_icon.png-bc904292cc126e1d3e1fd0eb1ba5acc2.etc2.ctex"] dest_files=["res://.godot/imported/basic_icon.png-bc904292cc126e1d3e1fd0eb1ba5acc2.ctex"]
[params] [params]
compress/mode=2 compress/mode=0
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1
compress/normal_map=0 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=true mipmaps/generate=false
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -33,4 +31,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false process/hdr_as_srgb=false
process/hdr_clamp_exposure=false process/hdr_clamp_exposure=false
process/size_limit=0 process/size_limit=0
detect_3d/compress_to=0 detect_3d/compress_to=1

View File

@ -1,80 +0,0 @@
#! /usr/bin/env bash
## Build & package all project targets for a debug release
PROJECT_NAME="gfolf"
HELPMSG=$(cat <<EOF
debug_build.sh - helper script for automatically packaging project debug builds.
Usage:
./debug_build.sh [options]
Options:
-f, --force Overwrite an existing build for this tag, if there is one.
-h, --help Display this help.
EOF
)
## Parse options
OPTS=`getopt -o hf -- "$@"`
if [ $? -ne 0 ]; then echo "(error) Failed parsing options." >&2; exit 1; fi
eval set -- "$OPTS"
while true; do
case "$1" in
-h | --help ) echo "$HELPMSG"; exit 0;;
-f | --force ) FORCE=1; shift;;
-- ) shift; break;;
* ) break;;
esac
done
VERSION_TAG=`git describe`
BUILD_DIR="data_package/$VERSION_TAG"
if [ -d $BUILD_DIR ] && [ ! $FORCE ]; then
echo "(error) Build directory `$BUILD_DIR` exists! Aborting..."
echo "(HINT: use -f to force overwrite!)"
exit 1
fi
echo "Packaging to: $BUILD_DIR"
## Shared build logic
function build_project {
TARGET="$1"
TARGET_EXT="$3"
TARGET_SUBDIR="$PROJECT_NAME""_$TARGET"
TARGET_DIR="$BUILD_DIR/$TARGET_SUBDIR"
TARGET_OUT="$TARGET_DIR/$PROJECT_NAME.$TARGET_EXT"
echo "Building target '$TARGET' to: $TARGET_OUT"
set -x
rm -rf "$TARGET_DIR"
mkdir -p $TARGET_DIR
godot --headless --export-debug "$TARGET" $TARGET_OUT
set +x
ZIP_OUT="$PROJECT_NAME""_$VERSION_TAG""_$TARGET.7z"
echo "Packaging to: $ZIP_OUT"
# TODO
set -x
(cd $BUILD_DIR && 7z a $ZIP_OUT $TARGET_SUBDIR)
set +x
}
# Build linux
build_project "linux64" "x86_64"
# Build OSX
build_project "osx" "app"
# Build Michaelsoft Binbows
build_project "win64" "exe"

View File

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

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=66 format=3 uid="uid://bm2o3mex10v11"] [gd_scene load_steps=64 format=3 uid="uid://bm2o3mex10v11"]
[ext_resource type="Terrain3DAssets" uid="uid://cwl34gstabgrx" path="res://levels/debug_level/terrain_assets.res" id="1_5smdk"] [ext_resource type="Terrain3DAssets" uid="uid://cwl34gstabgrx" path="res://levels/debug_level/terrain_assets.res" id="1_5smdk"]
[ext_resource type="Material" uid="uid://drxnue0xsen13" path="res://assets/materials/tropical_water.tres" id="4_bwkbv"] [ext_resource type="Material" uid="uid://drxnue0xsen13" path="res://assets/materials/tropical_water.tres" id="4_bwkbv"]
@ -20,12 +20,10 @@
[ext_resource type="Texture2D" uid="uid://du3vk5nnksohs" path="res://assets/sprites/particles/sparkle.png" id="16_2m5yu"] [ext_resource type="Texture2D" uid="uid://du3vk5nnksohs" path="res://assets/sprites/particles/sparkle.png" id="16_2m5yu"]
[ext_resource type="Shader" path="res://src/shaders/frosted_glass.gdshader" id="16_rat2n"] [ext_resource type="Shader" path="res://src/shaders/frosted_glass.gdshader" id="16_rat2n"]
[ext_resource type="PackedScene" uid="uid://nqar1qcun8ax" path="res://src/props/scenery/highway/guard_rail/guard_rail.tscn" id="16_xtxyj"] [ext_resource type="PackedScene" uid="uid://nqar1qcun8ax" path="res://src/props/scenery/highway/guard_rail/guard_rail.tscn" id="16_xtxyj"]
[ext_resource type="PackedScene" uid="uid://c6k44l0mnq3o1" path="res://src/world/effects/explosion/explosion_effect.tscn" id="16_xufks"]
[ext_resource type="PackedScene" uid="uid://d0tcr6uijpym5" path="res://src/props/scenery/highway/highway_road.tscn" id="17_amems"] [ext_resource type="PackedScene" uid="uid://d0tcr6uijpym5" path="res://src/props/scenery/highway/highway_road.tscn" id="17_amems"]
[ext_resource type="Texture2D" uid="uid://bq8dxuxfw1rwu" path="res://assets/textures/wood/lacquered_planks.png" id="17_xciuf"] [ext_resource type="Texture2D" uid="uid://bq8dxuxfw1rwu" path="res://assets/textures/wood/lacquered_planks.png" id="17_xciuf"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_green/grass_green_albedo.dds" id="18_scall"] [ext_resource type="Texture2D" path="res://assets/textures/grass_green/grass_green_albedo.dds" id="18_scall"]
[ext_resource type="PackedScene" uid="uid://cblsayfgirexr" path="res://src/characters/umineko/umineko.tscn" id="21_ch6qk"] [ext_resource type="PackedScene" uid="uid://cblsayfgirexr" path="res://src/characters/umineko/umineko.tscn" id="21_ch6qk"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="23_7p8cl"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_rpgb7"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_rpgb7"]
noise_type = 0 noise_type = 0
@ -69,12 +67,12 @@ auto_shader = true
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_h8tes"] [sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_h8tes"]
panorama = ExtResource("6_ectru") panorama = ExtResource("6_ectru")
[sub_resource type="Sky" id="Sky_x5sbg"] [sub_resource type="Sky" id="Sky_3yoab"]
sky_material = SubResource("PanoramaSkyMaterial_h8tes") sky_material = SubResource("PanoramaSkyMaterial_h8tes")
[sub_resource type="Environment" id="Environment_k6wwx"] [sub_resource type="Environment" id="Environment_k6wwx"]
background_mode = 2 background_mode = 2
sky = SubResource("Sky_x5sbg") sky = SubResource("Sky_3yoab")
ambient_light_source = 2 ambient_light_source = 2
ambient_light_color = Color(0.78, 0.78, 0.78, 1) ambient_light_color = Color(0.78, 0.78, 0.78, 1)
ssao_enabled = true ssao_enabled = true
@ -307,6 +305,7 @@ directional_shadow_pancake_size = 5.0
gravity_point_center = Vector3(0, 1, 0) gravity_point_center = Vector3(0, 1, 0)
gravity_direction = Vector3(0, 1, 0) gravity_direction = Vector3(0, 1, 0)
script = ExtResource("9_jwlau") script = ExtResource("9_jwlau")
terrain_angular_damping = 2.0
[node name="CollisionPolygon3D" type="CollisionPolygon3D" parent="Course/Fairway"] [node name="CollisionPolygon3D" type="CollisionPolygon3D" parent="Course/Fairway"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 209.788, 6.20358, 256.527) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 209.788, 6.20358, 256.527)
@ -440,9 +439,6 @@ amount = -1
spawn_on_ready = true spawn_on_ready = true
spawn_turns = 1 spawn_turns = 1
[node name="ExplosionEffect" parent="Course" instance=ExtResource("16_xufks")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 274.103, 5.01502, 286.299)
[node name="CityBuildings" type="Node3D" parent="."] [node name="CityBuildings" 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)
@ -577,10 +573,6 @@ mesh = SubResource("BoxMesh_jpetf")
[node name="StaticBody3D" type="StaticBody3D" parent="GravityCube/MeshInstance3D"] [node name="StaticBody3D" type="StaticBody3D" parent="GravityCube/MeshInstance3D"]
[node name="TerrainMarker" type="Node" parent="GravityCube/MeshInstance3D/StaticBody3D"]
script = ExtResource("23_7p8cl")
type = 9
[node name="CollisionShape3D" type="CollisionShape3D" parent="GravityCube/MeshInstance3D/StaticBody3D"] [node name="CollisionShape3D" type="CollisionShape3D" parent="GravityCube/MeshInstance3D/StaticBody3D"]
shape = SubResource("BoxShape3D_74f5g") shape = SubResource("BoxShape3D_74f5g")
@ -647,10 +639,6 @@ mesh = SubResource("SphereMesh_ooxtq")
[node name="StaticBody3D" type="StaticBody3D" parent="GravityOrb/MeshInstance3D"] [node name="StaticBody3D" type="StaticBody3D" parent="GravityOrb/MeshInstance3D"]
[node name="TerrainMarker" type="Node" parent="GravityOrb/MeshInstance3D/StaticBody3D"]
script = ExtResource("23_7p8cl")
type = 5
[node name="CollisionShape3D" type="CollisionShape3D" parent="GravityOrb/MeshInstance3D/StaticBody3D"] [node name="CollisionShape3D" type="CollisionShape3D" parent="GravityOrb/MeshInstance3D/StaticBody3D"]
shape = SubResource("SphereShape3D_ne5nm") shape = SubResource("SphereShape3D_ne5nm")
@ -670,10 +658,6 @@ transform = Transform3D(2.33934e-08, 0.535178, -0.844739, 1, -4.37114e-08, 0, -3
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="GravityBowl"] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="GravityBowl"]
use_collision = true use_collision = true
[node name="TerrainMarker" type="Node" parent="GravityBowl/CSGCombiner3D"]
script = ExtResource("23_7p8cl")
type = 7
[node name="OuterCylinder" type="CSGCylinder3D" parent="GravityBowl/CSGCombiner3D"] [node name="OuterCylinder" type="CSGCylinder3D" parent="GravityBowl/CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0)
radius = 32.0 radius = 32.0
@ -705,10 +689,6 @@ transform = Transform3D(0.688355, -0.285755, 0.666717, 0, 0.919135, 0.393942, -0
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="GravityHalo"] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="GravityHalo"]
use_collision = true use_collision = true
[node name="TerrainMarker" type="Node" parent="GravityHalo/CSGCombiner3D"]
script = ExtResource("23_7p8cl")
type = 7
[node name="OuterShell" type="CSGTorus3D" parent="GravityHalo/CSGCombiner3D"] [node name="OuterShell" type="CSGTorus3D" parent="GravityHalo/CSGCombiner3D"]
inner_radius = 32.0 inner_radius = 32.0
outer_radius = 108.0 outer_radius = 108.0

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

Binary file not shown.

Binary file not shown.

View File

@ -1,728 +0,0 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.2.60",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0,
1,
2,
3
]
}
],
"nodes":[
{
"mesh":0,
"name":"Geometry"
},
{
"name":"Origin",
"rotation":[
0,
1,
0,
0
]
},
{
"mesh":1,
"name":"Fountain",
"translation":[
0,
1,
0
]
},
{
"mesh":2,
"name":"FountainWater",
"translation":[
0,
0.5,
0
]
}
],
"materials":[
{
"doubleSided":true,
"name":"MallFloor",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.37290316820144653,
0.8002911806106567,
0.1968839168548584,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"MallStorefrontWall",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.7833530902862549,
0.743090033531189,
0.3785495460033417,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"MallOtherWall",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.5049755573272705,
0.4796982407569885,
0.4796982407569885,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"MallCeiling",
"pbrMetallicRoughness":{
"baseColorFactor":[
1,
0.2704524099826813,
0.2704524099826813,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"MallDome",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.015895012766122818,
0.800614058971405,
0.7241971492767334,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"MallCatwalk",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.7324724793434143,
0.17093542218208313,
0.8004578351974487,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Fountain",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.800000011920929,
0.800000011920929,
0.800000011920929,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Water",
"pbrMetallicRoughness":{
"baseColorFactor":[
0,
0.00015084154438227415,
0.8002434968948364,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
}
],
"meshes":[
{
"name":"Geometry.Mesh",
"primitives":[
{
"attributes":{
"POSITION":0,
"NORMAL":1,
"TEXCOORD_0":2
},
"indices":3,
"material":0
},
{
"attributes":{
"POSITION":4,
"NORMAL":5,
"TEXCOORD_0":6
},
"indices":7,
"material":1
},
{
"attributes":{
"POSITION":8,
"NORMAL":9,
"TEXCOORD_0":10
},
"indices":11,
"material":2
},
{
"attributes":{
"POSITION":12,
"NORMAL":13,
"TEXCOORD_0":14
},
"indices":15,
"material":3
},
{
"attributes":{
"POSITION":16,
"NORMAL":17,
"TEXCOORD_0":18
},
"indices":19,
"material":4
},
{
"attributes":{
"POSITION":20,
"NORMAL":21,
"TEXCOORD_0":22
},
"indices":23,
"material":5
}
]
},
{
"name":"Fountain.Mesh",
"primitives":[
{
"attributes":{
"POSITION":24,
"NORMAL":25,
"TEXCOORD_0":26
},
"indices":27,
"material":6
}
]
},
{
"name":"FountainWater.Mesh",
"primitives":[
{
"attributes":{
"POSITION":28,
"NORMAL":29,
"TEXCOORD_0":30
},
"indices":31,
"material":7
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":92,
"max":[
65,
22,
130
],
"min":[
-65,
0,
-130
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":92,
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":92,
"type":"VEC2"
},
{
"bufferView":3,
"componentType":5123,
"count":204,
"type":"SCALAR"
},
{
"bufferView":4,
"componentType":5126,
"count":238,
"max":[
65,
32.025001525878906,
123.66582489013672
],
"min":[
-65,
0,
-123.66582489013672
],
"type":"VEC3"
},
{
"bufferView":5,
"componentType":5126,
"count":238,
"type":"VEC3"
},
{
"bufferView":6,
"componentType":5126,
"count":238,
"type":"VEC2"
},
{
"bufferView":7,
"componentType":5123,
"count":396,
"type":"SCALAR"
},
{
"bufferView":8,
"componentType":5126,
"count":126,
"max":[
65,
42,
130
],
"min":[
-65,
0,
-130
],
"type":"VEC3"
},
{
"bufferView":9,
"componentType":5126,
"count":126,
"type":"VEC3"
},
{
"bufferView":10,
"componentType":5126,
"count":126,
"type":"VEC2"
},
{
"bufferView":11,
"componentType":5123,
"count":234,
"type":"SCALAR"
},
{
"bufferView":12,
"componentType":5126,
"count":108,
"max":[
65,
42,
130
],
"min":[
-65,
9.75,
-130
],
"type":"VEC3"
},
{
"bufferView":13,
"componentType":5126,
"count":108,
"type":"VEC3"
},
{
"bufferView":14,
"componentType":5126,
"count":108,
"type":"VEC2"
},
{
"bufferView":15,
"componentType":5123,
"count":228,
"type":"SCALAR"
},
{
"bufferView":16,
"componentType":5126,
"count":142,
"max":[
38,
80,
37.999996185302734
],
"min":[
-38,
42,
-37.999996185302734
],
"type":"VEC3"
},
{
"bufferView":17,
"componentType":5126,
"count":142,
"type":"VEC3"
},
{
"bufferView":18,
"componentType":5126,
"count":142,
"type":"VEC2"
},
{
"bufferView":19,
"componentType":5123,
"count":144,
"type":"SCALAR"
},
{
"bufferView":20,
"componentType":5126,
"count":120,
"max":[
40,
22,
40.5
],
"min":[
-40,
21,
-40.5
],
"type":"VEC3"
},
{
"bufferView":21,
"componentType":5126,
"count":120,
"type":"VEC3"
},
{
"bufferView":22,
"componentType":5126,
"count":120,
"type":"VEC2"
},
{
"bufferView":23,
"componentType":5123,
"count":270,
"type":"SCALAR"
},
{
"bufferView":24,
"componentType":5126,
"count":1344,
"max":[
20.556293487548828,
2.5298473834991455,
20.556293487548828
],
"min":[
-20.556293487548828,
-1,
-20.556293487548828
],
"type":"VEC3"
},
{
"bufferView":25,
"componentType":5126,
"count":1344,
"type":"VEC3"
},
{
"bufferView":26,
"componentType":5126,
"count":1344,
"type":"VEC2"
},
{
"bufferView":27,
"componentType":5123,
"count":2100,
"type":"SCALAR"
},
{
"bufferView":28,
"componentType":5126,
"count":192,
"max":[
19.063644409179688,
1.5,
19.22129249572754
],
"min":[
-19,
-5.5,
-19
],
"type":"VEC3"
},
{
"bufferView":29,
"componentType":5126,
"count":192,
"type":"VEC3"
},
{
"bufferView":30,
"componentType":5126,
"count":192,
"type":"VEC2"
},
{
"bufferView":31,
"componentType":5123,
"count":360,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":1104,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":1104,
"byteOffset":1104,
"target":34962
},
{
"buffer":0,
"byteLength":736,
"byteOffset":2208,
"target":34962
},
{
"buffer":0,
"byteLength":408,
"byteOffset":2944,
"target":34963
},
{
"buffer":0,
"byteLength":2856,
"byteOffset":3352,
"target":34962
},
{
"buffer":0,
"byteLength":2856,
"byteOffset":6208,
"target":34962
},
{
"buffer":0,
"byteLength":1904,
"byteOffset":9064,
"target":34962
},
{
"buffer":0,
"byteLength":792,
"byteOffset":10968,
"target":34963
},
{
"buffer":0,
"byteLength":1512,
"byteOffset":11760,
"target":34962
},
{
"buffer":0,
"byteLength":1512,
"byteOffset":13272,
"target":34962
},
{
"buffer":0,
"byteLength":1008,
"byteOffset":14784,
"target":34962
},
{
"buffer":0,
"byteLength":468,
"byteOffset":15792,
"target":34963
},
{
"buffer":0,
"byteLength":1296,
"byteOffset":16260,
"target":34962
},
{
"buffer":0,
"byteLength":1296,
"byteOffset":17556,
"target":34962
},
{
"buffer":0,
"byteLength":864,
"byteOffset":18852,
"target":34962
},
{
"buffer":0,
"byteLength":456,
"byteOffset":19716,
"target":34963
},
{
"buffer":0,
"byteLength":1704,
"byteOffset":20172,
"target":34962
},
{
"buffer":0,
"byteLength":1704,
"byteOffset":21876,
"target":34962
},
{
"buffer":0,
"byteLength":1136,
"byteOffset":23580,
"target":34962
},
{
"buffer":0,
"byteLength":288,
"byteOffset":24716,
"target":34963
},
{
"buffer":0,
"byteLength":1440,
"byteOffset":25004,
"target":34962
},
{
"buffer":0,
"byteLength":1440,
"byteOffset":26444,
"target":34962
},
{
"buffer":0,
"byteLength":960,
"byteOffset":27884,
"target":34962
},
{
"buffer":0,
"byteLength":540,
"byteOffset":28844,
"target":34963
},
{
"buffer":0,
"byteLength":16128,
"byteOffset":29384,
"target":34962
},
{
"buffer":0,
"byteLength":16128,
"byteOffset":45512,
"target":34962
},
{
"buffer":0,
"byteLength":10752,
"byteOffset":61640,
"target":34962
},
{
"buffer":0,
"byteLength":4200,
"byteOffset":72392,
"target":34963
},
{
"buffer":0,
"byteLength":2304,
"byteOffset":76592,
"target":34962
},
{
"buffer":0,
"byteLength":2304,
"byteOffset":78896,
"target":34962
},
{
"buffer":0,
"byteLength":1536,
"byteOffset":81200,
"target":34962
},
{
"buffer":0,
"byteLength":720,
"byteOffset":82736,
"target":34963
}
],
"buffers":[
{
"byteLength":83456,
"uri":"mall.bin"
}
]
}

View File

@ -1,36 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://1x7alivn27ef"
path="res://.godot/imported/mall.gltf-de9e241c02ee8b7f4ac1317b5b5fa9bb.scn"
[deps]
source_file="res://levels/mall/geometry/mall.gltf"
dest_files=["res://.godot/imported/mall.gltf-de9e241c02ee8b7f4ac1317b5b5fa9bb.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@ -1,9 +0,0 @@
[gd_resource type="Resource" script_class="Level" load_steps=3 format=3 uid="uid://3odongr8qm8e"]
[ext_resource type="PackedScene" uid="uid://ciqd8r8yt00y0" path="res://levels/mall/mall.tscn" id="1_2cp8o"]
[ext_resource type="Script" path="res://src/world/level/level.gd" id="2_wmp72"]
[resource]
script = ExtResource("2_wmp72")
scene = ExtResource("1_2cp8o")
level_name = "Mall"

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cwxh04w02o83o"]
[ext_resource type="Texture2D" uid="uid://cqlp0tjmadi75" path="res://assets/textures/highway/highway_road.png" id="1_5ncmm"]
[resource]
albedo_texture = ExtResource("1_5ncmm")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://ccmj2vt17lvs2"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_fairway/grass_fairway_albedo.dds" id="1_isnyn"]
[resource]
albedo_texture = ExtResource("1_isnyn")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cjvumpmthiac4"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_green/grass_green_albedo.dds" id="1_ad8tx"]
[resource]
albedo_texture = ExtResource("1_ad8tx")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://buagg4yv8c7lj"]
[ext_resource type="Texture2D" uid="uid://b8vgf8wy7h4nx" path="res://assets/textures/guard_rail/guard_rail.png" id="1_arb6a"]
[resource]
albedo_texture = ExtResource("1_arb6a")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dei1jkva281ei"]
[ext_resource type="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_albedo.dds" id="1_x1eim"]
[resource]
albedo_texture = ExtResource("1_x1eim")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://c8uym7rba01o5"]
[ext_resource type="Texture2D" path="res://assets/textures/grass_rough/grass_rough_albedo.dds" id="1_kiq74"]
[resource]
albedo_texture = ExtResource("1_kiq74")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://d3doxcg7g0sq"]
[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_albedo.dds" id="1_bubcj"]
[resource]
albedo_texture = ExtResource("1_bubcj")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

View File

@ -1,9 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bgnbvc5qdnoxm"]
[ext_resource type="Texture2D" uid="uid://bq8dxuxfw1rwu" path="res://assets/textures/wood/lacquered_planks.png" id="1_codln"]
[resource]
albedo_texture = ExtResource("1_codln")
uv1_scale = Vector3(0.05, 0.05, 0.05)
uv1_triplanar = true
texture_filter = 4

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,46 +0,0 @@
extends Node3D
const RAMP_SPAWN_GROUP := "RampSpawn"
const DROP_SPAWN_GROUP := "DropSpawn"
const PUTT_SPAWN_GROUP := "PuttSpawn"
const PUTT_VEC := Vector3(0, 0, 2)
@export var ball_scene: PackedScene
func spawn_balls(spawn_group: String, initial_impulse: Vector3 = Vector3.ZERO) -> void:
for spawn: Node3D in get_tree().get_nodes_in_group(spawn_group):
var ball: GameBall = ball_scene.instantiate()
var callback := func() -> void:
if ball.sleeping:
ball.queue_free()
ball.sleeping_state_changed.connect(callback)
spawn.add_sibling(ball)
ball.global_transform = spawn.global_transform
ball.freeze = false
if initial_impulse:
ball.apply_impulse(
initial_impulse,
(
initial_impulse.normalized()
* -1
* ball.radius
* ball.radius
* ShotSetup.SHOT_OFFSET_Z_FACTOR
)
)
func _process(_delta: float) -> void:
if Input.is_action_just_pressed("debug_1"):
spawn_balls(RAMP_SPAWN_GROUP)
if Input.is_action_just_pressed("debug_2"):
spawn_balls(DROP_SPAWN_GROUP)
if Input.is_action_just_pressed("debug_3"):
spawn_balls(PUTT_SPAWN_GROUP, PUTT_VEC)
if Input.is_action_just_pressed("ui_page_up"):
Engine.time_scale *= 2.0
if Input.is_action_just_pressed("ui_page_down"):
Engine.time_scale *= 0.5

View File

@ -1,9 +0,0 @@
[gd_resource type="Resource" script_class="Level" load_steps=3 format=3 uid="uid://dexm07r8wvu83"]
[ext_resource type="PackedScene" uid="uid://cvs546kk7t7aw" path="res://levels/terrain_test/terrain_test.tscn" id="1_iggnc"]
[ext_resource type="Script" path="res://src/world/level/level.gd" id="2_uc833"]
[resource]
script = ExtResource("2_uc833")
scene = ExtResource("1_iggnc")
level_name = "Terrain Debug"

View File

@ -1,784 +0,0 @@
[gd_scene load_steps=34 format=3 uid="uid://cvs546kk7t7aw"]
[ext_resource type="Texture2D" uid="uid://c47ern0l2d50r" path="res://assets/vista_2.png" id="1_d1wmn"]
[ext_resource type="Script" path="res://levels/terrain_test/terrain_test.gd" id="1_drk48"]
[ext_resource type="Terrain3DAssets" uid="uid://cwl34gstabgrx" path="res://levels/debug_level/terrain_assets.res" id="2_25igk"]
[ext_resource type="PackedScene" uid="uid://b7pgvftmj7nbe" path="res://src/equipment/balls/debug_ball/debug_ball.tscn" id="2_77pf6"]
[ext_resource type="Material" uid="uid://c8uym7rba01o5" path="res://levels/terrain_test/materials/rough.tres" id="5_5e0na"]
[ext_resource type="FontFile" uid="uid://cbaqlaqdobnux" path="res://assets/fonts/Orbitron/Orbitron-VariableFont_wght.ttf" id="5_h18yf"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="6_4bo0x"]
[ext_resource type="Material" uid="uid://ccmj2vt17lvs2" path="res://levels/terrain_test/materials/fairway.tres" id="8_eb66j"]
[ext_resource type="Material" uid="uid://cjvumpmthiac4" path="res://levels/terrain_test/materials/green.tres" id="9_b32yd"]
[ext_resource type="Material" uid="uid://d3doxcg7g0sq" path="res://levels/terrain_test/materials/sand.tres" id="10_5p842"]
[ext_resource type="Material" uid="uid://cwxh04w02o83o" path="res://levels/terrain_test/materials/concrete.tres" id="11_n8v11"]
[ext_resource type="Material" uid="uid://dei1jkva281ei" path="res://levels/terrain_test/materials/rock.tres" id="12_521n4"]
[ext_resource type="Material" uid="uid://bgnbvc5qdnoxm" path="res://levels/terrain_test/materials/wood.tres" id="13_h001q"]
[ext_resource type="Material" uid="uid://buagg4yv8c7lj" path="res://levels/terrain_test/materials/metal.tres" id="14_7mq02"]
[ext_resource type="Material" uid="uid://c5hidbq5gbmr" path="res://assets/materials/crystal.tres" id="14_o81al"]
[ext_resource type="PackedScene" uid="uid://1s3gywmoi20e" path="res://src/characters/player_characters/gfolf_girl/gfolf_girl.tscn" id="16_r3ld5"]
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_kd0nc"]
panorama = ExtResource("1_d1wmn")
[sub_resource type="Sky" id="Sky_3yoab"]
sky_material = SubResource("PanoramaSkyMaterial_kd0nc")
[sub_resource type="Environment" id="Environment_qax3v"]
background_mode = 2
sky = SubResource("Sky_3yoab")
ambient_light_source = 2
ambient_light_color = Color(0.78, 0.78, 0.78, 1)
ssao_enabled = true
ssao_intensity = 1.7
glow_enabled = true
glow_bloom = 0.05
volumetric_fog_enabled = true
volumetric_fog_density = 0.001
volumetric_fog_emission = Color(0.6, 1, 1, 1)
volumetric_fog_length = 1024.0
volumetric_fog_sky_affect = 0.0
[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_ph8qj"]
dof_blur_far_distance = 200.0
dof_blur_far_transition = 800.0
dof_blur_near_enabled = true
dof_blur_near_distance = 1.0
dof_blur_near_transition = 0.5
[sub_resource type="FastNoiseLite" id="FastNoiseLite_rpgb7"]
noise_type = 0
frequency = 1.0
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_sb318"]
width = 256
height = 256
seamless = true
noise = SubResource("FastNoiseLite_rpgb7")
[sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_4xim8"]
_shader_parameters = {
"auto_base_texture": 4,
"auto_height_reduction": 0.1,
"auto_overlay_texture": 0,
"auto_slope": 0.41,
"blend_sharpness": 1.0,
"height_blending": true,
"macro_variation1": Color(0.964742, 0.964742, 0.964742, 1),
"macro_variation2": Color(1, 1, 1, 1),
"noise1_angle": 0.0,
"noise1_offset": Vector2(0.5, 0.5),
"noise1_scale": 0.062,
"noise2_scale": 0.076,
"noise3_scale": 0.021,
"noise_texture": SubResource("NoiseTexture2D_sb318"),
"vertex_normals_distance": 128.0,
"world_noise_height": 74.0,
"world_noise_lod_distance": 7500.0,
"world_noise_max_octaves": 8,
"world_noise_min_octaves": 2,
"world_noise_offset": Vector3(0, -8, 0),
"world_noise_region_blend": 0.55,
"world_noise_scale": 5.0
}
world_background = 2
texture_filtering = 1
auto_shader = true
[sub_resource type="BoxMesh" id="BoxMesh_7awoq"]
size = Vector3(10, 1, 60)
[sub_resource type="PrismMesh" id="PrismMesh_kdeya"]
left_to_right = 1.0
size = Vector3(100, 50, 10)
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_ufirn"]
data = PackedVector3Array(-5, 0.5, 30, 5, 0.5, 30, -5, -0.5, 30, 5, 0.5, 30, 5, -0.5, 30, -5, -0.5, 30, 5, 0.5, -30, -5, 0.5, -30, 5, -0.5, -30, -5, 0.5, -30, -5, -0.5, -30, 5, -0.5, -30, 5, 0.5, 30, 5, 0.5, -30, 5, -0.5, 30, 5, 0.5, -30, 5, -0.5, -30, 5, -0.5, 30, -5, 0.5, -30, -5, 0.5, 30, -5, -0.5, -30, -5, 0.5, 30, -5, -0.5, 30, -5, -0.5, -30, 5, 0.5, 30, -5, 0.5, 30, 5, 0.5, -30, -5, 0.5, 30, -5, 0.5, -30, 5, 0.5, -30, -5, -0.5, 30, 5, -0.5, 30, -5, -0.5, -30, 5, -0.5, 30, 5, -0.5, -30, -5, -0.5, -30)
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_gq475"]
data = PackedVector3Array(50, 25, 5, 50, -25, 5, -50, -25, 5, 50, 25, -5, -50, -25, -5, 50, -25, -5, 50, 25, 5, 50, 25, -5, 50, -25, 5, 50, 25, -5, 50, -25, -5, 50, -25, 5, 50, 25, -5, 50, 25, 5, -50, -25, -5, 50, 25, 5, -50, -25, 5, -50, -25, -5, -50, -25, 5, 50, -25, 5, -50, -25, -5, 50, -25, 5, 50, -25, -5, -50, -25, -5)
[sub_resource type="BoxMesh" id="BoxMesh_oukkf"]
size = Vector3(10, 1, 60)
[sub_resource type="PrismMesh" id="PrismMesh_c7rfr"]
left_to_right = 1.0
size = Vector3(100, 50, 10)
[sub_resource type="BoxMesh" id="BoxMesh_3gfbh"]
size = Vector3(20, 1, 400)
[sub_resource type="BoxShape3D" id="BoxShape3D_1sq7i"]
size = Vector3(20, 1, 400)
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_ugtgi"]
[sub_resource type="BoxMesh" id="BoxMesh_u7piw"]
size = Vector3(20, 1, 400)
[node name="TerrainTestMap" type="Node3D"]
script = ExtResource("1_drk48")
ball_scene = ExtResource("2_77pf6")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_qax3v")
camera_attributes = SubResource("CameraAttributesPractical_ph8qj")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.782608, -0.611691, 0.11558, 0, 0.185667, 0.982613, -0.622515, -0.769001, 0.145304, 0, 0, 0)
shadow_enabled = true
shadow_blur = 4.0
directional_shadow_split_1 = 0.017
directional_shadow_split_2 = 0.042
directional_shadow_split_3 = 0.247
directional_shadow_fade_start = 0.98
directional_shadow_max_distance = 750.0
directional_shadow_pancake_size = 5.0
[node name="Terrain3D" type="Terrain3D" parent="."]
data_directory = "res://levels/terrain_test/terrain_3d_data"
material = SubResource("Terrain3DMaterial_4xim8")
assets = ExtResource("2_25igk")
mesh_size = 64
top_level = true
metadata/_edit_lock_ = true
[node name="PlayerSpawn" type="Marker3D" parent="." groups=["PlayerSpawn"]]
[node name="TestRamps" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -299.216)
[node name="Rough" type="Node3D" parent="TestRamps"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Rough"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Rough/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_7awoq")
surface_material_override/0 = ExtResource("5_5e0na")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Rough/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_kdeya")
surface_material_override/0 = ExtResource("5_5e0na")
[node name="Label3D" type="Label3D" parent="TestRamps/Rough/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Rough"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D" type="StaticBody3D" parent="TestRamps/Rough/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Rough/RampGeometry/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 1
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Rough/RampGeometry/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Rough/RampGeometry/StaticBody3D"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Rough/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Fairway" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.34202, 0, 0.939693, 0, 1, 0, -0.939693, 0, 0.34202, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Fairway"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Fairway/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("8_eb66j")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Fairway/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("8_eb66j")
[node name="Label3D" type="Label3D" parent="TestRamps/Fairway/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Fairway"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Fairway/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Fairway/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Fairway/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Fairway/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Fairway/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Green" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.642788, 0, 0.766044, 0, 1, 0, -0.766044, 0, 0.642788, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Green"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Green/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("9_b32yd")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Green/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("9_b32yd")
[node name="Label3D" type="Label3D" parent="TestRamps/Green/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Green"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Green/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Green/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 3
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Green/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Green/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Green/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Sand" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.866025, 0, 0.5, 0, 1, 0, -0.5, 0, 0.866025, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Sand"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Sand/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("10_5p842")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Sand/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("10_5p842")
[node name="Label3D" type="Label3D" parent="TestRamps/Sand/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Sand"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Sand/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Sand/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Sand/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Sand/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Sand/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Concrete" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.984808, 0, 0.173648, 0, 1, 0, -0.173648, 0, 0.984808, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Concrete"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Concrete/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("11_n8v11")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Concrete/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("11_n8v11")
[node name="Label3D" type="Label3D" parent="TestRamps/Concrete/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Concrete"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Concrete/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Concrete/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 5
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Concrete/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Concrete/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Concrete/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Rock" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.984808, 0, -0.173648, 0, 1, 0, 0.173648, 0, 0.984808, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Rock"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Rock/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("12_521n4")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Rock/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("12_521n4")
[node name="Label3D" type="Label3D" parent="TestRamps/Rock/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Rock"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Rock/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Rock/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 6
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Rock/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Rock/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Rock/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Wood" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.866025, 0, -0.5, 0, 1, 0, 0.5, 0, 0.866025, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Wood"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Wood/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("13_h001q")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Wood/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("13_h001q")
[node name="Label3D" type="Label3D" parent="TestRamps/Wood/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Wood"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Wood/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Wood/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 7
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Wood/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Wood/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Wood/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Metal" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.642788, 0, -0.766044, 0, 1, 0, 0.766044, 0, 0.642788, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Metal"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Metal/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("14_7mq02")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Metal/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("14_7mq02")
[node name="Label3D" type="Label3D" parent="TestRamps/Metal/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Metal"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Metal/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Metal/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 8
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Metal/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Metal/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Metal/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="Glass" type="Node3D" parent="TestRamps"]
transform = Transform3D(0.34202, 0, -0.939692, 0, 1, 0, 0.939692, 0, 0.34202, 0, 0, 0)
[node name="RampGeometry" type="Node3D" parent="TestRamps/Glass"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestRamps/Glass/RampGeometry"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
mesh = SubResource("BoxMesh_oukkf")
surface_material_override/0 = ExtResource("14_o81al")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="TestRamps/Glass/RampGeometry"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 25, 109)
mesh = SubResource("PrismMesh_c7rfr")
surface_material_override/0 = ExtResource("14_o81al")
[node name="Label3D" type="Label3D" parent="TestRamps/Glass/RampGeometry"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 8, 0)
text = "Glass"
font = ExtResource("5_h18yf")
font_size = 300
outline_size = 48
[node name="StaticBody3D2" type="StaticBody3D" parent="TestRamps/Glass/RampGeometry"]
[node name="TerrainMarker" type="Node" parent="TestRamps/Glass/RampGeometry/StaticBody3D2"]
script = ExtResource("6_4bo0x")
type = 9
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestRamps/Glass/RampGeometry/StaticBody3D2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
shape = SubResource("ConcavePolygonShape3D_ufirn")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="TestRamps/Glass/RampGeometry/StaticBody3D2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 0, 25, 109)
shape = SubResource("ConcavePolygonShape3D_gq475")
[node name="BallSpawn" type="Marker3D" parent="TestRamps/Glass/RampGeometry" groups=["RampSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 50, 158)
[node name="TestFields" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -90, 0, 30)
[node name="Rough" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Rough"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_3gfbh")
surface_material_override/0 = ExtResource("5_5e0na")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Rough/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Rough/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Rough/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 1
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Rough" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Rough" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Rough/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="GfolfGirl" parent="TestFields/Rough/PuttSpawn" instance=ExtResource("16_r3ld5")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.5, -0.05, 0)
[node name="Fairway" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Fairway"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("8_eb66j")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Fairway/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Fairway/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Fairway/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 2
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Fairway" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Fairway" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Fairway/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 8)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Green" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 50, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Green"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("9_b32yd")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Green/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Green/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Green/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 3
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Green" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Green" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Green/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 13)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Sand" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 70, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Sand"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("10_5p842")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Sand/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Sand/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Sand/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 4
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Sand" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Sand" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Sand/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Concrete" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 90, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Concrete"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("11_n8v11")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Concrete/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Concrete/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Concrete/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 5
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Concrete" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Concrete" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Concrete/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 21)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Rock" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 110, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Rock"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("12_521n4")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Rock/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Rock/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Rock/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 6
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Rock" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Rock" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Rock/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 8)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Wood" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 130, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Wood"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("13_h001q")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Wood/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Wood/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Wood/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 7
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Wood" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Wood" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Wood/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 21)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Metal" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 150, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Metal"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("14_7mq02")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Metal/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Metal/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Metal/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 8
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Metal" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Metal" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Metal/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 21)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")
[node name="Glass" type="Node3D" parent="TestFields"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 170, 0, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="TestFields/Glass"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
mesh = SubResource("BoxMesh_u7piw")
surface_material_override/0 = ExtResource("14_o81al")
[node name="StaticBody3D" type="StaticBody3D" parent="TestFields/Glass/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="CollisionShape3D" type="CollisionShape3D" parent="TestFields/Glass/MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 200)
shape = SubResource("BoxShape3D_1sq7i")
[node name="TerrainMarker" type="Node" parent="TestFields/Glass/MeshInstance3D/StaticBody3D"]
script = ExtResource("6_4bo0x")
type = 9
[node name="BallDropSpawn" type="Marker3D" parent="TestFields/Glass" groups=["DropSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 40, 10)
[node name="PuttSpawn" type="Marker3D" parent="TestFields/Glass" groups=["PuttSpawn"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 1)
[node name="GoalLine" type="Decal" parent="TestFields/Glass/PuttSpawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 34)
size = Vector3(20, 2, 0.5)
texture_albedo = SubResource("PlaceholderTexture2D_ugtgi")

View File

@ -12,13 +12,12 @@ config_version=5
config/name="GFOLF" config/name="GFOLF"
config/description="GFOLF: Combat Golf Action" config/description="GFOLF: Combat Golf Action"
config/version="0.0.2" config/version="0.0.1"
run/main_scene="res://src/game/game.tscn" run/main_scene="res://src/game/game.tscn"
config/use_custom_user_dir=true config/use_custom_user_dir=true
config/project_settings_override="user://settings.godot" config/project_settings_override="user://settings.godot"
config/features=PackedStringArray("4.3", "Forward Plus") config/features=PackedStringArray("4.3", "Forward Plus")
run/max_fps=60 run/max_fps=60
run/main_scene.editor="res://src/game/debug_game.tscn"
[autoload] [autoload]
@ -51,8 +50,6 @@ project/assembly_name="Gfolf2"
movie_writer/movie_file="demos/demo.avi" movie_writer/movie_file="demos/demo.avi"
movie_writer/fps=40 movie_writer/fps=40
version_control/plugin_name="GitPlugin"
version_control/autoload_on_startup=true
[editor_plugins] [editor_plugins]
@ -190,27 +187,22 @@ select_putter={
} }
club_next={ club_next={
"deadzone": 0.5, "deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(105, 13),"global_position":Vector2(114, 59),"factor":1.0,"button_index":8,"canceled":false,"pressed":true,"double_click":false,"script":null)
] ]
} }
club_previous={ club_previous={
"deadzone": 0.5, "deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(277, 2),"global_position":Vector2(286, 48),"factor":1.0,"button_index":9,"canceled":false,"pressed":true,"double_click":false,"script":null)
] ]
} }
ball_next={ ball_next={
"deadzone": 0.5, "deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":103,"location":0,"echo":false,"script":null) "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
] ]
} }
ball_previous={ ball_previous={
"deadzone": 0.5, "deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":71,"location":0,"echo":false,"script":null) "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
fast_forward={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
] ]
} }
pause={ pause={
@ -251,6 +243,12 @@ locale/translations=PackedStringArray("res://assets/text/text.en.translation")
3d_physics/layer_1="Collision Geometry" 3d_physics/layer_1="Collision Geometry"
3d_physics/layer_2="Water" 3d_physics/layer_2="Water"
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]
@ -258,7 +256,6 @@ locale/translations=PackedStringArray("res://assets/text/text.en.translation")
3d/sleep_threshold_angular=2.0 3d/sleep_threshold_angular=2.0
jolt_3d/sleep/velocity_threshold=0.1 jolt_3d/sleep/velocity_threshold=0.1
jolt_3d/sleep/time_threshold=1.0 jolt_3d/sleep/time_threshold=1.0
jolt_3d/limits/max_angular_velocity=5700.0
jolt_3d/limits/max_temporary_memory=64 jolt_3d/limits/max_temporary_memory=64
[rendering] [rendering]
@ -267,8 +264,6 @@ textures/canvas_textures/default_texture_filter=0
textures/vram_compression/import_etc2_astc=true textures/vram_compression/import_etc2_astc=true
lights_and_shadows/directional_shadow/size=16384 lights_and_shadows/directional_shadow/size=16384
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=0 lights_and_shadows/directional_shadow/soft_shadow_filter_quality=0
textures/decals/filter=2
anti_aliasing/quality/msaa_3d=3 anti_aliasing/quality/msaa_3d=3
viewport/hdr_2d=true
anti_aliasing/quality/screen_space_aa=1 anti_aliasing/quality/screen_space_aa=1
anti_aliasing/quality/use_debanding=true anti_aliasing/quality/use_debanding=true

View File

@ -3,8 +3,3 @@ extends GameBall
func enter_zone(zone: BallZone) -> void: func enter_zone(zone: BallZone) -> void:
_zones.push_back(zone) _zones.push_back(zone)
if zone.water_hazard:
effects.play_splash()
# Play effect but don't emit signal
# Also don't play SFX -- kind of annoying tbh

View File

@ -1,27 +1,23 @@
[gd_scene load_steps=9 format=3 uid="uid://bptiryfbnautm"] [gd_scene load_steps=9 format=3 uid="uid://bptiryfbnautm"]
[ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_pl6e6"] [ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_pl6e6"]
[ext_resource type="Texture2D" uid="uid://daipuukf6e6bc" path="res://assets/textures/beach_ball/beach_ball.png" id="2_6dwmi"]
[ext_resource type="Script" path="res://src/equipment/balls/beach_ball/beach_ball.gd" id="2_ay78j"] [ext_resource type="Script" path="res://src/equipment/balls/beach_ball/beach_ball.gd" id="2_ay78j"]
[ext_resource type="Texture2D" uid="uid://3oatrxh60ed7" path="res://assets/textures/beach_ball/beach_ball_normal_map.png" id="3_rdlj8"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_867vn"] [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_867vn"]
friction = 0.7 friction = 0.7
bounce = 0.67 bounce = 0.67
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_e5701"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_x6y4w"]
load_path = "res://.godot/imported/beach_ball.png-103709b22c99e920077c858fb92c2e27.ctex" albedo_texture = ExtResource("2_6dwmi")
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_oyl4c"]
load_path = "res://.godot/imported/beach_ball_normal_map.png-06c8d20483d619e155834bb8abd74c2f.s3tc.ctex"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cybhj"]
albedo_texture = SubResource("CompressedTexture2D_e5701")
normal_enabled = true normal_enabled = true
normal_scale = 0.5 normal_scale = 0.5
normal_texture = SubResource("CompressedTexture2D_oyl4c") normal_texture = ExtResource("3_rdlj8")
texture_filter = 4 texture_filter = 4
[sub_resource type="SphereMesh" id="SphereMesh_kstjc"] [sub_resource type="SphereMesh" id="SphereMesh_iqcc5"]
material = SubResource("StandardMaterial3D_cybhj") material = SubResource("StandardMaterial3D_x6y4w")
radial_segments = 6 radial_segments = 6
rings = 6 rings = 6
@ -36,11 +32,8 @@ script = ExtResource("2_ay78j")
base_damage = 5.0 base_damage = 5.0
radius = 0.5 radius = 0.5
[node name="BallMesh" parent="MeshRoot" index="0"] [node name="BallMesh" parent="." index="0"]
visible = false mesh = SubResource("SphereMesh_iqcc5")
[node name="BeachBallMesh" type="MeshInstance3D" parent="MeshRoot" index="1"]
mesh = SubResource("SphereMesh_kstjc")
[node name="CollisionShape3D" parent="." index="1"] [node name="CollisionShape3D" parent="." index="1"]
shape = SubResource("SphereShape3D_cvsx2") shape = SubResource("SphereShape3D_cvsx2")

View File

@ -16,11 +16,11 @@ mass = 0.08
physics_material_override = SubResource("PhysicsMaterial_f03f4") physics_material_override = SubResource("PhysicsMaterial_f03f4")
radius = 0.15 radius = 0.15
[node name="BallMesh" parent="MeshRoot" index="0"] [node name="BrickMesh" parent="." index="0" instance=ExtResource("2_ubuxr")]
visible = false
[node name="BrickMesh" parent="MeshRoot" index="1" instance=ExtResource("2_ubuxr")]
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0) transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0)
[node name="CollisionShape3D" parent="." index="1"] [node name="BallMesh" parent="." index="1"]
visible = false
[node name="CollisionShape3D" parent="." index="2"]
shape = SubResource("BoxShape3D_7v3re") shape = SubResource("BoxShape3D_7v3re")

View File

@ -1,18 +0,0 @@
extends GameBall
const INFO_FMT := "speed: {0} m/s\nang.spd: {1}\nsurface: {2}\ntime: {3} s"
@onready var debug_info: Label3D = %DebugInfo
func _physics_process(delta: float) -> void:
super._physics_process(delta)
debug_info.text = INFO_FMT.format(
[
linear_velocity.length(),
angular_velocity.length(),
Terrain.Type.keys()[_surface_terrain],
_shot_time_s
]
)

View File

@ -1,44 +0,0 @@
[gd_scene load_steps=7 format=3 uid="uid://b7pgvftmj7nbe"]
[ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_gcsxs"]
[ext_resource type="Script" path="res://src/equipment/balls/debug_ball/debug_ball.gd" id="2_edye5"]
[ext_resource type="Texture2D" uid="uid://tancoet1lih5" path="res://assets/ui/ball_icons/basic_icon.png" id="2_h3ccx"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_8pnwh"]
transparency = 1
no_depth_test = true
shading_mode = 0
albedo_texture = ExtResource("2_h3ccx")
texture_filter = 2
billboard_mode = 1
fixed_size = true
[sub_resource type="QuadMesh" id="QuadMesh_lf5f4"]
material = SubResource("StandardMaterial3D_8pnwh")
size = Vector2(0.05, 0.05)
[sub_resource type="SystemFont" id="SystemFont_td87w"]
font_names = PackedStringArray("Monospace")
subpixel_positioning = 0
[node name="DebugBall" instance=ExtResource("1_gcsxs")]
script = ExtResource("2_edye5")
[node name="MeshInstance3D" type="MeshInstance3D" parent="MeshRoot/BallMesh" index="0"]
mesh = SubResource("QuadMesh_lf5f4")
[node name="DebugInfo" type="Label3D" parent="MeshRoot/BallMesh" index="1"]
unique_name_in_owner = true
pixel_size = 0.0005
offset = Vector2(0, -64)
billboard = 1
no_depth_test = true
fixed_size = true
texture_filter = 2
text = "DEBUG INFO
DEBUG INFO
DEBUG INFO"
font = SubResource("SystemFont_td87w")
outline_size = 10
horizontal_alignment = 0
vertical_alignment = 0

View File

@ -1,37 +1,16 @@
class_name BallParticleEffects extends Node3D class_name BallParticleEffects extends Node3D
## Controller for ball particle effects. ## Controller for ball particle effects.
@export var splash_effect_scene: PackedScene
@onready var chunk_particles: GPUParticles3D = %ChunkParticles
@onready var sand_particles: GPUParticles3D = %SandParticles @onready var sand_particles: GPUParticles3D = %SandParticles
@onready var ball: GameBall = $".." @onready var ball: GameBall = $".."
func play_splash() -> void:
var effect: Node3D = splash_effect_scene.instantiate()
ball.add_sibling(effect)
effect.global_position = ball.global_position
func _physics_process(_delta: float) -> void:
global_rotation = Vector3.ZERO
func play_effect(terrain: Terrain.Type) -> void: func play_effect(terrain: Terrain.Type) -> void:
global_rotation = Vector3.ZERO global_rotation = Vector3.ZERO
match terrain: match terrain:
Terrain.Type.SAND: Terrain.Type.SAND:
# Adjust sand particle direction # Adjust sand particle direction
var material: ParticleProcessMaterial = sand_particles.process_material var material: ParticleProcessMaterial = sand_particles.process_material
material.direction = -ball.current_gravity.normalized() material.direction = -ball.linear_velocity.normalized()
sand_particles.emitting = true sand_particles.emitting = true
func play_chunk(chunk_scale: float) -> void:
print_debug("Playing chunk effect, scale: ", chunk_scale)
chunk_particles.amount_ratio = chunk_scale
var material: ParticleProcessMaterial = chunk_particles.process_material
material.direction = -ball.current_gravity.normalized()
chunk_particles.emitting = true

View File

@ -10,7 +10,6 @@ const VELOCITY_ATTENUATION_SCALE := 400.0
@onready var grass_sfx_player: AudioStreamPlayer3D = %GrassSFXPlayer @onready var grass_sfx_player: AudioStreamPlayer3D = %GrassSFXPlayer
@onready var concrete_sfx_player: AudioStreamPlayer3D = %ConcreteSFXPlayer @onready var concrete_sfx_player: AudioStreamPlayer3D = %ConcreteSFXPlayer
@onready var sand_sfx_player: AudioStreamPlayer3D = %SandSFXPlayer @onready var sand_sfx_player: AudioStreamPlayer3D = %SandSFXPlayer
@onready var splash_sfx_player: AudioStreamPlayer3D = %SplashSFXPlayer
func _force_attenuated_volume() -> float: func _force_attenuated_volume() -> float:
@ -36,7 +35,3 @@ func play_sfx(terrain: Terrain.Type) -> void:
_play(concrete_sfx_player) _play(concrete_sfx_player)
Terrain.Type.SAND: Terrain.Type.SAND:
_play(sand_sfx_player) _play(sand_sfx_player)
func play_splash() -> void:
_play(splash_sfx_player)

View File

@ -6,7 +6,6 @@ signal entered_water
## Types of game balls ## Types of game balls
enum Type { enum Type {
DEBUG = -1,
NONE, NONE,
BASIC, BASIC,
PLASMA, PLASMA,
@ -15,29 +14,16 @@ enum Type {
POWER, POWER,
} }
const MAGNUS_SQ_EPSILON := 1e-3 const TERRAIN_DAMPING_EPSILON := 1e-6
const SURFACE_SNAP_DISTANCE := 2.0 const MAGNUS_EPSILON := 1e-3
## If enabled, ball ability cooldown is only reset at end of shot. ## If enabled, ball ability cooldown is only reset at end of shot.
@export var once_per_shot_ability := false @export var once_per_shot_ability := false
## Material physics configuration for this ball. ## Angular damping while in air
@export var terrain_physics: TerrainPhysics @export var air_damping := 0.0
## Angular damping while in collision with rough terrain
## Coefficient of the roll damping quadratic curve. @export var rough_damping := 8.0
## This applies progressively greater damping after the ball rolls for a period of time.
@export var roll_damping_coefficient := 0.4
## Time in seconds after the ball begins rolling after which roll damping will start to apply.
## This applies progressively greater damping after the ball rolls for a period of time.
@export var roll_damping_delay := 12.0
## Coefficient of the roll cull linear curve.
## The ball be frozen if it rolls with speed under this curve.
@export var roll_cull_coefficient := 0.2
## Time in seconds after the ball begins rolling after which roll culling will start to apply.
@export var roll_cull_delay := 16.0
#@export var fluid_density := 1.225 #@export var fluid_density := 1.225
#@export var lift_coefficient := 0.05 #@export var lift_coefficient := 0.05
@ -72,9 +58,6 @@ var _position_on_last_wake: Vector3
var _awake := false var _awake := false
var _ability_triggered := false var _ability_triggered := false
var _zones: Array[BallZone] = [] var _zones: Array[BallZone] = []
var _shot_time_s := 0.0
var _surface_time_s := 0.0
var _surface_terrain: Terrain.Type
@onready var ability_cooldown: Timer = %AbilityCooldown @onready var ability_cooldown: Timer = %AbilityCooldown
@onready var manual_sleep_timer: Timer = %ManualSleepTimer @onready var manual_sleep_timer: Timer = %ManualSleepTimer
@ -119,21 +102,10 @@ func get_damage() -> float:
return base_damage + linear_velocity.length_squared() * damage_force_scale return base_damage + linear_velocity.length_squared() * damage_force_scale
## Get the surface position immediately under the ball. func _total_terrain_angular_damping() -> float:
## This will typically be the surface the ball is laying on. return _zones.reduce(
## If the ball is not on a surface, this will be the position of the ball itself. func(a: float, b: BallZone) -> float: return a + b.terrain_angular_damping, 0.0
func get_surface_snap_point() -> Vector3:
var params := PhysicsRayQueryParameters3D.create(
global_position,
global_position - get_reoriented_basis().y * SURFACE_SNAP_DISTANCE,
collision_mask,
[get_rid()]
) )
var collisions := get_world_3d().direct_space_state.intersect_ray(params)
if collisions:
@warning_ignore("unsafe_cast")
return collisions["position"] as Vector3
return global_position
func _magnus_force() -> Vector3: func _magnus_force() -> Vector3:
@ -148,60 +120,38 @@ func _integrate_forces(state: PhysicsDirectBodyState3D) -> void:
_ability_triggered = false _ability_triggered = false
_position_on_last_wake = global_position _position_on_last_wake = global_position
_last_contact_normal = Vector3.UP _last_contact_normal = Vector3.UP
_shot_time_s = 0.0
_surface_time_s = 0.0
# TODO something's fucky here... I think this gets called once after the ball sleeps # TODO something's fucky here... I think this gets called once after the ball sleeps
var contacts := state.get_contact_count() var damping := air_damping
if contacts: if state.get_contact_count():
# Ball is in contact with a surface constant_force = Vector3.ZERO
# We want the contact normal which minimizes the angle to the up vector # We want the contact normal which minimizes the angle to the up vector
var min_dot := -2.0 var min_dot := -1.0
var primary_body: Node for i: int in range(state.get_contact_count()):
for i: int in range(contacts):
var norm := state.get_contact_local_normal(i) var norm := state.get_contact_local_normal(i)
var dot := norm.dot(Vector3.UP) var dot := norm.dot(Vector3.UP)
if dot > min_dot: if dot > min_dot:
min_dot = dot min_dot = dot
_last_contact_normal = norm _last_contact_normal = norm
primary_body = state.get_contact_collider_object(i)
_surface_terrain = Terrain.from_collision(global_position, primary_body)
else:
# Ball is in the air
_surface_terrain = Terrain.Type.NONE
_surface_time_s = 0.0
var params := terrain_physics.get_params(_surface_terrain) damping = _total_terrain_angular_damping()
#physics_material_override.bounce = params.bounce if damping <= TERRAIN_DAMPING_EPSILON:
angular_damp = params.angular_damp damping = rough_damping
linear_damp = params.linear_damp angular_damp = damping
# Progressively increase linear damping after a delay.
linear_damp += roll_damping_coefficient * pow(maxf(_surface_time_s - roll_damping_delay, 0), 2)
var cull_speed := roll_cull_coefficient * maxf(_surface_time_s - roll_cull_delay, 0)
if linear_velocity.length_squared() < pow(cull_speed, 2):
_manual_sleep()
func _physics_process(delta: float) -> void: func _physics_process(_delta: float) -> void:
# Simulate magnus effect # Simulate magnus effect
var magnus := _magnus_force() var magnus := _magnus_force()
if magnus.length_squared() > MAGNUS_SQ_EPSILON: if magnus.length_squared() > MAGNUS_EPSILON:
apply_central_force(magnus) apply_central_force(magnus)
# Keep shot time
_shot_time_s += delta
_surface_time_s += delta
func enter_zone(zone: BallZone) -> void: func enter_zone(zone: BallZone) -> void:
_zones.push_back(zone) _zones.push_back(zone)
if zone.water_hazard: if zone.water_hazard:
effects.play_splash()
sfx.play_splash()
entered_water.emit() entered_water.emit()
@ -222,31 +172,28 @@ func _on_sleeping_state_changed() -> void:
if sleeping: if sleeping:
# Trigger to reassign on wake # Trigger to reassign on wake
_awake = false _awake = false
linear_velocity = Vector3.ZERO
angular_velocity = Vector3.ZERO
linear_damp = 0.0
angular_damp = 0.0
func _manual_sleep() -> void:
freeze = true
manual_sleep_timer.start()
func _on_collision(body: Node) -> void: func _on_collision(body: Node) -> void:
if is_sticky(): if is_sticky():
# Freeze physics as soon as we hit something # Freeze physics as soon as we hit something
_manual_sleep() freeze = true
manual_sleep_timer.start()
var terrain := Terrain.from_collision(global_position, body) var terrain: Terrain.Type
print_debug("Collision terrain: ", Terrain.Type.keys()[terrain]) if body is Terrain3D:
terrain = Terrain.at_position(global_position, body as Terrain3D)
elif body is CSGShape3D:
terrain = Terrain.from_physical_layer((body as CSGShape3D).collision_layer)
elif body is CollisionObject3D:
terrain = Terrain.from_physical_layer((body as CollisionObject3D).collision_layer)
else:
print_debug("COLLIDER: ", body)
if terrain: if terrain:
sfx.play_sfx(terrain) sfx.play_sfx(terrain)
effects.play_effect(terrain) effects.play_effect(terrain)
linear_velocity *= clampf(1 - terrain_physics.get_params(terrain).impact_damp, 0, 1)
func _fire_sleep_signal() -> void: func _fire_sleep_signal() -> void:
sleeping = true sleeping = true

View File

@ -1,4 +1,4 @@
[gd_resource type="PhysicsMaterial" format=3 uid="uid://3bih72l068ic"] [gd_resource type="PhysicsMaterial" format=3 uid="uid://3bih72l068ic"]
[resource] [resource]
bounce = 0.4 bounce = 0.5

View File

@ -1,77 +0,0 @@
[gd_resource type="Resource" script_class="TerrainPhysics" load_steps=13 format=3 uid="uid://c6tt1hto75ex4"]
[ext_resource type="Script" path="res://src/equipment/balls/physics_ball/terrain_physics/terrain_parameters.gd" id="1_45pis"]
[ext_resource type="Script" path="res://src/equipment/balls/physics_ball/terrain_physics/terrain_physics.gd" id="2_yuehx"]
[sub_resource type="Resource" id="Resource_casfi"]
script = ExtResource("1_45pis")
linear_damp = 1.05
angular_damp = 3.0
impact_damp = 0.05
[sub_resource type="Resource" id="Resource_3k63c"]
script = ExtResource("1_45pis")
linear_damp = 0.0
angular_damp = 0.01
impact_damp = 0.0
[sub_resource type="Resource" id="Resource_xf73q"]
script = ExtResource("1_45pis")
linear_damp = 2.8
angular_damp = 4.0
impact_damp = 0.3
[sub_resource type="Resource" id="Resource_nhn3l"]
script = ExtResource("1_45pis")
linear_damp = 0.86
angular_damp = 1.0
impact_damp = 0.0
[sub_resource type="Resource" id="Resource_m3wjo"]
script = ExtResource("1_45pis")
linear_damp = 1.25
angular_damp = 4.0
impact_damp = 0.3
[sub_resource type="Resource" id="Resource_h4rld"]
script = ExtResource("1_45pis")
linear_damp = 1.62
angular_damp = 1.0
impact_damp = 0.0
[sub_resource type="Resource" id="Resource_j6lib"]
script = ExtResource("1_45pis")
linear_damp = 4.0
angular_damp = 2.0
impact_damp = 0.15
[sub_resource type="Resource" id="Resource_7f7ql"]
script = ExtResource("1_45pis")
linear_damp = 3.0
angular_damp = 8.0
impact_damp = 0.5
[sub_resource type="Resource" id="Resource_pusmf"]
script = ExtResource("1_45pis")
linear_damp = 4.0
angular_damp = 4.0
impact_damp = 0.7
[sub_resource type="Resource" id="Resource_edkxb"]
script = ExtResource("1_45pis")
linear_damp = 1.25
angular_damp = 1.3
impact_damp = 0.15
[resource]
script = ExtResource("2_yuehx")
default = SubResource("Resource_3k63c")
rough = SubResource("Resource_7f7ql")
fairway = SubResource("Resource_xf73q")
green = SubResource("Resource_m3wjo")
sand = SubResource("Resource_pusmf")
concrete = SubResource("Resource_casfi")
rock = SubResource("Resource_j6lib")
wood = SubResource("Resource_edkxb")
metal = SubResource("Resource_h4rld")
glass = SubResource("Resource_nhn3l")

View File

@ -1,7 +1,7 @@
[gd_scene load_steps=30 format=3 uid="uid://dfttci386ohip"] [gd_scene load_steps=22 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="Resource" uid="uid://c6tt1hto75ex4" path="res://src/equipment/balls/physics_ball/normal_terrain_physics.tres" id="3_3gnie"] [ext_resource type="PhysicsMaterial" uid="uid://3bih72l068ic" path="res://src/equipment/balls/physics_ball/normal_physics.tres" id="1_l23pw"]
[ext_resource type="Material" uid="uid://dpsmjlhjpc7vs" path="res://assets/materials/basic_ball_material.tres" id="3_rc7m1"] [ext_resource type="Material" uid="uid://dpsmjlhjpc7vs" path="res://assets/materials/basic_ball_material.tres" id="3_rc7m1"]
[ext_resource type="Script" path="res://src/equipment/balls/physics_ball/ball_sfx.gd" id="5_bhshl"] [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://cayyndwmxua5x" path="res://assets/sound/sfx/ball/grass2.wav" id="7_l22cv"]
@ -10,13 +10,8 @@
[ext_resource type="AudioStream" uid="uid://3csnnhxndt67" path="res://assets/sound/sfx/ball/concrete5.wav" id="9_p0lmw"] [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://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"] [ext_resource type="AudioStream" uid="uid://b5xx5t050i4p" path="res://assets/sound/sfx/ball/sand2.wav" id="11_ed8je"]
[ext_resource type="AudioStream" uid="uid://dutumw1vj854w" path="res://assets/sound/sfx/ball/splash1.wav" id="11_xmj6n"]
[ext_resource type="Script" path="res://src/equipment/balls/physics_ball/ball_particle_effects.gd" id="12_7krl6"] [ext_resource type="Script" path="res://src/equipment/balls/physics_ball/ball_particle_effects.gd" id="12_7krl6"]
[ext_resource type="PackedScene" uid="uid://cm4bb3lg4mfd2" path="res://src/world/effects/splash/splash_effect.tscn" id="12_qlrvx"] [ext_resource type="Texture2D" uid="uid://c47bkx508biqr" path="res://assets/sprites/particles/plasma.png" id="12_guipt"]
[ext_resource type="Texture2D" uid="uid://dy310v1j5vexd" path="res://assets/sprites/particles/smudge.png" id="14_el0o3"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_u134x"]
bounce = 0.8
[sub_resource type="SphereMesh" id="SphereMesh_y0d13"] [sub_resource type="SphereMesh" id="SphereMesh_y0d13"]
material = ExtResource("3_rc7m1") material = ExtResource("3_rc7m1")
@ -35,13 +30,10 @@ script/source = "extends Control
const COLOR_X := Color(1, 0, 0) const COLOR_X := Color(1, 0, 0)
const COLOR_Y := Color(0, 1, 0) const COLOR_Y := Color(0, 1, 0)
const COLOR_Z := Color(0, 0, 1) const COLOR_Z := Color(0, 0, 1)
const COLOR_VELOCITY := Color.ORANGE
const COLOR_MAGNUS := Color.CYAN const COLOR_MAGNUS := Color.CYAN
const VELOCITY_SCALE := 0.5
const MAGNUS_SCALE := 3 const MAGNUS_SCALE := 3
const WIDTH := 4 const WIDTH := 4
@export var draw_velocity := true
@export var draw_reoriented_basis := true @export var draw_reoriented_basis := true
@export var draw_magnus_effect := true @export var draw_magnus_effect := true
@export var draw_gravity_basis := true @export var draw_gravity_basis := true
@ -57,11 +49,6 @@ func _process(_delta: float) -> void:
func _draw() -> void: func _draw() -> void:
var camera := get_viewport().get_camera_3d() var camera := get_viewport().get_camera_3d()
var start := camera.unproject_position(physics_ball.global_position) var start := camera.unproject_position(physics_ball.global_position)
if draw_velocity:
var end := camera.unproject_position(physics_ball.global_position + physics_ball.linear_velocity * VELOCITY_SCALE)
draw_line(start, end, COLOR_VELOCITY, WIDTH)
if draw_reoriented_basis and physics_ball._last_contact_normal != null: if draw_reoriented_basis and physics_ball._last_contact_normal != null:
var basis := physics_ball.get_reoriented_basis() var basis := physics_ball.get_reoriented_basis()
var end_x := camera.unproject_position(physics_ball.global_position + basis.x) var end_x := camera.unproject_position(physics_ball.global_position + basis.x)
@ -108,40 +95,6 @@ streams_count = 2
stream_0/stream = ExtResource("10_b64mx") stream_0/stream = ExtResource("10_b64mx")
stream_1/stream = ExtResource("11_ed8je") stream_1/stream = ExtResource("11_ed8je")
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_nlbkf"]
playback_mode = 1
streams_count = 1
stream_0/stream = ExtResource("11_xmj6n")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_706cj"]
angle_min = -720.0
angle_max = 720.0
spread = 20.0
initial_velocity_min = 1.0
initial_velocity_max = 5.0
scale_min = 0.0
hue_variation_min = -0.02
hue_variation_max = -2.23517e-08
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5u1jh"]
load_path = "res://.godot/imported/smudge.png-6be29afb408991155df57310104cb1f8.ctex"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fbolh"]
transparency = 1
vertex_color_use_as_albedo = true
albedo_color = Color(0.17, 0.12954, 0.0272, 1)
albedo_texture = SubResource("CompressedTexture2D_5u1jh")
texture_filter = 2
billboard_mode = 3
billboard_keep_scale = true
particles_anim_h_frames = 1
particles_anim_v_frames = 1
particles_anim_loop = false
[sub_resource type="QuadMesh" id="QuadMesh_npp3t"]
material = SubResource("StandardMaterial3D_fbolh")
size = Vector2(0.15, 0.15)
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_mwiw1"] [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_mwiw1"]
angle_min = -720.0 angle_min = -720.0
angle_max = 720.0 angle_max = 720.0
@ -156,9 +109,9 @@ hue_variation_max = -2.23517e-08
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v1i8b"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v1i8b"]
transparency = 1 transparency = 1
vertex_color_use_as_albedo = true vertex_color_use_as_albedo = true
albedo_color = Color(0.45, 0.4092, 0.306, 1) albedo_color = Color(0.78, 0.70928, 0.5304, 1)
albedo_texture = ExtResource("14_el0o3") albedo_texture = ExtResource("12_guipt")
texture_filter = 2 texture_filter = 4
billboard_mode = 3 billboard_mode = 3
billboard_keep_scale = true billboard_keep_scale = true
particles_anim_h_frames = 1 particles_anim_h_frames = 1
@ -171,20 +124,17 @@ size = Vector2(0.2, 0.2)
[node name="PhysicsBall" type="RigidBody3D"] [node name="PhysicsBall" type="RigidBody3D"]
mass = 0.05 mass = 0.05
physics_material_override = SubResource("PhysicsMaterial_u134x") physics_material_override = ExtResource("1_l23pw")
sleeping = true
freeze = true freeze = true
continuous_cd = true continuous_cd = true
contact_monitor = true contact_monitor = true
max_contacts_reported = 3 max_contacts_reported = 3
linear_damp_mode = 1 linear_damp_mode = 1
angular_damp_mode = 1 angular_damp_mode = 1
angular_damp = 8.0
script = ExtResource("1_iwh2u") script = ExtResource("1_iwh2u")
terrain_physics = ExtResource("3_3gnie")
[node name="MeshRoot" type="Node3D" parent="."] [node name="BallMesh" type="MeshInstance3D" parent="."]
[node name="BallMesh" type="MeshInstance3D" parent="MeshRoot"]
mesh = SubResource("SphereMesh_y0d13") mesh = SubResource("SphereMesh_y0d13")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
@ -200,8 +150,8 @@ anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
script = SubResource("GDScript_p4v7o") script = SubResource("GDScript_p4v7o")
draw_reoriented_basis = false
draw_magnus_effect = false draw_magnus_effect = false
draw_gravity_basis = false
[node name="SFX" type="Node3D" parent="."] [node name="SFX" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@ -226,12 +176,6 @@ unit_size = 40.0
max_db = 0.0 max_db = 0.0
bus = &"SFX" bus = &"SFX"
[node name="SplashSFXPlayer" type="AudioStreamPlayer3D" parent="SFX"]
unique_name_in_owner = true
stream = SubResource("AudioStreamRandomizer_nlbkf")
unit_size = 40.0
bus = &"SFX"
[node name="ManualSleepTimer" type="Timer" parent="."] [node name="ManualSleepTimer" type="Timer" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
one_shot = true one_shot = true
@ -243,16 +187,6 @@ one_shot = true
[node name="ParticleEffects" type="Node3D" parent="."] [node name="ParticleEffects" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
script = ExtResource("12_7krl6") script = ExtResource("12_7krl6")
splash_effect_scene = ExtResource("12_qlrvx")
[node name="ChunkParticles" type="GPUParticles3D" parent="ParticleEffects"]
unique_name_in_owner = true
emitting = false
amount = 12
one_shot = true
explosiveness = 1.0
process_material = SubResource("ParticleProcessMaterial_706cj")
draw_pass_1 = SubResource("QuadMesh_npp3t")
[node name="SandParticles" type="GPUParticles3D" parent="ParticleEffects"] [node name="SandParticles" type="GPUParticles3D" parent="ParticleEffects"]
unique_name_in_owner = true unique_name_in_owner = true

View File

@ -1,10 +0,0 @@
class_name TerrainParameters extends Resource
## Physical parameters for an individual terrain type.
## Linear damping applied while in contact with the terrain surface.
@export var linear_damp := 0.0
## Angular damping applied while in contact with the terrain surface.
@export var angular_damp := 0.0
## Linear damping applied the frame the ball makes contact with the surface.
## This is applied in addition `linear_damp`.
@export var impact_damp := 0.0

View File

@ -1,40 +0,0 @@
class_name TerrainPhysics extends Resource
## Container for ball behavior parameters when in contact with different terrain types
@export var default: TerrainParameters
@export var rough: TerrainParameters
@export var fairway: TerrainParameters
@export var green: TerrainParameters
@export var sand: TerrainParameters
@export var concrete: TerrainParameters
@export var rock: TerrainParameters
@export var wood: TerrainParameters
@export var metal: TerrainParameters
@export var glass: TerrainParameters
func get_params(type: Terrain.Type) -> TerrainParameters:
# NOTE: sure would be nice to just store this in a dict,
# but that makes editing physics through the editor unweildy.
match type:
Terrain.Type.ROUGH:
return rough
Terrain.Type.FAIRWAY:
return fairway
Terrain.Type.GREEN:
return green
Terrain.Type.SAND:
return sand
Terrain.Type.CONCRETE:
return concrete
Terrain.Type.ROCK:
return rock
Terrain.Type.WOOD:
return wood
Terrain.Type.METAL:
return metal
Terrain.Type.GLASS:
return glass
_:
return default

View File

@ -1,17 +1,10 @@
[gd_scene load_steps=14 format=3 uid="uid://dcqxlbsrubapk"] [gd_scene load_steps=13 format=3 uid="uid://dcqxlbsrubapk"]
[ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_yh4fp"] [ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_yh4fp"]
[ext_resource type="Texture2D" uid="uid://c47bkx508biqr" path="res://assets/sprites/particles/plasma.png" id="2_8fdyx"] [ext_resource type="Texture2D" uid="uid://c47bkx508biqr" path="res://assets/sprites/particles/plasma.png" id="2_8fdyx"]
[ext_resource type="Script" path="res://src/equipment/balls/plasma_ball/plasma_ball.gd" id="2_16fhh"] [ext_resource type="Script" path="res://src/equipment/balls/plasma_ball/plasma_ball.gd" id="2_16fhh"]
[ext_resource type="Material" uid="uid://f3qufrkoiv66" path="res://assets/materials/plasma_ball.tres" id="3_6gyuc"] [ext_resource type="Material" uid="uid://f3qufrkoiv66" path="res://assets/materials/plasma_ball.tres" id="3_6gyuc"]
[sub_resource type="SphereMesh" id="SphereMesh_n65ut"]
material = ExtResource("3_6gyuc")
radius = 0.1
height = 0.2
radial_segments = 6
rings = 6
[sub_resource type="Curve" id="Curve_kabhn"] [sub_resource type="Curve" id="Curve_kabhn"]
max_value = 2.0 max_value = 2.0
_data = [Vector2(0, 2), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] _data = [Vector2(0, 2), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
@ -62,13 +55,11 @@ radius = 0.1
script = ExtResource("2_16fhh") script = ExtResource("2_16fhh")
magnetic = true magnetic = true
[node name="BallMesh" parent="MeshRoot" index="0"] [node name="BallMesh" parent="." index="0"]
visible = false transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0)
surface_material_override/0 = ExtResource("3_6gyuc")
[node name="PlasmaBallMesh" type="MeshInstance3D" parent="MeshRoot" index="1"] [node name="PlasmaFireEffect" type="GPUParticles3D" parent="BallMesh" index="0"]
mesh = SubResource("SphereMesh_n65ut")
[node name="PlasmaFireEffect" type="GPUParticles3D" parent="MeshRoot/PlasmaBallMesh" index="0"]
sorting_offset = -1.0 sorting_offset = -1.0
amount = 20 amount = 20
lifetime = 0.6 lifetime = 0.6

View File

@ -1,31 +1,27 @@
[gd_scene load_steps=37 format=4 uid="uid://deuytmxw2lc62"] [gd_scene load_steps=37 format=4 uid="uid://deuytmxw2lc62"]
[ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_14gld"] [ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_14gld"]
[ext_resource type="Texture2D" uid="uid://ckhiq6rfjv63u" path="res://assets/textures/gfolfball/gfolfball.png" id="2_a2gtg"]
[ext_resource type="Script" path="res://src/equipment/balls/power_ball/power_ball.gd" id="2_hy51e"] [ext_resource type="Script" path="res://src/equipment/balls/power_ball/power_ball.gd" id="2_hy51e"]
[ext_resource type="Texture2D" uid="uid://btntjs7mbdigu" path="res://assets/textures/gfolfball/gfolfball_normal.png" id="3_60i75"]
[ext_resource type="PackedScene" uid="uid://dd2nxbfssd4hh" path="res://assets/models/balls/powerball/fireball.gltf" id="5_i8vmm"] [ext_resource type="PackedScene" uid="uid://dd2nxbfssd4hh" path="res://assets/models/balls/powerball/fireball.gltf" id="5_i8vmm"]
[ext_resource type="AudioStream" uid="uid://tqr7u7vb2r0f" path="res://assets/sound/sfx/ball/effects/fireball.wav" id="6_uwolu"] [ext_resource type="AudioStream" uid="uid://tqr7u7vb2r0f" path="res://assets/sound/sfx/ball/effects/fireball.wav" id="6_uwolu"]
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_bmjge"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fcniu"]
load_path = "res://.godot/imported/gfolfball.png-4fde775993c78b86828199273dc9e4be.s3tc.ctex"
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_314t2"]
load_path = "res://.godot/imported/gfolfball_normal.png-d9cc0e700a9a63c2e2cea72beebc6133.s3tc.ctex"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ya45b"]
albedo_color = Color(2, 0.266, 0.266, 1) albedo_color = Color(2, 0.266, 0.266, 1)
albedo_texture = SubResource("CompressedTexture2D_bmjge") albedo_texture = ExtResource("2_a2gtg")
albedo_texture_force_srgb = true albedo_texture_force_srgb = true
metallic = 1.0 metallic = 1.0
roughness = 0.67 roughness = 0.67
normal_enabled = true normal_enabled = true
normal_scale = 0.2 normal_scale = 0.2
normal_texture = SubResource("CompressedTexture2D_314t2") normal_texture = ExtResource("3_60i75")
clearcoat_roughness = 0.0 clearcoat_roughness = 0.0
uv1_scale = Vector3(3, 1.5, 3) uv1_scale = Vector3(3, 1.5, 3)
texture_filter = 4 texture_filter = 4
[sub_resource type="SphereMesh" id="SphereMesh_v4hrl"] [sub_resource type="SphereMesh" id="SphereMesh_0b0i7"]
material = SubResource("StandardMaterial3D_ya45b") material = SubResource("StandardMaterial3D_fcniu")
radius = 0.05 radius = 0.05
height = 0.1 height = 0.1
radial_segments = 6 radial_segments = 6
@ -49,33 +45,6 @@ vertex_color_use_as_albedo = true
albedo_color = Color(2, 1.98431, 1.6, 0.156863) albedo_color = Color(2, 1.98431, 1.6, 0.156863)
albedo_texture = SubResource("GradientTexture2D_ny4ye") albedo_texture = SubResource("GradientTexture2D_ny4ye")
[sub_resource type="Animation" id="Animation_2co83"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("FireballScaleRoot:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("FireballScaleRoot:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_5t74j"] [sub_resource type="Animation" id="Animation_5t74j"]
resource_name = "flicker" resource_name = "flicker"
length = 2.0 length = 2.0
@ -105,6 +74,33 @@ tracks/1/keys = {
"values": [Vector3(0, 0, 0), Vector3(0, 2.0944, 0)] "values": [Vector3(0, 0, 0), Vector3(0, 2.0944, 0)]
} }
[sub_resource type="Animation" id="Animation_2co83"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("FireballScaleRoot:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("FireballScaleRoot:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_hmunj"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_hmunj"]
_data = { _data = {
"RESET": SubResource("Animation_2co83"), "RESET": SubResource("Animation_2co83"),
@ -238,45 +234,6 @@ _surfaces = [{
blend_shape_mode = 0 blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_r0r4b") shadow_mesh = SubResource("ArrayMesh_r0r4b")
[sub_resource type="Animation" id="Animation_6c6mi"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("ParticleEffects/PowerParticles:emitting")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("ParticleEffects/SmokeParticles:emitting")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("SFX/PowerballSFX:playing")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_7yrvu"] [sub_resource type="Animation" id="Animation_7yrvu"]
resource_name = "activate" resource_name = "activate"
length = 4.8 length = 4.8
@ -309,11 +266,11 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("ParticleEffects/SmokeParticles:emitting") tracks/2/path = NodePath("BallMesh/FireballPivot:visible")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
"times": PackedFloat32Array(0.9, 4.5), "times": PackedFloat32Array(0.8, 4.8),
"transitions": PackedFloat32Array(1, 1), "transitions": PackedFloat32Array(1, 1),
"update": 1, "update": 1,
"values": [true, false] "values": [true, false]
@ -321,16 +278,103 @@ tracks/2/keys = {
tracks/3/type = "value" tracks/3/type = "value"
tracks/3/imported = false tracks/3/imported = false
tracks/3/enabled = true tracks/3/enabled = true
tracks/3/path = NodePath("SFX/PowerballSFX:playing") tracks/3/path = NodePath("BallMesh/FireballPivot/FireballScaleRoot/fireball/Fireball:surface_material_override/0:albedo_color")
tracks/3/interp = 1 tracks/3/interp = 1
tracks/3/loop_wrap = true tracks/3/loop_wrap = true
tracks/3/keys = { tracks/3/keys = {
"times": PackedFloat32Array(0.8, 0.9, 4, 4.8),
"transitions": PackedFloat32Array(1, 1, 1.618, 1),
"update": 0,
"values": [Color(1, 0.993333, 0.8, 0), Color(2, 1.98431, 1.6, 0.156863), Color(2, 1.98431, 1.6, 0.156863), Color(1, 0.993333, 0.8, 0)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("ParticleEffects/SmokeParticles:emitting")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.9, 4.5),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("SFX/PowerballSFX:playing")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0.333333), "times": PackedFloat32Array(0.333333),
"transitions": PackedFloat32Array(1), "transitions": PackedFloat32Array(1),
"update": 1, "update": 1,
"values": [true] "values": [true]
} }
[sub_resource type="Animation" id="Animation_6c6mi"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("ParticleEffects/PowerParticles:emitting")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BallMesh/FireballPivot:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("BallMesh/FireballPivot/FireballScaleRoot/fireball/Fireball:surface_material_override/0:albedo_color")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(2, 1.98431, 1.6, 0.156863)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("ParticleEffects/SmokeParticles:emitting")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("SFX/PowerballSFX:playing")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_ospg0"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_ospg0"]
_data = { _data = {
"RESET": SubResource("Animation_6c6mi"), "RESET": SubResource("Animation_6c6mi"),
@ -342,26 +386,23 @@ freeze_mode = 1
script = ExtResource("2_hy51e") script = ExtResource("2_hy51e")
once_per_shot_ability = true once_per_shot_ability = true
[node name="BallMesh" parent="MeshRoot" index="0"] [node name="BallMesh" parent="." index="0"]
visible = false mesh = SubResource("SphereMesh_0b0i7")
[node name="PowerballMesh" type="MeshInstance3D" parent="MeshRoot" index="1"] [node name="FireballPivot" type="Node3D" parent="BallMesh" index="0"]
mesh = SubResource("SphereMesh_v4hrl")
[node name="FireballPivot" type="Node3D" parent="MeshRoot/PowerballMesh" index="0"]
unique_name_in_owner = true unique_name_in_owner = true
visible = false visible = false
[node name="FireballScaleRoot" type="Node3D" parent="MeshRoot/PowerballMesh/FireballPivot" index="0"] [node name="FireballScaleRoot" type="Node3D" parent="BallMesh/FireballPivot" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0)
[node name="fireball" parent="MeshRoot/PowerballMesh/FireballPivot/FireballScaleRoot" index="0" instance=ExtResource("5_i8vmm")] [node name="fireball" parent="BallMesh/FireballPivot/FireballScaleRoot" index="0" instance=ExtResource("5_i8vmm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.17, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.17, 0)
[node name="Fireball" parent="MeshRoot/PowerballMesh/FireballPivot/FireballScaleRoot/fireball" index="0"] [node name="Fireball" parent="BallMesh/FireballPivot/FireballScaleRoot/fireball" index="0"]
surface_material_override/0 = SubResource("StandardMaterial3D_aqmuo") surface_material_override/0 = SubResource("StandardMaterial3D_aqmuo")
[node name="FireballAnimation" type="AnimationPlayer" parent="MeshRoot/PowerballMesh/FireballPivot" index="1"] [node name="FireballAnimation" type="AnimationPlayer" parent="BallMesh/FireballPivot" index="1"]
libraries = { libraries = {
"": SubResource("AnimationLibrary_hmunj") "": SubResource("AnimationLibrary_hmunj")
} }
@ -397,4 +438,4 @@ libraries = {
"": SubResource("AnimationLibrary_ospg0") "": SubResource("AnimationLibrary_ospg0")
} }
[editable path="MeshRoot/PowerballMesh/FireballPivot/FireballScaleRoot/fireball"] [editable path="BallMesh/FireballPivot/FireballScaleRoot/fireball"]

View File

@ -1,6 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://ces65grpayngu"]
[ext_resource type="PackedScene" uid="uid://cefit4bc8akbb" path="res://src/game/game.tscn" id="1_qa7ks"]
[node name="Game" instance=ExtResource("1_qa7ks")]
start_scene = "res://src/world/world.tscn"

View File

@ -1,7 +1,7 @@
class_name Game extends Node class_name Game extends Node
## Wrapper for the game application ## Wrapper for the game application
@export_file("*.tscn") var start_scene: String = "res://src/ui/menus/title_screen/title_screen.tscn" @export var start_scene: String = "res://src/ui/menus/title_screen/title_screen.tscn"
var _loading_resources := {} var _loading_resources := {}
@ -81,20 +81,12 @@ func _unload_content() -> void:
func _finish_scene_load(instance: Node) -> void: func _finish_scene_load(instance: Node) -> void:
# Unpause in case the previous scene was paused. # Unpause in case the previous scene was paused.
get_tree().paused = false get_tree().paused = false
# Reset time scale in case it's been changed.
Engine.time_scale = 1.0
content.add_child(instance) content.add_child(instance)
instance.reparent(content) instance.reparent(content)
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
# REMOVEME
if Input.is_action_just_pressed("ui_page_up"):
Engine.time_scale *= 2.0
if Input.is_action_just_pressed("ui_page_down"):
Engine.time_scale *= 0.5
if _loading_resources and not loading_screen.visible: if _loading_resources and not loading_screen.visible:
loader_transition.play("fade_in") loader_transition.play("fade_in")

View File

@ -21,8 +21,6 @@ var projection_gravity: bool
var default_text_speed: float var default_text_speed: float
var default_physics_ticks_per_second: int
func _init() -> void: func _init() -> void:
ProjectSettings.settings_changed.connect(_read_settings) ProjectSettings.settings_changed.connect(_read_settings)
@ -56,9 +54,6 @@ func _read_settings() -> void:
) )
default_text_speed = ProjectSettings.get_setting("game/config/text/default_text_speed") default_text_speed = ProjectSettings.get_setting("game/config/text/default_text_speed")
default_physics_ticks_per_second = ProjectSettings.get_setting(
"physics/common/physics_ticks_per_second"
)
func _load_audio_bus_override() -> void: func _load_audio_bus_override() -> void:

View File

@ -16,7 +16,6 @@ iron = ExtResource("2_piku2")
wedge = ExtResource("5_wm4ae") wedge = ExtResource("5_wm4ae")
putter = ExtResource("3_tytwr") putter = ExtResource("3_tytwr")
_balls = { _balls = {
-1: -1,
1: -1, 1: -1,
2: 5, 2: 5,
3: -1, 3: -1,

View File

@ -6,7 +6,6 @@ signal ball_changed(ball: GameBall)
## Scenes for each type of ball. ## Scenes for each type of ball.
const SCENE_MAP: Dictionary = { const SCENE_MAP: Dictionary = {
GameBall.Type.DEBUG: preload("res://src/equipment/balls/debug_ball/debug_ball.tscn"),
GameBall.Type.BASIC: preload("res://src/equipment/balls/physics_ball/physics_ball.tscn"), GameBall.Type.BASIC: preload("res://src/equipment/balls/physics_ball/physics_ball.tscn"),
GameBall.Type.PLASMA: preload("res://src/equipment/balls/plasma_ball/plasma_ball.tscn"), GameBall.Type.PLASMA: preload("res://src/equipment/balls/plasma_ball/plasma_ball.tscn"),
GameBall.Type.BRICK: preload("res://src/equipment/balls/brick/brick.tscn"), GameBall.Type.BRICK: preload("res://src/equipment/balls/brick/brick.tscn"),

View File

@ -38,7 +38,7 @@ const BIG_POWER_THRESHOLD := 0.7
const WATER_DAMAGE := 10.0 const WATER_DAMAGE := 10.0
## Angle of influence that shot curve has, in radians ## Angle of influence that shot curve has, in radians
const CURVE_INFLUENCE := PI / 4 const CURVE_INFLUENCE := PI / 16
## Just enough to make things interesting! ## Just enough to make things interesting!
const SHOT_OFFSET_X_FACTOR := 20.0 const SHOT_OFFSET_X_FACTOR := 20.0
@ -48,15 +48,11 @@ const SHOT_OFFSET_Z_FACTOR := 2.0 / 45.0
const CURVE_FACTOR := 0.002 const CURVE_FACTOR := 0.002
## Maximum absolute curve for the "nice shot" animation to play ## Maximum absolute curve for the "nice shot" animation to play
const NICE_THRESHOLD := 0.05 const NICE_THRESHOLD := 0.2
## Force by which explosions knock the ball away ## Force by which explosions knock the ball away
const EXPLOSIVE_FORCE_FACTOR := 0.12 const EXPLOSIVE_FORCE_FACTOR := 0.12
const CLUB_SELECT_ORDER: Array[Club.Type] = [
Club.Type.DRIVER, Club.Type.IRON, Club.Type.WEDGE, Club.Type.SPECIAL, Club.Type.PUTTER
]
## In Driving Range mode, the ball can be retrieved in the shot phase. ## In Driving Range mode, the ball can be retrieved in the shot phase.
@export var driving_range := false @export var driving_range := false
@ -292,7 +288,7 @@ func take_shot() -> void:
print_debug("Shot impulse: ", impulse, "; ", impulse.length(), " N*s") print_debug("Shot impulse: ", impulse, "; ", impulse.length(), " N*s")
# Curve the curve # Curve the curve
var curve := shot_curve * CURVE_FACTOR var curve := shot_curve * absf(shot_curve) * CURVE_FACTOR
# Position where the ball is hit (imparts spin) # Position where the ball is hit (imparts spin)
var offset := ( var offset := (
@ -311,9 +307,6 @@ func take_shot() -> void:
game_ball.magnetic = club_type == Club.Type.IRON game_ball.magnetic = club_type == Club.Type.IRON
game_ball.freeze = false game_ball.freeze = false
game_ball.apply_impulse(impulse, offset) game_ball.apply_impulse(impulse, offset)
if not is_shot_good():
# Play chunk particle effect
game_ball.effects.play_chunk(absf(shot_curve) / (1.0 - NICE_THRESHOLD))
reset_prompt_timer.start() reset_prompt_timer.start()
@ -396,7 +389,7 @@ func travel_to_ball() -> void:
return return
game_ball.freeze = true game_ball.freeze = true
global_position = game_ball.get_surface_snap_point() global_position = game_ball.global_position
# Re-orient to the ball's last contact normal if there is one. # Re-orient to the ball's last contact normal if there is one.
# Normally this will just be Vector3.UP or something close to it. # Normally this will just be Vector3.UP or something close to it.
@ -404,6 +397,9 @@ func travel_to_ball() -> void:
_target_rotation.y = 0 _target_rotation.y = 0
global_basis = game_ball.get_reoriented_basis() global_basis = game_ball.get_reoriented_basis()
# Adjust position downward to account for ball radius
global_position -= global_basis.y.normalized() * game_ball.radius
ball_point.snap() ball_point.snap()
@ -485,8 +481,6 @@ func _on_phase_change(new_phase: Phase) -> void:
idle_prompt_timer.start() idle_prompt_timer.start()
hud.hide_idle_prompts() hud.hide_idle_prompts()
world.fast_forward = false
match new_phase: match new_phase:
Phase.AIM: Phase.AIM:
hud.show_hud() hud.show_hud()
@ -540,21 +534,7 @@ func _on_game_ball_changed(ball: GameBall) -> void:
player_offset.position.z = z_offset player_offset.position.z = z_offset
func _get_relative_club(delta: int, from: int = -1) -> Club.Type: func _process(delta: float) -> void:
from = from if from != -1 else club_type
var old_idx := CLUB_SELECT_ORDER.find(from)
var new_idx := wrapi(old_idx + delta, 0, len(CLUB_SELECT_ORDER))
var new_club := CLUB_SELECT_ORDER[new_idx]
# UX behavior: if there is not club in the next slot, get the NEXT next slot, etc etc
# NOTE: this will enter a loop if the player has no clubs!
if not player.get_club(new_club):
return _get_relative_club(delta, new_club)
return new_club
func _process(_delta: float) -> void:
# REMOVEME # REMOVEME
if Input.is_action_just_pressed("ui_menu"): if Input.is_action_just_pressed("ui_menu"):
print("Debugging...") print("Debugging...")
@ -564,24 +544,24 @@ func _process(_delta: float) -> void:
## Visual updates ## Visual updates
# Rotation # Rotation
direction.rotation.y = lerp_angle( direction.rotation.y = lerp_angle(
direction.rotation.y, _target_rotation.y, Game.settings.x_acceleration / 60.0 direction.rotation.y, _target_rotation.y, delta * Game.settings.x_acceleration
) )
pitch.rotation.x = lerp_angle( pitch.rotation.x = lerp_angle(
pitch.rotation.x, _target_rotation.x, Game.settings.y_acceleration / 60.0 pitch.rotation.x, _target_rotation.x, delta * Game.settings.y_acceleration
) )
# Arrow lags behind camera control # Arrow lags behind camera control
arrow_pivot.rotation.y = lerp_angle( arrow_pivot.rotation.y = lerp_angle(
arrow_pivot.rotation.y, _target_rotation.y, ARROW_ACCELERATION / 60.0 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, PLAYER_ACCELERATION / 60.0 player_pivot.rotation.y, _target_rotation.y, delta * PLAYER_ACCELERATION
) )
## Input Handling ## Input Handling
if control_disabled: if control_disabled:
if Input.is_action_just_pressed("camera_cancel", true): if Input.is_action_just_pressed("camera_cancel"):
if is_instance_valid(_free_camera) and not _returning_free_camera: if is_instance_valid(_free_camera) and not _returning_free_camera:
_returning_free_camera = true _returning_free_camera = true
var tween := get_tree().create_tween() var tween := get_tree().create_tween()
@ -601,79 +581,72 @@ func _process(_delta: float) -> void:
match phase: match phase:
Phase.AIM: Phase.AIM:
# Camera zoom # Camera zoom
if Input.is_action_just_pressed("shot_zoom_in", true): if Input.is_action_just_pressed("shot_zoom_in"):
camera_distance = max(camera_distance - 1.0, ZOOM_MIN) camera_distance = max(camera_distance - 1.0, ZOOM_MIN)
if Input.is_action_just_pressed("shot_zoom_out", true): if Input.is_action_just_pressed("shot_zoom_out"):
camera_distance = min(camera_distance + 1.0, ZOOM_MAX) camera_distance = min(camera_distance + 1.0, ZOOM_MAX)
# Club select # Club select
if Input.is_action_just_pressed("club_next", true): if Input.is_action_just_pressed("select_driver"):
club_type = _get_relative_club(1)
if Input.is_action_just_pressed("club_previous", true):
club_type = _get_relative_club(-1)
if Input.is_action_just_pressed("select_driver", true):
club_type = Club.Type.DRIVER club_type = Club.Type.DRIVER
if Input.is_action_just_pressed("select_iron", true): if Input.is_action_just_pressed("select_iron"):
club_type = Club.Type.IRON club_type = Club.Type.IRON
if Input.is_action_just_pressed("select_wedge", true): if Input.is_action_just_pressed("select_wedge"):
club_type = Club.Type.WEDGE club_type = Club.Type.WEDGE
if Input.is_action_just_pressed("select_special", true): if Input.is_action_just_pressed("select_special"):
club_type = Club.Type.SPECIAL club_type = Club.Type.SPECIAL
if Input.is_action_just_pressed("select_putter", true): if Input.is_action_just_pressed("select_putter"):
club_type = Club.Type.PUTTER club_type = Club.Type.PUTTER
# Ball select # Ball select
if Input.is_action_just_pressed("ball_next", true): if Input.is_action_just_pressed("ball_next"):
ball_type = player.next_ball(ball_type) ball_type = player.next_ball(ball_type)
if Input.is_action_just_pressed("ball_previous", true): if Input.is_action_just_pressed("ball_previous"):
ball_type = player.prev_ball(ball_type) ball_type = player.prev_ball(ball_type)
# Switch to free cam # Switch to free cam
if ( if (
Input.is_action_just_pressed("camera_back", true) Input.is_action_just_pressed("camera_back")
or Input.is_action_just_pressed("camera_forward", true) or Input.is_action_just_pressed("camera_forward")
or Input.is_action_just_pressed("camera_left", true) or Input.is_action_just_pressed("camera_left")
or Input.is_action_just_pressed("camera_right", true) or Input.is_action_just_pressed("camera_right")
): ):
insert_free_cam() insert_free_cam()
# Advance to next phase # Advance to next phase
if Input.is_action_just_pressed("shot_accept", true): if Input.is_action_just_pressed("shot_accept"):
if player.get_balls(ball_type) != 0: if player.get_balls(ball_type) != 0:
# Check that player has enough of the selected ball (<0 means unlimited) # Check that player has enough of the selected ball (<0 means unlimited)
phase = Phase.POWER_ADJUST phase = Phase.POWER_ADJUST
# TODO play UI bonk if player doesn't have balls (lmao) # TODO play UI bonk if player doesn't have balls (lmao)
Phase.POWER_ADJUST: Phase.POWER_ADJUST:
if Input.is_action_just_pressed("shot_accept", true): if Input.is_action_just_pressed("shot_accept"):
# TODO set power gauge parameters if needed # TODO set power gauge parameters if needed
character.start_upswing() character.start_upswing()
hud.start_power_bar() hud.start_power_bar()
if Input.is_action_just_pressed("shot_cancel", true): if Input.is_action_just_pressed("shot_cancel"):
hud.reset_power_bar() hud.reset_power_bar()
phase = Phase.AIM phase = Phase.AIM
if Input.is_action_just_released("shot_accept", true) and shot_power > 0: if Input.is_action_just_released("shot_accept") and shot_power > 0:
hud.stop_power_bar() hud.stop_power_bar()
phase = Phase.CURVE_ADJUST phase = Phase.CURVE_ADJUST
Phase.CURVE_ADJUST: Phase.CURVE_ADJUST:
if Input.is_action_just_pressed("shot_cancel", true): if Input.is_action_just_pressed("shot_cancel"):
hud.reset_curve_bar() hud.reset_curve_bar()
phase = Phase.POWER_ADJUST phase = Phase.POWER_ADJUST
if Input.is_action_just_pressed("shot_accept", true): if Input.is_action_just_pressed("shot_accept"):
hud.stop_curve_bar() hud.stop_curve_bar()
phase = Phase.DOWNSWING phase = Phase.DOWNSWING
Phase.SHOT: Phase.SHOT:
# Fast-forward when input is held: if reset_enabled and Input.is_action_just_pressed("shot_reset"):
world.fast_forward = Input.is_action_pressed("fast_forward", true)
if reset_enabled and Input.is_action_just_pressed("shot_reset", true):
phase = Phase.SHOT_RESET phase = Phase.SHOT_RESET
reset_enabled = false reset_enabled = false
return_ball() return_ball()
if Input.is_action_just_pressed("activate_ball", true): if Input.is_action_just_pressed("activate_ball"):
game_ball.activate_ability() game_ball.activate_ability()
if driving_range and Input.is_action_just_pressed("shot_accept", true): if driving_range and Input.is_action_just_pressed("shot_accept"):
phase = Phase.AIM phase = Phase.AIM
return_ball() return_ball()
Phase.FINISHED: Phase.FINISHED:
@ -755,5 +728,3 @@ func _on_idle_prompt_timer_timeout() -> void:
hud.show_power_prompt() hud.show_power_prompt()
Phase.CURVE_ADJUST: Phase.CURVE_ADJUST:
hud.show_curve_prompt() hud.show_curve_prompt()
Phase.SHOT:
hud.show_shot_prompt()

View File

@ -329,7 +329,7 @@ _data = {
} }
[sub_resource type="SphereShape3D" id="SphereShape3D_xvvdi"] [sub_resource type="SphereShape3D" id="SphereShape3D_xvvdi"]
radius = 2.0 radius = 1.5
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4n2rd"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4n2rd"]
transparency = 1 transparency = 1

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://dagh38vap4t1d"] [gd_scene load_steps=3 format=3 uid="uid://dagh38vap4t1d"]
[ext_resource type="PackedScene" uid="uid://mhycq1tk1bpm" path="res://assets/models/scenery/city/concrete_building_1/concrete_building_1.gltf" id="1_id6ph"] [ext_resource type="PackedScene" uid="uid://mhycq1tk1bpm" path="res://assets/models/scenery/city/concrete_building_1/concrete_building_1.gltf" id="1_id6ph"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="2_5x2lp"]
[sub_resource type="BoxShape3D" id="BoxShape3D_5g4vq"] [sub_resource type="BoxShape3D" id="BoxShape3D_5g4vq"]
size = Vector3(16, 24, 16) size = Vector3(16, 24, 16)
@ -10,10 +9,6 @@ size = Vector3(16, 24, 16)
[node name="StaticBody3D" type="StaticBody3D" parent="." index="1"] [node name="StaticBody3D" type="StaticBody3D" parent="." index="1"]
[node name="TerrainMarker" type="Node" parent="StaticBody3D" index="0"] [node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"]
script = ExtResource("2_5x2lp")
type = 5
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="1"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12, 0)
shape = SubResource("BoxShape3D_5g4vq") shape = SubResource("BoxShape3D_5g4vq")

View File

@ -1,8 +1,7 @@
[gd_scene load_steps=6 format=3 uid="uid://cjubxs7peir5k"] [gd_scene load_steps=5 format=3 uid="uid://cjubxs7peir5k"]
[ext_resource type="PackedScene" uid="uid://hwc1px831dgm" path="res://assets/models/scenery/city/kana_signboard/kana_signboard.gltf" id="1_o4tvg"] [ext_resource type="PackedScene" uid="uid://hwc1px831dgm" path="res://assets/models/scenery/city/kana_signboard/kana_signboard.gltf" id="1_o4tvg"]
[ext_resource type="Texture2D" uid="uid://d0lsrrx0r5wnu" path="res://assets/models/scenery/city/kana_signboard/kana_signboard.png" id="2_85s5u"] [ext_resource type="Texture2D" uid="uid://d0lsrrx0r5wnu" path="res://assets/models/scenery/city/kana_signboard/kana_signboard.png" id="2_85s5u"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="3_dllon"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dwyvb"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dwyvb"]
albedo_texture = ExtResource("2_85s5u") albedo_texture = ExtResource("2_85s5u")
@ -19,17 +18,13 @@ surface_material_override/0 = SubResource("StandardMaterial3D_dwyvb")
[node name="StaticBody3D" type="StaticBody3D" parent="." index="3"] [node name="StaticBody3D" type="StaticBody3D" parent="." index="3"]
[node name="TerrainMarker" type="Node" parent="StaticBody3D" index="0"] [node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"]
script = ExtResource("3_dllon")
type = 8
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="1"]
shape = SubResource("BoxShape3D_kp4b0") shape = SubResource("BoxShape3D_kp4b0")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D" index="2"] [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D" index="1"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 1.2)
shape = SubResource("BoxShape3D_kp4b0") shape = SubResource("BoxShape3D_kp4b0")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="StaticBody3D" index="3"] [node name="CollisionShape3D3" type="CollisionShape3D" parent="StaticBody3D" index="2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 1.2)
shape = SubResource("BoxShape3D_kp4b0") shape = SubResource("BoxShape3D_kp4b0")

View File

@ -1,11 +1,10 @@
[gd_scene load_steps=6 format=3 uid="uid://nqar1qcun8ax"] [gd_scene load_steps=5 format=3 uid="uid://nqar1qcun8ax"]
[ext_resource type="Script" path="res://src/props/scenery/highway/guard_rail/guard_rail.gd" id="1_imntf"] [ext_resource type="Script" path="res://src/props/scenery/highway/guard_rail/guard_rail.gd" id="1_imntf"]
[ext_resource type="Material" uid="uid://cift6p0wn1oce" path="res://assets/materials/guard_rail.tres" id="2_1s4wy"] [ext_resource type="Material" uid="uid://cift6p0wn1oce" path="res://assets/materials/guard_rail.tres" id="2_1s4wy"]
[ext_resource type="PlaneMesh" uid="uid://bdcmgvgpj1e0w" path="res://src/props/scenery/highway/guard_rail/guard_rail_post_mesh.tres" id="3_hha2c"] [ext_resource type="PlaneMesh" uid="uid://bdcmgvgpj1e0w" path="res://src/props/scenery/highway/guard_rail/guard_rail_post_mesh.tres" id="3_hha2c"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="3_nfjvf"]
[sub_resource type="MultiMesh" id="MultiMesh_1dcl6"] [sub_resource type="MultiMesh" id="MultiMesh_1o4mq"]
transform_format = 1 transform_format = 1
mesh = ExtResource("3_hha2c") mesh = ExtResource("3_hha2c")
@ -27,10 +26,6 @@ path_u_distance = 1.0
path_joined = false path_joined = false
material = ExtResource("2_1s4wy") material = ExtResource("2_1s4wy")
[node name="TerrainMarker" type="Node" parent="UpperRail"]
script = ExtResource("3_nfjvf")
type = 8
[node name="LowerRail" type="CSGPolygon3D" parent="."] [node name="LowerRail" type="CSGPolygon3D" parent="."]
use_collision = true use_collision = true
polygon = PackedVector2Array(0, 0.4, -0.01, 0.5, 0, 0.6, 0.01, 0.5) polygon = PackedVector2Array(0, 0.4, -0.01, 0.5, 0, 0.6, 0.01, 0.5)
@ -46,11 +41,7 @@ path_u_distance = 1.0
path_joined = false path_joined = false
material = ExtResource("2_1s4wy") material = ExtResource("2_1s4wy")
[node name="TerrainMarker" type="Node" parent="LowerRail"]
script = ExtResource("3_nfjvf")
type = 8
[node name="PostMultiMesh" type="MultiMeshInstance3D" parent="."] [node name="PostMultiMesh" type="MultiMeshInstance3D" parent="."]
multimesh = SubResource("MultiMesh_1dcl6") multimesh = SubResource("MultiMesh_1o4mq")
[connection signal="curve_changed" from="." to="." method="_on_curve_changed"] [connection signal="curve_changed" from="." to="." method="_on_curve_changed"]

View File

@ -1,7 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://d0tcr6uijpym5"] [gd_scene load_steps=3 format=3 uid="uid://d0tcr6uijpym5"]
[ext_resource type="Texture2D" uid="uid://dloe67udf7fpd" path="res://assets/textures/highway/highway_road_grass.png" id="1_f3xui"] [ext_resource type="Texture2D" uid="uid://dloe67udf7fpd" path="res://assets/textures/highway/highway_road_grass.png" id="1_f3xui"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="2_4f0hb"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nkovu"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nkovu"]
transparency = 1 transparency = 1
@ -26,7 +25,3 @@ path_continuous_u = true
path_u_distance = 1.0 path_u_distance = 1.0
path_joined = false path_joined = false
material = SubResource("StandardMaterial3D_nkovu") material = SubResource("StandardMaterial3D_nkovu")
[node name="TerrainMarker" type="Node" parent="CSGPolygon3D"]
script = ExtResource("2_4f0hb")
type = 5

View File

@ -1,7 +1,6 @@
[gd_scene load_steps=9 format=3 uid="uid://di7aql54lksn7"] [gd_scene load_steps=8 format=3 uid="uid://di7aql54lksn7"]
[ext_resource type="PackedScene" uid="uid://bgdgd3lky5w60" path="res://assets/models/scenery/trees/palm_tree/palm_tree.gltf" id="1_o3thn"] [ext_resource type="PackedScene" uid="uid://bgdgd3lky5w60" path="res://assets/models/scenery/trees/palm_tree/palm_tree.gltf" id="1_o3thn"]
[ext_resource type="Script" path="res://src/world/terrain_marker.gd" id="2_1lamy"]
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_bp5t6"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_bp5t6"]
data = PackedVector3Array(-0.6467, 5.2727, -3.6037, -0.7678, 3.663, -4.1571, 0.0705, 4.1529, -5.0529, 0.1793, 5.4514, -3.9613, 1.1035, 5.3325, -3.712, 0.2063, 5.6673, -3.3214, 0.2063, 5.6673, -3.3214, 1.1035, 5.3325, -3.712, 0.2526, 6.0382, -2.2225, -0.102, 1.5632, -4.5545, 0.9292, 3.4191, -4.4363, 0.0705, 4.1529, -5.0529, 0.0705, 4.1529, -5.0529, -0.7379, 3.4651, -4.2526, -0.102, 1.5632, -4.5545, 0.0705, 4.1529, -5.0529, 0.992, 3.6309, -4.3423, 1.1035, 5.3325, -3.712, 0.0705, 4.1529, -5.0529, 1.1035, 5.3325, -3.712, 0.1793, 5.4514, -3.9613, 0.0705, 4.1529, -5.0529, 0.1793, 5.4514, -3.9613, -0.6467, 5.2727, -3.6037, 0.2063, 5.6673, -3.3214, 0.2526, 6.0382, -2.2225, -0.4953, 5.4015, -3.3712, 0.2063, 5.6673, -3.3214, -0.6467, 5.2727, -3.6037, 0.1793, 5.4514, -3.9613) data = PackedVector3Array(-0.6467, 5.2727, -3.6037, -0.7678, 3.663, -4.1571, 0.0705, 4.1529, -5.0529, 0.1793, 5.4514, -3.9613, 1.1035, 5.3325, -3.712, 0.2063, 5.6673, -3.3214, 0.2063, 5.6673, -3.3214, 1.1035, 5.3325, -3.712, 0.2526, 6.0382, -2.2225, -0.102, 1.5632, -4.5545, 0.9292, 3.4191, -4.4363, 0.0705, 4.1529, -5.0529, 0.0705, 4.1529, -5.0529, -0.7379, 3.4651, -4.2526, -0.102, 1.5632, -4.5545, 0.0705, 4.1529, -5.0529, 0.992, 3.6309, -4.3423, 1.1035, 5.3325, -3.712, 0.0705, 4.1529, -5.0529, 1.1035, 5.3325, -3.712, 0.1793, 5.4514, -3.9613, 0.0705, 4.1529, -5.0529, 0.1793, 5.4514, -3.9613, -0.6467, 5.2727, -3.6037, 0.2063, 5.6673, -3.3214, 0.2526, 6.0382, -2.2225, -0.4953, 5.4015, -3.3712, 0.2063, 5.6673, -3.3214, -0.6467, 5.2727, -3.6037, 0.1793, 5.4514, -3.9613)
@ -45,35 +44,26 @@ bones/10/rotation = Quaternion(0.183326, -0.237737, -0.342496, 0.890264)
bones/10/scale = Vector3(1, 1, 1) 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="LeafBody" type="StaticBody3D" parent="." index="2"] [node name="StaticBody3D" type="StaticBody3D" parent="." index="2"]
collision_layer = 2147483649
[node name="TerrainMarker" type="Node" parent="LeafBody" index="0"] [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D" index="0"]
script = ExtResource("2_1lamy")
type = 1
[node name="CollisionShape3D2" type="CollisionShape3D" parent="LeafBody" index="1"]
shape = SubResource("ConcavePolygonShape3D_bp5t6") shape = SubResource("ConcavePolygonShape3D_bp5t6")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="LeafBody" index="2"] [node name="CollisionShape3D3" type="CollisionShape3D" parent="StaticBody3D" index="1"]
shape = SubResource("ConcavePolygonShape3D_j5qxc") shape = SubResource("ConcavePolygonShape3D_j5qxc")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="LeafBody" index="3"] [node name="CollisionShape3D4" type="CollisionShape3D" parent="StaticBody3D" index="2"]
shape = SubResource("ConcavePolygonShape3D_eopyd") shape = SubResource("ConcavePolygonShape3D_eopyd")
[node name="CollisionShape3D5" type="CollisionShape3D" parent="LeafBody" index="4"] [node name="CollisionShape3D5" type="CollisionShape3D" parent="StaticBody3D" index="3"]
shape = SubResource("ConcavePolygonShape3D_npgp7") shape = SubResource("ConcavePolygonShape3D_npgp7")
[node name="CollisionShape3D6" type="CollisionShape3D" parent="LeafBody" index="5"] [node name="CollisionShape3D6" type="CollisionShape3D" parent="StaticBody3D" index="4"]
shape = SubResource("ConcavePolygonShape3D_xl1fh") shape = SubResource("ConcavePolygonShape3D_xl1fh")
[node name="TrunkBody" type="StaticBody3D" parent="." index="3"] [node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="5"]
[node name="TerrainMarker" type="Node" parent="TrunkBody" index="0"]
script = ExtResource("2_1lamy")
type = 7
[node name="CollisionShape3D" type="CollisionShape3D" parent="TrunkBody" index="1"]
shape = SubResource("ConcavePolygonShape3D_lol7j") shape = SubResource("ConcavePolygonShape3D_lol7j")
[node name="AnimationPlayer" parent="." index="4"] [node name="AnimationPlayer" parent="." index="3"]
autoplay = "sway_circle" autoplay = "sway_circle"

View File

@ -1,108 +0,0 @@
// https://www.shadertoy.com/view/MdffD7
// Fork of FMS_Cat's VCR distortion shader
// Retrieved from https://godotshaders.com/shader/vhs-post-processing/
shader_type canvas_item;
// TODO: Add uniforms for tape crease discoloration and image jiggle
uniform sampler2D screen_texture: hint_screen_texture, filter_linear_mipmap, repeat_disable;
uniform vec2 vhs_resolution = vec2(320.0, 240.0);
uniform int samples = 2;
uniform float crease_noise: hint_range(0.0, 2.0, 0.1) = 1.0;
uniform float crease_opacity: hint_range(0.0, 1.0, 0.1) = 0.5;
uniform float filter_intensity: hint_range(0.0, 1.0, 0.1) = 0.1;
group_uniforms tape_crease;
uniform float tape_crease_smear: hint_range(0.0, 2.0, 0.1) = 0.2;
uniform float tape_crease_intensity: hint_range(0.0, 1.0, 0.1) = 0.2;
uniform float tape_crease_jitter: hint_range(0.0, 1.0, 0.01) = 0.10;
uniform float tape_crease_speed: hint_range(-2.0, 2.0, 0.1) = 0.5;
uniform float tape_crease_discoloration: hint_range(0.0, 2.0, 0.1) = 1.0;
group_uniforms bottom_border;
uniform float bottom_border_thickness: hint_range(0.0,32.0, 0.1) = 6.0;
uniform float bottom_border_jitter: hint_range(0.0, 24.0, 0.5) = 6.0;
group_uniforms noise;
uniform float noise_intensity: hint_range(0.0, 1.0, 0.1) = 0.1;
uniform sampler2D noise_texture: filter_linear_mipmap, repeat_enable;
float v2random(vec2 uv) {
return texture(noise_texture, mod(uv, vec2(1.0))).x;
}
mat2 rotate2D(float t) {
return mat2(vec2(cos(t), sin(t)), vec2(-sin(t), cos(t)));
}
vec3 rgb2yiq(vec3 rgb) {
return mat3(vec3(0.299, 0.596, 0.211), vec3(0.587, -0.274, -0.523), vec3(0.114, -0.322, 0.312)) * rgb;
}
vec3 yiq2rgb(vec3 yiq) {
return mat3(vec3(1.0, 1.0, 1.0), vec3(0.956, -0.272, -1.106), vec3(0.621, -0.647, 1.703)) * yiq;
}
vec3 vhx_tex_2D(sampler2D tex, vec2 uv, float rot) {
vec3 yiq = vec3(0.0);
for (int i = 0; i < samples; i++) {
yiq += rgb2yiq(texture(tex, uv - vec2(float(i), 0.0) / vhs_resolution).xyz) *
vec2(float(i), float(samples - 1 - i)).yxx / float(samples - 1)
/ float(samples) * 2.0;
}
if (rot != 0.0) {
yiq.yz *= rotate2D(rot * tape_crease_discoloration);
}
return yiq2rgb(yiq);
}
void fragment() {
vec2 uvn = UV;
vec3 col = vec3(0.0, 0.0, 0.0);
// Tape wave.
uvn.x += (v2random(vec2(uvn.y / 10.0, TIME / 10.0) / 1.0) - 0.5) / vhs_resolution.x * 1.0;
uvn.x += (v2random(vec2(uvn.y, TIME * 10.0)) - 0.5) / vhs_resolution.x * 1.0;
// tape crease
float tc_phase = smoothstep(0.9, 0.96, sin(uvn.y * 8.0 - (TIME * tape_crease_speed + tape_crease_jitter * v2random(TIME * vec2(0.67, 0.59))) * PI * 1.2));
float tc_noise = smoothstep(0.3, 1.0, v2random(vec2(uvn.y * 4.77, TIME)));
float tc = tc_phase * tc_noise;
uvn.x = uvn.x - tc / vhs_resolution.x * 8.0 * tape_crease_smear;
// switching noise
float sn_phase = smoothstep(1.0 - bottom_border_thickness / vhs_resolution.y, 1.0, uvn.y);
uvn.x += sn_phase * (v2random(vec2(UV.y * 100.0, TIME * 10.0)) - 0.5) / vhs_resolution.x * bottom_border_jitter;
// fetch
col = vhx_tex_2D(screen_texture, uvn, tc_phase * 0.2 + sn_phase * 2.0);
// crease noise
float cn = tc_noise * crease_noise * (0.7 * tc_phase * tape_crease_intensity + 0.3);
if (0.29 < cn) {
vec2 V = vec2(0.0, crease_opacity);
vec2 uvt = (uvn + V.yx * v2random(vec2(uvn.y, TIME))) * vec2(0.1, 1.0);
float n0 = v2random(uvt);
float n1 = v2random(uvt + V.yx / vhs_resolution.x);
if (n1 < n0) {
col = mix(col, 2.0 * V.yyy, pow(n0, 10.0));
}
}
// ac beat
col *= 1.0 + 0.1 * smoothstep(0.4, 0.6, v2random(vec2(0.0, 0.1 * (UV.y + TIME * 0.2)) / 10.0));
// color noise
col *= 1.0 - noise_intensity * 0.5 + noise_intensity * texture(noise_texture, mod(uvn * vec2(1.0, 1.0) + TIME * vec2(5.97, 4.45), vec2(1.0))).xyz;
col = clamp(col, 0.0, 1.0);
// yiq
col = rgb2yiq(col);
col = vec3(0.9, 1.1, 1.5) * col + vec3(0.1, -0.1, 0.0) * filter_intensity;
col = yiq2rgb(col);
COLOR = vec4(col, 1.0);
}

View File

@ -63,8 +63,7 @@ var _cached_vel: Vector3
func set_ball(ball: GameBall) -> void: func set_ball(ball: GameBall) -> void:
global_position = ball.global_position global_position = ball.global_position
linear_damp = ball.terrain_physics.default.linear_damp linear_damp = ball.linear_damp
print("using linear damp: ", linear_damp)
func _process(_delta: float) -> void: func _process(_delta: float) -> void:

View File

@ -31,10 +31,10 @@ func camera_motion(motion: Vector2) -> void:
) )
func _physics_process(_delta: float) -> void: func _physics_process(delta: float) -> void:
# Rotation # Rotation
rotation.y = lerp_angle(rotation.y, _target.y, Game.settings.x_acceleration / 60.0) rotation.y = lerp_angle(rotation.y, _target.y, delta * Game.settings.x_acceleration)
rotation.x = lerp_angle(rotation.x, _target.x, Game.settings.y_acceleration / 60.0) rotation.x = lerp_angle(rotation.x, _target.x, delta * Game.settings.y_acceleration)
# Handle spatial movement # Handle spatial movement
var xz_input := Input.get_vector("camera_left", "camera_right", "camera_forward", "camera_back") var xz_input := Input.get_vector("camera_left", "camera_right", "camera_forward", "camera_back")
@ -42,7 +42,7 @@ func _physics_process(_delta: float) -> void:
var direction := (transform.basis * Vector3(xz_input.x, y_input.y, xz_input.y)).normalized() var direction := (transform.basis * Vector3(xz_input.x, y_input.y, xz_input.y)).normalized()
var speed := Game.settings.free_camera_speed var speed := Game.settings.free_camera_speed
if Input.is_action_pressed("camera_sprint", true): if Input.is_action_pressed("camera_sprint"):
speed *= SPRINT_MULT speed *= SPRINT_MULT
if direction: if direction:

View File

@ -1,9 +1,46 @@
[gd_scene load_steps=3 format=3 uid="uid://dd17ce110sw6p"] [gd_scene load_steps=7 format=3 uid="uid://dd17ce110sw6p"]
[ext_resource type="Script" path="res://src/ui/camera/free_camera/free_camera.gd" id="1_3gm3q"] [ext_resource type="Script" path="res://src/ui/camera/free_camera/free_camera.gd" id="1_3gm3q"]
[ext_resource type="PackedScene" uid="uid://b47goj32i6sdh" path="res://src/ui/elements/input_prompt/input_prompt.tscn" id="2_6hucw"]
[sub_resource type="SphereShape3D" id="SphereShape3D_wmusx"] [sub_resource type="SphereShape3D" id="SphereShape3D_wmusx"]
[sub_resource type="Animation" id="Animation_vc2i5"]
resource_name = "RESET"
length = 0.001
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:offset_bottom")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0),
"points": PackedFloat32Array(0, -0.2, 0, 0.2, 0),
"times": PackedFloat32Array(0)
}
[sub_resource type="Animation" id="Animation_8gctc"]
resource_name = "show"
length = 0.4
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:offset_bottom")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(0, -0.2, 0, 0.2, 0, 55, -0.2, 0, 0.2, 0),
"times": PackedFloat32Array(0, 0.4)
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_fk25i"]
_data = {
"RESET": SubResource("Animation_vc2i5"),
"show": SubResource("Animation_8gctc")
}
[node name="FreeCamera" type="CharacterBody3D"] [node name="FreeCamera" type="CharacterBody3D"]
process_mode = 3 process_mode = 3
collision_layer = 0 collision_layer = 0
@ -16,3 +53,42 @@ shape = SubResource("SphereShape3D_wmusx")
[node name="Camera3D" type="Camera3D" parent="."] [node name="Camera3D" type="Camera3D" parent="."]
current = true current = true
far = 8192.0 far = 8192.0
[node name="FreeCamHUD" type="Control" parent="."]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="UtilityPrompts" type="MarginContainer" parent="FreeCamHUD"]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.5
anchor_right = 0.5
grow_horizontal = 2
grow_vertical = 0
theme_override_constants/margin_top = 16
theme_override_constants/margin_right = 16
[node name="HBoxContainer" type="HBoxContainer" parent="FreeCamHUD/UtilityPrompts"]
layout_mode = 2
theme_override_constants/separation = 64
[node name="InputPrompt" parent="FreeCamHUD/UtilityPrompts/HBoxContainer" instance=ExtResource("2_6hucw")]
layout_mode = 2
text = "❓ - ACTION_camera_sprint"
action = &"camera_sprint"
[node name="InputPrompt2" parent="FreeCamHUD/UtilityPrompts/HBoxContainer" instance=ExtResource("2_6hucw")]
layout_mode = 2
text = "❓ - ACTION_camera_cancel"
action = &"camera_cancel"
[node name="AimEquipPromptAnimation" type="AnimationPlayer" parent="FreeCamHUD/UtilityPrompts"]
unique_name_in_owner = true
libraries = {
"": SubResource("AnimationLibrary_fk25i")
}
autoplay = "show"

View File

@ -3,22 +3,14 @@ extends Label
## A prompt with the input symbol bound to the given action. ## A prompt with the input symbol bound to the given action.
const PROMPT_FORMAT := "{0} - {1}" const PROMPT_FORMAT := "{0} - {1}"
const HOLD_FORMAT := "{0} {1}"
const UNKNOWN_LABEL_SYM := "[unknown]" const UNKNOWN_LABEL_SYM := "[unknown]"
const ACTION_HOLD_KEY := "ACTION_HOLD_MODIFIER"
@export var action: StringName: @export var action: StringName:
set(value): set(value):
action = value action = value
_update() _update()
@export var hold := false:
set(value):
hold = value
_update()
@export var show_name := true: @export var show_name := true:
set(value): set(value):
show_name = value show_name = value
@ -45,19 +37,12 @@ func _update() -> void:
if not input_symbol: if not input_symbol:
input_symbol = str(PromptMap.UNKNOWN_INPUT_SYMBOL) input_symbol = str(PromptMap.UNKNOWN_INPUT_SYMBOL)
if hold:
input_symbol = HOLD_FORMAT.format([input_symbol, tr(ACTION_HOLD_KEY)])
if show_name: if show_name:
text = ( text = PROMPT_FORMAT.format(
PROMPT_FORMAT
. format(
[ [
input_symbol, input_symbol if input_symbol else str(PromptMap.UNKNOWN_INPUT_SYMBOL),
loc_action if loc_action else str(action), loc_action if loc_action else str(action)
] ]
) )
)
else: else:
text = input_symbol text = input_symbol

Some files were not shown because too many files have changed in this diff Show More