Compare commits

..

8 Commits

26 changed files with 599 additions and 15 deletions

BIN
asset_dev/balls/brick/brick.blend (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
asset_dev/balls/brick/brick_uv_layout.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,120 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.2.60",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Brick"
}
],
"materials":[
{
"doubleSided":true,
"name":"Brick",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.6121358871459961,
0.21650230884552002,
0.09049086272716522,
1
],
"metallicFactor":0
}
}
],
"meshes":[
{
"name":"Cube",
"primitives":[
{
"attributes":{
"POSITION":0,
"NORMAL":1,
"TEXCOORD_0":2
},
"indices":3,
"material":0
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":24,
"max":[
0.09207499027252197,
0.05715000629425049,
0.1936749815940857
],
"min":[
-0.09207499027252197,
-0.05715000629425049,
-0.1936749815940857
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":24,
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":24,
"type":"VEC2"
},
{
"bufferView":3,
"componentType":5123,
"count":36,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":288,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":288,
"byteOffset":288,
"target":34962
},
{
"buffer":0,
"byteLength":192,
"byteOffset":576,
"target":34962
},
{
"buffer":0,
"byteLength":72,
"byteOffset":768,
"target":34963
}
],
"buffers":[
{
"byteLength":840,
"uri":"brick.bin"
}
]
}

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b1aslqfbciwg8"
path="res://.godot/imported/brick.gltf-c734431c3027107f004874542c5d8b9c.scn"
[deps]
source_file="res://assets/models/balls/brick/brick.gltf"
dest_files=["res://.godot/imported/brick.gltf-c734431c3027107f004874542c5d8b9c.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

@ -19,6 +19,9 @@ SETTINGS_GAME_ACCESSIBILITY_HEADING,Accessibility
SETTINGS_GAME_CAMERA_HEADING,Camera SETTINGS_GAME_CAMERA_HEADING,Camera
SETTINGS_SCREEN_SHAKE,"Enable Screen Shake" SETTINGS_SCREEN_SHAKE,"Enable Screen Shake"
SETTINGS_HIT_LAG,"Enable Hit Lag Effect" SETTINGS_HIT_LAG,"Enable Hit Lag Effect"
SETTINGS_GAME_GAMEPLAY_HEADING,Gameplay
SETTINGS_PROJECTION_COLLISIONS,"Enable Shot Projection Collisions"
SETTINGS_PROJECTION_GRAVITY,"Use Local Gravity for Shot Projection"
SETTINGS_FREE_CAMERA_SPEED,"Free Camera Speed" SETTINGS_FREE_CAMERA_SPEED,"Free Camera Speed"
SETTINGS_SENSITIVITY_X,"Sensitivity, Horizontal" SETTINGS_SENSITIVITY_X,"Sensitivity, Horizontal"
SETTINGS_SENSITIVITY_Y,"Sensitivity, Vertical" SETTINGS_SENSITIVITY_Y,"Sensitivity, Vertical"
@ -27,6 +30,40 @@ SETTINGS_ACCELERATION_Y,"Acceleration, Vertical"
SETTINGS_INVERT_PITCH,"Invert Pitch" SETTINGS_INVERT_PITCH,"Invert Pitch"
SETTINGS_GRAPHICS,Graphics SETTINGS_GRAPHICS,Graphics
SETTINGS_GRAPHICS_HEADING,"Graphics & Display" SETTINGS_GRAPHICS_HEADING,"Graphics & Display"
SETTINGS_GRAPHICS_DISPLAY_HEADING,Display
SETTINGS_GRAPHICS_FULLSCREEN,Fullscreen
SETTINGS_GRAPHICS_VSYNC,V-Sync
SETTINGS_GRAPHICS_AA_HEADING,Antialiasing
SETTINGS_GRAPHICS_MSAA,MSAA
SETTINGS_GRAPHICS_MSAA_0,"Disabled (Fastest)"
SETTINGS_GRAPHICS_MSAA_2,"2× (Average)"
SETTINGS_GRAPHICS_MSAA_4,"4× (Slow)"
SETTINGS_GRAPHICS_MSAA_8,"8× (Slowest)"
SETTINGS_GRAPHICS_FXAA,"Enable FXAA"
SETTINGS_GRAPHICS_TAA,"Enable TAA"
SETTINGS_GRAPHICS_DEBANDING,"Use Debanding"
SETTINGS_GRAPHICS_TEXTURES_HEADING,Textures
SETTINGS_GRAPHICS_ANISOTROPIC,"Anisotropic Filtering Level (requires restart)"
SETTINGS_GRAPHICS_ANISOTROPIC_0,"Disabled (Fastest)"
SETTINGS_GRAPHICS_ANISOTROPIC_1,"2× (Faster)"
SETTINGS_GRAPHICS_ANISOTROPIC_2,"4× (Fast)"
SETTINGS_GRAPHICS_ANISOTROPIC_3,"8× (Average)"
SETTINGS_GRAPHICS_ANISOTROPIC_4,"16× (Slow)"
SETTINGS_GRAPHICS_LIGHTING_HEADING,"Light & Shadows"
SETTINGS_GRAPHICS_SHADOW_QUALITY,"Directional Shadow Quality (requires restart)"
SETTINGS_GRAPHICS_SHADOW_QUALITY_0,"Lowest (256)"
SETTINGS_GRAPHICS_SHADOW_QUALITY_1,"Low (2048)"
SETTINGS_GRAPHICS_SHADOW_QUALITY_2,"Average (4096)"
SETTINGS_GRAPHICS_SHADOW_QUALITY_3,"High (8192)"
SETTINGS_GRAPHICS_SHADOW_QUALITY_4,"Higher (16384)"
SETTINGS_GRAPHICS_SHADOW_QUALITY_5,"Ultra (32768)"
SETTINGS_GRAPHICS_SHADOW_FILTER,"Directional Soft Shadow Filter Quality (requires restart)"
SETTINGS_GRAPHICS_SHADOW_FILTER_0,"Hard (Fastest)"
SETTINGS_GRAPHICS_SHADOW_FILTER_1,"Soft Very Low (Faster)"
SETTINGS_GRAPHICS_SHADOW_FILTER_2,"Soft Low (Fast)"
SETTINGS_GRAPHICS_SHADOW_FILTER_3,"Soft Medium (Average)"
SETTINGS_GRAPHICS_SHADOW_FILTER_4,"Soft High (Slow)"
SETTINGS_GRAPHICS_SHADOW_FILTER_5,"Soft Ultra (Slowest)"
SETTINGS_AUDIO,Audio SETTINGS_AUDIO,Audio
SETTINGS_AUDIO_HEADING,"Audio Settings" SETTINGS_AUDIO_HEADING,"Audio Settings"
SETTINGS_CONTROLS,Controls SETTINGS_CONTROLS,Controls
@ -64,3 +101,4 @@ CLUB_PUTTER,Putter
, ,
BALL_BASIC,Basic BALL_BASIC,Basic
BALL_PLASMA,Plasma BALL_PLASMA,Plasma
BALL_BRICK,Brick

1 keys en
19 SETTINGS_GAME_CAMERA_HEADING Camera
20 SETTINGS_SCREEN_SHAKE Enable Screen Shake
21 SETTINGS_HIT_LAG Enable Hit Lag Effect
22 SETTINGS_GAME_GAMEPLAY_HEADING Gameplay
23 SETTINGS_PROJECTION_COLLISIONS Enable Shot Projection Collisions
24 SETTINGS_PROJECTION_GRAVITY Use Local Gravity for Shot Projection
25 SETTINGS_FREE_CAMERA_SPEED Free Camera Speed
26 SETTINGS_SENSITIVITY_X Sensitivity, Horizontal
27 SETTINGS_SENSITIVITY_Y Sensitivity, Vertical
30 SETTINGS_INVERT_PITCH Invert Pitch
31 SETTINGS_GRAPHICS Graphics
32 SETTINGS_GRAPHICS_HEADING Graphics & Display
33 SETTINGS_GRAPHICS_DISPLAY_HEADING Display
34 SETTINGS_GRAPHICS_FULLSCREEN Fullscreen
35 SETTINGS_GRAPHICS_VSYNC V-Sync
36 SETTINGS_GRAPHICS_AA_HEADING Antialiasing
37 SETTINGS_GRAPHICS_MSAA MSAA
38 SETTINGS_GRAPHICS_MSAA_0 Disabled (Fastest)
39 SETTINGS_GRAPHICS_MSAA_2 2× (Average)
40 SETTINGS_GRAPHICS_MSAA_4 4× (Slow)
41 SETTINGS_GRAPHICS_MSAA_8 8× (Slowest)
42 SETTINGS_GRAPHICS_FXAA Enable FXAA
43 SETTINGS_GRAPHICS_TAA Enable TAA
44 SETTINGS_GRAPHICS_DEBANDING Use Debanding
45 SETTINGS_GRAPHICS_TEXTURES_HEADING Textures
46 SETTINGS_GRAPHICS_ANISOTROPIC Anisotropic Filtering Level (requires restart)
47 SETTINGS_GRAPHICS_ANISOTROPIC_0 Disabled (Fastest)
48 SETTINGS_GRAPHICS_ANISOTROPIC_1 2× (Faster)
49 SETTINGS_GRAPHICS_ANISOTROPIC_2 4× (Fast)
50 SETTINGS_GRAPHICS_ANISOTROPIC_3 8× (Average)
51 SETTINGS_GRAPHICS_ANISOTROPIC_4 16× (Slow)
52 SETTINGS_GRAPHICS_LIGHTING_HEADING Light & Shadows
53 SETTINGS_GRAPHICS_SHADOW_QUALITY Directional Shadow Quality (requires restart)
54 SETTINGS_GRAPHICS_SHADOW_QUALITY_0 Lowest (256)
55 SETTINGS_GRAPHICS_SHADOW_QUALITY_1 Low (2048)
56 SETTINGS_GRAPHICS_SHADOW_QUALITY_2 Average (4096)
57 SETTINGS_GRAPHICS_SHADOW_QUALITY_3 High (8192)
58 SETTINGS_GRAPHICS_SHADOW_QUALITY_4 Higher (16384)
59 SETTINGS_GRAPHICS_SHADOW_QUALITY_5 Ultra (32768)
60 SETTINGS_GRAPHICS_SHADOW_FILTER Directional Soft Shadow Filter Quality (requires restart)
61 SETTINGS_GRAPHICS_SHADOW_FILTER_0 Hard (Fastest)
62 SETTINGS_GRAPHICS_SHADOW_FILTER_1 Soft Very Low (Faster)
63 SETTINGS_GRAPHICS_SHADOW_FILTER_2 Soft Low (Fast)
64 SETTINGS_GRAPHICS_SHADOW_FILTER_3 Soft Medium (Average)
65 SETTINGS_GRAPHICS_SHADOW_FILTER_4 Soft High (Slow)
66 SETTINGS_GRAPHICS_SHADOW_FILTER_5 Soft Ultra (Slowest)
67 SETTINGS_AUDIO Audio
68 SETTINGS_AUDIO_HEADING Audio Settings
69 SETTINGS_CONTROLS Controls
101
102 BALL_BASIC Basic
103 BALL_PLASMA Plasma
104 BALL_BRICK Brick

View File

@ -1,10 +1,11 @@
[gd_scene load_steps=61 format=3 uid="uid://bm2o3mex10v11"] [gd_scene load_steps=62 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="Shader" path="res://src/shaders/psx_water.gdshader" id="6_0efu4"] [ext_resource type="Shader" path="res://src/shaders/psx_water.gdshader" id="6_0efu4"]
[ext_resource type="Texture2D" uid="uid://c47ern0l2d50r" path="res://assets/vista_2.png" id="6_ectru"] [ext_resource type="Texture2D" uid="uid://c47ern0l2d50r" path="res://assets/vista_2.png" id="6_ectru"]
[ext_resource type="Texture2D" uid="uid://con5a36t6n6sq" path="res://assets/textures/clear_sea_water_2048x2048.png" id="7_t86h2"] [ext_resource type="Texture2D" uid="uid://con5a36t6n6sq" path="res://assets/textures/clear_sea_water_2048x2048.png" id="7_t86h2"]
[ext_resource type="Script" path="res://src/world/ball_zone/ball_zone.gd" id="9_jwlau"] [ext_resource type="Script" path="res://src/world/ball_zone/ball_zone.gd" id="9_jwlau"]
[ext_resource type="PackedScene" uid="uid://1s3gywmoi20e" path="res://src/characters/player_characters/gfolf_girl/gfolf_girl.tscn" id="10_8tu3b"]
[ext_resource type="PackedScene" uid="uid://dagh38vap4t1d" path="res://src/props/scenery/city/concrete_building_1.tscn" id="10_lf15j"] [ext_resource type="PackedScene" uid="uid://dagh38vap4t1d" path="res://src/props/scenery/city/concrete_building_1.tscn" id="10_lf15j"]
[ext_resource type="PackedScene" uid="uid://cjubxs7peir5k" path="res://src/props/scenery/city/kana_signboard.tscn" id="11_evxup"] [ext_resource type="PackedScene" uid="uid://cjubxs7peir5k" path="res://src/props/scenery/city/kana_signboard.tscn" id="11_evxup"]
[ext_resource type="PackedScene" uid="uid://di7aql54lksn7" path="res://src/props/scenery/trees/palm_tree/palm_tree.tscn" id="12_sswxf"] [ext_resource type="PackedScene" uid="uid://di7aql54lksn7" path="res://src/props/scenery/trees/palm_tree/palm_tree.tscn" id="12_sswxf"]
@ -312,7 +313,12 @@ camera_attributes = SubResource("CameraAttributesPractical_ypy22")
transform = Transform3D(0.782608, -0.611691, 0.11558, 0, 0.185667, 0.982613, -0.622515, -0.769001, 0.145304, 0, 0, 0) 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_enabled = true
shadow_blur = 4.0 shadow_blur = 4.0
directional_shadow_max_distance = 160.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="Course" type="Node3D" parent="."] [node name="Course" type="Node3D" parent="."]
@ -374,6 +380,9 @@ draw_pass_1 = SubResource("QuadMesh_l4j8a")
[node name="DemoCamera" type="Camera3D" parent="Course" groups=["DemoCamera"]] [node name="DemoCamera" type="Camera3D" parent="Course" groups=["DemoCamera"]]
transform = Transform3D(-0.734269, 0.305072, -0.606448, 0, 0.893336, 0.44939, 0.678858, 0.329973, -0.655949, 143.463, 90.0707, 223.738) transform = Transform3D(-0.734269, 0.305072, -0.606448, 0, 0.893336, 0.44939, 0.678858, 0.329973, -0.655949, 143.463, 90.0707, 223.738)
[node name="GfolfGirl" parent="Course" instance=ExtResource("10_8tu3b")]
transform = Transform3D(0.909686, 0, 0.415297, 0, 1, 0, -0.415297, 0, 0.909686, 537.767, 4, 452.434)
[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)

View File

@ -62,6 +62,8 @@ config/controls/camera/invert_pitch=false
config/accessibility/enable_screen_shake=true config/accessibility/enable_screen_shake=true
config/accessibility/enable_hit_lag=true config/accessibility/enable_hit_lag=true
audio/buses/override_bus_layout="user://audio_bus_layout.tres" audio/buses/override_bus_layout="user://audio_bus_layout.tres"
config/gameplay/projection/detect_collision=true
config/gameplay/projection/use_local_gravity=true
[global_group] [global_group]
@ -242,3 +244,5 @@ jolt_3d/limits/max_temporary_memory=64
[rendering] [rendering]
textures/canvas_textures/default_texture_filter=0 textures/canvas_textures/default_texture_filter=0
lights_and_shadows/directional_shadow/size=8192
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=3

View File

@ -0,0 +1,26 @@
[gd_scene load_steps=5 format=3 uid="uid://cc8molh324unk"]
[ext_resource type="PackedScene" uid="uid://dfttci386ohip" path="res://src/equipment/balls/physics_ball/physics_ball.tscn" id="1_y1dte"]
[ext_resource type="PackedScene" uid="uid://b1aslqfbciwg8" path="res://assets/models/balls/brick/brick.gltf" id="2_ubuxr"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_f03f4"]
rough = true
bounce = 1.0
absorbent = true
[sub_resource type="BoxShape3D" id="BoxShape3D_7v3re"]
size = Vector3(0.147, 0.092, 0.31)
[node name="Brick" instance=ExtResource("1_y1dte")]
mass = 0.08
physics_material_override = SubResource("PhysicsMaterial_f03f4")
radius = 0.15
[node name="BrickMesh" parent="." index="0" instance=ExtResource("2_ubuxr")]
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0)
[node name="BallMesh" parent="." index="1"]
visible = false
[node name="CollisionShape3D" parent="." index="2"]
shape = SubResource("BoxShape3D_7v3re")

View File

@ -9,6 +9,7 @@ enum Type {
NONE, NONE,
BASIC, BASIC,
PLASMA, PLASMA,
BRICK,
} }
const TERRAIN_DAMPING_EPSILON := 1e-6 const TERRAIN_DAMPING_EPSILON := 1e-6
@ -38,6 +39,9 @@ const MAGNUS_EPSILON := 1e-3
## Scaling factor for additional force-based damage ## Scaling factor for additional force-based damage
@export var damage_force_scale := 0.01 @export var damage_force_scale := 0.01
## Approximate average radius, for physics purposes
@export var radius := 0.05
var current_gravity: Vector3 var current_gravity: Vector3
var _last_contact_normal: Vector3 = Vector3.UP var _last_contact_normal: Vector3 = Vector3.UP

View File

@ -1,9 +1,10 @@
[gd_scene load_steps=9 format=3 uid="uid://cefit4bc8akbb"] [gd_scene load_steps=10 format=3 uid="uid://cefit4bc8akbb"]
[ext_resource type="Script" path="res://src/game/game.gd" id="1_4qa87"] [ext_resource type="Script" path="res://src/game/game.gd" id="1_4qa87"]
[ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="2_y3adf"] [ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="2_y3adf"]
[ext_resource type="Script" path="res://src/ui/decorations/rumbler.gd" id="3_3vfdb"] [ext_resource type="Script" path="res://src/ui/decorations/rumbler.gd" id="3_3vfdb"]
[ext_resource type="Script" path="res://src/ui/game_viewport_container.gd" id="3_rmm5i"] [ext_resource type="Script" path="res://src/ui/game_viewport_container.gd" id="3_rmm5i"]
[ext_resource type="Script" path="res://src/game/game_viewport.gd" id="5_v2qv5"]
[sub_resource type="Animation" id="Animation_c3dlb"] [sub_resource type="Animation" id="Animation_c3dlb"]
length = 0.001 length = 0.001
@ -192,6 +193,7 @@ use_taa = true
audio_listener_enable_3d = true audio_listener_enable_3d = true
size = Vector2i(1920, 1080) size = Vector2i(1920, 1080)
render_target_update_mode = 4 render_target_update_mode = 4
script = ExtResource("5_v2qv5")
[node name="Content" type="Node" parent="RootControl/Rumbler/ViewportContainer/Viewport"] [node name="Content" type="Node" parent="RootControl/Rumbler/ViewportContainer/Viewport"]
unique_name_in_owner = true unique_name_in_owner = true

View File

@ -13,6 +13,9 @@ var invert_pitch: bool
var enable_screen_shake: bool var enable_screen_shake: bool
var enable_hit_lag: bool var enable_hit_lag: bool
var projection_collisions: bool
var projection_gravity: bool
func _init() -> void: func _init() -> void:
ProjectSettings.settings_changed.connect(_read_settings) ProjectSettings.settings_changed.connect(_read_settings)
@ -36,6 +39,13 @@ func _read_settings() -> void:
) )
enable_hit_lag = ProjectSettings.get_setting("game/config/accessibility/enable_hit_lag") enable_hit_lag = ProjectSettings.get_setting("game/config/accessibility/enable_hit_lag")
projection_collisions = ProjectSettings.get_setting(
"game/config/gameplay/projection/detect_collision"
)
projection_gravity = ProjectSettings.get_setting(
"game/config/gameplay/projection/use_local_gravity"
)
func _load_audio_bus_override() -> void: func _load_audio_bus_override() -> void:
# Load override audio bus file # Load override audio bus file

