generated from krampus/template-godot4
	Player turns are managed & sequenced in World
This commit is contained in:
		
							parent
							
								
									5cfb1fce96
								
							
						
					
					
						commit
						3d1da45673
					
				@ -1,4 +1,4 @@
 | 
				
			|||||||
[gd_scene load_steps=55 format=3 uid="uid://bm2o3mex10v11"]
 | 
					[gd_scene load_steps=54 format=3 uid="uid://bm2o3mex10v11"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Texture2D" path="res://assets/textures/grass_fairway/grass_fairway_albedo.dds" id="2_e4m27"]
 | 
					[ext_resource type="Texture2D" path="res://assets/textures/grass_fairway/grass_fairway_albedo.dds" id="2_e4m27"]
 | 
				
			||||||
[ext_resource type="Texture2D" path="res://assets/textures/grass_rough/grass_rough_albedo.dds" id="4_p0awb"]
 | 
					[ext_resource type="Texture2D" path="res://assets/textures/grass_rough/grass_rough_albedo.dds" id="4_p0awb"]
 | 
				
			||||||
@ -9,7 +9,6 @@
 | 
				
			|||||||
[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_albedo.dds" id="6_nlea7"]
 | 
					[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_albedo.dds" id="6_nlea7"]
 | 
				
			||||||
[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_normal.dds" id="7_f25dn"]
 | 
					[ext_resource type="Texture2D" path="res://assets/textures/sand_trap/sand_trap_normal.dds" id="7_f25dn"]
 | 
				
			||||||
[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="PackedScene" uid="uid://cy7t2tc4y3b4" path="res://src/player/shot_setup/shot_setup.tscn" id="8_h44v5"]
 | 
					 | 
				
			||||||
[ext_resource type="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_albedo.dds" id="8_ujbjy"]
 | 
					[ext_resource type="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_albedo.dds" id="8_ujbjy"]
 | 
				
			||||||
[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="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_normal.dds" id="9_rrguh"]
 | 
					[ext_resource type="Texture2D" path="res://assets/textures/mountain_rock/mountain_rock_normal.dds" id="9_rrguh"]
 | 
				
			||||||
@ -306,8 +305,17 @@ shape = SubResource("BoxShape3D_x3wvm")
 | 
				
			|||||||
[node name="Flag" parent="Course" instance=ExtResource("13_6jtao")]
 | 
					[node name="Flag" parent="Course" instance=ExtResource("13_6jtao")]
 | 
				
			||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 540, 4, 452)
 | 
					transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 540, 4, 452)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="ShotSetup" parent="Course" instance=ExtResource("8_h44v5")]
 | 
					[node name="PlayerSpawn1" type="Marker3D" parent="Course" groups=["PlayerSpawn"]]
 | 
				
			||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 212.717, 4, 294.073)
 | 
					transform = Transform3D(-0.842697, 0, -0.538388, 0, 1, 0, 0.538388, 0, -0.842697, 212.717, 4, 294.073)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="PlayerSpawn2" type="Marker3D" parent="Course" groups=["PlayerSpawn"]]
 | 
				
			||||||
 | 
					transform = Transform3D(-0.842697, 0, -0.538388, 0, 1, 0, 0.538388, 0, -0.842697, 217.046, 4, 292.261)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="PlayerSpawn3" type="Marker3D" parent="Course" groups=["PlayerSpawn"]]
 | 
				
			||||||
 | 
					transform = Transform3D(-0.842697, 0, -0.538388, 0, 1, 0, 0.538388, 0, -0.842697, 218.01, 4, 289.245)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="PlayerSpawn4" type="Marker3D" parent="Course" groups=["PlayerSpawn"]]
 | 
				
			||||||
 | 
					transform = Transform3D(-0.842697, 0, -0.538388, 0, 1, 0, 0.538388, 0, -0.842697, 214.256, 4, 290.91)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="GuardRail" parent="Course" instance=ExtResource("16_xtxyj")]
 | 
					[node name="GuardRail" parent="Course" instance=ExtResource("16_xtxyj")]
 | 
				
			||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 211.416, 4, 288.708)
 | 
					transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 211.416, 4, 288.708)
 | 
				
			||||||
 | 
				
			|||||||
@ -169,7 +169,7 @@ bones/23/scale = Vector3(1, 1, 1)
 | 
				
			|||||||
visible = false
 | 
					visible = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="BoneAttachment3D" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="6"]
 | 
					[node name="BoneAttachment3D" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="6"]
 | 
				
			||||||
transform = Transform3D(-0.944824, 0.316851, -0.0831417, -0.326395, -0.932135, 0.156815, -0.027812, 0.1753, 0.984122, -0.1687, 3.13445, 0.86185)
 | 
					transform = Transform3D(-0.947388, 0.307308, -0.089546, -0.319114, -0.928605, 0.189367, -0.0249588, 0.207979, 0.977815, -0.157835, 3.16355, 0.865627)
 | 
				
			||||||
bone_name = "Hand.R"
 | 
					bone_name = "Hand.R"
 | 
				
			||||||
bone_idx = 11
 | 
					bone_idx = 11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
class_name Club extends Node
 | 
					class_name Club extends Resource
 | 
				
			||||||
