generated from krampus/template-godot4
Compare commits
4 Commits
06c4d859a8
...
4e538df4b0
Author | SHA1 | Date |
---|---|---|
Rob Kelly | 4e538df4b0 | |
Rob Kelly | e9abc96002 | |
Rob Kelly | 0b48ec4082 | |
Rob Kelly | 5678bd543b |
BIN
asset_dev/audio/464839__breviceps__anime-sound-effect-piercing-impact-stabbing.wav (Stored with Git LFS)
Normal file
BIN
asset_dev/audio/464839__breviceps__anime-sound-effect-piercing-impact-stabbing.wav (Stored with Git LFS)
Normal file
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,24 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="wav"
|
||||||
|
type="AudioStreamWAV"
|
||||||
|
uid="uid://gocwud8dxgrj"
|
||||||
|
path="res://.godot/imported/hit1.wav-53061910ec313d77eab7d39e11bb6d2e.sample"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://assets/sound/sfx/player/hit1.wav"
|
||||||
|
dest_files=["res://.godot/imported/hit1.wav-53061910ec313d77eab7d39e11bb6d2e.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
|
Binary file not shown.
|
@ -0,0 +1,24 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="wav"
|
||||||
|
type="AudioStreamWAV"
|
||||||
|
uid="uid://ixxphtt1fp88"
|
||||||
|
path="res://.godot/imported/hit2.wav-4dd8ae86a458841903e431693113cba2.sample"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://assets/sound/sfx/player/hit2.wav"
|
||||||
|
dest_files=["res://.godot/imported/hit2.wav-4dd8ae86a458841903e431693113cba2.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
|
Binary file not shown.
|
@ -0,0 +1,24 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="wav"
|
||||||
|
type="AudioStreamWAV"
|
||||||
|
uid="uid://wa0uejal81b"
|
||||||
|
path="res://.godot/imported/hit3.wav-c5ea520c5ed0d4243944981f59bae603.sample"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://assets/sound/sfx/player/hit3.wav"
|
||||||
|
dest_files=["res://.godot/imported/hit3.wav-c5ea520c5ed0d4243944981f59bae603.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
|
|
@ -21,38 +21,38 @@
|
||||||
[resource]
|
[resource]
|
||||||
resource_local_to_scene = true
|
resource_local_to_scene = true
|
||||||
frames = 17
|
frames = 17
|
||||||
pause = true
|
one_shot = true
|
||||||
frame_0/texture = ExtResource("1_d0hbp")
|
frame_0/texture = ExtResource("16_kbc1f")
|
||||||
frame_0/duration = 0.1
|
frame_0/duration = 0.1
|
||||||
frame_1/texture = ExtResource("2_bjmaj")
|
frame_1/texture = ExtResource("17_ip4qp")
|
||||||
frame_1/duration = 0.1
|
frame_1/duration = 0.1
|
||||||
frame_2/texture = ExtResource("10_e4v3n")
|
frame_2/texture = ExtResource("3_21mo1")
|
||||||
frame_2/duration = 0.1
|
frame_2/duration = 0.1
|
||||||
frame_3/texture = ExtResource("11_7y6m6")
|
frame_3/texture = ExtResource("4_qthhk")
|
||||||
frame_3/duration = 0.1
|
frame_3/duration = 0.1
|
||||||
frame_4/texture = ExtResource("12_702rw")
|
frame_4/texture = ExtResource("5_0684l")
|
||||||
frame_4/duration = 0.1
|
frame_4/duration = 0.1
|
||||||
frame_5/texture = ExtResource("13_orlo6")
|
frame_5/texture = ExtResource("6_y6mm3")
|
||||||
frame_5/duration = 0.1
|
frame_5/duration = 0.1
|
||||||
frame_6/texture = ExtResource("14_doi0c")
|
frame_6/texture = ExtResource("7_4d5db")
|
||||||
frame_6/duration = 0.1
|
frame_6/duration = 0.1
|
||||||
frame_7/texture = ExtResource("15_8snwx")
|
frame_7/texture = ExtResource("8_icpm3")
|
||||||
frame_7/duration = 0.1
|
frame_7/duration = 0.1
|
||||||
frame_8/texture = ExtResource("16_kbc1f")
|
frame_8/texture = ExtResource("9_mv3mc")
|
||||||
frame_8/duration = 0.1
|
frame_8/duration = 0.1
|
||||||
frame_9/texture = ExtResource("17_ip4qp")
|
frame_9/texture = ExtResource("1_d0hbp")
|
||||||
frame_9/duration = 0.1
|
frame_9/duration = 0.1
|
||||||
frame_10/texture = ExtResource("3_21mo1")
|
frame_10/texture = ExtResource("2_bjmaj")
|
||||||
frame_10/duration = 0.1
|
frame_10/duration = 0.1
|
||||||
frame_11/texture = ExtResource("4_qthhk")
|
frame_11/texture = ExtResource("10_e4v3n")
|
||||||
frame_11/duration = 0.1
|
frame_11/duration = 0.1
|
||||||
frame_12/texture = ExtResource("5_0684l")
|
frame_12/texture = ExtResource("11_7y6m6")
|
||||||
frame_12/duration = 0.1
|
frame_12/duration = 0.1
|
||||||
frame_13/texture = ExtResource("6_y6mm3")
|
frame_13/texture = ExtResource("12_702rw")
|
||||||
frame_13/duration = 0.1
|
frame_13/duration = 0.1
|
||||||
frame_14/texture = ExtResource("7_4d5db")
|
frame_14/texture = ExtResource("13_orlo6")
|
||||||
frame_14/duration = 0.1
|
frame_14/duration = 0.1
|
||||||
frame_15/texture = ExtResource("8_icpm3")
|
frame_15/texture = ExtResource("14_doi0c")
|
||||||
frame_15/duration = 0.1
|
frame_15/duration = 0.1
|
||||||
frame_16/texture = ExtResource("9_mv3mc")
|
frame_16/texture = ExtResource("15_8snwx")
|
||||||
frame_16/duration = 0.1
|
frame_16/duration = 0.1
|
||||||
|
|
|
@ -620,7 +620,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16, 0)
|
||||||
shape = SubResource("CylinderShape3D_f1rqf")
|
shape = SubResource("CylinderShape3D_f1rqf")
|
||||||
|
|
||||||
[node name="GravityHalo" type="Node3D" parent="."]
|
[node name="GravityHalo" type="Node3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 73.1897, 78.0923, 345.794)
|
transform = Transform3D(0.688355, -0.285755, 0.666717, 0, 0.919135, 0.393942, -0.725374, -0.271172, 0.632691, 73.19, 90.937, 345.794)
|
||||||
|
|
||||||
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="GravityHalo"]
|
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="GravityHalo"]
|
||||||
use_collision = true
|
use_collision = true
|
||||||
|
|
|
@ -22,7 +22,7 @@ func hold_right(node: Node3D = null) -> void:
|
||||||
|
|
||||||
|
|
||||||
## Set this character's color. Implementation-dependent.
|
## Set this character's color. Implementation-dependent.
|
||||||
func set_color(color: Color) -> void:
|
func set_color(_color: Color) -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,8 @@ const MAGNUS_EPSILON := 1e-3
|
||||||
## where `rho` is the fluid density of the medium, or 1.225 for air at sea level,
|
## where `rho` is the fluid density of the medium, or 1.225 for air at sea level,
|
||||||
## and `C_L` is the lift coefficient which for our purposes is 0.05,
|
## and `C_L` is the lift coefficient which for our purposes is 0.05,
|
||||||
## and `r` is the radius of the ball, which is 5cm.
|
## and `r` is the radius of the ball, which is 5cm.
|
||||||
@export var magnus_coefficient := 0.00024
|
#@export var magnus_coefficient := 0.00024
|
||||||
|
@export var magnus_coefficient := 0.0
|
||||||
|
|
||||||
## Causes the ball to stick to surfaces
|
## Causes the ball to stick to surfaces
|
||||||
@export var magnetic := false
|
@export var magnetic := false
|
||||||
|
@ -57,8 +58,6 @@ var _zones: Array[BallZone] = []
|
||||||
"res://src/equipment/balls/physics_ball/normal_physics.tres"
|
"res://src/equipment/balls/physics_ball/normal_physics.tres"
|
||||||
)
|
)
|
||||||
|
|
||||||
@onready var _debug_draw: Control = %DebugDraw
|
|
||||||
|
|
||||||
|
|
||||||
## Should this ball stick to surfaces, rather than bounce?
|
## Should this ball stick to surfaces, rather than bounce?
|
||||||
func is_sticky() -> bool:
|
func is_sticky() -> bool:
|
||||||
|
|
|
@ -163,7 +163,6 @@ libraries = {
|
||||||
|
|
||||||
[node name="Rumbler" type="Control" parent="RootControl"]
|
[node name="Rumbler" type="Control" parent="RootControl"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
process_mode = 1
|
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
anchors_preset = 15
|
anchors_preset = 15
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
|
@ -174,7 +173,6 @@ script = ExtResource("3_3vfdb")
|
||||||
|
|
||||||
[node name="ViewportContainer" type="SubViewportContainer" parent="RootControl/Rumbler"]
|
[node name="ViewportContainer" type="SubViewportContainer" parent="RootControl/Rumbler"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
process_mode = 3
|
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
anchors_preset = 15
|
anchors_preset = 15
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
extends Node3D
|
||||||
|
|
||||||
|
@export var screen_shake_intensity := 10.0
|
||||||
|
@export var screen_shake_length := 0.5
|
||||||
|
|
||||||
|
@onready var game: Game = get_tree().get_first_node_in_group(Game.group)
|
||||||
|
|
||||||
|
|
||||||
|
func screen_shake() -> void:
|
||||||
|
game.viewport.screen_shake(screen_shake_intensity, screen_shake_length)
|
|
@ -0,0 +1,14 @@
|
||||||
|
extends MeshInstance3D
|
||||||
|
|
||||||
|
var texture: AnimatedTexture
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
var quad: QuadMesh = mesh
|
||||||
|
var mat: StandardMaterial3D = quad.material
|
||||||
|
texture = mat.albedo_texture
|
||||||
|
|
||||||
|
|
||||||
|
func play() -> void:
|
||||||
|
texture.current_frame = 0
|
||||||
|
texture.pause = false
|
|
@ -10,6 +10,7 @@ enum Phase {
|
||||||
SHOT,
|
SHOT,
|
||||||
SHOT_RESET,
|
SHOT_RESET,
|
||||||
FINISHED,
|
FINISHED,
|
||||||
|
DEAD,
|
||||||
}
|
}
|
||||||
|
|
||||||
const PITCH_MIN := deg_to_rad(-60.0)
|
const PITCH_MIN := deg_to_rad(-60.0)
|
||||||
|
@ -140,6 +141,8 @@ var _tracking_camera: OrbitalCamera
|
||||||
@onready var shot_animation: AnimationPlayer = %ShotAnimation
|
@onready var shot_animation: AnimationPlayer = %ShotAnimation
|
||||||
@onready var shot_sfx: ShotSFX = %ShotSFX
|
@onready var shot_sfx: ShotSFX = %ShotSFX
|
||||||
|
|
||||||
|
@onready var death_animation: AnimationPlayer = %DeathAnimation
|
||||||
|
|
||||||
@onready var arrow: Node3D = %Arrow
|
@onready var arrow: Node3D = %Arrow
|
||||||
@onready var arrow_pivot: Node3D = %ArrowPivot
|
@onready var arrow_pivot: Node3D = %ArrowPivot
|
||||||
@onready var arrow_animation: AnimationPlayer = %ArrowAnimation
|
@onready var arrow_animation: AnimationPlayer = %ArrowAnimation
|
||||||
|
@ -171,6 +174,9 @@ static var scene := preload("res://src/player/shot_setup/shot_setup.tscn")
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
if player:
|
||||||
|
player.on_life_changed.connect(_on_life_changed)
|
||||||
|
|
||||||
# Create & set up HUD
|
# Create & set up HUD
|
||||||
hud = ShotHUD.create(player)
|
hud = ShotHUD.create(player)
|
||||||
world.ui.add_player_hud(hud)
|
world.ui.add_player_hud(hud)
|
||||||
|
@ -186,6 +192,14 @@ func _ready() -> void:
|
||||||
_on_phase_change(phase)
|
_on_phase_change(phase)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_tree_exiting() -> void:
|
||||||
|
if is_instance_valid(_tracking_camera):
|
||||||
|
_tracking_camera.queue_free()
|
||||||
|
if is_instance_valid(_free_camera):
|
||||||
|
_free_camera.queue_free()
|
||||||
|
hud.queue_free()
|
||||||
|
|
||||||
|
|
||||||
func _set_camera_distance(value: float) -> void:
|
func _set_camera_distance(value: float) -> void:
|
||||||
var tween := get_tree().create_tween()
|
var tween := get_tree().create_tween()
|
||||||
tween.tween_property(zoom, "position:z", value, ZOOM_LENGTH).set_trans(Tween.TRANS_SINE)
|
tween.tween_property(zoom, "position:z", value, ZOOM_LENGTH).set_trans(Tween.TRANS_SINE)
|
||||||
|
@ -390,6 +404,20 @@ func end_shot_track() -> void:
|
||||||
phase = Phase.FINISHED
|
phase = Phase.FINISHED
|
||||||
|
|
||||||
|
|
||||||
|
func start_death() -> void:
|
||||||
|
print_debug("starting death sequence")
|
||||||
|
world.ui.play_death_sequence()
|
||||||
|
death_animation.play("death")
|
||||||
|
get_tree().paused = true
|
||||||
|
|
||||||
|
|
||||||
|
func finish_death() -> void:
|
||||||
|
print_debug("finishing death sequence")
|
||||||
|
get_tree().paused = false
|
||||||
|
player.die()
|
||||||
|
queue_free()
|
||||||
|
|
||||||
|
|
||||||
func _set_club_type(new_club_type: Club.Type) -> void:
|
func _set_club_type(new_club_type: Club.Type) -> void:
|
||||||
if new_club_type == club_type:
|
if new_club_type == club_type:
|
||||||
return
|
return
|
||||||
|
@ -597,6 +625,8 @@ func _process(delta: float) -> void:
|
||||||
if _restart_queued:
|
if _restart_queued:
|
||||||
_restart_queued = false
|
_restart_queued = false
|
||||||
phase = Phase.AIM
|
phase = Phase.AIM
|
||||||
|
Phase.DEAD:
|
||||||
|
start_death()
|
||||||
|
|
||||||
|
|
||||||
func _on_ball_sleeping_state_changed() -> void:
|
func _on_ball_sleeping_state_changed() -> void:
|
||||||
|
@ -639,6 +669,13 @@ func _on_hitbox_ball_collision(ball: GameBall) -> void:
|
||||||
ball.apply_central_impulse(explosion_impulse)
|
ball.apply_central_impulse(explosion_impulse)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_life_changed(new_value: float) -> void:
|
||||||
|
if new_value <= 0:
|
||||||
|
# No action is taken till the next process phase
|
||||||
|
# This is because we need to be in the main thread to run the death sequence!
|
||||||
|
phase = Phase.DEAD
|
||||||
|
|
||||||
|
|
||||||
func _on_reset_prompt_timer_timeout() -> void:
|
func _on_reset_prompt_timer_timeout() -> void:
|
||||||
reset_enabled = true
|
reset_enabled = true
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=34 format=3 uid="uid://cy7t2tc4y3b4"]
|
[gd_scene load_steps=42 format=3 uid="uid://cy7t2tc4y3b4"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://src/player/shot_setup/shot_setup.gd" id="1_r6ei4"]
|
[ext_resource type="Script" path="res://src/player/shot_setup/shot_setup.gd" id="1_r6ei4"]
|
||||||
[ext_resource type="Script" path="res://src/player/shot_setup/ball_point.gd" id="2_e6i3g"]
|
[ext_resource type="Script" path="res://src/player/shot_setup/ball_point.gd" id="2_e6i3g"]
|
||||||
|
@ -15,7 +15,11 @@
|
||||||
[ext_resource type="Script" path="res://src/player/shot_setup/hitbox.gd" id="7_uh8kn"]
|
[ext_resource type="Script" path="res://src/player/shot_setup/hitbox.gd" id="7_uh8kn"]
|
||||||
[ext_resource type="Texture2D" uid="uid://2yoipvd107t1" path="res://assets/sprites/dope_explosion/dope_explosion.tres" id="8_5ghmo"]
|
[ext_resource type="Texture2D" uid="uid://2yoipvd107t1" path="res://assets/sprites/dope_explosion/dope_explosion.tres" id="8_5ghmo"]
|
||||||
[ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="9_y5iv1"]
|
[ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="9_y5iv1"]
|
||||||
|
[ext_resource type="Script" path="res://src/player/shot_setup/death_sequence.gd" id="10_vakjm"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://ixxphtt1fp88" path="res://assets/sound/sfx/player/hit2.wav" id="11_i5g55"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://wa0uejal81b" path="res://assets/sound/sfx/player/hit3.wav" id="12_0losp"]
|
||||||
[ext_resource type="AudioStream" uid="uid://cvsv02inxvsyw" path="res://assets/sound/sfx/player/explosion.mp3" id="15_fn6g1"]
|
[ext_resource type="AudioStream" uid="uid://cvsv02inxvsyw" path="res://assets/sound/sfx/player/explosion.mp3" id="15_fn6g1"]
|
||||||
|
[ext_resource type="Script" path="res://src/player/shot_setup/explosion.gd" id="15_ytrxd"]
|
||||||
|
|
||||||
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_gh0gi"]
|
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_gh0gi"]
|
||||||
random_pitch = 1.1
|
random_pitch = 1.1
|
||||||
|
@ -34,6 +38,129 @@ random_pitch = 1.1
|
||||||
streams_count = 1
|
streams_count = 1
|
||||||
stream_0/stream = ExtResource("7_niyj5")
|
stream_0/stream = ExtResource("7_niyj5")
|
||||||
|
|
||||||
|
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_7seum"]
|
||||||
|
playback_mode = 1
|
||||||
|
random_pitch = 1.1
|
||||||
|
streams_count = 2
|
||||||
|
stream_0/stream = ExtResource("11_i5g55")
|
||||||
|
stream_1/stream = ExtResource("12_0losp")
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_ll5da"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("AudioStreamPlayer3D:playing")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 1,
|
||||||
|
"values": [false]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_dlkgq"]
|
||||||
|
resource_name = "death"
|
||||||
|
length = 8.0
|
||||||
|
tracks/0/type = "method"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Camera3D1")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(1.1),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"make_current"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/1/type = "method"
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/path = NodePath("Camera3D2")
|
||||||
|
tracks/1/interp = 1
|
||||||
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PackedFloat32Array(2.2),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"make_current"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/2/type = "method"
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
|
tracks/2/path = NodePath("Camera3D3")
|
||||||
|
tracks/2/interp = 1
|
||||||
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/keys = {
|
||||||
|
"times": PackedFloat32Array(3.3),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"make_current"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/3/type = "method"
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
|
tracks/3/path = NodePath("%PlayerPivot/..")
|
||||||
|
tracks/3/interp = 1
|
||||||
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/keys = {
|
||||||
|
"times": PackedFloat32Array(8),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"finish_death"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/4/type = "method"
|
||||||
|
tracks/4/imported = false
|
||||||
|
tracks/4/enabled = true
|
||||||
|
tracks/4/path = NodePath(".")
|
||||||
|
tracks/4/interp = 1
|
||||||
|
tracks/4/loop_wrap = true
|
||||||
|
tracks/4/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 1.1, 2.2, 3.3),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"screen_shake"
|
||||||
|
}, {
|
||||||
|
"args": [],
|
||||||
|
"method": &"screen_shake"
|
||||||
|
}, {
|
||||||
|
"args": [],
|
||||||
|
"method": &"screen_shake"
|
||||||
|
}, {
|
||||||
|
"args": [],
|
||||||
|
"method": &"screen_shake"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/5/type = "value"
|
||||||
|
tracks/5/imported = false
|
||||||
|
tracks/5/enabled = true
|
||||||
|
tracks/5/path = NodePath("AudioStreamPlayer3D:playing")
|
||||||
|
tracks/5/interp = 1
|
||||||
|
tracks/5/loop_wrap = true
|
||||||
|
tracks/5/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 1,
|
||||||
|
"values": [true]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_kc803"]
|
||||||
|
_data = {
|
||||||
|
"RESET": SubResource("Animation_ll5da"),
|
||||||
|
"death": SubResource("Animation_dlkgq")
|
||||||
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_ug2a7"]
|
[sub_resource type="Animation" id="Animation_ug2a7"]
|
||||||
length = 0.001
|
length = 0.001
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
|
@ -222,37 +349,25 @@ length = 0.001
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
tracks/0/imported = false
|
||||||
tracks/0/enabled = true
|
tracks/0/enabled = true
|
||||||
tracks/0/path = NodePath("ExplosionMesh:mesh:material:albedo_texture:pause")
|
tracks/0/path = NodePath("ExplosionMesh:visible")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PackedFloat32Array(0),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PackedFloat32Array(1),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true]
|
"values": [false]
|
||||||
}
|
}
|
||||||
tracks/1/type = "value"
|
tracks/1/type = "value"
|
||||||
tracks/1/imported = false
|
tracks/1/imported = false
|
||||||
tracks/1/enabled = true
|
tracks/1/enabled = false
|
||||||
tracks/1/path = NodePath("ExplosionMesh:visible")
|
tracks/1/path = NodePath("ExplosionMesh/ExplosionSFXPlayer:playing")
|
||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PackedFloat32Array(0),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PackedFloat32Array(1),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [false]
|
|
||||||
}
|
|
||||||
tracks/2/type = "value"
|
|
||||||
tracks/2/imported = false
|
|
||||||
tracks/2/enabled = false
|
|
||||||
tracks/2/path = NodePath("ExplosionMesh/ExplosionSFXPlayer:playing")
|
|
||||||
tracks/2/interp = 1
|
|
||||||
tracks/2/loop_wrap = true
|
|
||||||
tracks/2/keys = {
|
|
||||||
"times": PackedFloat32Array(0),
|
|
||||||
"transitions": PackedFloat32Array(1),
|
|
||||||
"update": 1,
|
|
||||||
"values": [true]
|
"values": [true]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,38 +377,40 @@ length = 1.618
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
tracks/0/imported = false
|
||||||
tracks/0/enabled = true
|
tracks/0/enabled = true
|
||||||
tracks/0/path = NodePath("ExplosionMesh:mesh:material:albedo_texture:pause")
|
tracks/0/path = NodePath("ExplosionMesh:visible")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0, 1.618),
|
"times": PackedFloat32Array(0, 1.618),
|
||||||
"transitions": PackedFloat32Array(1, 1),
|
"transitions": PackedFloat32Array(1, 1),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [false, true]
|
"values": [true, false]
|
||||||
}
|
}
|
||||||
tracks/1/type = "value"
|
tracks/1/type = "value"
|
||||||
tracks/1/imported = false
|
tracks/1/imported = false
|
||||||
tracks/1/enabled = true
|
tracks/1/enabled = true
|
||||||
tracks/1/path = NodePath("ExplosionMesh:visible")
|
tracks/1/path = NodePath("ExplosionMesh/ExplosionSFXPlayer:playing")
|
||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0, 1.618),
|
"times": PackedFloat32Array(0),
|
||||||
"transitions": PackedFloat32Array(1, 1),
|
"transitions": PackedFloat32Array(1),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true, false]
|
"values": [true]
|
||||||
}
|
}
|
||||||
tracks/2/type = "value"
|
tracks/2/type = "method"
|
||||||
tracks/2/imported = false
|
tracks/2/imported = false
|
||||||
tracks/2/enabled = true
|
tracks/2/enabled = true
|
||||||
tracks/2/path = NodePath("ExplosionMesh/ExplosionSFXPlayer:playing")
|
tracks/2/path = NodePath("ExplosionMesh")
|
||||||
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),
|
"times": PackedFloat32Array(0),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PackedFloat32Array(1),
|
||||||
"update": 1,
|
"values": [{
|
||||||
"values": [true]
|
"args": [],
|
||||||
|
"method": &"play"
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dg262"]
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dg262"]
|
||||||
|
@ -345,6 +462,33 @@ transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.555
|
||||||
[node name="DemoCamera" type="Camera3D" parent="PlayerPivot" groups=["DemoCamera"]]
|
[node name="DemoCamera" type="Camera3D" parent="PlayerPivot" groups=["DemoCamera"]]
|
||||||
transform = Transform3D(-0.311543, -0.0687373, 0.947743, 0, 0.99738, 0.0723374, -0.950232, 0.0225362, -0.310727, 0.845792, 0.706621, -0.383459)
|
transform = Transform3D(-0.311543, -0.0687373, 0.947743, 0, 0.99738, 0.0723374, -0.950232, 0.0225362, -0.310727, 0.845792, 0.706621, -0.383459)
|
||||||
|
|
||||||
|
[node name="DeathSequence" type="Node3D" parent="PlayerPivot"]
|
||||||
|
process_mode = 3
|
||||||
|
script = ExtResource("10_vakjm")
|
||||||
|
|
||||||
|
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer" parent="PlayerPivot/DeathSequence"]
|
||||||
|
stream = SubResource("AudioStreamRandomizer_7seum")
|
||||||
|
volume_db = -4.0
|
||||||
|
bus = &"SFX"
|
||||||
|
|
||||||
|
[node name="DeathAnimation" type="AnimationPlayer" parent="PlayerPivot/DeathSequence"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
libraries = {
|
||||||
|
"": SubResource("AnimationLibrary_kc803")
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Camera3D1" type="Camera3D" parent="PlayerPivot/DeathSequence"]
|
||||||
|
transform = Transform3D(-0.00257592, 0.0226116, 0.999741, 0, 0.999744, -0.0226116, -0.999997, -5.82457e-05, -0.00257526, 1.6905, 0.831287, 0.0668699)
|
||||||
|
far = 8192.0
|
||||||
|
|
||||||
|
[node name="Camera3D2" type="Camera3D" parent="PlayerPivot/DeathSequence"]
|
||||||
|
transform = Transform3D(0.864734, -0.175509, 0.470564, 0, 0.936951, 0.349461, -0.502229, -0.302191, 0.810214, 0.386249, 1.16999, 0.906541)
|
||||||
|
far = 8192.0
|
||||||
|
|
||||||
|
[node name="Camera3D3" type="Camera3D" parent="PlayerPivot/DeathSequence"]
|
||||||
|
transform = Transform3D(0.00178714, 0.559853, 0.82859, 0, 0.828592, -0.559853, -0.999998, 0.00100054, 0.00148081, 0.334412, 0.629604, 0.136928)
|
||||||
|
far = 8192.0
|
||||||
|
|
||||||
[node name="Direction" type="Node3D" parent="."]
|
[node name="Direction" type="Node3D" parent="."]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
|
@ -430,8 +574,8 @@ unique_name_in_owner = true
|
||||||
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, -0.02, 0)
|
transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, -0.02, 0)
|
||||||
visible = false
|
visible = false
|
||||||
initial_speed = 50.0
|
initial_speed = 50.0
|
||||||
time_step = 0.01
|
time_step = 0.1
|
||||||
max_steps = 800
|
max_steps = 100
|
||||||
|
|
||||||
[node name="ProjectedTarget" parent="ArrowPivot/ShotProjection" instance=ExtResource("6_mynqj")]
|
[node name="ProjectedTarget" parent="ArrowPivot/ShotProjection" instance=ExtResource("6_mynqj")]
|
||||||
|
|
||||||
|
@ -466,6 +610,7 @@ shape = SubResource("SphereShape3D_xvvdi")
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
||||||
visible = false
|
visible = false
|
||||||
mesh = SubResource("QuadMesh_t34ji")
|
mesh = SubResource("QuadMesh_t34ji")
|
||||||
|
script = ExtResource("15_ytrxd")
|
||||||
|
|
||||||
[node name="ExplosionAnimation" type="AnimationPlayer" parent="ExplosionMesh"]
|
[node name="ExplosionAnimation" type="AnimationPlayer" parent="ExplosionMesh"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
@ -500,6 +645,7 @@ line_spacing = -16.0
|
||||||
autowrap_mode = 2
|
autowrap_mode = 2
|
||||||
width = 120.0
|
width = 120.0
|
||||||
|
|
||||||
|
[connection signal="tree_exiting" from="." to="." method="_on_tree_exiting"]
|
||||||
[connection signal="ball_changed" from="BallPoint" to="." method="_on_game_ball_changed"]
|
[connection signal="ball_changed" from="BallPoint" to="." method="_on_game_ball_changed"]
|
||||||
[connection signal="timeout" from="DownswingTimer" to="." method="finish_downswing"]
|
[connection signal="timeout" from="DownswingTimer" to="." method="finish_downswing"]
|
||||||
[connection signal="timeout" from="BallReturnTimer" to="." method="_on_ball_return_timer_timeout"]
|
[connection signal="timeout" from="BallReturnTimer" to="." method="_on_ball_return_timer_timeout"]
|
||||||
|
|
|
@ -3,6 +3,7 @@ class_name WorldPlayer extends Resource
|
||||||
|
|
||||||
signal on_life_changed(new_value: float)
|
signal on_life_changed(new_value: float)
|
||||||
signal on_balls_changed(type: GameBall.Type, new_value: int)
|
signal on_balls_changed(type: GameBall.Type, new_value: int)
|
||||||
|
signal on_death(player: WorldPlayer)
|
||||||
|
|
||||||
@export_range(0, 100) var life: float = 100.0:
|
@export_range(0, 100) var life: float = 100.0:
|
||||||
set(value):
|
set(value):
|
||||||
|
@ -89,6 +90,10 @@ func prev_ball(type: GameBall.Type) -> GameBall.Type:
|
||||||
return keys[j]
|
return keys[j]
|
||||||
|
|
||||||
|
|
||||||
|
func die() -> void:
|
||||||
|
on_death.emit(self)
|
||||||
|
|
||||||
|
|
||||||
## Create a debug player instance
|
## Create a debug player instance
|
||||||
static func create_debug() -> WorldPlayer:
|
static func create_debug() -> WorldPlayer:
|
||||||
var instance := WorldPlayer.new()
|
var instance := WorldPlayer.new()
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
// Regular saturation is between 0 and 1
|
||||||
|
// But I'm gonna leave this unbounded for fun because you can also supersaturate & anti-saturate o_O
|
||||||
|
uniform float saturation;
|
||||||
|
|
||||||
|
uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec4 source = texture(screen_texture, SCREEN_UV);
|
||||||
|
|
||||||
|
COLOR.rgb = mix(vec3(dot(source.rgb, vec3(0.299, 0.587, 0.114))), source.rgb, saturation);
|
||||||
|
COLOR.a = source.a;
|
||||||
|
}
|
|
@ -36,10 +36,19 @@ const PUTT_ATTRITION := 0.8325 # green?
|
||||||
## If disabled, global gravity will be used instead.
|
## If disabled, global gravity will be used instead.
|
||||||
@export var check_gravity := true
|
@export var check_gravity := true
|
||||||
|
|
||||||
|
## Improves performance by caching gravity at each point along the projection.
|
||||||
|
## This can cause problems if there is a moving gravity field.
|
||||||
|
@export var cache_gravity := true
|
||||||
|
|
||||||
var _tick_counter := 0
|
var _tick_counter := 0
|
||||||
|
|
||||||
var _debug_points: Array[Vector3] = []
|
var _debug_points: Array[Vector3] = []
|
||||||
|
|
||||||
|
var _gravity_cache: Array[Vector3] = []
|
||||||
|
|
||||||
|
var _cached_pos: Vector3
|
||||||
|
var _cached_vel: Vector3
|
||||||
|
|
||||||
@onready var polygon: CSGPolygon3D = %Polygon
|
@onready var polygon: CSGPolygon3D = %Polygon
|
||||||
@onready var path: Path3D = %Path
|
@onready var path: Path3D = %Path
|
||||||
|
|
||||||
|
@ -73,6 +82,11 @@ func _process(_delta: float) -> void:
|
||||||
var pos := global_position
|
var pos := global_position
|
||||||
var vel := -global_basis.z * initial_speed
|
var vel := -global_basis.z * initial_speed
|
||||||
|
|
||||||
|
if not cache_gravity or pos != _cached_pos or vel != _cached_vel:
|
||||||
|
_gravity_cache = []
|
||||||
|
_cached_pos = pos
|
||||||
|
_cached_vel = vel
|
||||||
|
|
||||||
var final_normal: Vector3
|
var final_normal: Vector3
|
||||||
|
|
||||||
for t in range(0, max_steps):
|
for t in range(0, max_steps):
|
||||||
|
@ -82,11 +96,13 @@ func _process(_delta: float) -> void:
|
||||||
# Get local gravity if enabled
|
# Get local gravity if enabled
|
||||||
var local_gravity := gravity * gravity_vec
|
var local_gravity := gravity * gravity_vec
|
||||||
if check_gravity and Game.settings.projection_gravity:
|
if check_gravity and Game.settings.projection_gravity:
|
||||||
local_gravity = _get_gravity(pos)
|
if t >= len(_gravity_cache):
|
||||||
|
_gravity_cache.append(_get_gravity(pos))
|
||||||
|
local_gravity = _gravity_cache[t]
|
||||||
|
|
||||||
# Integrate projectile path
|
# Integrate projectile path
|
||||||
|
var next_pos := pos + vel * time_step + 0.5 * local_gravity * time_step * time_step
|
||||||
vel += local_gravity * time_step
|
vel += local_gravity * time_step
|
||||||
var next_pos := pos + vel * time_step
|
|
||||||
|
|
||||||
# Collision
|
# Collision
|
||||||
if check_collision and Game.settings.projection_collisions:
|
if check_collision and Game.settings.projection_collisions:
|
||||||
|
@ -99,6 +115,7 @@ func _process(_delta: float) -> void:
|
||||||
pos = collision["position"]
|
pos = collision["position"]
|
||||||
_debug_points.append(pos)
|
_debug_points.append(pos)
|
||||||
if putt_projection:
|
if putt_projection:
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
var norm: Vector3 = (collision["normal"] as Vector3).normalized()
|
var norm: Vector3 = (collision["normal"] as Vector3).normalized()
|
||||||
next_pos = pos + norm * 0.05
|
next_pos = pos + norm * 0.05
|
||||||
vel = PUTT_ATTRITION * (vel - 2 * norm * vel.dot(norm))
|
vel = PUTT_ATTRITION * (vel - 2 * norm * vel.dot(norm))
|
||||||
|
@ -143,6 +160,7 @@ func _get_gravity(point: Vector3) -> Vector3:
|
||||||
point_params.position = point
|
point_params.position = point
|
||||||
var collisions := get_world_3d().direct_space_state.intersect_point(point_params)
|
var collisions := get_world_3d().direct_space_state.intersect_point(point_params)
|
||||||
var gravity_areas: Array[Area3D] = []
|
var gravity_areas: Array[Area3D] = []
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
gravity_areas.assign(
|
gravity_areas.assign(
|
||||||
collisions.map(func(d: Dictionary) -> Area3D: return d["collider"] as Area3D)
|
collisions.map(func(d: Dictionary) -> Area3D: return d["collider"] as Area3D)
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,7 +21,7 @@ static var scene := preload("res://src/ui/camera/orbital_camera/orbital_camera.t
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
var up := Vector3.UP
|
var up := Vector3.UP
|
||||||
# If target is a game ball, realign to gravity
|
# If target is a game ball, realign to gravity
|
||||||
if target is GameBall:
|
if is_instance_valid(target) and target is GameBall:
|
||||||
up = -(target as GameBall).current_gravity.normalized()
|
up = -(target as GameBall).current_gravity.normalized()
|
||||||
var right := up.cross(global_basis.z).normalized()
|
var right := up.cross(global_basis.z).normalized()
|
||||||
var forward := right.cross(up).normalized()
|
var forward := right.cross(up).normalized()
|
||||||
|
|
|
@ -12,7 +12,7 @@ func _ready() -> void:
|
||||||
|
|
||||||
func _is_even_child() -> bool:
|
func _is_even_child() -> bool:
|
||||||
var parent := get_parent()
|
var parent := get_parent()
|
||||||
return parent.get_children().find(self) % 2 if parent else false
|
return parent.get_children().find(self) % 2 == 0 if parent else false
|
||||||
|
|
||||||
|
|
||||||
func _recompute() -> void:
|
func _recompute() -> void:
|
||||||
|
|
|
@ -27,7 +27,7 @@ func _update() -> void:
|
||||||
|
|
||||||
text = PROMPT_FORMAT.format(
|
text = PROMPT_FORMAT.format(
|
||||||
[
|
[
|
||||||
input_symbol if input_symbol else PromptMap.UNKNOWN_INPUT_SYMBOL,
|
input_symbol if input_symbol else str(PromptMap.UNKNOWN_INPUT_SYMBOL),
|
||||||
loc_action if loc_action else action
|
loc_action if loc_action else str(action)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
|
@ -16,7 +16,7 @@ func screen_shake(intensity: float, duration: float = 0.2) -> void:
|
||||||
if not Game.settings.enable_screen_shake:
|
if not Game.settings.enable_screen_shake:
|
||||||
return
|
return
|
||||||
|
|
||||||
var tween := get_tree().create_tween()
|
var tween := create_tween()
|
||||||
rumbler.intensity = intensity
|
rumbler.intensity = intensity
|
||||||
tween.tween_property(rumbler, "intensity", 0.0, duration).set_trans(Tween.TRANS_CUBIC)
|
tween.tween_property(rumbler, "intensity", 0.0, duration).set_trans(Tween.TRANS_CUBIC)
|
||||||
tween.tween_callback(_reset_position)
|
tween.tween_callback(_reset_position)
|
||||||
|
|
|
@ -81,6 +81,10 @@ ClubSelectLabelDisabled/colors/font_outline_color = Color(0.2, 0.2, 0.2, 1)
|
||||||
ClubSelectLabelDisabled/colors/font_shadow_color = Color(0.2, 0.2, 0.2, 1)
|
ClubSelectLabelDisabled/colors/font_shadow_color = Color(0.2, 0.2, 0.2, 1)
|
||||||
ClubSelectLabelDisabled/font_sizes/font_size = 84
|
ClubSelectLabelDisabled/font_sizes/font_size = 84
|
||||||
ClubSelectLabelDisabled/fonts/font = ExtResource("1_3rv2b")
|
ClubSelectLabelDisabled/fonts/font = ExtResource("1_3rv2b")
|
||||||
|
DeathScreenLabel/base_type = &"RichTextLabel"
|
||||||
|
DeathScreenLabel/colors/default_color = Color(0.611765, 0.133333, 0.133333, 1)
|
||||||
|
DeathScreenLabel/colors/font_outline_color = Color(0, 0, 0, 1)
|
||||||
|
DeathScreenLabel/fonts/normal_font = ExtResource("1_eha6a")
|
||||||
HeaderLarge/constants/outline_size = 8
|
HeaderLarge/constants/outline_size = 8
|
||||||
HeaderLarge/font_sizes/font_size = 28
|
HeaderLarge/font_sizes/font_size = 28
|
||||||
HeaderMedium/constants/outline_size = 6
|
HeaderMedium/constants/outline_size = 6
|
||||||
|
|
|
@ -5,6 +5,7 @@ extends Setting
|
||||||
|
|
||||||
|
|
||||||
func initialize_value(value: Variant) -> void:
|
func initialize_value(value: Variant) -> void:
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
checkbox.button_pressed = value as bool
|
checkbox.button_pressed = value as bool
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ extends "res://src/ui/menus/settings_menu/settings/checkbox_setting/checkbox_set
|
||||||
|
|
||||||
|
|
||||||
func initialize_value(value: Variant) -> void:
|
func initialize_value(value: Variant) -> void:
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
checkbox.button_pressed = (value as Window.Mode) == Window.MODE_FULLSCREEN
|
checkbox.button_pressed = (value as Window.Mode) == Window.MODE_FULLSCREEN
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ extends Setting
|
||||||
|
|
||||||
|
|
||||||
func initialize_value(value: Variant) -> void:
|
func initialize_value(value: Variant) -> void:
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
dropdown.selected = dropdown.get_item_index(value as int)
|
dropdown.selected = dropdown.get_item_index(value as int)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ extends Setting
|
||||||
|
|
||||||
|
|
||||||
func initialize_value(value: Variant) -> void:
|
func initialize_value(value: Variant) -> void:
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
slider.value = value as float
|
slider.value = value as float
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ const PIVOT_SCALE := -PI / 4
|
||||||
if pivot:
|
if pivot:
|
||||||
pivot.rotation = v * PIVOT_SCALE
|
pivot.rotation = v * PIVOT_SCALE
|
||||||
get:
|
get:
|
||||||
return pivot.rotation / PIVOT_SCALE if pivot else 0
|
return pivot.rotation / PIVOT_SCALE if pivot else 0.0
|
||||||
|
|
||||||
@onready var pivot: Control = %Pivot
|
@onready var pivot: Control = %Pivot
|
||||||
@onready var gradient_fill: TextureRect = %GradientFill
|
@onready var gradient_fill: TextureRect = %GradientFill
|
||||||
|
|
|
@ -0,0 +1,266 @@
|
||||||
|
[gd_scene load_steps=12 format=3 uid="uid://biokiug3e0ipk"]
|
||||||
|
|
||||||
|
[ext_resource type="Shader" path="res://src/shaders/desaturate.gdshader" id="1_0nlhb"]
|
||||||
|
[ext_resource type="Script" path="res://src/ui/decorations/text_effects/typewriter/typewriter_label.gd" id="2_w3oh2"]
|
||||||
|
|
||||||
|
[sub_resource type="ShaderMaterial" id="ShaderMaterial_m6b5h"]
|
||||||
|
shader = ExtResource("1_0nlhb")
|
||||||
|
shader_parameter/saturation = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="Gradient" id="Gradient_d8y1q"]
|
||||||
|
offsets = PackedFloat32Array(0.248473, 1)
|
||||||
|
colors = PackedColorArray(0, 0, 0, 0.8, 0, 0, 0, 0)
|
||||||
|
|
||||||
|
[sub_resource type="GradientTexture2D" id="GradientTexture2D_7xfnx"]
|
||||||
|
gradient = SubResource("Gradient_d8y1q")
|
||||||
|
width = 256
|
||||||
|
fill = 1
|
||||||
|
fill_from = Vector2(0.5, 0.5)
|
||||||
|
fill_to = Vector2(1, 0.5)
|
||||||
|
metadata/_snap_enabled = true
|
||||||
|
|
||||||
|
[sub_resource type="Curve" id="Curve_ndj60"]
|
||||||
|
min_value = -16.0
|
||||||
|
max_value = 16.0
|
||||||
|
_data = [Vector2(0, 0), 0.0, 44.2396, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||||
|
point_count = 2
|
||||||
|
|
||||||
|
[sub_resource type="Curve" id="Curve_nld14"]
|
||||||
|
min_value = -100.0
|
||||||
|
max_value = 0.0
|
||||||
|
_data = [Vector2(0, -100), 0.0, 451.099, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||||
|
point_count = 2
|
||||||
|
|
||||||
|
[sub_resource type="CurveXYZTexture" id="CurveXYZTexture_bixq7"]
|
||||||
|
curve_x = SubResource("Curve_ndj60")
|
||||||
|
curve_y = SubResource("Curve_nld14")
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_4aged"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("AlertContainer/GradientBG:modulate")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Color(1, 1, 1, 1)]
|
||||||
|
}
|
||||||
|
tracks/1/type = "value"
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/path = NodePath("AlertContainer/Text/Subheading:modulate")
|
||||||
|
tracks/1/interp = 1
|
||||||
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Color(1, 1, 1, 1)]
|
||||||
|
}
|
||||||
|
tracks/2/type = "value"
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
|
tracks/2/path = NodePath(".:modulate")
|
||||||
|
tracks/2/interp = 1
|
||||||
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Color(1, 1, 1, 1)]
|
||||||
|
}
|
||||||
|
tracks/3/type = "value"
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
|
tracks/3/path = NodePath("Desaturator:material:shader_parameter/saturation")
|
||||||
|
tracks/3/interp = 1
|
||||||
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [1.0]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_l6yhv"]
|
||||||
|
resource_name = "display"
|
||||||
|
length = 8.0
|
||||||
|
loop_mode = 1
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("AlertContainer/GradientBG:modulate")
|
||||||
|
tracks/0/interp = 2
|
||||||
|
tracks/0/loop_wrap = false
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 3),
|
||||||
|
"transitions": PackedFloat32Array(1.618, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
|
||||||
|
}
|
||||||
|
tracks/1/type = "value"
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/path = NodePath("AlertContainer/Text/Subheading:modulate")
|
||||||
|
tracks/1/interp = 2
|
||||||
|
tracks/1/loop_wrap = false
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PackedFloat32Array(3, 8),
|
||||||
|
"transitions": PackedFloat32Array(1.618, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
|
||||||
|
}
|
||||||
|
tracks/2/type = "value"
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
|
tracks/2/path = NodePath(".:modulate")
|
||||||
|
tracks/2/interp = 2
|
||||||
|
tracks/2/loop_wrap = false
|
||||||
|
tracks/2/keys = {
|
||||||
|
"times": PackedFloat32Array(7.5, 8),
|
||||||
|
"transitions": PackedFloat32Array(1.618, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)]
|
||||||
|
}
|
||||||
|
tracks/3/type = "method"
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
|
tracks/3/path = NodePath("AlertContainer/Text/TypewriterLabel")
|
||||||
|
tracks/3/interp = 1
|
||||||
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"restart"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/4/type = "method"
|
||||||
|
tracks/4/imported = false
|
||||||
|
tracks/4/enabled = true
|
||||||
|
tracks/4/path = NodePath(".")
|
||||||
|
tracks/4/interp = 1
|
||||||
|
tracks/4/loop_wrap = true
|
||||||
|
tracks/4/keys = {
|
||||||
|
"times": PackedFloat32Array(8),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"queue_free"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
tracks/5/type = "value"
|
||||||
|
tracks/5/imported = false
|
||||||
|
tracks/5/enabled = true
|
||||||
|
tracks/5/path = NodePath("Desaturator:material:shader_parameter/saturation")
|
||||||
|
tracks/5/interp = 1
|
||||||
|
tracks/5/loop_wrap = false
|
||||||
|
tracks/5/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 6, 7.5, 8),
|
||||||
|
"transitions": PackedFloat32Array(1.618, 1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [1.0, 0.0, 0.0, 1.0]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_em7mg"]
|
||||||
|
_data = {
|
||||||
|
"RESET": SubResource("Animation_4aged"),
|
||||||
|
"display": SubResource("Animation_l6yhv")
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="DeathAlert" type="Control"]
|
||||||
|
custom_minimum_size = Vector2(0, 300)
|
||||||
|
layout_mode = 3
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="Desaturator" type="ColorRect" parent="."]
|
||||||
|
material = SubResource("ShaderMaterial_m6b5h")
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="AlertContainer" type="Control" parent="."]
|
||||||
|
custom_minimum_size = Vector2(0, 300)
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 14
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="GradientBG" type="TextureRect" parent="AlertContainer"]
|
||||||
|
texture_filter = 6
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = -1
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_left = -128.0
|
||||||
|
offset_right = 128.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
texture = SubResource("GradientTexture2D_7xfnx")
|
||||||
|
|
||||||
|
[node name="Text" type="Control" parent="AlertContainer"]
|
||||||
|
texture_filter = 6
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="TypewriterLabel" type="RichTextLabel" parent="AlertContainer/Text"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
theme_type_variation = &"DeathScreenLabel"
|
||||||
|
theme_override_constants/outline_size = 16
|
||||||
|
theme_override_font_sizes/normal_font_size = 256
|
||||||
|
bbcode_enabled = true
|
||||||
|
text = "[center][wave][type speed=10 delay=2.7 factor=4.0]got em[/type][/wave][/center]"
|
||||||
|
scroll_active = false
|
||||||
|
autowrap_mode = 0
|
||||||
|
script = ExtResource("2_w3oh2")
|
||||||
|
translation_curve = SubResource("CurveXYZTexture_bixq7")
|
||||||
|
|
||||||
|
[node name="Subheading" type="RichTextLabel" parent="AlertContainer/Text"]
|
||||||
|
custom_minimum_size = Vector2(220, 40)
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = -1
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_left = -110.0
|
||||||
|
offset_top = -40.0
|
||||||
|
offset_right = 110.0
|
||||||
|
offset_bottom = -50.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 0
|
||||||
|
theme_type_variation = &"DeathScreenLabel"
|
||||||
|
theme_override_constants/outline_size = 4
|
||||||
|
theme_override_font_sizes/normal_font_size = 36
|
||||||
|
bbcode_enabled = true
|
||||||
|
text = "[center][wave]lmao[/wave][/center]"
|
||||||
|
|
||||||
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||||
|
libraries = {
|
||||||
|
"": SubResource("AnimationLibrary_em7mg")
|
||||||
|
}
|
||||||
|
autoplay = "display"
|
|
@ -445,8 +445,10 @@ _data = {
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="NiceAlert" type="Control"]
|
[node name="NiceAlert" type="Control"]
|
||||||
|
texture_filter = 5
|
||||||
custom_minimum_size = Vector2(0, 300)
|
custom_minimum_size = Vector2(0, 300)
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
|
anchors_preset = 14
|
||||||
anchor_top = 0.5
|
anchor_top = 0.5
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 0.5
|
anchor_bottom = 0.5
|
|
@ -1,7 +1,7 @@
|
||||||
class_name ShotHUD extends Control
|
class_name ShotHUD extends Control
|
||||||
## HUD for main gameplay loop
|
## HUD for main gameplay loop
|
||||||
|
|
||||||
const NICE_ALERT_SCENE := preload("res://src/ui/decorations/nice_alert.tscn")
|
const NICE_ALERT_SCENE := preload("res://src/ui/shot_hud/nice_alert.tscn")
|
||||||
|
|
||||||
## Scale factor for the life bar rumble intensity on taking damage
|
## Scale factor for the life bar rumble intensity on taking damage
|
||||||
const LIFE_BAR_DAMAGE_RUMBLE_SCALE := 0.2
|
const LIFE_BAR_DAMAGE_RUMBLE_SCALE := 0.2
|
||||||
|
@ -20,7 +20,7 @@ var player: WorldPlayer
|
||||||
@onready var _curve_animation: AnimationPlayer = %CurveAnimation
|
@onready var _curve_animation: AnimationPlayer = %CurveAnimation
|
||||||
@onready var _power_animation: AnimationPlayer = %PowerAnimation
|
@onready var _power_animation: AnimationPlayer = %PowerAnimation
|
||||||
|
|
||||||
@onready var _nice_container: Control = %NiceContainer
|
@onready var _alert_container: Control = %AlertContainer
|
||||||
@onready var _wasted_animation: AnimationPlayer = %WastedAnimation
|
@onready var _wasted_animation: AnimationPlayer = %WastedAnimation
|
||||||
|
|
||||||
@onready var _club_selector_animation: AnimationPlayer = %ClubSelectorAnimation
|
@onready var _club_selector_animation: AnimationPlayer = %ClubSelectorAnimation
|
||||||
|
@ -90,7 +90,7 @@ func gauge_flourish() -> void:
|
||||||
|
|
||||||
|
|
||||||
func play_nice_animation() -> void:
|
func play_nice_animation() -> void:
|
||||||
_nice_container.add_child(NICE_ALERT_SCENE.instantiate())
|
_alert_container.add_child(NICE_ALERT_SCENE.instantiate())
|
||||||
|
|
||||||
|
|
||||||
func play_wasted_animation() -> void:
|
func play_wasted_animation() -> void:
|
||||||
|
|
|
@ -547,15 +547,6 @@ grow_vertical = 2
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
script = ExtResource("1_x5b4c")
|
script = ExtResource("1_x5b4c")
|
||||||
|
|
||||||
[node name="NiceContainer" type="Control" parent="."]
|
|
||||||
unique_name_in_owner = true
|
|
||||||
layout_mode = 1
|
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
|
||||||
anchor_bottom = 1.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 2
|
|
||||||
|
|
||||||
[node name="WastedFeedback" type="RichTextLabel" parent="."]
|
[node name="WastedFeedback" type="RichTextLabel" parent="."]
|
||||||
visible = false
|
visible = false
|
||||||
custom_minimum_size = Vector2(1400, 0)
|
custom_minimum_size = Vector2(1400, 0)
|
||||||
|
@ -565,10 +556,10 @@ anchor_left = 0.5
|
||||||
anchor_top = 0.5
|
anchor_top = 0.5
|
||||||
anchor_right = 0.5
|
anchor_right = 0.5
|
||||||
anchor_bottom = 0.5
|
anchor_bottom = 0.5
|
||||||
offset_left = -350.0
|
offset_left = -700.0
|
||||||
offset_top = -66.0
|
offset_top = -136.5
|
||||||
offset_right = 350.0
|
offset_right = 700.0
|
||||||
offset_bottom = 66.0
|
offset_bottom = 136.5
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
grow_vertical = 2
|
grow_vertical = 2
|
||||||
pivot_offset = Vector2(100, 115)
|
pivot_offset = Vector2(100, 115)
|
||||||
|
@ -818,3 +809,12 @@ unique_name_in_owner = true
|
||||||
libraries = {
|
libraries = {
|
||||||
"": SubResource("AnimationLibrary_o70c6")
|
"": SubResource("AnimationLibrary_o70c6")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[node name="AlertContainer" type="Control" parent="."]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
class_name WorldUI extends Control
|
class_name WorldUI extends Control
|
||||||
## Container & accessor for the world UI.
|
## Container & accessor for the world UI.
|
||||||
|
|
||||||
|
const DEATH_ALERT_SCENE := preload("res://src/ui/shot_hud/death_alert.tscn")
|
||||||
|
|
||||||
const DEMO_CAMERA_GROUP := "DemoCamera"
|
const DEMO_CAMERA_GROUP := "DemoCamera"
|
||||||
|
|
||||||
@export var pause_scene := preload("res://src/ui/menus/pause_menu/pause_menu.tscn")
|
@export var pause_scene := preload("res://src/ui/menus/pause_menu/pause_menu.tscn")
|
||||||
|
|
||||||
var _prev_camera: Camera3D
|
var _prev_camera: Camera3D
|
||||||
|
var _pre_death_camera: Camera3D
|
||||||
|
|
||||||
@onready var hud_container: Control = %HUDContainer
|
@onready var hud_container: Control = %HUDContainer
|
||||||
|
@onready var effect_container: Control = %EffectContainer
|
||||||
@onready var pause_container: Control = %PauseContainer
|
@onready var pause_container: Control = %PauseContainer
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,6 +25,19 @@ func add_player_hud(hud: ShotHUD) -> void:
|
||||||
hud_container.add_child(hud)
|
hud_container.add_child(hud)
|
||||||
|
|
||||||
|
|
||||||
|
func play_death_sequence() -> void:
|
||||||
|
_pre_death_camera = get_viewport().get_camera_3d()
|
||||||
|
hud_container.hide()
|
||||||
|
var alert := DEATH_ALERT_SCENE.instantiate()
|
||||||
|
alert.tree_exiting.connect(_finish_death_sequence)
|
||||||
|
effect_container.add_child(alert)
|
||||||
|
|
||||||
|
|
||||||
|
func _finish_death_sequence() -> void:
|
||||||
|
hud_container.show()
|
||||||
|
_pre_death_camera.make_current()
|
||||||
|
|
||||||
|
|
||||||
func pause() -> void:
|
func pause() -> void:
|
||||||
# Switch to demo cam, if there is one.
|
# Switch to demo cam, if there is one.
|
||||||
var democams: Array[Node] = get_tree().get_nodes_in_group(DEMO_CAMERA_GROUP)
|
var democams: Array[Node] = get_tree().get_nodes_in_group(DEMO_CAMERA_GROUP)
|
||||||
|
|
|
@ -227,11 +227,13 @@ static func key(event: InputEventKey) -> String:
|
||||||
return OS.get_keycode_string(
|
return OS.get_keycode_string(
|
||||||
DisplayServer.keyboard_get_keycode_from_physical(event.physical_keycode)
|
DisplayServer.keyboard_get_keycode_from_physical(event.physical_keycode)
|
||||||
)
|
)
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
return _compose_modifiers(event, KEYBOARD[event.physical_keycode] as String)
|
return _compose_modifiers(event, KEYBOARD[event.physical_keycode] as String)
|
||||||
|
|
||||||
|
|
||||||
## Get the symbol representing the given mouse button event.
|
## Get the symbol representing the given mouse button event.
|
||||||
static func mouse_button(event: InputEventMouseButton) -> String:
|
static func mouse_button(event: InputEventMouseButton) -> String:
|
||||||
|
@warning_ignore("unsafe_cast")
|
||||||
return _compose_modifiers(event, MOUSE.get(event.button_index, UNKNOWN_INPUT_SYMBOL) as String)
|
return _compose_modifiers(event, MOUSE.get(event.button_index, UNKNOWN_INPUT_SYMBOL) as String)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ class_name PlayManager extends Resource
|
||||||
func initialize() -> void:
|
func initialize() -> void:
|
||||||
for player: WorldPlayer in players:
|
for player: WorldPlayer in players:
|
||||||
player.shot_setup.finished.connect(_on_turn_finished)
|
player.shot_setup.finished.connect(_on_turn_finished)
|
||||||
|
player.on_death.connect(_on_player_death)
|
||||||
on_initialization()
|
on_initialization()
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,3 +22,11 @@ func on_turn_finished(_shot_setup: ShotSetup) -> void:
|
||||||
|
|
||||||
func _on_turn_finished(shot_setup: ShotSetup) -> void:
|
func _on_turn_finished(shot_setup: ShotSetup) -> void:
|
||||||
on_turn_finished(shot_setup)
|
on_turn_finished(shot_setup)
|
||||||
|
|
||||||
|
|
||||||
|
func on_player_death(_player: WorldPlayer) -> void:
|
||||||
|
pass # Implemented in derived type
|
||||||
|
|
||||||
|
|
||||||
|
func _on_player_death(player: WorldPlayer) -> void:
|
||||||
|
on_player_death(player)
|
||||||
|
|
|
@ -11,3 +11,18 @@ func on_turn_finished(source: ShotSetup) -> void:
|
||||||
print_debug("Shot finished for ", source.player.name)
|
print_debug("Shot finished for ", source.player.name)
|
||||||
players.push_back(players.pop_front())
|
players.push_back(players.pop_front())
|
||||||
players[0].shot_setup.queue_restart()
|
players[0].shot_setup.queue_restart()
|
||||||
|
|
||||||
|
|
||||||
|
func on_player_death(player: WorldPlayer) -> void:
|
||||||
|
# If the dying player was active, we need to finish it and activate the next player's turn
|
||||||
|
if player.shot_setup.is_active():
|
||||||
|
on_turn_finished(player.shot_setup)
|
||||||
|
|
||||||
|
players.erase(player)
|
||||||
|
print("Player 0 phase: ", ShotSetup.Phase.keys()[players[0].shot_setup.phase])
|
||||||
|
if len(players) == 1:
|
||||||
|
on_win_condition()
|
||||||
|
|
||||||
|
|
||||||
|
func on_win_condition() -> void:
|
||||||
|
pass # TODO
|
||||||
|
|
|
@ -63,7 +63,7 @@ static func at_position(global_position: Vector3, terrain3d: Terrain3D) -> Type:
|
||||||
var blend := terrain3d.data.get_texture_id(global_position)
|
var blend := terrain3d.data.get_texture_id(global_position)
|
||||||
var id: int
|
var id: int
|
||||||
if terrain3d.data.get_control_auto(global_position):
|
if terrain3d.data.get_control_auto(global_position):
|
||||||
id = blend.x if blend.z > 0 else blend.y
|
id = int(blend.x if blend.z > 0 else blend.y)
|
||||||
else:
|
else:
|
||||||
id = blend.x
|
id = int(blend.x)
|
||||||
return from_texture_id(id)
|
return from_texture_id(id)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=8 format=3 uid="uid://cwnwcd8kushl3"]
|
[gd_scene load_steps=10 format=3 uid="uid://cwnwcd8kushl3"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://src/world/world.gd" id="1_ybjyx"]
|
[ext_resource type="Script" path="res://src/world/world.gd" id="1_ybjyx"]
|
||||||
[ext_resource type="PackedScene" uid="uid://bm2o3mex10v11" path="res://levels/debug_level/debug_level.tscn" id="2_0xu5a"]
|
[ext_resource type="PackedScene" uid="uid://bm2o3mex10v11" path="res://levels/debug_level/debug_level.tscn" id="2_0xu5a"]
|
||||||
|
@ -6,10 +6,22 @@
|
||||||
[ext_resource type="Script" path="res://src/ui/world_ui.gd" id="2_imewa"]
|
[ext_resource type="Script" path="res://src/ui/world_ui.gd" id="2_imewa"]
|
||||||
[ext_resource type="Resource" uid="uid://crock3revdn73" path="res://src/player/debug_player.tres" id="3_pyw81"]
|
[ext_resource type="Resource" uid="uid://crock3revdn73" path="res://src/player/debug_player.tres" id="3_pyw81"]
|
||||||
[ext_resource type="Script" path="res://src/world/play_manager/round_robin_manager.gd" id="5_h6mje"]
|
[ext_resource type="Script" path="res://src/world/play_manager/round_robin_manager.gd" id="5_h6mje"]
|
||||||
|
[ext_resource type="Resource" uid="uid://c1pnqsddvey3m" path="res://src/equipment/clubs/drivers/debug_driver.tres" id="5_u5ok3"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_njyo4"]
|
||||||
|
script = ExtResource("2_e743i")
|
||||||
|
life = 4.0
|
||||||
|
name = "Gfolfer2"
|
||||||
|
color = Color(1, 0.439216, 0.439216, 1)
|
||||||
|
driver = ExtResource("5_u5ok3")
|
||||||
|
_balls = {
|
||||||
|
1: -1,
|
||||||
|
2: -1
|
||||||
|
}
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_rdjhi"]
|
[sub_resource type="Resource" id="Resource_rdjhi"]
|
||||||
script = ExtResource("5_h6mje")
|
script = ExtResource("5_h6mje")
|
||||||
players = Array[ExtResource("2_e743i")]([ExtResource("3_pyw81")])
|
players = Array[ExtResource("2_e743i")]([ExtResource("3_pyw81"), SubResource("Resource_njyo4")])
|
||||||
|
|
||||||
[node name="World" type="Node" groups=["WorldGroup"]]
|
[node name="World" type="Node" groups=["WorldGroup"]]
|
||||||
script = ExtResource("1_ybjyx")
|
script = ExtResource("1_ybjyx")
|
||||||
|
@ -39,6 +51,17 @@ anchor_bottom = 1.0
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
grow_vertical = 2
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="EffectContainer" type="Control" parent="UI"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
process_mode = 3
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
mouse_filter = 2
|
||||||
|
|
||||||
[node name="PauseContainer" type="Control" parent="UI"]
|
[node name="PauseContainer" type="Control" parent="UI"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
|
|
Loading…
Reference in New Issue