16
src/game/game_viewport.gd Normal file
View File

@ -0,0 +1,16 @@
extends SubViewport
## Logic for dynamically resetting viewport graphics settings
func _ready() -> void:
ProjectSettings.settings_changed.connect(apply_rendering_settings)
func apply_rendering_settings() -> void:
print_debug("Applying rendering settings to viewport")
msaa_2d = ProjectSettings.get_setting("rendering/anti_aliasing/quality/msaa_2d")
msaa_3d = ProjectSettings.get_setting("rendering/anti_aliasing/quality/msaa_3d")
screen_space_aa = ProjectSettings.get_setting("rendering/anti_aliasing/quality/screen_space_aa")
use_taa = ProjectSettings.get_setting("rendering/anti_aliasing/quality/use_taa")
use_debanding = ProjectSettings.get_setting("rendering/anti_aliasing/quality/use_debanding")

View File

@ -17,5 +17,6 @@ wedge = ExtResource("5_wm4ae")
putter = ExtResource("3_tytwr") putter = ExtResource("3_tytwr")
_balls = { _balls = {
1: -1, 1: -1,
2: 5 2: 5,
3: -1
} }

View File

@ -8,6 +8,7 @@ signal ball_changed(ball: GameBall)
const SCENE_MAP: Dictionary = { const SCENE_MAP: Dictionary = {
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"),
} }
@export var ball: GameBall: @export var ball: GameBall:

