diff --git a/src/equipment/balls/physics_ball/game_ball.gd b/src/equipment/balls/physics_ball/game_ball.gd index 3c4bf9d..0f8c351 100644 --- a/src/equipment/balls/physics_ball/game_ball.gd +++ b/src/equipment/balls/physics_ball/game_ball.gd @@ -13,14 +13,11 @@ enum Type { const TERRAIN_DAMPING_EPSILON := 1e-6 const MAGNUS_EPSILON := 1e-3 -const IRON_DAMPING := 9999.0 ## Angular damping while in air @export var air_damping := 0.0 ## Angular damping while in collision with rough terrain @export var rough_damping := 8.0 -## Angular damping for iron balls -@export var iron_damping := 9999.0 #@export var fluid_density := 1.225 #@export var lift_coefficient := 0.05 @@ -32,14 +29,8 @@ const IRON_DAMPING := 9999.0 ## and `r` is the radius of the ball, which is 5cm. @export var magnus_coefficient := 0.00024 -## Causes the ball to act more like a brick -@export var iron_ball := false: - set(value): - if value: - physics_material_override = iron_physics - else: - physics_material_override = normal_physics - iron_ball = value +## Causes the ball to stick to surfaces +@export var magnetic := false ## Base damage inflicted on impact with a player @export var base_damage := 15.0 @@ -52,18 +43,21 @@ var _position_on_last_wake: Vector3 var _awake := false var _zones: Array[BallZone] = [] +@onready var manual_sleep_timer: Timer = %ManualSleepTimer @onready var sfx: BallSFX = %SFX @onready var normal_physics: PhysicsMaterial = preload( "res://src/equipment/balls/physics_ball/normal_physics.tres" ) -@onready var iron_physics: PhysicsMaterial = preload( - "res://src/equipment/balls/physics_ball/iron_physics.tres" -) @onready var _debug_draw: Control = %DebugDraw +## Should this ball stick to surfaces, rather than bounce? +func is_sticky() -> bool: + return magnetic + + ## Called by a water area when this ball enters it func enter_water() -> void: entered_water.emit() @@ -108,8 +102,6 @@ func _integrate_forces(state: PhysicsDirectBodyState3D) -> void: damping = _total_terrain_angular_damping() if damping <= TERRAIN_DAMPING_EPSILON: damping = rough_damping - if iron_ball: - damping = iron_damping angular_damp = damping @@ -147,6 +139,11 @@ func _on_sleeping_state_changed() -> void: func _on_collision(body: Node) -> void: + if is_sticky(): + # Freeze physics as soon as we hit something + freeze = true + manual_sleep_timer.start() + if body is Terrain3D: sfx.play_sfx(Terrain.at_position(global_position, body as Terrain3D)) elif body is CSGShape3D: @@ -155,3 +152,8 @@ func _on_collision(body: Node) -> void: sfx.play_sfx(Terrain.from_physical_layer((body as CollisionObject3D).collision_layer)) else: print_debug("COLLIDER: ", body) + + +func _fire_sleep_signal() -> void: + sleeping = true + sleeping_state_changed.emit() diff --git a/src/equipment/balls/physics_ball/iron_physics.tres b/src/equipment/balls/physics_ball/iron_physics.tres deleted file mode 100644 index 3056424..0000000 --- a/src/equipment/balls/physics_ball/iron_physics.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="PhysicsMaterial" format=3 uid="uid://cfd56nhaods5a"] - -[resource] -friction = 0.8 -rough = true -bounce = 1.0 -absorbent = true diff --git a/src/equipment/balls/physics_ball/physics_ball.tscn b/src/equipment/balls/physics_ball/physics_ball.tscn index f3524e3..ea711ee 100644 --- a/src/equipment/balls/physics_ball/physics_ball.tscn +++ b/src/equipment/balls/physics_ball/physics_ball.tscn @@ -103,7 +103,6 @@ linear_damp_mode = 1 angular_damp_mode = 1 angular_damp = 8.0 script = ExtResource("1_iwh2u") -iron_damping = 1e+07 [node name="BallMesh" type="MeshInstance3D" parent="."] mesh = SubResource("SphereMesh_y0d13") @@ -146,5 +145,10 @@ unit_size = 40.0 max_db = 0.0 bus = &"SFX" +[node name="ManualSleepTimer" type="Timer" parent="."] +unique_name_in_owner = true +one_shot = true + [connection signal="body_entered" from="." to="." method="_on_collision"] [connection signal="sleeping_state_changed" from="." to="." method="_on_sleeping_state_changed"] +[connection signal="timeout" from="ManualSleepTimer" to="." method="_fire_sleep_signal"] diff --git a/src/equipment/balls/plasma_ball/plasma_ball.gd b/src/equipment/balls/plasma_ball/plasma_ball.gd index ac86964..66f1680 100644 --- a/src/equipment/balls/plasma_ball/plasma_ball.gd +++ b/src/equipment/balls/plasma_ball/plasma_ball.gd @@ -1,16 +1,6 @@ extends GameBall -## The plasma ball sticks to the first surface it hits - -@onready var manual_sleep_timer: Timer = %ManualSleepTimer +## Plasma ball always sticks to surfaces -func _on_body_entered(_body: Node) -> void: - print_debug("Plasma ball stuck to ", _body) - # Freeze physics as soon as we hit something - freeze = true - manual_sleep_timer.start() - - -func _fire_sleep_signal() -> void: - sleeping = true - sleeping_state_changed.emit() +func is_sticky() -> bool: + return true diff --git a/src/equipment/balls/plasma_ball/plasma_ball.tscn b/src/equipment/balls/plasma_ball/plasma_ball.tscn index 03ac039..ec19e19 100644 --- a/src/equipment/balls/plasma_ball/plasma_ball.tscn +++ b/src/equipment/balls/plasma_ball/plasma_ball.tscn @@ -2,7 +2,7 @@ [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="Script" path="res://src/equipment/balls/plasma_ball/plasma_ball.gd" id="2_pdts3"] +[ext_resource type="Script" path="res://src/equipment/balls/plasma_ball/plasma_ball.gd" id="2_16fhh"] [sub_resource type="Curve" id="Curve_kabhn"] max_value = 2.0 @@ -48,8 +48,8 @@ material = SubResource("StandardMaterial3D_7ptri") size = Vector2(0.4, 0.4) [node name="PlasmaBall" instance=ExtResource("1_yh4fp")] -script = ExtResource("2_pdts3") -base_damage = 30.0 +script = ExtResource("2_16fhh") +magnetic = true [node name="PlasmaFireEffect" type="GPUParticles3D" parent="BallMesh" index="0"] amount = 20 @@ -57,9 +57,4 @@ lifetime = 0.6 process_material = SubResource("ParticleProcessMaterial_uffe8") draw_pass_1 = SubResource("QuadMesh_go8iw") -[node name="ManualSleepTimer" type="Timer" parent="." index="3"] -unique_name_in_owner = true -one_shot = true - [connection signal="body_entered" from="." to="." method="_on_body_entered"] -[connection signal="timeout" from="ManualSleepTimer" to="." method="_fire_sleep_signal"] diff --git a/src/player/shot_setup/shot_setup.gd b/src/player/shot_setup/shot_setup.gd index fe81bac..f0543b2 100644 --- a/src/player/shot_setup/shot_setup.gd +++ b/src/player/shot_setup/shot_setup.gd @@ -272,7 +272,7 @@ func take_shot() -> void: print_debug("Shot offset: ", offset, "; ", offset.length(), " m") if game_ball: - game_ball.iron_ball = club_type == Club.Type.IRON + game_ball.magnetic = club_type == Club.Type.IRON game_ball.freeze = false game_ball.apply_impulse(impulse, offset)