## Base type for gfolf clubs
 | 
					## Base type for gfolf clubs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum Type {
 | 
					enum Type {
 | 
				
			||||||
@ -10,6 +10,7 @@ enum Type {
 | 
				
			|||||||
	SPECIAL,
 | 
						SPECIAL,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@export var name: String
 | 
				
			||||||
@export var type: Club.Type
 | 
					@export var type: Club.Type
 | 
				
			||||||
@export var _model: PackedScene
 | 
					@export var _model: PackedScene
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
class_name ClubCatalogType extends Node
 | 
					class_name ClubCatalogType extends Node
 | 
				
			||||||
## Provides access to Club equipment
 | 
					## Provides access to Club equipment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var debug_driver: Club = %"DEBUG Driver"
 | 
					@export var debug_driver: Club = preload("res://src/equipment/clubs/drivers/debug_driver.tres")
 | 
				
			||||||
@onready var debug_iron: Club = %"DEBUG Iron"
 | 
					@export var debug_iron: Club = preload("res://src/equipment/clubs/irons/debug_iron.tres")
 | 
				
			||||||
@onready var debug_wedge: Club = %"DEBUG Wedge"
 | 
					@export var debug_wedge: Club = preload("res://src/equipment/clubs/wedges/debug_wedge.tres")
 | 
				
			||||||
@onready var debug_putter: Club = %"DEBUG Putter"
 | 
					@export var debug_putter: Club = preload("res://src/equipment/clubs/putters/debug_putter.tres")
 | 
				
			||||||
 | 
				
			|||||||
@ -1,35 +1,6 @@
 | 
				
			|||||||
[gd_scene load_steps=7 format=3 uid="uid://f5qw4losi1ag"]
 | 
					[gd_scene load_steps=2 format=3 uid="uid://brn02ebnp248v"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Script" path="res://src/equipment/clubs/club_catalog.gd" id="1_omf4k"]
 | 
					[ext_resource type="Script" path="res://src/equipment/clubs/club_catalog.gd" id="1_omf4k"]
 | 
				
			||||||
[ext_resource type="Script" path="res://src/equipment/clubs/club.gd" id="2_hl4eh"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://dekwor3a7kqio" path="res://assets/models/clubs/driver.gltf" id="3_gocak"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://btpn1j6jwv4pr" path="res://assets/models/clubs/iron.gltf" id="4_ile8w"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://d4bnvf34xenya" path="res://assets/models/clubs/wedge.gltf" id="5_qa3by"]
 | 
					 | 
				
			||||||
[ext_resource type="PackedScene" uid="uid://bo41mkkc70fcl" path="res://assets/models/clubs/putter.gltf" id="6_8bavt"]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="ClubCatalog" type="Node"]
 | 
					[node name="ClubCatalog" type="Node"]
 | 
				
			||||||
script = ExtResource("1_omf4k")
 | 
					script = ExtResource("1_omf4k")
 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="DEBUG Driver" type="Node" parent="."]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
script = ExtResource("2_hl4eh")
 | 
					 | 
				
			||||||
type = 1
 | 
					 | 
				
			||||||
_model = ExtResource("3_gocak")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="DEBUG Iron" type="Node" parent="."]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
script = ExtResource("2_hl4eh")
 | 
					 | 
				
			||||||
type = 2
 | 
					 | 
				
			||||||
_model = ExtResource("4_ile8w")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="DEBUG Wedge" type="Node" parent="."]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
script = ExtResource("2_hl4eh")
 | 
					 | 
				
			||||||
type = 3
 | 
					 | 
				
			||||||
_model = ExtResource("5_qa3by")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="DEBUG Putter" type="Node" parent="."]
 | 
					 | 
				
			||||||
unique_name_in_owner = true
 | 
					 | 
				
			||||||
script = ExtResource("2_hl4eh")
 | 
					 | 
				
			||||||
type = 4
 | 
					 | 
				
			||||||
