generated from krampus/template-godot4
Club angle & power are properties of the club
This commit is contained in:
parent
0b0cb0ddf1
commit
1623d468a3
|
@ -14,6 +14,9 @@ enum Type {
|
|||
@export var type: Club.Type
|
||||
@export var _model: PackedScene
|
||||
|
||||
@export_range(-360, 360, 0.001, "radians") var angle := 0.0
|
||||
@export var power := 1.0
|
||||
|
||||
## Global typesafe accessor for club catalog
|
||||
static var catalog: ClubCatalogType:
|
||||
get:
|
||||
|
|
|
@ -8,3 +8,5 @@ script = ExtResource("1_7mcyu")
|
|||
name = "DEBUG Driver"
|
||||
type = 1
|
||||
_model = ExtResource("1_ug675")
|
||||
angle = 0.785398
|
||||
power = 1.0
|
||||
|
|
|
@ -8,3 +8,5 @@ script = ExtResource("1_6ksva")
|
|||
name = "DEBUG Iron"
|
||||
type = 2
|
||||
_model = ExtResource("1_5wgil")
|
||||
angle = 0.785398
|
||||
power = 0.6
|
||||
|
|
|
@ -8,3 +8,5 @@ script = ExtResource("1_qlirk")
|
|||
name = "DEBUG Putter"
|
||||
type = 4
|
||||
_model = ExtResource("1_ghpah")
|
||||
angle = 0.0
|
||||
power = 0.8
|
||||
|
|
|
@ -8,3 +8,5 @@ script = ExtResource("1_gy3nk")
|
|||
name = "DEBUG Wedge"
|
||||
type = 3
|
||||
_model = ExtResource("1_voves")
|
||||
angle = 1.39626
|
||||
power = 0.8
|
||||
|
|
|
@ -48,7 +48,7 @@ const EXPLOSIVE_FORCE_FACTOR := 0.12
|
|||
@export var driving_range := false
|
||||
|
||||
## Initially-selected club
|
||||
@export var initial_club: Club.Type = Club.Type.DRIVER
|
||||
@export var initial_club_type: Club.Type = Club.Type.DRIVER
|
||||
|
||||
## Initially-selected ball type
|
||||
@export var initial_ball: GameBall.Type = GameBall.Type.BASIC
|
||||
|
@ -92,11 +92,15 @@ var phase: Phase = Phase.FINISHED:
|
|||
|
||||
var hud: ShotHUD
|
||||
|
||||
var club: Club.Type:
|
||||
var club_type: Club.Type:
|
||||
set(value):
|
||||
if value != club:
|
||||
if value != club_type:
|
||||
_on_club_change(value)
|
||||
club = value
|
||||
club_type = value
|
||||
|
||||
var club: Club:
|
||||
get:
|
||||
return player.get_club(club_type) if player else null
|
||||
|
||||
var ball_type: GameBall.Type:
|
||||
set(value):
|
||||
|
@ -105,8 +109,6 @@ var ball_type: GameBall.Type:
|
|||
ball_point.spawn_ball(value)
|
||||
ball_type = value
|
||||
|
||||
var shot_ref: Node3D
|
||||
|
||||
var shot_power: float:
|
||||
set(value):
|
||||
hud.power_bar.value = value
|
||||
|
@ -149,13 +151,9 @@ var _tracking_camera: OrbitalCamera
|
|||
|
||||
@onready var ball_point: BallPoint = %BallPoint
|
||||
|
||||
@onready var drive_ref: RayCast3D = %DriveRef
|
||||
@onready var drive_arrow: Node3D = %DriveArrow
|
||||
@onready var wedge_ref: RayCast3D = %WedgeRef
|
||||
@onready var wedge_arrow: Node3D = %WedgeArrow
|
||||
@onready var iron_ref: RayCast3D = %IronRef
|
||||
@onready var iron_arrow: Node3D = %IronArrow
|
||||
@onready var putt_ref: RayCast3D = %PuttRef
|
||||
@onready var putt_arrow: Node3D = %PuttArrow
|
||||
|
||||
@onready var downswing_timer: Timer = %DownswingTimer
|
||||
|
@ -180,7 +178,7 @@ func _ready() -> void:
|
|||
hud = ShotHUD.create(player)
|
||||
world.ui.add_player_hud(hud)
|
||||
ball_type = initial_ball
|
||||
club = initial_club
|
||||
club_type = initial_club_type
|
||||
character.set_color(player.color)
|
||||
|
||||
# Set up player 3D label
|
||||
|
@ -240,21 +238,22 @@ func finish_downswing() -> void:
|
|||
|
||||
|
||||
func get_shot_impulse(meter_pct: float) -> Vector3:
|
||||
return -shot_ref.global_basis.z * base_power * meter_pct
|
||||
return (
|
||||
-direction.global_basis.rotated(direction.global_basis.x, club.angle).z
|
||||
* club.power
|
||||
* base_power
|
||||
* meter_pct
|
||||
)
|
||||
|
||||
|
||||
func take_shot() -> void:
|
||||
# Impact screenshake & hitlag
|
||||
# Impact screenshake
|
||||
if game:
|
||||
if shot_power > BIG_POWER_THRESHOLD:
|
||||
#game.viewport.hit_lag_big()
|
||||
var shake_intensity: float = (
|
||||
10.0 * (shot_power - BIG_POWER_THRESHOLD) / (1.0 - BIG_POWER_THRESHOLD)
|
||||
)
|
||||
game.viewport.screen_shake(shake_intensity, 1.0)
|
||||
else:
|
||||
pass
|
||||
#game.viewport.hit_lag_small()
|
||||
|
||||
print_debug("WHACK!\nPower: ", shot_power, "\nCurve: ", shot_curve)
|
||||
|
||||
|
@ -263,7 +262,7 @@ func take_shot() -> void:
|
|||
print_debug("Shot impulse: ", impulse, "; ", impulse.length(), " N*s")
|
||||
|
||||
# Curve the curve
|
||||
var curve := shot_ref.global_basis.x.normalized() * shot_curve
|
||||
var curve := direction.global_basis.x.normalized() * shot_curve
|
||||
|
||||
# Position where the ball is hit (imparts spin)
|
||||
var offset := curve * 0.001
|
||||
|
@ -272,12 +271,12 @@ func take_shot() -> void:
|
|||
impulse = impulse.rotated(Vector3.UP, -shot_curve * CURVE_INFLUENCE * shot_power)
|
||||
|
||||
if game_ball:
|
||||
game_ball.iron_ball = club == Club.Type.IRON
|
||||
game_ball.iron_ball = club_type == Club.Type.IRON
|
||||
game_ball.freeze = false
|
||||
game_ball.apply_impulse(impulse, offset)
|
||||
|
||||
# Play SFX
|
||||
shot_sfx.play_shot_sfx(club, is_shot_good(), shot_power)
|
||||
shot_sfx.play_shot_sfx(club_type, is_shot_good(), shot_power)
|
||||
|
||||
# Use a ball if a limited type is selected
|
||||
if player.get_balls(ball_type) > 0:
|
||||
|
@ -289,9 +288,9 @@ func _show_shot_projection() -> void:
|
|||
if not game_ball:
|
||||
return
|
||||
|
||||
shot_projection.putt_projection = club == Club.Type.PUTTER
|
||||
shot_projection.putt_projection = club_type == Club.Type.PUTTER
|
||||
shot_projection.initial_speed = 1
|
||||
shot_projection.basis = shot_ref.basis.orthonormalized()
|
||||
shot_projection.basis = Basis.from_euler(Vector3(club.angle, 0, 0))
|
||||
var shot_speed := get_shot_impulse(1.0).length() / game_ball.mass
|
||||
var tween := get_tree().create_tween()
|
||||
tween.tween_property(shot_projection, "initial_speed", shot_speed, CAMERA_SNAP_TIME).set_trans(
|
||||
|
@ -401,20 +400,16 @@ func _on_club_change(new_club_type: Club.Type) -> void:
|
|||
character.hold_right(new_club.get_model())
|
||||
match new_club_type:
|
||||
Club.Type.DRIVER:
|
||||
shot_ref = drive_ref
|
||||
drive_arrow.show()
|
||||
Club.Type.PUTTER:
|
||||
shot_ref = putt_ref
|
||||
putt_arrow.show()
|
||||
Club.Type.WEDGE:
|
||||
shot_ref = wedge_ref
|
||||
wedge_arrow.show()
|
||||
Club.Type.IRON:
|
||||
shot_ref = iron_ref
|
||||
iron_arrow.show()
|
||||
Club.Type.SPECIAL:
|
||||
# TODO figure this out
|
||||
shot_ref = drive_ref
|
||||
pass
|
||||
_:
|
||||
print_debug("Not sure how to equip club type: ", new_club)
|
||||
|
||||
|
@ -522,15 +517,15 @@ func _process(delta: float) -> void:
|
|||
|
||||
# Club select
|
||||
if Input.is_action_just_pressed("select_driver"):
|
||||
club = Club.Type.DRIVER
|
||||
club_type = Club.Type.DRIVER
|
||||
if Input.is_action_just_pressed("select_iron"):
|
||||
club = Club.Type.IRON
|
||||
club_type = Club.Type.IRON
|
||||
if Input.is_action_just_pressed("select_wedge"):
|
||||
club = Club.Type.WEDGE
|
||||
club_type = Club.Type.WEDGE
|
||||
if Input.is_action_just_pressed("select_special"):
|
||||
club = Club.Type.SPECIAL
|
||||
club_type = Club.Type.SPECIAL
|
||||
if Input.is_action_just_pressed("select_putter"):
|
||||
club = Club.Type.PUTTER
|
||||
club_type = Club.Type.PUTTER
|
||||
|
||||
# Ball select
|
||||
if Input.is_action_just_pressed("ball_next"):
|
||||
|
|
|
@ -348,36 +348,8 @@ transform = Transform3D(-0.311543, -0.0687373, 0.947743, 0, 0.99738, 0.0723374,
|
|||
[node name="Direction" type="Node3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="DriveRef" type="RayCast3D" parent="Direction"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 0.08, 0)
|
||||
enabled = false
|
||||
target_position = Vector3(0, 0, -1)
|
||||
collision_mask = 0
|
||||
collide_with_bodies = false
|
||||
debug_shape_thickness = 4
|
||||
|
||||
[node name="WedgeRef" type="RayCast3D" parent="Direction"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.7, 0, 0, 0, 0.181173, -0.676148, 0, 0.676148, 0.181173, 0, 0.08, 0)
|
||||
enabled = false
|
||||
target_position = Vector3(0, 0, -1)
|
||||
collision_mask = 0
|
||||
collide_with_bodies = false
|
||||
debug_shape_thickness = 4
|
||||
|
||||
[node name="IronRef" type="RayCast3D" parent="Direction"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.7, 0, 0, 0, 0.449952, -0.536231, 0, 0.536231, 0.449952, 0, 0.08, 0)
|
||||
enabled = false
|
||||
target_position = Vector3(0, 0, -1)
|
||||
collision_mask = 0
|
||||
collide_with_bodies = false
|
||||
debug_shape_thickness = 4
|
||||
|
||||
[node name="PuttRef" type="RayCast3D" parent="Direction"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0.08, 0)
|
||||
[node name="ShotRef" type="RayCast3D" parent="Direction"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.08, 0)
|
||||
enabled = false
|
||||
target_position = Vector3(0, 0, -1)
|
||||
collision_mask = 0
|
||||
|
|
|
@ -13,9 +13,9 @@ func _attenuate_volume(power: float) -> float:
|
|||
return lerpf(BASE_VOLUME, MAX_VOLUME, power)
|
||||
|
||||
|
||||
func play_shot_sfx(club: Club.Type, good: bool, power: float) -> void:
|
||||
func play_shot_sfx(club_type: Club.Type, good: bool, power: float) -> void:
|
||||
var player: AudioStreamPlayer3D
|
||||
match club:
|
||||
match club_type:
|
||||
Club.Type.PUTTER:
|
||||
player = putt_sfx_player
|
||||
_:
|
||||
|
|
|
@ -35,7 +35,7 @@ func set_state_for_player(player: WorldPlayer) -> void:
|
|||
special_label.set_enabled(player.special != null)
|
||||
putter_label.set_enabled(player.putter != null)
|
||||
if player.shot_setup:
|
||||
value = player.shot_setup.club
|
||||
value = player.shot_setup.club_type
|
||||
|
||||
|
||||
func _get_club_label(club: Club.Type) -> Label:
|
||||
|
|
Loading…
Reference in New Issue