From 37e3cb2677131882e4055e005565a2d3f4ea4cd2 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Mon, 11 Nov 2024 14:45:47 -0700 Subject: [PATCH] Clubs access is controlled by ClubCatalog --- asset_dev/characters/clubs/clubs.blend | 4 +- asset_dev/characters/clubs/clubs.blend1 | Bin 911812 -> 960560 bytes assets/models/clubs/driver.bin | Bin 5740 -> 5740 bytes assets/models/clubs/driver.gltf | 17 ++- assets/models/clubs/iron.bin | Bin 4416 -> 4416 bytes assets/models/clubs/iron.gltf | 17 ++- assets/models/clubs/putter.bin | Bin 0 -> 5320 bytes assets/models/clubs/putter.gltf | 126 ++++++++++++++++++ assets/models/clubs/putter.gltf.import | 36 +++++ assets/models/clubs/wedge.bin | Bin 0 -> 6276 bytes assets/models/clubs/wedge.gltf | 126 ++++++++++++++++++ assets/models/clubs/wedge.gltf.import | 36 +++++ project.godot | 4 + src/characters/character_controller.gd | 14 ++ src/characters/gfolf_girl/gfolf_girl.tscn | 17 +-- src/equipment/clubs/club.gd | 23 ++++ src/equipment/clubs/club_catalog.gd | 7 + src/equipment/clubs/club_catalog.tscn | 35 +++++ src/equipment/clubs/driver.tscn | 5 - src/equipment/clubs/iron.tscn | 5 - .../shot_setup/club_selector/club_selector.gd | 60 +++++---- .../club_selector/club_selector.tscn | 1 + src/player/shot_setup/shot_setup.gd | 51 +++++-- src/util/types.gd | 8 -- 24 files changed, 506 insertions(+), 86 deletions(-) create mode 100644 assets/models/clubs/putter.bin create mode 100644 assets/models/clubs/putter.gltf create mode 100644 assets/models/clubs/putter.gltf.import create mode 100644 assets/models/clubs/wedge.bin create mode 100644 assets/models/clubs/wedge.gltf create mode 100644 assets/models/clubs/wedge.gltf.import create mode 100644 src/equipment/clubs/club.gd create mode 100644 src/equipment/clubs/club_catalog.gd create mode 100644 src/equipment/clubs/club_catalog.tscn delete mode 100644 src/equipment/clubs/driver.tscn delete mode 100644 src/equipment/clubs/iron.tscn diff --git a/asset_dev/characters/clubs/clubs.blend b/asset_dev/characters/clubs/clubs.blend index 7bfc058..002b5fd 100644 --- a/asset_dev/characters/clubs/clubs.blend +++ b/asset_dev/characters/clubs/clubs.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21201b892011430f72c9e8eaeccc8ad66e70630410d4d7f03728cc8ee38625a0 -size 911812 +oid sha256:f8b17ff1466a6c93dee473c5e0d5f1911963596c57bbf245eed62eb06c241d0f +size 960560 diff --git a/asset_dev/characters/clubs/clubs.blend1 b/asset_dev/characters/clubs/clubs.blend1 index 92a0881ca4f0c4ca5e3ddf10b74aa5f20ee0e1ed..069f510d1f0e0ee5ef4ffbceee6eea644a60bc97 100644 GIT binary patch delta 41150 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 e+xEJv-Jr1rFaR2;UJF^ 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 K6VGEYp2UCZE-K*w diff --git a/assets/models/clubs/driver.gltf b/assets/models/clubs/driver.gltf index d475e18..ac63486 100644 --- a/assets/models/clubs/driver.gltf +++ b/assets/models/clubs/driver.gltf @@ -15,7 +15,12 @@ "nodes":[ { "mesh":0, - "name":"Driver" + "name":"Driver", + "translation":[ + 0, + 1.2000000476837158, + 0 + ] } ], "materials":[ @@ -56,13 +61,13 @@ "componentType":5126, "count":164, "max":[ - 0.6112575531005859, - 1.8250000476837158, - 0.4176815152168274 + 0.4176812469959259, + 1.9800440073013306, + 0.6112575531005859 ], "min":[ - -0.05376402288675308, - -1.9800440073013306, + -0.05376391485333443, + -1.8250000476837158, -0.05376402288675308 ], "type":"VEC3" diff --git a/assets/models/clubs/iron.bin b/assets/models/clubs/iron.bin index e3ed60bd4fd66f02a64c2900cb478a2eb4bb6fc0..dc6c3b40acb92fcda0f5887c442d81403375defd 100644 GIT binary patch literal 4416 zcmbVMeN2^A82?!y7ABdbSbmUKlu#fQLNC1Up>IA#5l#6hPy@e86AcnwcWYUjb8ER; zR?|ssIks9f4cYGHZ3PRf6{`(!ef(LuT4giok2ZRq_k9od+{-=q(!IOS?{}W_e4le} z)sQdr#>vZ~;6g`tm4+w(el4GE{_g7N_QHP~^o2gSxWbw?e6rE;FKJKa(s3D|;ska4op8+|9sfFUrv@MJSBxH98cap?4SrjFOpn=N1Zmsqv#g6V}fCGIn%y%#?6LaHHa(D6#D;WaTJ zj(_5iddD&{m#d5R6^gG=eBBt1mm1H_YbkjxuX&Fa9kFIyOddA}wKi#^pM%rCTA7?{ zc%CtPx7bJ8M9wy5%!oN&jmx$D2`A7;=XKW7$3aiI>>Sch_D5@317UP7?oR5)@+$Vc z&!2HNGM8;D_hoJ;XSimoB2zRBoaiC6R2#mFles^-I8Ke>I^}&+?RB}7J1LY|{hxO+ z_NLT0N^SPc+}ijJj=dvgCR)9&ekHzr7P5DxFP^!*$Eed!^d7HV88v_DslCF8Rm)uaSDLNB(z3+Q>WPR2<8`;?F#B`TS32+nEHRzGe1^RfB5J zHVfa5x4zv{ZPzLP6DF!bjVXO2?IZI_8!vfPo5)^1=6O+#u`ob;tRIghjY-^>D2qa= zkHmoKtOKTFA4aKnuuw>J>r*cBy0fozEKX&13Azq3vioqfA)y^P0eCytYs&drX~`pp@msDsZdAS4#kn)MP{&;B|rw$C{rN?l~T z(XU$E^8%c612`VfVIt%?@;>*&$oGg*>bW0Y>yYmw@AF(4`(5NU*TwVEA=?9mc0Qgj zuT?yC^b>RNy&ueIjQu{s?`8_U6TW{Equ&k3ORsFVScMEU(61c#ArCnub5M;WY^G+C=vRbnEI~SbS0If^09{G8a#-lSdUVY zrMMf*@hCQu+=zRy5|5*fWF79sTBIS1WELtBhbd?z*@#`3gFDbhvJFpTD-NKAWDB0e zoruRCl6!Cji?EQ6X%YQy#535ACX!9qkHgrFy(IVIS?t6U*hX?2p29vHLMzEu9HcH& K&`h!!JMbTS-NXa{ literal 4416 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 L3%|v!cn|*t`inn% literal 0 HcmV?d00001 diff --git a/assets/models/clubs/wedge.gltf b/assets/models/clubs/wedge.gltf new file mode 100644 index 0000000..3ea57d3 --- /dev/null +++ b/assets/models/clubs/wedge.gltf @@ -0,0 +1,126 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.2.60", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wedge", + "translation":[ + 0, + 1.2000000476837158, + 0 + ] + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.002", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":180, + "max":[ + 0.22545579075813293, + 1.951971173286438, + 0.49008044600486755 + ], + "min":[ + -0.08979124575853348, + -1.8250000476837158, + -0.05376402288675308 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":180, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":180, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":258, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2160, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":2160, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":4320, + "target":34962 + }, + { + "buffer":0, + "byteLength":516, + "byteOffset":5760, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":6276, + "uri":"wedge.bin" + } + ] +} diff --git a/assets/models/clubs/wedge.gltf.import b/assets/models/clubs/wedge.gltf.import new file mode 100644 index 0000000..157d9bd --- /dev/null +++ b/assets/models/clubs/wedge.gltf.import @@ -0,0 +1,36 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d4bnvf34xenya" +path="res://.godot/imported/wedge.gltf-0b94d38ac8af3aeedd25f97520851d66.scn" + +[deps] + +source_file="res://assets/models/clubs/wedge.gltf" +dest_files=["res://.godot/imported/wedge.gltf-0b94d38ac8af3aeedd25f97520851d66.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/project.godot b/project.godot index b26d254..101c1a4 100644 --- a/project.godot +++ b/project.godot @@ -16,6 +16,10 @@ run/main_scene="res://levels/debug_level/debug_level.tscn" config/features=PackedStringArray("4.3", "Forward Plus") run/max_fps=60 +[autoload] + +ClubCatalog="*res://src/equipment/clubs/club_catalog.tscn" + [debug] gdscript/warnings/untyped_declaration=2 diff --git a/src/characters/character_controller.gd b/src/characters/character_controller.gd index 443d1a7..686d813 100644 --- a/src/characters/character_controller.gd +++ b/src/characters/character_controller.gd @@ -5,6 +5,20 @@ class_name CharacterController extends Node3D @onready var animation_state: AnimationNodeStateMachinePlayback = animation_tree["parameters/playback"] +@onready var right_hand_grip: Node3D = %RightHandGrip + + +## Snap the given node to the character's right hand grip. +## Anything currently held in the right hand will be freed. +## If `node` is null, the character's right hand grip will just be cleared. +func hold_right(node: Node3D = null) -> void: + for c: Node in right_hand_grip.get_children(): + c.queue_free() + + if node: + right_hand_grip.add_child(node) + node.transform = Transform3D.IDENTITY + func reset() -> void: animation_state.start("stand_to_idle") diff --git a/src/characters/gfolf_girl/gfolf_girl.tscn b/src/characters/gfolf_girl/gfolf_girl.tscn index 547deea..748e93b 100644 --- a/src/characters/gfolf_girl/gfolf_girl.tscn +++ b/src/characters/gfolf_girl/gfolf_girl.tscn @@ -1,9 +1,7 @@ -[gd_scene load_steps=20 format=3 uid="uid://1s3gywmoi20e"] +[gd_scene load_steps=18 format=3 uid="uid://1s3gywmoi20e"] [ext_resource type="PackedScene" uid="uid://ha6jxf4v5845" path="res://assets/models/characters/gfolf_girl/gfolf_girl.gltf" id="1_j80rr"] [ext_resource type="Script" path="res://src/characters/character_controller.gd" id="2_7o84v"] -[ext_resource type="PackedScene" uid="uid://bfugnkuyflxrd" path="res://src/equipment/clubs/iron.tscn" id="3_fqr7u"] -[ext_resource type="PackedScene" uid="uid://cc5npwiq3m21c" path="res://src/equipment/clubs/driver.tscn" id="4_s7iyi"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fokhu"] albedo_color = Color(0.226707, 0.226707, 0.226707, 1) @@ -106,7 +104,7 @@ bones/23/rotation = Quaternion(0.000222673, 0.707107, 0.707107, -0.000222504) bones/23/scale = Vector3(1, 1, 1) [node name="BoneAttachment3D" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="6"] -transform = Transform3D(-0.942953, 0.303928, 0.135893, -0.265659, -0.932915, 0.243093, 0.20066, 0.193124, 0.960437, -0.315494, 3.01329, 0.865057) +transform = Transform3D(-0.944824, 0.316851, -0.0831416, -0.325832, -0.935181, 0.138814, -0.0337689, 0.158246, 0.986822, -0.1687, 3.15143, 0.849092) bone_name = "Hand.R" bone_idx = 11 @@ -114,23 +112,16 @@ bone_idx = 11 unique_name_in_owner = true transform = Transform3D(0.934826, 0.266239, -0.23498, -0.336326, 0.876157, -0.345298, 0.113948, 0.401823, 0.908599, -0.0340219, 0.535822, -0.0310692) -[node name="DebugClub" type="MeshInstance3D" parent="Armature/Skeleton3D/BoneAttachment3D/RightHandGrip" index="0"] +[node name="ReferenceClub" type="MeshInstance3D" parent="Armature/Skeleton3D/BoneAttachment3D/RightHandGrip" index="0"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.205, 0) visible = false mesh = SubResource("BoxMesh_363n0") skeleton = NodePath("../..") -[node name="MeshInstance3D" type="MeshInstance3D" parent="Armature/Skeleton3D/BoneAttachment3D/RightHandGrip/DebugClub" index="0"] +[node name="MeshInstance3D" type="MeshInstance3D" parent="Armature/Skeleton3D/BoneAttachment3D/RightHandGrip/ReferenceClub" index="0"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.705, 0.3) mesh = SubResource("BoxMesh_oll6x") -[node name="Iron" parent="Armature/Skeleton3D/BoneAttachment3D/RightHandGrip" index="1" instance=ExtResource("3_fqr7u")] -transform = Transform3D(-7.54979e-08, 8.74228e-08, 1, -8.74228e-08, -1, 8.74228e-08, 1, -8.74228e-08, 7.54979e-08, 0, 1.2, 0) -visible = false - -[node name="Driver" parent="Armature/Skeleton3D/BoneAttachment3D/RightHandGrip" index="2" instance=ExtResource("4_s7iyi")] -transform = Transform3D(-7.63685e-08, 8.75443e-08, 1, -8.9407e-08, -1, 8.84756e-08, 1, -1.78814e-07, 7.82311e-08, -7.45058e-09, 1.2, 2.38419e-07) - [node name="AnimationTree" type="AnimationTree" parent="." index="2"] tree_root = SubResource("AnimationNodeStateMachine_yepp7") anim_player = NodePath("../AnimationPlayer") diff --git a/src/equipment/clubs/club.gd b/src/equipment/clubs/club.gd new file mode 100644 index 0000000..7778cbc --- /dev/null +++ b/src/equipment/clubs/club.gd @@ -0,0 +1,23 @@ +class_name Club extends Node +## Base type for gfolf clubs + +enum Type { + NONE, + DRIVER, + IRON, + WEDGE, + PUTTER, + SPECIAL, +} + +@export var type: Club.Type +@export var _model: PackedScene + +## Global typesafe accessor for club catalog +static var catalog: ClubCatalogType: + get: + return ClubCatalog + + +func get_model() -> Node3D: + return _model.instantiate() as Node3D if _model else null diff --git a/src/equipment/clubs/club_catalog.gd b/src/equipment/clubs/club_catalog.gd new file mode 100644 index 0000000..65c9764 --- /dev/null +++ b/src/equipment/clubs/club_catalog.gd @@ -0,0 +1,7 @@ +class_name ClubCatalogType extends Node +## Provides access to Club equipment + +@onready var debug_driver: Club = %"DEBUG Driver" +@onready var debug_iron: Club = %"DEBUG Iron" +@onready var debug_wedge: Club = %"DEBUG Wedge" +@onready var debug_putter: Club = %"DEBUG Putter" diff --git a/src/equipment/clubs/club_catalog.tscn b/src/equipment/clubs/club_catalog.tscn new file mode 100644 index 0000000..c4831a9 --- /dev/null +++ b/src/equipment/clubs/club_catalog.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=7 format=3 uid="uid://f5qw4losi1ag"] + +[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"] +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") diff --git a/src/equipment/clubs/driver.tscn b/src/equipment/clubs/driver.tscn deleted file mode 100644 index 6ca5a46..0000000 --- a/src/equipment/clubs/driver.tscn +++ /dev/null @@ -1,5 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://cc5npwiq3m21c"] - -[ext_resource type="PackedScene" uid="uid://dekwor3a7kqio" path="res://assets/models/clubs/driver.gltf" id="1_8gkvl"] - -[node name="Driver" instance=ExtResource("1_8gkvl")] diff --git a/src/equipment/clubs/iron.tscn b/src/equipment/clubs/iron.tscn deleted file mode 100644 index 62711a4..0000000 --- a/src/equipment/clubs/iron.tscn +++ /dev/null @@ -1,5 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://bfugnkuyflxrd"] - -[ext_resource type="PackedScene" uid="uid://btpn1j6jwv4pr" path="res://assets/models/clubs/iron.gltf" id="1_dnro0"] - -[node name="Iron" instance=ExtResource("1_dnro0")] diff --git a/src/player/shot_setup/club_selector/club_selector.gd b/src/player/shot_setup/club_selector/club_selector.gd index 45ec3a1..31be840 100644 --- a/src/player/shot_setup/club_selector/club_selector.gd +++ b/src/player/shot_setup/club_selector/club_selector.gd @@ -8,14 +8,14 @@ const LABEL_SCALE_TIME := 0.3 const HUB_ROTATION_TIME := 0.2 const CLUB_ROTATION := { - T.Club.DRIVER: 0.0, - T.Club.IRON: -16.0, - T.Club.WEDGE: -32.0, - T.Club.SPECIAL: -48.0, - T.Club.PUTTER: -64.0, + Club.Type.DRIVER: 0.0, + Club.Type.IRON: -16.0, + Club.Type.WEDGE: -32.0, + Club.Type.SPECIAL: -48.0, + Club.Type.PUTTER: -64.0, } -@export var value: T.Club: +@export var value: Club.Type: set = _set_value @onready var club_hub: Control = %ClubHub @@ -27,20 +27,20 @@ const CLUB_ROTATION := { @onready var putter_label: Label = %PutterLabel -func _get_club_label(club: T.Club) -> Label: +func _get_club_label(club: Club.Type) -> Label: match club: - T.Club.DRIVER: + Club.Type.DRIVER: return driver_label - T.Club.IRON: + Club.Type.IRON: return iron_label - T.Club.WEDGE: + Club.Type.WEDGE: return wedge_label - T.Club.SPECIAL: + Club.Type.SPECIAL: return special_label - T.Club.PUTTER: + Club.Type.PUTTER: return putter_label - assert(false, "Unknown club %d" % club) - return + print_debug("Unknown club: ", club) + return null func _reset_label_scale() -> void: @@ -48,22 +48,24 @@ func _reset_label_scale() -> void: c.scale = UNSELECTED_SCALE -func _set_value(new_value: T.Club) -> void: - #_reset_label_scale() - var old_label := _get_club_label(value) - var new_label := _get_club_label(new_value) - var hub_rotation: float = CLUB_ROTATION[new_value] - +func _set_value(new_value: Club.Type) -> void: var tween := get_tree().create_tween() tween.set_parallel() - tween.tween_property(old_label, "scale", UNSELECTED_SCALE, LABEL_SCALE_TIME).set_trans( - Tween.TRANS_SINE - ) - tween.tween_property(new_label, "scale", SELECTED_SCALE, LABEL_SCALE_TIME).set_trans( - Tween.TRANS_SINE - ) - tween.tween_property(club_hub, "rotation_degrees", hub_rotation, HUB_ROTATION_TIME).set_trans( - Tween.TRANS_QUAD - ) + + var old_label := _get_club_label(value) + if old_label: + tween.tween_property(old_label, "scale", UNSELECTED_SCALE, LABEL_SCALE_TIME).set_trans( + Tween.TRANS_SINE + ) + + var new_label := _get_club_label(new_value) + if new_label: + tween.tween_property(new_label, "scale", SELECTED_SCALE, LABEL_SCALE_TIME).set_trans( + Tween.TRANS_SINE + ) + var theta: float = CLUB_ROTATION[new_value] + tween.tween_property(club_hub, "rotation_degrees", theta, HUB_ROTATION_TIME).set_trans( + Tween.TRANS_QUAD + ) value = new_value diff --git a/src/player/shot_setup/club_selector/club_selector.tscn b/src/player/shot_setup/club_selector/club_selector.tscn index dd7469e..d2b1140 100644 --- a/src/player/shot_setup/club_selector/club_selector.tscn +++ b/src/player/shot_setup/club_selector/club_selector.tscn @@ -103,6 +103,7 @@ offset_top = -19.5 offset_right = 461.0 offset_bottom = 19.5 grow_vertical = 2 +scale = Vector2(0.618, 0.618) pivot_offset = Vector2(0, 20) theme_type_variation = &"ClubSelectLabel" text = "DRIVER" diff --git a/src/player/shot_setup/shot_setup.gd b/src/player/shot_setup/shot_setup.gd index ef73d80..876d5ba 100644 --- a/src/player/shot_setup/shot_setup.gd +++ b/src/player/shot_setup/shot_setup.gd @@ -27,6 +27,9 @@ const CAMERA_SNAP_TIME := 0.3 ## In Driving Range mode, the ball can be retrieved in the shot phase. @export var driving_range := false +## Initially-selected club +@export var initial_club: Club.Type = Club.Type.DRIVER + @export_category("Shot Parameters") @export var base_power := 2.5 @export var base_curve := 0.0 @@ -56,7 +59,7 @@ var phase: Phase: _on_phase_change(value) phase = value -var club: T.Club: +var club: Club.Type: set(value): if value != club: _on_club_change(value) @@ -97,6 +100,8 @@ var _tracking_camera: OrbitalCamera @onready var drive_arrow: Node3D = %DriveArrow @onready var putt_ref: RayCast3D = %PuttRef @onready var putt_arrow: Node3D = %PuttArrow +@onready var wedge_ref: RayCast3D = %WedgeRef + @onready var club_selector: ClubSelector = %ClubSelector @onready var nice_animation: AnimationPlayer = %NiceAnimation @@ -117,7 +122,7 @@ var _tracking_camera: OrbitalCamera func _ready() -> void: _on_phase_change(phase) - _on_club_change(club) + club = initial_club func _set_camera_distance(value: float) -> void: @@ -230,17 +235,39 @@ func end_shot_track() -> void: ## Called immediately before `club` is mutated. -func _on_club_change(new_club: T.Club) -> void: +func _on_club_change(new_club: Club.Type) -> void: + # Hide all arrows + # TODO animate? + drive_arrow.hide() + putt_arrow.hide() club_selector.value = new_club match new_club: - T.Club.DRIVER: + Club.Type.DRIVER: shot_ref = drive_ref drive_arrow.show() - putt_arrow.hide() - T.Club.PUTTER: + + # TODO get this from player loadout + # TODO club change animation + character.hold_right(Club.catalog.debug_driver.get_model()) + Club.Type.PUTTER: shot_ref = putt_ref putt_arrow.show() - drive_arrow.hide() + character.hold_right(Club.catalog.debug_putter.get_model()) + Club.Type.WEDGE: + # TODO + shot_ref = wedge_ref + drive_arrow.show() + character.hold_right(Club.catalog.debug_wedge.get_model()) + Club.Type.IRON: + # TODO + shot_ref = drive_ref + drive_arrow.show() + character.hold_right(Club.catalog.debug_iron.get_model()) + Club.Type.SPECIAL: + # TODO + print_debug("TODO: implement special clubs!") + _: + print_debug("Not sure how to equip club type: ", new_club) ## Called immediately before `phase` is mutated. @@ -330,15 +357,15 @@ func _process(delta: float) -> void: # Club select if Input.is_action_just_pressed("select_driver"): - club = T.Club.DRIVER + club = Club.Type.DRIVER if Input.is_action_just_pressed("select_iron"): - club = T.Club.IRON + club = Club.Type.IRON if Input.is_action_just_pressed("select_wedge"): - club = T.Club.WEDGE + club = Club.Type.WEDGE if Input.is_action_just_pressed("select_special"): - club = T.Club.SPECIAL + club = Club.Type.SPECIAL if Input.is_action_just_pressed("select_putter"): - club = T.Club.PUTTER + club = Club.Type.PUTTER # Switch to free cam if ( diff --git a/src/util/types.gd b/src/util/types.gd index 02130ba..e198015 100644 --- a/src/util/types.gd +++ b/src/util/types.gd @@ -1,10 +1,2 @@ class_name T extends Object ## Library for shared game enum types - -enum Club { - DRIVER, - IRON, - SPECIAL, - WEDGE, - PUTTER, -}