_model = ExtResource("6_8bavt")
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								src/equipment/clubs/drivers/debug_driver.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/equipment/clubs/drivers/debug_driver.tres
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					[gd_resource type="Resource" script_class="Club" load_steps=3 format=3 uid="uid://c1pnqsddvey3m"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/equipment/clubs/club.gd" id="1_7mcyu"]
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://dekwor3a7kqio" path="res://assets/models/clubs/driver.gltf" id="1_ug675"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[resource]
 | 
				
			||||||
 | 
					script = ExtResource("1_7mcyu")
 | 
				
			||||||
 | 
					name = "DEBUG Driver"
 | 
				
			||||||
 | 
					type = 1
 | 
				
			||||||
 | 
					_model = ExtResource("1_ug675")
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/equipment/clubs/irons/debug_iron.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/equipment/clubs/irons/debug_iron.tres
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					[gd_resource type="Resource" script_class="Club" load_steps=3 format=3 uid="uid://ck17u5yn6k0bi"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://btpn1j6jwv4pr" path="res://assets/models/clubs/iron.gltf" id="1_5wgil"]
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/equipment/clubs/club.gd" id="1_6ksva"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[resource]
 | 
				
			||||||
 | 
					script = ExtResource("1_6ksva")
 | 
				
			||||||
 | 
					name = "DEBUG Iron"
 | 
				
			||||||
 | 
					type = 2
 | 
				
			||||||
 | 
					_model = ExtResource("1_5wgil")
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/equipment/clubs/putters/debug_putter.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/equipment/clubs/putters/debug_putter.tres
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					[gd_resource type="Resource" script_class="Club" load_steps=3 format=3 uid="uid://dagld0q5krapu"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://bo41mkkc70fcl" path="res://assets/models/clubs/putter.gltf" id="1_ghpah"]
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/equipment/clubs/club.gd" id="1_qlirk"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[resource]
 | 
				
			||||||
 | 
					script = ExtResource("1_qlirk")
 | 
				
			||||||
 | 
					name = "DEBUG Putter"
 | 
				
			||||||
 | 
					type = 4
 | 
				
			||||||
 | 
					_model = ExtResource("1_ghpah")
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/equipment/clubs/wedges/debug_wedge.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/equipment/clubs/wedges/debug_wedge.tres
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					[gd_resource type="Resource" script_class="Club" load_steps=3 format=3 uid="uid://dthtc1no2c4wy"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/equipment/clubs/club.gd" id="1_gy3nk"]
 | 
				
			||||||
 | 
					[ext_resource type="PackedScene" uid="uid://d4bnvf34xenya" path="res://assets/models/clubs/wedge.gltf" id="1_voves"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[resource]
 | 
				
			||||||
 | 
					script = ExtResource("1_gy3nk")
 | 
				
			||||||
 | 
					name = "DEBUG Wedge"
 | 
				
			||||||
 | 
					type = 3
 | 
				
			||||||
 | 
					_model = ExtResource("1_voves")
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/player/debug_player.tres
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/player/debug_player.tres
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					[gd_resource type="Resource" script_class="WorldPlayer" load_steps=6 format=3 uid="uid://crock3revdn73"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ext_resource type="Resource" uid="uid://c1pnqsddvey3m" path="res://src/equipment/clubs/drivers/debug_driver.tres" id="1_sn8fd"]
 | 
				
			||||||
 | 
					[ext_resource type="Resource" uid="uid://ck17u5yn6k0bi" path="res://src/equipment/clubs/irons/debug_iron.tres" id="2_piku2"]
 | 
				
			||||||
 | 
					[ext_resource type="Resource" uid="uid://dagld0q5krapu" path="res://src/equipment/clubs/putters/debug_putter.tres" id="3_tytwr"]
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/player/world_player.gd" id="4_8ybyj"]
 | 
				
			||||||
 | 
					[ext_resource type="Resource" uid="uid://dthtc1no2c4wy" path="res://src/equipment/clubs/wedges/debug_wedge.tres" id="5_wm4ae"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[resource]
 | 
				
			||||||
 | 
					script = ExtResource("4_8ybyj")
 | 
				
			||||||
 | 
					name = "DEBUG Gfolfer"
 | 
				
			||||||
 | 
					driver = ExtResource("1_sn8fd")
 | 
				
			||||||
 | 
					iron = ExtResource("2_piku2")
 | 
				
			||||||
 | 
					wedge = ExtResource("5_wm4ae")
 | 
				
			||||||
 | 
					putter = ExtResource("3_tytwr")
 | 
				
			||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
class_name ShotSetup extends Node3D
 | 
					class_name ShotSetup extends Node3D
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					signal finished(source: ShotSetup)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum Phase {
 | 
					enum Phase {
 | 
				
			||||||
	AIM,
 | 
						AIM,
 | 
				
			||||||
	POWER_ADJUST,
 | 
						POWER_ADJUST,
 | 
				
			||||||
@ -44,6 +46,8 @@ const WASTED_BALL_RETURN_DELAY := 3.5
 | 
				
			|||||||
## Keep projection visible
 | 
					## Keep projection visible
 | 
				
			||||||
@export var keep_projection := false
 | 
					@export var keep_projection := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var player: WorldPlayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var base_speed: float = ProjectSettings.get_setting("game/config/controls/camera/free_camera_speed")
 | 
					var base_speed: float = ProjectSettings.get_setting("game/config/controls/camera/free_camera_speed")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var x_sensitivity: float = ProjectSettings.get_setting(
 | 
					var x_sensitivity: float = ProjectSettings.get_setting(
 | 
				
			||||||
@ -63,16 +67,16 @@ var invert_pitch: bool = ProjectSettings.get_setting("game/config/controls/camer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var control_disabled := false
 | 
					var control_disabled := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var hud: ShotHUD:
 | 
					var phase: Phase = Phase.FINISHED:
 | 
				
			||||||
	get:
 | 
					 | 
				
			||||||
		return world.ui.shot_hud if world and world.ui else null
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var phase: Phase:
 | 
					 | 
				
			||||||
	set(value):
 | 
						set(value):
 | 
				
			||||||
		if value != phase:
 | 
							if value != phase:
 | 
				
			||||||
			_on_phase_change(value)
 | 
								_on_phase_change(value)
 | 
				
			||||||
		phase = value
 | 
							phase = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var hud: ShotHUD:
 | 
				
			||||||
 | 
						get:
 | 
				
			||||||
 | 
							return world.ui.shot_hud if world and world.ui else null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var club: Club.Type:
 | 
					var club: Club.Type:
 | 
				
			||||||
	set(value):
 | 
						set(value):
 | 
				
			||||||
		if value != club:
 | 
							if value != club:
 | 
				
			||||||
@ -95,6 +99,7 @@ var shot_curve: float:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var _free_camera: FreeCamera
 | 
					var _free_camera: FreeCamera
 | 
				
			||||||
var _returning_free_camera := false
 | 
					var _returning_free_camera := false
 | 
				
			||||||
 | 
					var _restart_queued := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _tracking_camera: OrbitalCamera
 | 
					var _tracking_camera: OrbitalCamera
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -134,15 +139,17 @@ var _tracking_camera: OrbitalCamera
 | 
				
			|||||||
@onready var camera_distance := zoom.position.z:
 | 
					@onready var camera_distance := zoom.position.z:
 | 
				
			||||||
	set = _set_camera_distance
 | 
						set = _set_camera_distance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var phys_ball_scene := preload("res://src/player/physics_ball/physics_ball.tscn")
 | 
					@onready var phys_ball_scene := preload("res://src/equipment/balls/physics_ball/physics_ball.tscn")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var world: World = get_tree().get_first_node_in_group(World.group)
 | 
					@onready var world: World = get_tree().get_first_node_in_group(World.group)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var _target_rotation := Vector2(pitch.rotation.x, direction.rotation.y)
 | 
					@onready var _target_rotation := Vector2(pitch.rotation.x, direction.rotation.y)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static var scene := preload("res://src/player/shot_setup/shot_setup.tscn")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _init_deferred() -> void:
 | 
					func _init_deferred() -> void:
 | 
				
			||||||
	_on_phase_change(phase)
 | 
						# Set up HUD
 | 
				
			||||||
	club = initial_club
 | 
						club = initial_club
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -181,6 +188,15 @@ func camera_motion(motion: Vector2) -> void:
 | 
				
			|||||||
		)
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Return this instance to the AIM phase the next time we process while FINISHED.
 | 
				
			||||||
 | 
					func queue_restart() -> void:
 | 
				
			||||||
 | 
						_restart_queued = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func is_active() -> bool:
 | 
				
			||||||
 | 
						return phase != Phase.FINISHED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func finish_downswing() -> void:
 | 
					func finish_downswing() -> void:
 | 
				
			||||||
	phase = Phase.SHOT
 | 
						phase = Phase.SHOT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -279,7 +295,13 @@ func end_shot_track() -> void:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Called immediately before `club` is mutated.
 | 
					## Called immediately before `club` is mutated.
 | 
				
			||||||
func _on_club_change(new_club: Club.Type) -> void:
 | 
					func _on_club_change(new_club_type: Club.Type) -> void:
 | 
				
			||||||
 | 
						var new_club := player.get_club(new_club_type)
 | 
				
			||||||
 | 
						if not new_club:
 | 
				
			||||||
 | 
							# `new_club` will be null if player has no club in the given slot
 | 
				
			||||||
 | 
							# TODO play bonk
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Hide all arrows
 | 
						# Hide all arrows
 | 
				
			||||||
	# TODO animate?
 | 
						# TODO animate?
 | 
				
			||||||
	drive_arrow.hide()
 | 
						drive_arrow.hide()
 | 
				
			||||||
@ -287,40 +309,36 @@ func _on_club_change(new_club: Club.Type) -> void:
 | 
				
			|||||||
	iron_arrow.hide()
 | 
						iron_arrow.hide()
 | 
				
			||||||
	putt_arrow.hide()
 | 
						putt_arrow.hide()
 | 
				
			||||||
	physics_ball.iron_ball = false
 | 
						physics_ball.iron_ball = false
 | 
				
			||||||
	hud.club_selector.value = new_club
 | 
						hud.club_selector.value = new_club_type
 | 
				
			||||||
	match new_club:
 | 
						# TODO club change animation
 | 
				
			||||||
 | 
						character.hold_right(new_club.get_model())
 | 
				
			||||||
 | 
						match new_club_type:
 | 
				
			||||||
		Club.Type.DRIVER:
 | 
							Club.Type.DRIVER:
 | 
				
			||||||
			shot_ref = drive_ref
 | 
								shot_ref = drive_ref
 | 
				
			||||||
			drive_arrow.show()
 | 
								drive_arrow.show()
 | 
				
			||||||
			# TODO get this from player loadout
 | 
					 | 
				
			||||||
			# TODO club change animation
 | 
					 | 
				
			||||||
			character.hold_right(Club.catalog.debug_driver.get_model())
 | 
					 | 
				
			||||||
		Club.Type.PUTTER:
 | 
							Club.Type.PUTTER:
 | 
				
			||||||
			shot_ref = putt_ref
 | 
								shot_ref = putt_ref
 | 
				
			||||||
			putt_arrow.show()
 | 
								putt_arrow.show()
 | 
				
			||||||
			character.hold_right(Club.catalog.debug_putter.get_model())
 | 
					 | 
				
			||||||
		Club.Type.WEDGE:
 | 
							Club.Type.WEDGE:
 | 
				
			||||||
			# TODO
 | 
					 | 
				
			||||||
			shot_ref = wedge_ref
 | 
								shot_ref = wedge_ref
 | 
				
			||||||
			wedge_arrow.show()
 | 
								wedge_arrow.show()
 | 
				
			||||||
			character.hold_right(Club.catalog.debug_wedge.get_model())
 | 
					 | 
				
			||||||
		Club.Type.IRON:
 | 
							Club.Type.IRON:
 | 
				
			||||||
			# TODO
 | 
					 | 
				
			||||||
			shot_ref = iron_ref
 | 
								shot_ref = iron_ref
 | 
				
			||||||
			iron_arrow.show()
 | 
								iron_arrow.show()
 | 
				
			||||||
			physics_ball.iron_ball = true
 | 
								physics_ball.iron_ball = true
 | 
				
			||||||
			character.hold_right(Club.catalog.debug_iron.get_model())
 | 
					 | 
				
			||||||
		Club.Type.SPECIAL:
 | 
							Club.Type.SPECIAL:
 | 
				
			||||||
			# TODO
 | 
								# TODO figure this out
 | 
				
			||||||
			print_debug("TODO: implement special clubs!")
 | 
								shot_ref = drive_ref
 | 
				
			||||||
		_:
 | 
							_:
 | 
				
			||||||
			print_debug("Not sure how to equip club type: ", new_club)
 | 
								print_debug("Not sure how to equip club type: ", new_club)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Called immediately before `phase` is mutated.
 | 
					## Called immediately before `phase` is mutated.
 | 
				
			||||||
func _on_phase_change(new_phase: Phase) -> void:
 | 
					func _on_phase_change(new_phase: Phase) -> void:
 | 
				
			||||||
 | 
						print_debug("Player ", player.name, ": change to ", Phase.keys()[new_phase])
 | 
				
			||||||
	match new_phase:
 | 
						match new_phase:
 | 
				
			||||||
		Phase.AIM:
 | 
							Phase.AIM:
 | 
				
			||||||
 | 
								hud.set_state_for_player(player)
 | 
				
			||||||
			hud.show_hud()
 | 
								hud.show_hud()
 | 
				
			||||||
			if not arrow.visible:
 | 
								if not arrow.visible:
 | 
				
			||||||
				arrow_animation.play("show")
 | 
									arrow_animation.play("show")
 | 
				
			||||||
@ -358,6 +376,7 @@ func _on_phase_change(new_phase: Phase) -> void:
 | 
				
			|||||||
			hud.power_bar.hide()
 | 
								hud.power_bar.hide()
 | 
				
			||||||
			hud.curve_bar.hide()
 | 
								hud.curve_bar.hide()
 | 
				
			||||||
			travel_to_ball()
 | 
								travel_to_ball()
 | 
				
			||||||
 | 
								finished.emit(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _process(delta: float) -> void:
 | 
					func _process(delta: float) -> void:
 | 
				
			||||||
@ -451,7 +470,8 @@ func _process(delta: float) -> void:
 | 
				
			|||||||
				phase = Phase.AIM
 | 
									phase = Phase.AIM
 | 
				
			||||||
				return_ball()
 | 
									return_ball()
 | 
				
			||||||
		Phase.FINISHED:
 | 
							Phase.FINISHED:
 | 
				
			||||||
			# TODO: hand over to next player where appropriate
 | 
								if _restart_queued:
 | 
				
			||||||
 | 
									_restart_queued = false
 | 
				
			||||||
				phase = Phase.AIM
 | 
									phase = Phase.AIM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -483,3 +503,10 @@ func _on_physics_ball_body_entered(_body: Node) -> void:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func _on_ball_return_timer_timeout() -> void:
 | 
					func _on_ball_return_timer_timeout() -> void:
 | 
				
			||||||
	return_ball()
 | 
						return_ball()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Create a new instance for the given player.
 | 
				
			||||||
 | 
					static func create(_player: WorldPlayer) -> ShotSetup:
 | 
				
			||||||
 | 
						var instance: ShotSetup = ShotSetup.scene.instantiate()
 | 
				
			||||||
 | 
						instance.player = _player
 | 
				
			||||||
 | 
						return instance
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										49
									
								
								src/player/world_player.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								src/player/world_player.gd
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					class_name WorldPlayer extends Resource
 | 
				
			||||||
 | 
					## Container for the state of the player within the world.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TODO character select
 | 
				
			||||||
 | 
					@export var name: String = "Gfolfer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@export_category("Equipment")
 | 
				
			||||||
 | 
					@export var driver: Club
 | 
				
			||||||
 | 
					@export var iron: Club
 | 
				
			||||||
 | 
					@export var wedge: Club
 | 
				
			||||||
 | 
					@export var putter: Club
 | 
				
			||||||
 | 
					@export var special: Club
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TODO balls, pickups, etc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var shot_setup: ShotSetup:
 | 
				
			||||||
 | 
						get:
 | 
				
			||||||
 | 
							if not shot_setup:
 | 
				
			||||||
 | 
								shot_setup = ShotSetup.create(self)
 | 
				
			||||||
 | 
							return shot_setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Get the club equipped in the given slot.
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					## Returns `null` if the player has no club equipped in the given slot
 | 
				
			||||||
 | 
					func get_club(type: Club.Type) -> Club:
 | 
				
			||||||
 | 
						match type:
 | 
				
			||||||
 | 
							Club.Type.DRIVER:
 | 
				
			||||||
 | 
								return driver
 | 
				
			||||||
 | 
							Club.Type.IRON:
 | 
				
			||||||
 | 
								return iron
 | 
				
			||||||
 | 
							Club.Type.WEDGE:
 | 
				
			||||||
 | 
								return wedge
 | 
				
			||||||
 | 
							Club.Type.PUTTER:
 | 
				
			||||||
 | 
								return putter
 | 
				
			||||||
 | 
							Club.Type.SPECIAL:
 | 
				
			||||||
 | 
								return special
 | 
				
			||||||
 | 
						return null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Create a debug player instance
 | 
				
			||||||
 | 
					static func create_debug() -> WorldPlayer:
 | 
				
			||||||
 | 
						var instance := WorldPlayer.new()
 | 
				
			||||||
 | 
						instance.driver = Club.catalog.debug_driver
 | 
				
			||||||
 | 
						instance.iron = Club.catalog.debug_iron
 | 
				
			||||||
 | 
						instance.wedge = Club.catalog.debug_wedge
 | 
				
			||||||
 | 
						instance.putter = Club.catalog.debug_wedge
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return instance
 | 
				
			||||||
@ -1,2 +0,0 @@
 | 
				
			|||||||
class_name WorldPlayer extends Node
 | 
					 | 
				
			||||||
## Container for the state of the player within the world.
 | 
					 | 
				
			||||||
@ -1,6 +0,0 @@
 | 
				
			|||||||
[gd_scene load_steps=2 format=3 uid="uid://q8vdqfewwvsy"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ext_resource type="Script" path="res://src/player/world_player/world_player.gd" id="1_2wo11"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[node name="WorldPlayer" type="Node"]
 | 
					 | 
				
			||||||
script = ExtResource("1_2wo11")
 | 
					 | 
				
			||||||
@ -13,6 +13,10 @@ ClubSelectLabel/constants/shadow_offset_x = 6
 | 
				
			|||||||
ClubSelectLabel/constants/shadow_offset_y = 0
 | 
					ClubSelectLabel/constants/shadow_offset_y = 0
 | 
				
			||||||
ClubSelectLabel/font_sizes/font_size = 84
 | 
					ClubSelectLabel/font_sizes/font_size = 84
 | 
				
			||||||
ClubSelectLabel/fonts/font = ExtResource("1_3rv2b")
 | 
					ClubSelectLabel/fonts/font = ExtResource("1_3rv2b")
 | 
				
			||||||
 | 
					ClubSelectLabelDisabled/base_type = &"ClubSelectLabel"
 | 
				
			||||||
 | 
					ClubSelectLabelDisabled/colors/font_color = Color(0.4, 0.3848, 0.376, 1)
 | 
				
			||||||
 | 
					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)
 | 
				
			||||||
ShotFeedback/base_type = &"RichTextLabel"
 | 
					ShotFeedback/base_type = &"RichTextLabel"
 | 
				
			||||||
ShotFeedback/colors/font_shadow_color = Color(0, 0, 0, 1)
 | 
					ShotFeedback/colors/font_shadow_color = Color(0, 0, 0, 1)
 | 
				
			||||||
ShotFeedback/constants/shadow_offset_x = 6
 | 
					ShotFeedback/constants/shadow_offset_x = 6
 | 
				
			||||||
 | 
				
			|||||||
@ -20,11 +20,20 @@ const CLUB_ROTATION := {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@onready var club_hub: Control = %ClubHub
 | 
					@onready var club_hub: Control = %ClubHub
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var driver_label: Label = %DriverLabel
 | 
					@onready var driver_label: ClubSelectorLabel = %DriverLabel
 | 
				
			||||||
@onready var iron_label: Label = %IronLabel
 | 
					@onready var iron_label: ClubSelectorLabel = %IronLabel
 | 
				
			||||||
@onready var wedge_label: Label = %WedgeLabel
 | 
					@onready var wedge_label: ClubSelectorLabel = %WedgeLabel
 | 
				
			||||||
@onready var special_label: Label = %SpecialLabel
 | 
					@onready var special_label: ClubSelectorLabel = %SpecialLabel
 | 
				
			||||||
@onready var putter_label: Label = %PutterLabel
 | 
					@onready var putter_label: ClubSelectorLabel = %PutterLabel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Enable/disable labels based on the player's available equipment
 | 
				
			||||||
 | 
					func set_state_for_player(player: WorldPlayer) -> void:
 | 
				
			||||||
 | 
						driver_label.set_enabled(player.driver != null)
 | 
				
			||||||
 | 
						iron_label.set_enabled(player.iron != null)
 | 
				
			||||||
 | 
						wedge_label.set_enabled(player.wedge != null)
 | 
				
			||||||
 | 
						special_label.set_enabled(player.special != null)
 | 
				
			||||||
 | 
						putter_label.set_enabled(player.putter != null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _get_club_label(club: Club.Type) -> Label:
 | 
					func _get_club_label(club: Club.Type) -> Label:
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
[gd_scene load_steps=7 format=3 uid="uid://445qd7m4qe2j"]
 | 
					[gd_scene load_steps=8 format=3 uid="uid://445qd7m4qe2j"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[ext_resource type="Script" path="res://src/ui/shot_hud/club_selector/club_selector.gd" id="1_cttgc"]
 | 
					[ext_resource type="Script" path="res://src/ui/shot_hud/club_selector/club_selector.gd" id="1_cttgc"]
 | 
				
			||||||
[ext_resource type="Script" path="res://src/ui/decorations/arc.gd" id="2_vijl7"]
 | 
					[ext_resource type="Script" path="res://src/ui/decorations/arc.gd" id="2_vijl7"]
 | 
				
			||||||
[ext_resource type="Script" path="res://src/ui/decorations/double_rotator.gd" id="3_0ptmq"]
 | 
					[ext_resource type="Script" path="res://src/ui/decorations/double_rotator.gd" id="3_0ptmq"]
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/ui/shot_hud/club_selector/club_selector_label.gd" id="4_j7p7f"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[sub_resource type="Animation" id="Animation_crn6i"]
 | 
					[sub_resource type="Animation" id="Animation_crn6i"]
 | 
				
			||||||
length = 0.001
 | 
					length = 0.001
 | 
				
			||||||
@ -107,6 +108,7 @@ scale = Vector2(0.618, 0.618)
 | 
				
			|||||||
pivot_offset = Vector2(0, 20)
 | 
					pivot_offset = Vector2(0, 20)
 | 
				
			||||||
theme_type_variation = &"ClubSelectLabel"
 | 
					theme_type_variation = &"ClubSelectLabel"
 | 
				
			||||||
text = "DRIVER"
 | 
					text = "DRIVER"
 | 
				
			||||||
 | 
					script = ExtResource("4_j7p7f")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="IronLabel" type="Label" parent="ClubHub"]
 | 
					[node name="IronLabel" type="Label" parent="ClubHub"]
 | 
				
			||||||
unique_name_in_owner = true
 | 
					unique_name_in_owner = true
 | 
				
			||||||
@ -126,6 +128,7 @@ scale = Vector2(0.618, 0.618)
 | 
				
			|||||||
pivot_offset = Vector2(0, 20)
 | 
					pivot_offset = Vector2(0, 20)
 | 
				
			||||||
theme_type_variation = &"ClubSelectLabel"
 | 
					theme_type_variation = &"ClubSelectLabel"
 | 
				
			||||||
text = "IRON"
 | 
					text = "IRON"
 | 
				
			||||||
 | 
					script = ExtResource("4_j7p7f")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="WedgeLabel" type="Label" parent="ClubHub"]
 | 
					[node name="WedgeLabel" type="Label" parent="ClubHub"]
 | 
				
			||||||
unique_name_in_owner = true
 | 
					unique_name_in_owner = true
 | 
				
			||||||
@ -145,6 +148,7 @@ scale = Vector2(0.618, 0.618)
 | 
				
			|||||||
pivot_offset = Vector2(0, 20)
 | 
					pivot_offset = Vector2(0, 20)
 | 
				
			||||||
theme_type_variation = &"ClubSelectLabel"
 | 
					theme_type_variation = &"ClubSelectLabel"
 | 
				
			||||||
text = "WEDGE"
 | 
					text = "WEDGE"
 | 
				
			||||||
 | 
					script = ExtResource("4_j7p7f")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="SpecialLabel" type="Label" parent="ClubHub"]
 | 
					[node name="SpecialLabel" type="Label" parent="ClubHub"]
 | 
				
			||||||
unique_name_in_owner = true
 | 
					unique_name_in_owner = true
 | 
				
			||||||
@ -164,6 +168,7 @@ scale = Vector2(0.618, 0.618)
 | 
				
			|||||||
pivot_offset = Vector2(0, 20)
 | 
					pivot_offset = Vector2(0, 20)
 | 
				
			||||||
theme_type_variation = &"ClubSelectLabel"
 | 
					theme_type_variation = &"ClubSelectLabel"
 | 
				
			||||||
text = "SPECIAL"
 | 
					text = "SPECIAL"
 | 
				
			||||||
 | 
					script = ExtResource("4_j7p7f")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="PutterLabel" type="Label" parent="ClubHub"]
 | 
					[node name="PutterLabel" type="Label" parent="ClubHub"]
 | 
				
			||||||
unique_name_in_owner = true
 | 
					unique_name_in_owner = true
 | 
				
			||||||
@ -183,3 +188,4 @@ scale = Vector2(0.618, 0.618)
 | 
				
			|||||||
pivot_offset = Vector2(0, 20)
 | 
					pivot_offset = Vector2(0, 20)
 | 
				
			||||||
theme_type_variation = &"ClubSelectLabel"
 | 
					theme_type_variation = &"ClubSelectLabel"
 | 
				
			||||||
text = "PUTTER"
 | 
					text = "PUTTER"
 | 
				
			||||||
 | 
					script = ExtResource("4_j7p7f")
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								src/ui/shot_hud/club_selector/club_selector_label.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/ui/shot_hud/club_selector/club_selector_label.gd
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					class_name ClubSelectorLabel extends Label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ENABLED_THEME_TYPE := "ClubSelectLabel"
 | 
				
			||||||
 | 
					const DISABLED_THEME_TYPE := "ClubSelectLabelDisabled"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func set_enabled(is_enabled: bool) -> void:
 | 
				
			||||||
 | 
						theme_type_variation = ENABLED_THEME_TYPE if is_enabled else DISABLED_THEME_TYPE
 | 
				
			||||||
@ -17,6 +17,15 @@ class_name ShotHUD extends Control
 | 
				
			|||||||
@onready var _state: AnimationNodeStateMachinePlayback = hud_state_machine["parameters/playback"]
 | 
					@onready var _state: AnimationNodeStateMachinePlayback = hud_state_machine["parameters/playback"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Set any HUD state specific to the player.
 | 
				
			||||||
 | 
					func set_state_for_player(player: WorldPlayer) -> void:
 | 
				
			||||||
 | 
						print_debug("Setting HUD for player ", player.name)
 | 
				
			||||||
 | 
						club_selector.set_state_for_player(player)
 | 
				
			||||||
 | 
						# TODO life
 | 
				
			||||||
 | 
						# TODO special equipment
 | 
				
			||||||
 | 
						# TODO abilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func show_hud() -> void:
 | 
					func show_hud() -> void:
 | 
				
			||||||
	_state.travel("visible")
 | 
						_state.travel("visible")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,12 @@ class_name World extends Node
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@export var initial_level: PackedScene = load("res://levels/debug_level/debug_level.tscn")
 | 
					@export var initial_level: PackedScene = load("res://levels/debug_level/debug_level.tscn")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@export var players: Array[WorldPlayer] = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@export var spawn_group := "PlayerSpawn"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _spawns_available: Array[Node3D] = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@onready var level: Node3D = %Level
 | 
					@onready var level: Node3D = %Level
 | 
				
			||||||
@onready var ui: WorldUI = %UI
 | 
					@onready var ui: WorldUI = %UI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -15,6 +21,41 @@ static var group := "WorldGroup"
 | 
				
			|||||||
func _ready() -> void:
 | 
					func _ready() -> void:
 | 
				
			||||||
	load_level(initial_level)
 | 
						load_level(initial_level)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Spawn players in the level
 | 
				
			||||||
 | 
						for player: WorldPlayer in players:
 | 
				
			||||||
 | 
							_spawn_player(player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Set first player as active
 | 
				
			||||||
 | 
						if players:
 | 
				
			||||||
 | 
							players[0].shot_setup.phase = ShotSetup.Phase.AIM
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							push_warning("Warning: Starting game world with no players!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _random_spawn() -> Node3D:
 | 
				
			||||||
 | 
						# Get random spawn point
 | 
				
			||||||
 | 
						if not _spawns_available:
 | 
				
			||||||
 | 
							_spawns_available.assign(get_tree().get_nodes_in_group(spawn_group))
 | 
				
			||||||
 | 
						@warning_ignore("unsafe_cast")
 | 
				
			||||||
 | 
						var spawn_point := _spawns_available.pick_random() as Node3D
 | 
				
			||||||
 | 
						assert(spawn_point, "No nodes in spawn group `%s` found!" % spawn_group)
 | 
				
			||||||
 | 
						_spawns_available.erase(spawn_point)
 | 
				
			||||||
 | 
						return spawn_point
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _spawn_player(player: WorldPlayer) -> void:
 | 
				
			||||||
 | 
						var spawn_point := _random_spawn()
 | 
				
			||||||
 | 
						var shot_setup := player.shot_setup
 | 
				
			||||||
 | 
						shot_setup.finished.connect(_on_shot_finished)
 | 
				
			||||||
 | 
						shot_setup.global_transform = spawn_point.global_transform
 | 
				
			||||||
 | 
						spawn_point.add_sibling(shot_setup)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _on_shot_finished(source: ShotSetup) -> void:
 | 
				
			||||||
 | 
						print_debug("Shot finished for ", source.player.name)
 | 
				
			||||||
 | 
						players.push_back(players.pop_front())
 | 
				
			||||||
 | 
						players[0].shot_setup.queue_restart()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Instantiate and mantle the given level scene.
 | 
					## Instantiate and mantle the given level scene.
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
@ -27,4 +68,3 @@ func load_level(level_scene: PackedScene) -> void:
 | 
				
			|||||||
	# Load the level
 | 
						# Load the level
 | 
				
			||||||
	var instance: Node3D = level_scene.instantiate()
 | 
						var instance: Node3D = level_scene.instantiate()
 | 
				
			||||||
	level.add_child(instance)
 | 
						level.add_child(instance)
 | 
				
			||||||
	instance.reparent(level)
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,14 @@
 | 
				
			|||||||
[gd_scene load_steps=4 format=3 uid="uid://cwnwcd8kushl3"]
 | 
					[gd_scene load_steps=6 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://c4ifdiohng830" path="res://src/ui/shot_hud/shot_hud.tscn" id="2_5b7qb"]
 | 
					[ext_resource type="PackedScene" uid="uid://c4ifdiohng830" path="res://src/ui/shot_hud/shot_hud.tscn" id="2_5b7qb"]
 | 
				
			||||||
 | 
					[ext_resource type="Script" path="res://src/player/world_player.gd" id="2_e743i"]
 | 
				
			||||||
[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"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="World" type="Node" groups=["WorldGroup"]]
 | 
					[node name="World" type="Node" groups=["WorldGroup"]]
 | 
				
			||||||
script = ExtResource("1_ybjyx")
 | 
					script = ExtResource("1_ybjyx")
 | 
				
			||||||
 | 
					players = Array[ExtResource("2_e743i")]([ExtResource("3_pyw81")])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Level" type="Node3D" parent="."]
 | 
					[node name="Level" type="Node3D" parent="."]
 | 
				
			||||||
unique_name_in_owner = true
 | 
					unique_name_in_owner = true
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user