View File

@ -39,6 +39,9 @@ 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 / 16 const CURVE_INFLUENCE := PI / 16
## Just enough to make things interesting!
const SHOT_OFFSET_Z_FACTOR := 2.0 / 45.0
## Impulse offset multiplier due to curve, in meters ## Impulse offset multiplier due to curve, in meters
const CURVE_FACTOR := 0.002 const CURVE_FACTOR := 0.002
@ -262,10 +265,16 @@ 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 := direction.global_basis.x.normalized() * shot_curve * absf(shot_curve) 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 := -curve * CURVE_FACTOR var offset := direction.global_basis.x.normalized() * -curve
offset += (
direction.global_basis.z.normalized()
* game_ball.radius
* game_ball.radius
* SHOT_OFFSET_Z_FACTOR
)
print_debug("Shot offset: ", offset, "; ", offset.length(), " m") print_debug("Shot offset: ", offset, "; ", offset.length(), " m")
if game_ball: if game_ball:

View File

@ -22,7 +22,7 @@ const PUTT_ATTRITION := 0.8325 # green?
## If enabled, project a linear putt instead of an arcing shot ## If enabled, project a linear putt instead of an arcing shot
@export var putt_projection := false @export var putt_projection := false
@export_category("Collision") @export_category("Collision & Physics")
## Enables collision checking. Projection will end at the point where a collision is detected. ## Enables collision checking. Projection will end at the point where a collision is detected.
## Uses continuous collision detection. ## Uses continuous collision detection.
@export var check_collision := true @export var check_collision := true
@ -32,6 +32,10 @@ const PUTT_ATTRITION := 0.8325 # green?
## This should probably include the ball! ## This should probably include the ball!
@export var excluded_bodies: Array[CollisionObject3D] = [] @export var excluded_bodies: Array[CollisionObject3D] = []
## Enables checking local gravity at each point along the trajectory.
## If disabled, global gravity will be used instead.
@export var check_gravity := true
var _tick_counter := 0 var _tick_counter := 0
var _debug_points: Array[Vector3] = [] var _debug_points: Array[Vector3] = []
@ -73,12 +77,17 @@ func _process(_delta: float) -> void:
# TODO: smooth curve with bezier handles # TODO: smooth curve with bezier handles
path.curve.add_point(pos - global_position) path.curve.add_point(pos - global_position)
# Get local gravity if enabled
var local_gravity := gravity * gravity_vec
if check_gravity and Game.settings.projection_gravity:
local_gravity = _get_gravity(pos)
# Integrate projectile path # Integrate projectile path
vel += gravity * gravity_vec * time_step vel += local_gravity * time_step
var next_pos := pos + vel * time_step var next_pos := pos + vel * time_step
# Collision # Collision
if check_collision: if check_collision and Game.settings.projection_collisions:
var ray_params := PhysicsRayQueryParameters3D.create( var ray_params := PhysicsRayQueryParameters3D.create(
pos, next_pos, collision_mask, excluded_rid pos, next_pos, collision_mask, excluded_rid
) )
@ -110,6 +119,58 @@ func _process(_delta: float) -> void:
(%DebugDraw as CanvasItem).queue_redraw() (%DebugDraw as CanvasItem).queue_redraw()
func _get_gravity(point: Vector3) -> Vector3:
# Start with global gravity
var local_gravity := gravity * gravity_vec
# TODO this is awful, surely there has to be a better way than this!!!
# Get areas at point
var point_params := PhysicsPointQueryParameters3D.new()
point_params.collide_with_areas = true
point_params.collide_with_bodies = false
point_params.collision_mask = collision_mask
point_params.position = point
var collisions := get_world_3d().direct_space_state.intersect_point(point_params)
var gravity_areas: Array[Area3D] = []
gravity_areas.assign(
collisions.map(func(d: Dictionary) -> Area3D: return d["collider"] as Area3D)
)
gravity_areas.sort_custom(func(a: Area3D, b: Area3D) -> bool: return a.priority < b.priority)
# Iteratively integrate gravity
for area: Area3D in gravity_areas:
var point_local := point - area.global_position
var area_gravity: Vector3
if area.gravity_point:
# TODO: `point` may need to be local
var v := area.transform * area.gravity_direction - point_local
if area.gravity_point_unit_distance > 0:
var v_sq := v.length_squared()
if v_sq > 0:
area_gravity = (
v.normalized()
* area.gravity
* pow(area.gravity_point_unit_distance, 2)
/ v_sq
)
else:
area_gravity = Vector3.ZERO
else:
area_gravity = v.normalized() * area.gravity
else:
area_gravity = area.gravity * area.gravity_direction
match area.gravity_space_override:
Area3D.SPACE_OVERRIDE_COMBINE, Area3D.SPACE_OVERRIDE_COMBINE_REPLACE:
local_gravity += area_gravity
Area3D.SPACE_OVERRIDE_REPLACE_COMBINE, Area3D.SPACE_OVERRIDE_REPLACE:
local_gravity = area_gravity
Area3D.SPACE_OVERRIDE_COMBINE_REPLACE, Area3D.SPACE_OVERRIDE_REPLACE:
break
return local_gravity
func _on_visibility_changed() -> void: func _on_visibility_changed() -> void:
# Force update as soon as visible # Force update as soon as visible
_tick_counter = 0 _tick_counter = 0

View File

@ -2,7 +2,7 @@ class_name OrbitalCamera extends Node3D
const POSITION_ACCELERATION := 4.0 const POSITION_ACCELERATION := 4.0
const BASIS_ACCELERATION := 4.0 const BASIS_ACCELERATION := 4.0
const TARGETER_ACCELERATION := 4.0 const TARGETER_ACCELERATION := 8.0
@export var target: Node3D @export var target: Node3D
@export var offset := Vector3(0, 1, 0) @export var offset := Vector3(0, 1, 0)

View File

@ -0,0 +1,10 @@
extends "res://src/ui/menus/settings_menu/settings/checkbox_setting/checkbox_setting.gd"
## Special case setting for fullscreen mode
func initialize_value(value: Variant) -> void:
checkbox.button_pressed = (value as Window.Mode) == Window.MODE_FULLSCREEN
func get_value() -> Variant:
return Window.MODE_FULLSCREEN if checkbox.button_pressed else Window.MODE_WINDOWED

View File

@ -0,0 +1,12 @@
extends Setting
## Setting with a dropdown menu representing an enum value
@onready var dropdown: OptionButton = %Dropdown
func initialize_value(value: Variant) -> void:
dropdown.selected = dropdown.get_item_index(value as int)
func get_value() -> Variant:
return dropdown.get_item_id(dropdown.selected)

View File

@ -1,9 +1,13 @@
[gd_scene load_steps=2 format=3 uid="uid://dpry41u0ctikn"] [gd_scene load_steps=3 format=3 uid="uid://dpry41u0ctikn"]
[ext_resource type="PackedScene" uid="uid://dcah6r3ku60g6" path="res://src/ui/menus/settings_menu/settings/setting/setting.tscn" id="1_km84n"] [ext_resource type="PackedScene" uid="uid://dcah6r3ku60g6" path="res://src/ui/menus/settings_menu/settings/setting/setting.tscn" id="1_km84n"]
[ext_resource type="Script" path="res://src/ui/menus/settings_menu/settings/dropdown_setting/dropdown_setting.gd" id="2_ubo13"]
[node name="DropdownSetting" instance=ExtResource("1_km84n")] [node name="DropdownSetting" instance=ExtResource("1_km84n")]
script = ExtResource("2_ubo13")
[node name="OptionButton" type="OptionButton" parent="PanelContainer/MarginContainer" index="0"] [node name="Dropdown" type="OptionButton" parent="PanelContainer/MarginContainer" index="0"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
selected = 0
item_count = 1 item_count = 1

View File

@ -1,8 +1,10 @@
[gd_scene load_steps=4 format=3 uid="uid://d3eaqw2rdurct"] [gd_scene load_steps=6 format=3 uid="uid://d3eaqw2rdurct"]
[ext_resource type="Script" path="res://src/ui/menus/settings_menu/settings_menu.gd" id="1_lbcn7"] [ext_resource type="Script" path="res://src/ui/menus/settings_menu/settings_menu.gd" id="1_lbcn7"]
[ext_resource type="PackedScene" uid="uid://bpmpj4n6xp17l" path="res://src/ui/menus/settings_menu/settings/checkbox_setting/checkbox_setting.tscn" id="2_f274v"] [ext_resource type="PackedScene" uid="uid://bpmpj4n6xp17l" path="res://src/ui/menus/settings_menu/settings/checkbox_setting/checkbox_setting.tscn" id="2_f274v"]
[ext_resource type="PackedScene" uid="uid://dut1lj8ju37sq" path="res://src/ui/menus/settings_menu/settings/numeric_setting/numeric_setting.tscn" id="3_jox8e"] [ext_resource type="PackedScene" uid="uid://dut1lj8ju37sq" path="res://src/ui/menus/settings_menu/settings/numeric_setting/numeric_setting.tscn" id="3_jox8e"]
[ext_resource type="PackedScene" uid="uid://dpry41u0ctikn" path="res://src/ui/menus/settings_menu/settings/dropdown_setting/dropdown_setting.tscn" id="4_g7eck"]
[ext_resource type="Script" path="res://src/ui/menus/settings_menu/settings/checkbox_setting/fullscreen_setting.gd" id="4_ug1id"]
[node name="SettingsMenu" type="MarginContainer"] [node name="SettingsMenu" type="MarginContainer"]
anchors_preset = 15 anchors_preset = 15
@ -78,6 +80,32 @@ key = &"game/config/accessibility/enable_hit_lag"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/HitLag" index="1"] [node name="SettingLabel" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/HitLag" index="1"]
text = "SETTINGS_HIT_LAG" text = "SETTINGS_HIT_LAG"
[node name="GameplayHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"]
layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/GameplayHeading"]
layout_mode = 2
theme_type_variation = &"HeaderMedium"
text = "SETTINGS_GAME_GAMEPLAY_HEADING"
[node name="HSeparator" type="HSeparator" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/GameplayHeading"]
layout_mode = 2
size_flags_horizontal = 3
[node name="ProjectionCollision" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
key = &"game/config/gameplay/projection/detect_collision"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/ProjectionCollision" index="1"]
text = "SETTINGS_PROJECTION_COLLISIONS"
[node name="ProjectionGravity" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
key = &"game/config/gameplay/projection/use_local_gravity"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/ProjectionGravity" index="1"]
text = "SETTINGS_PROJECTION_GRAVITY"
[node name="CameraHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"] [node name="CameraHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"]
layout_mode = 2 layout_mode = 2
@ -194,6 +222,169 @@ theme_type_variation = &"SettingsListMargin"
[node name="SettingsList" type="VBoxContainer" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer"] [node name="SettingsList" type="VBoxContainer" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer"]
layout_mode = 2 layout_mode = 2
[node name="DisplayHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"]
layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DisplayHeading"]
layout_mode = 2
theme_type_variation = &"HeaderMedium"
text = "SETTINGS_GRAPHICS_DISPLAY_HEADING"
[node name="HSeparator" type="HSeparator" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DisplayHeading"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Fullscreen" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
script = ExtResource("4_ug1id")
key = &"display/window/size/mode"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/Fullscreen" index="1"]
text = "SETTINGS_GRAPHICS_FULLSCREEN"
[node name="VSync" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
key = &"display/window/vsync/vsync_mode"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/VSync" index="1"]
text = "SETTINGS_GRAPHICS_VSYNC"
[node name="AntialiasingHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"]
layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AntialiasingHeading"]
layout_mode = 2
theme_type_variation = &"HeaderMedium"
text = "SETTINGS_GRAPHICS_AA_HEADING"
[node name="HSeparator" type="HSeparator" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AntialiasingHeading"]
layout_mode = 2
size_flags_horizontal = 3
[node name="MSAA" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("4_g7eck")]
layout_mode = 2
key = &"rendering/anti_aliasing/quality/msaa_3d"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/MSAA" index="1"]
text = "SETTINGS_GRAPHICS_MSAA"
[node name="Dropdown" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/MSAA/PanelContainer/MarginContainer" index="0"]
item_count = 4
popup/item_0/text = "SETTINGS_GRAPHICS_MSAA_0"
popup/item_1/text = "SETTINGS_GRAPHICS_MSAA_2"
popup/item_1/id = 1
popup/item_2/text = "SETTINGS_GRAPHICS_MSAA_4"
popup/item_2/id = 2
popup/item_3/text = "SETTINGS_GRAPHICS_MSAA_8"
popup/item_3/id = 3
[node name="FXAA" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
key = &"rendering/anti_aliasing/quality/screen_space_aa"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/FXAA" index="1"]
text = "SETTINGS_GRAPHICS_FXAA"
[node name="TAA" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
key = &"rendering/anti_aliasing/quality/use_taa"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/TAA" index="1"]
text = "SETTINGS_GRAPHICS_TAA"
[node name="Debanding" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("2_f274v")]
layout_mode = 2
key = &"rendering/anti_aliasing/quality/use_debanding"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/Debanding" index="1"]
text = "SETTINGS_GRAPHICS_DEBANDING"
[node name="TextureHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"]
layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/TextureHeading"]
layout_mode = 2
theme_type_variation = &"HeaderMedium"
text = "SETTINGS_GRAPHICS_TEXTURES_HEADING"
[node name="HSeparator" type="HSeparator" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/TextureHeading"]
layout_mode = 2
size_flags_horizontal = 3
[node name="AnisotropicLevel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("4_g7eck")]
layout_mode = 2
key = &"rendering/textures/default_filters/anisotropic_filtering_level"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AnisotropicLevel" index="1"]
text = "SETTINGS_GRAPHICS_ANISOTROPIC"
[node name="Dropdown" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AnisotropicLevel/PanelContainer/MarginContainer" index="0"]
item_count = 5
popup/item_0/text = "SETTINGS_GRAPHICS_ANISOTROPIC_0"
popup/item_1/text = "SETTINGS_GRAPHICS_ANISOTROPIC_1"
popup/item_1/id = 1
popup/item_2/text = "SETTINGS_GRAPHICS_ANISOTROPIC_2"
popup/item_2/id = 2
popup/item_3/text = "SETTINGS_GRAPHICS_ANISOTROPIC_3"
popup/item_3/id = 3
popup/item_4/text = "SETTINGS_GRAPHICS_ANISOTROPIC_4"
popup/item_4/id = 4
[node name="LightingHeading" type="HBoxContainer" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList"]
layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/LightingHeading"]
layout_mode = 2
theme_type_variation = &"HeaderMedium"
text = "SETTINGS_GRAPHICS_LIGHTING_HEADING"
[node name="HSeparator" type="HSeparator" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/LightingHeading"]
layout_mode = 2
size_flags_horizontal = 3
[node name="DirectionalShadowQuality" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("4_g7eck")]
layout_mode = 2
key = &"rendering/lights_and_shadows/directional_shadow/size"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DirectionalShadowQuality" index="1"]
text = "SETTINGS_GRAPHICS_SHADOW_QUALITY"
[node name="Dropdown" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DirectionalShadowQuality/PanelContainer/MarginContainer" index="0"]
item_count = 6
popup/item_0/text = "SETTINGS_GRAPHICS_SHADOW_QUALITY_0"
popup/item_0/id = 256
popup/item_1/text = "SETTINGS_GRAPHICS_SHADOW_QUALITY_1"
popup/item_1/id = 2048
popup/item_2/text = "SETTINGS_GRAPHICS_SHADOW_QUALITY_2"
popup/item_2/id = 4096
popup/item_3/text = "SETTINGS_GRAPHICS_SHADOW_QUALITY_3"
popup/item_3/id = 8192
popup/item_4/text = "SETTINGS_GRAPHICS_SHADOW_QUALITY_4"
popup/item_4/id = 16384
popup/item_5/text = "SETTINGS_GRAPHICS_SHADOW_QUALITY_5"
popup/item_5/id = 32768
[node name="DirectionalShadowFilter" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList" groups=["Settings"] instance=ExtResource("4_g7eck")]
layout_mode = 2
key = &"rendering/lights_and_shadows/directional_shadow/soft_shadow_filter_quality"
[node name="SettingLabel" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DirectionalShadowFilter" index="1"]
text = "SETTINGS_GRAPHICS_SHADOW_FILTER"
[node name="Dropdown" parent="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DirectionalShadowFilter/PanelContainer/MarginContainer" index="0"]
item_count = 6
popup/item_0/text = "SETTINGS_GRAPHICS_SHADOW_FILTER_0"
popup/item_1/text = "SETTINGS_GRAPHICS_SHADOW_FILTER_1"
popup/item_1/id = 1
popup/item_2/text = "SETTINGS_GRAPHICS_SHADOW_FILTER_2"
popup/item_2/id = 2
popup/item_3/text = "SETTINGS_GRAPHICS_SHADOW_FILTER_3"
popup/item_3/id = 3
popup/item_4/text = "SETTINGS_GRAPHICS_SHADOW_FILTER_4"
popup/item_4/id = 4
popup/item_5/text = "SETTINGS_GRAPHICS_SHADOW_FILTER_5"
popup/item_5/id = 5
[node name="SETTINGS_AUDIO" type="MarginContainer" parent="TabContainer"] [node name="SETTINGS_AUDIO" type="MarginContainer" parent="TabContainer"]
visible = false visible = false
layout_mode = 2 layout_mode = 2
@ -299,6 +490,8 @@ text = "UI_ACCEPT"
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/ScreenShake"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/ScreenShake"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/HitLag"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/HitLag"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/ProjectionCollision"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/ProjectionGravity"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/FreeCameraSpeed"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/FreeCameraSpeed"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/FreeCameraSpeed/PanelContainer/MarginContainer/NumericSlider"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/FreeCameraSpeed/PanelContainer/MarginContainer/NumericSlider"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/SensitivityX"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/SensitivityX"]
@ -306,3 +499,12 @@ text = "UI_ACCEPT"
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AccelerationX"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AccelerationX"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AccelerationY"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AccelerationY"]
[editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/InvertPitch"] [editable path="TabContainer/SETTINGS_GAME/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/InvertPitch"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/Fullscreen"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/VSync"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/MSAA"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/FXAA"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/TAA"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/Debanding"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/AnisotropicLevel"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DirectionalShadowQuality"]
[editable path="TabContainer/SETTINGS_GRAPHICS/VBoxContainer/ScrollContainer/MarginContainer/SettingsList/DirectionalShadowFilter"]

View File

@ -7,6 +7,7 @@ const Y_OFFSET := {
GameBall.Type.NONE: 50, GameBall.Type.NONE: 50,
GameBall.Type.BASIC: 18, GameBall.Type.BASIC: 18,
GameBall.Type.PLASMA: -14, GameBall.Type.PLASMA: -14,
GameBall.Type.BRICK: -46,
} }
@export var value: GameBall.Type: @export var value: GameBall.Type:
@ -15,6 +16,7 @@ const Y_OFFSET := {
@onready var ball_list: VBoxContainer = %BallList @onready var ball_list: VBoxContainer = %BallList
@onready var basic_icon: BallIcon = %BasicIcon @onready var basic_icon: BallIcon = %BasicIcon
@onready var plasma_icon: BallIcon = %PlasmaIcon @onready var plasma_icon: BallIcon = %PlasmaIcon
@onready var brick_icon: BallIcon = %BrickIcon
func _ready() -> void: func _ready() -> void:
@ -25,6 +27,7 @@ func _ready() -> void:
func set_state_for_player(player: WorldPlayer) -> void: func set_state_for_player(player: WorldPlayer) -> void:
basic_icon.quantity = player.get_balls(GameBall.Type.BASIC) basic_icon.quantity = player.get_balls(GameBall.Type.BASIC)
plasma_icon.quantity = player.get_balls(GameBall.Type.PLASMA) plasma_icon.quantity = player.get_balls(GameBall.Type.PLASMA)
brick_icon.quantity = player.get_balls(GameBall.Type.BRICK)
if player.shot_setup: if player.shot_setup:
value = player.shot_setup.ball_type value = player.shot_setup.ball_type
player.on_balls_changed.connect(_set_quantity) player.on_balls_changed.connect(_set_quantity)
@ -36,6 +39,8 @@ func _get_icon(type: GameBall.Type) -> BallIcon:
return basic_icon return basic_icon
GameBall.Type.PLASMA: GameBall.Type.PLASMA:
return plasma_icon return plasma_icon
GameBall.Type.BRICK:
return brick_icon
return null return null

View File

@ -46,7 +46,7 @@ custom_minimum_size = Vector2(120, 0)
layout_mode = 0 layout_mode = 0
offset_top = 50.0 offset_top = 50.0
offset_right = 120.0 offset_right = 120.0
offset_bottom = 109.0 offset_bottom = 141.0
theme_override_constants/separation = 5 theme_override_constants/separation = 5
[node name="BasicIcon" parent="GradientMask/BallList" instance=ExtResource("1_1v8xg")] [node name="BasicIcon" parent="GradientMask/BallList" instance=ExtResource("1_1v8xg")]
@ -60,3 +60,11 @@ unique_name_in_owner = true
custom_minimum_size = Vector2(120, 27) custom_minimum_size = Vector2(120, 27)
layout_mode = 2 layout_mode = 2
text = "BALL_PLASMA" text = "BALL_PLASMA"
[node name="BrickIcon" parent="GradientMask/BallList" instance=ExtResource("1_1v8xg")]
unique_name_in_owner = true
custom_minimum_size = Vector2(120, 27)
layout_mode = 2
text = "BALL_BRICK"
quantity = 0
empty = true

View File

@ -1,6 +1,6 @@
[gd_scene load_steps=13 format=3 uid="uid://dwfckgdxnwwru"] [gd_scene load_steps=13 format=3 uid="uid://dwfckgdxnwwru"]
[ext_resource type="Texture2D" uid="uid://c0rf8luj8nbom" path="res://src/world/effects/zephyr/zephyr_scale_curve.tres" id="1_opmvf"] [ext_resource type="Texture2D" uid="uid://b1bfyk5c003se" path="res://src/world/effects/zephyr/zephyr_scale_curve.tres" id="1_opmvf"]
[ext_resource type="Curve" uid="uid://5vyddepvq1ho" path="res://src/world/effects/zephyr/zephyr_mesh_curve.tres" id="2_5lvg1"] [ext_resource type="Curve" uid="uid://5vyddepvq1ho" path="res://src/world/effects/zephyr/zephyr_mesh_curve.tres" id="2_5lvg1"]
[ext_resource type="Material" uid="uid://b20gam4x6f8gw" path="res://src/world/effects/zephyr/zephyr_mesh_material.tres" id="3_yxxm1"] [ext_resource type="Material" uid="uid://b20gam4x6f8gw" path="res://src/world/effects/zephyr/zephyr_mesh_material.tres" id="3_yxxm1"]