generated from krampus/template-godot4
	Compare commits
	
		
			5 Commits
		
	
	
		
			358d7c2eb4
			...
			96c73c5587
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 96c73c5587 | |||
| 2b1aabd808 | |||
| 479efd9c28 | |||
| aa87f57f1f | |||
| 77b5048d04 | 
							
								
								
									
										
											BIN
										
									
								
								asset_dev/UI/gauge_patch.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								asset_dev/UI/gauge_patch.xcf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								asset_dev/UI/gauge_patch_large.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								asset_dev/UI/gauge_patch_large.xcf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								asset_dev/UI/lifebar_patch.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								asset_dev/UI/lifebar_patch.xcf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								asset_dev/UI/power_gauge_tab.xcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								asset_dev/UI/power_gauge_tab.xcf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								assets/ui/gauge_patch.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ui/gauge_patch.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										34
									
								
								assets/ui/gauge_patch.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								assets/ui/gauge_patch.png.import
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://b5812y3pmmgg5" | ||||
| path="res://.godot/imported/gauge_patch.png-b06ef6737fda05dbce8a7a52b995acf4.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://assets/ui/gauge_patch.png" | ||||
| dest_files=["res://.godot/imported/gauge_patch.png-b06ef6737fda05dbce8a7a52b995acf4.ctex"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| compress/mode=0 | ||||
| compress/high_quality=false | ||||
| compress/lossy_quality=0.7 | ||||
| compress/hdr_compression=1 | ||||
| compress/normal_map=0 | ||||
| compress/channel_pack=0 | ||||
| mipmaps/generate=false | ||||
| mipmaps/limit=-1 | ||||
| roughness/mode=0 | ||||
| roughness/src_normal="" | ||||
| process/fix_alpha_border=true | ||||
| process/premult_alpha=false | ||||
| process/normal_map_invert_y=false | ||||
| process/hdr_as_srgb=false | ||||
| process/hdr_clamp_exposure=false | ||||
| process/size_limit=0 | ||||
| detect_3d/compress_to=1 | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/lifebar_fill_grey.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ui/lifebar_fill_grey.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										34
									
								
								assets/ui/lifebar_fill_grey.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								assets/ui/lifebar_fill_grey.png.import
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://dtdqninlnu10o" | ||||
| path="res://.godot/imported/lifebar_fill_grey.png-c028996d6e86e26137270a39216a5fd3.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://assets/ui/lifebar_fill_grey.png" | ||||
| dest_files=["res://.godot/imported/lifebar_fill_grey.png-c028996d6e86e26137270a39216a5fd3.ctex"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| compress/mode=0 | ||||
| compress/high_quality=false | ||||
| compress/lossy_quality=0.7 | ||||
| compress/hdr_compression=1 | ||||
| compress/normal_map=0 | ||||
| compress/channel_pack=0 | ||||
| mipmaps/generate=false | ||||
| mipmaps/limit=-1 | ||||
| roughness/mode=0 | ||||
| roughness/src_normal="" | ||||
| process/fix_alpha_border=true | ||||
| process/premult_alpha=false | ||||
| process/normal_map_invert_y=false | ||||
| process/hdr_as_srgb=false | ||||
| process/hdr_clamp_exposure=false | ||||
| process/size_limit=0 | ||||
| detect_3d/compress_to=1 | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/lifebar_patch.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ui/lifebar_patch.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										34
									
								
								assets/ui/lifebar_patch.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								assets/ui/lifebar_patch.png.import
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://bvwh0yunmvirp" | ||||
| path="res://.godot/imported/lifebar_patch.png-768842f340e38f78b7b90bbcd2d8dff9.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://assets/ui/lifebar_patch.png" | ||||
| dest_files=["res://.godot/imported/lifebar_patch.png-768842f340e38f78b7b90bbcd2d8dff9.ctex"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| compress/mode=0 | ||||
| compress/high_quality=false | ||||
| compress/lossy_quality=0.7 | ||||
| compress/hdr_compression=1 | ||||
| compress/normal_map=0 | ||||
| compress/channel_pack=0 | ||||
| mipmaps/generate=false | ||||
| mipmaps/limit=-1 | ||||
| roughness/mode=0 | ||||
| roughness/src_normal="" | ||||
| process/fix_alpha_border=true | ||||
| process/premult_alpha=false | ||||
| process/normal_map_invert_y=false | ||||
| process/hdr_as_srgb=false | ||||
| process/hdr_clamp_exposure=false | ||||
| process/size_limit=0 | ||||
| detect_3d/compress_to=1 | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/power_gauge_fill.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ui/power_gauge_fill.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										34
									
								
								assets/ui/power_gauge_fill.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								assets/ui/power_gauge_fill.png.import
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://76fjx2ukavqe" | ||||
| path="res://.godot/imported/power_gauge_fill.png-b7c279ae4fc601ab214f21b9b72d50c3.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://assets/ui/power_gauge_fill.png" | ||||
| dest_files=["res://.godot/imported/power_gauge_fill.png-b7c279ae4fc601ab214f21b9b72d50c3.ctex"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| compress/mode=0 | ||||
| compress/high_quality=false | ||||
| compress/lossy_quality=0.7 | ||||
| compress/hdr_compression=1 | ||||
| compress/normal_map=0 | ||||
| compress/channel_pack=0 | ||||
| mipmaps/generate=false | ||||
| mipmaps/limit=-1 | ||||
| roughness/mode=0 | ||||
| roughness/src_normal="" | ||||
| process/fix_alpha_border=true | ||||
| process/premult_alpha=false | ||||
| process/normal_map_invert_y=false | ||||
| process/hdr_as_srgb=false | ||||
| process/hdr_clamp_exposure=false | ||||
| process/size_limit=0 | ||||
| detect_3d/compress_to=1 | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/power_gauge_tab.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ui/power_gauge_tab.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										34
									
								
								assets/ui/power_gauge_tab.png.import
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								assets/ui/power_gauge_tab.png.import
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| [remap] | ||||
| 
 | ||||
| importer="texture" | ||||
| type="CompressedTexture2D" | ||||
| uid="uid://4a8tvjgwegv3" | ||||
| path="res://.godot/imported/power_gauge_tab.png-7979d59b50c40895525fdf1648e50b30.ctex" | ||||
| metadata={ | ||||
| "vram_texture": false | ||||
| } | ||||
| 
 | ||||
| [deps] | ||||
| 
 | ||||
| source_file="res://assets/ui/power_gauge_tab.png" | ||||
| dest_files=["res://.godot/imported/power_gauge_tab.png-7979d59b50c40895525fdf1648e50b30.ctex"] | ||||
| 
 | ||||
| [params] | ||||
| 
 | ||||
| compress/mode=0 | ||||
| compress/high_quality=false | ||||
| compress/lossy_quality=0.7 | ||||
| compress/hdr_compression=1 | ||||
| compress/normal_map=0 | ||||
| compress/channel_pack=0 | ||||
| mipmaps/generate=false | ||||
| mipmaps/limit=-1 | ||||
| roughness/mode=0 | ||||
| roughness/src_normal="" | ||||
| process/fix_alpha_border=true | ||||
| process/premult_alpha=false | ||||
| process/normal_map_invert_y=false | ||||
| process/hdr_as_srgb=false | ||||
| process/hdr_clamp_exposure=false | ||||
| process/size_limit=0 | ||||
| detect_3d/compress_to=1 | ||||
| @ -12,7 +12,7 @@ config_version=5 | ||||
| 
 | ||||
| config/name="GFOLF 2" | ||||
| config/description="GFOLF: Combat Golf Action" | ||||
| run/main_scene="res://src/world/world.tscn" | ||||
| run/main_scene="res://src/game/game.tscn" | ||||
| config/features=PackedStringArray("4.3", "Forward Plus") | ||||
| run/max_fps=60 | ||||
| 
 | ||||
| @ -55,10 +55,13 @@ config/controls/camera/y_axis_sensitivity=0.45 | ||||
| config/controls/camera/x_axis_acceleration=30.0 | ||||
| config/controls/camera/y_axis_acceleration=30.0 | ||||
| config/controls/camera/invert_pitch=false | ||||
| config/accessibility/enable_screen_shake=true | ||||
| config/accessibility/enable_hit_lag=true | ||||
| 
 | ||||
| [global_group] | ||||
| 
 | ||||
| WorldGroup="Singleton group for the active world instance, if any." | ||||
| GameGroup="Singleton group for the active game instance, if any." | ||||
| 
 | ||||
| [gui] | ||||
| 
 | ||||
| @ -146,6 +149,26 @@ select_putter={ | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":53,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) | ||||
| ] | ||||
| } | ||||
| debug_1={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194332,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| ] | ||||
| } | ||||
| debug_2={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194333,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| ] | ||||
| } | ||||
| debug_3={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194334,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| ] | ||||
| } | ||||
| debug_4={ | ||||
| "deadzone": 0.5, | ||||
| "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194335,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) | ||||
| ] | ||||
| } | ||||
| 
 | ||||
| [layer_names] | ||||
| 
 | ||||
| @ -163,6 +186,3 @@ jolt_3d/limits/max_temporary_memory=64 | ||||
| [rendering] | ||||
| 
 | ||||
| textures/canvas_textures/default_texture_filter=0 | ||||
| anti_aliasing/quality/msaa_3d=3 | ||||
| anti_aliasing/quality/screen_space_aa=1 | ||||
| anti_aliasing/quality/use_debanding=true | ||||
|  | ||||
| @ -169,7 +169,7 @@ bones/23/scale = Vector3(1, 1, 1) | ||||
| visible = false | ||||
| 
 | ||||
| [node name="BoneAttachment3D" type="BoneAttachment3D" parent="Armature/Skeleton3D" index="6"] | ||||
| 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) | ||||
| transform = Transform3D(-0.0322545, -0.997872, -0.0566733, 0.99947, -0.0324594, 0.00269896, -0.00453261, -0.0565562, 0.998389, -2.5177, 5.22011, -0.516371) | ||||
| bone_name = "Hand.R" | ||||
| bone_idx = 11 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										110
									
								
								src/game/game.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								src/game/game.gd
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | ||||
| class_name Game extends Node | ||||
| ## Wrapper for the game application | ||||
| 
 | ||||
| @export var start_scene: String = "res://src/world/world.tscn" | ||||
| 
 | ||||
| var _loading_resources := {} | ||||
| 
 | ||||
| @onready var viewport: GameViewportContainer = %ViewportContainer | ||||
| 
 | ||||
| @onready var content: Node = %Content | ||||
| @onready var loader_transition: AnimationPlayer = %LoaderTransition | ||||
| @onready var loading_screen: Control = %LoadingScreen | ||||
| 
 | ||||
| static var group := "GameGroup"  # hey i'm group | ||||
| 
 | ||||
| 
 | ||||
| class Promise: | ||||
| 	var _callbacks: Array[Callable] = [] | ||||
| 	var _end_callbacks: Array[Callable] = [] | ||||
| 
 | ||||
| 	func then(fn: Callable) -> Promise: | ||||
| 		_callbacks.push_back(fn) | ||||
| 		return self | ||||
| 
 | ||||
| 	func finally(fn: Callable) -> Promise: | ||||
| 		_end_callbacks.push_back(fn) | ||||
| 		return self | ||||
| 
 | ||||
| 	func resolve(res: Variant) -> void: | ||||
| 		for fn: Callable in _callbacks + _end_callbacks: | ||||
| 			fn.call(res) | ||||
| 
 | ||||
| 
 | ||||
| class ScenePromise: | ||||
| 	extends Promise | ||||
| 
 | ||||
| 	func resolve(res: Variant) -> void: | ||||
| 		var instance: Node = (res as PackedScene).instantiate() | ||||
| 		super.resolve(instance) | ||||
| 
 | ||||
| 
 | ||||
| func _initial_load() -> void: | ||||
| 	queue_scene(start_scene) | ||||
| 
 | ||||
| 
 | ||||
| func _ready() -> void: | ||||
| 	call_deferred("_initial_load") | ||||
| 
 | ||||
| 
 | ||||
| ## Unload the running scene & queue up a new scene to be loaded in the background. | ||||
| ## | ||||
| ## The loading screen will be shown until the scene is loaded. | ||||
| func queue_scene(path: String) -> Promise: | ||||
| 	if not loading_screen.visible: | ||||
| 		loading_screen.show() | ||||
| 		loading_screen.modulate = Color.WHITE | ||||
| 
 | ||||
| 	for child: Node in content.get_children(): | ||||
| 		child.queue_free() | ||||
| 
 | ||||
| 	return queue_load(path, ScenePromise.new()).finally(_finish_scene_load) | ||||
| 
 | ||||
| 
 | ||||
| ## Queue a resource to be loaded in the background. | ||||
| ## | ||||
| ## Returns a `Promise` which can be used to attach callbacks | ||||
| ## which will be called with the resource after it is loaded. | ||||
| func queue_load(path: String, promise: Promise = null) -> Promise: | ||||
| 	if not promise: | ||||
| 		promise = Promise.new() | ||||
| 	_loading_resources[path] = promise | ||||
| 	ResourceLoader.load_threaded_request(path) | ||||
| 	return promise | ||||
| 
 | ||||
| 
 | ||||
| func _finish_scene_load(instance: Node) -> void: | ||||
| 	content.add_child(instance) | ||||
| 	instance.reparent(content) | ||||
| 
 | ||||
| 
 | ||||
| func _process(_delta: float) -> void: | ||||
| 	# REMOVEME | ||||
| 	if Input.is_action_just_pressed("debug_1"): | ||||
| 		viewport.hit_lag(1) | ||||
| 	if Input.is_action_just_pressed("debug_2"): | ||||
| 		viewport.hit_lag_small() | ||||
| 	if Input.is_action_just_pressed("debug_3"): | ||||
| 		viewport.hit_lag_big() | ||||
| 	if Input.is_action_just_pressed("debug_4"): | ||||
| 		viewport.hit_lag_huge() | ||||
| 
 | ||||
| 	if _loading_resources and not loading_screen.visible: | ||||
| 		loader_transition.play("fade_in") | ||||
| 
 | ||||
| 	for key: String in _loading_resources.keys(): | ||||
| 		match ResourceLoader.load_threaded_get_status(key): | ||||
| 			ResourceLoader.THREAD_LOAD_LOADED: | ||||
| 				@warning_ignore("unsafe_cast") | ||||
| 				(_loading_resources[key] as Promise).resolve(ResourceLoader.load_threaded_get(key)) | ||||
| 				_loading_resources.erase(key) | ||||
| 			ResourceLoader.THREAD_LOAD_FAILED: | ||||
| 				assert(false, "Failed loading resource: " + key) | ||||
| 			ResourceLoader.THREAD_LOAD_INVALID_RESOURCE: | ||||
| 				assert(false, "Can't load invalid resource: " + key) | ||||
| 			_: | ||||
| 				# Continue loading | ||||
| 				pass | ||||
| 
 | ||||
| 	if not _loading_resources and loading_screen.visible: | ||||
| 		loader_transition.play("fade_out") | ||||
							
								
								
									
										196
									
								
								src/game/game.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								src/game/game.tscn
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,196 @@ | ||||
| [gd_scene load_steps=9 format=3 uid="uid://cefit4bc8akbb"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://src/game/game.gd" id="1_4qa87"] | ||||
| [ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="2_y3adf"] | ||||
| [ext_resource type="Script" path="res://src/ui/decorations/rumbler.gd" id="3_3vfdb"] | ||||
| [ext_resource type="Script" path="res://src/ui/game_viewport_container.gd" id="3_rmm5i"] | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_c3dlb"] | ||||
| length = 0.001 | ||||
| tracks/0/type = "value" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:visible") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 1, | ||||
| "values": [true] | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath(".: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)] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_2c1ud"] | ||||
| resource_name = "fade_in" | ||||
| length = 0.4 | ||||
| tracks/0/type = "value" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:visible") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 1, | ||||
| "values": [true] | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath(".:modulate") | ||||
| tracks/1/interp = 2 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(0, 0.4), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_xbqy2"] | ||||
| resource_name = "fade_out" | ||||
| length = 0.4 | ||||
| tracks/0/type = "value" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:visible") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0, 0.4), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 1, | ||||
| "values": [true, false] | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath(".:modulate") | ||||
| tracks/1/interp = 2 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(0, 0.4), | ||||
| "transitions": PackedFloat32Array(1, 1), | ||||
| "update": 0, | ||||
| "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="AnimationLibrary" id="AnimationLibrary_1s0w0"] | ||||
| _data = { | ||||
| "RESET": SubResource("Animation_c3dlb"), | ||||
| "fade_in": SubResource("Animation_2c1ud"), | ||||
| "fade_out": SubResource("Animation_xbqy2") | ||||
| } | ||||
| 
 | ||||
| [node name="Game" type="Node" groups=["GameGroup"]] | ||||
| process_mode = 3 | ||||
| script = ExtResource("1_4qa87") | ||||
| 
 | ||||
| [node name="RootControl" type="Control" parent="."] | ||||
| unique_name_in_owner = true | ||||
| layout_mode = 3 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| 
 | ||||
| [node name="LoadingScreen" type="Control" parent="RootControl"] | ||||
| unique_name_in_owner = true | ||||
| z_index = 128 | ||||
| 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="ColorRect" type="ColorRect" parent="RootControl/LoadingScreen"] | ||||
| layout_mode = 1 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| mouse_filter = 2 | ||||
| color = Color(0, 0, 0, 1) | ||||
| 
 | ||||
| [node name="MarginContainer" type="MarginContainer" parent="RootControl/LoadingScreen"] | ||||
| layout_mode = 1 | ||||
| anchors_preset = 3 | ||||
| anchor_left = 1.0 | ||||
| anchor_top = 1.0 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| offset_left = -1.0 | ||||
| offset_top = -42.0 | ||||
| grow_horizontal = 0 | ||||
| grow_vertical = 0 | ||||
| theme_override_constants/margin_right = 64 | ||||
| theme_override_constants/margin_bottom = 32 | ||||
| 
 | ||||
| [node name="RichTextLabel" type="RichTextLabel" parent="RootControl/LoadingScreen/MarginContainer"] | ||||
| custom_minimum_size = Vector2(160, 0) | ||||
| layout_mode = 2 | ||||
| mouse_filter = 2 | ||||
| theme_override_colors/default_color = Color(1, 0.75, 0.75, 1) | ||||
| theme_override_fonts/normal_font = ExtResource("2_y3adf") | ||||
| theme_override_font_sizes/normal_font_size = 32 | ||||
| bbcode_enabled = true | ||||
| text = "[wave]LOADING...[/wave]" | ||||
| fit_content = true | ||||
| 
 | ||||
| [node name="LoaderTransition" type="AnimationPlayer" parent="RootControl/LoadingScreen"] | ||||
| unique_name_in_owner = true | ||||
| libraries = { | ||||
| "": SubResource("AnimationLibrary_1s0w0") | ||||
| } | ||||
| 
 | ||||
| [node name="Rumbler" type="Control" parent="RootControl"] | ||||
| 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 | ||||
| script = ExtResource("3_3vfdb") | ||||
| 
 | ||||
| [node name="ViewportContainer" type="SubViewportContainer" parent="RootControl/Rumbler"] | ||||
| 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 | ||||
| stretch = true | ||||
| script = ExtResource("3_rmm5i") | ||||
| 
 | ||||
| [node name="Viewport" type="SubViewport" parent="RootControl/Rumbler/ViewportContainer"] | ||||
| handle_input_locally = false | ||||
| msaa_2d = 3 | ||||
| msaa_3d = 3 | ||||
| screen_space_aa = 1 | ||||
| use_taa = true | ||||
| size = Vector2i(1280, 720) | ||||
| render_target_update_mode = 4 | ||||
| 
 | ||||
| [node name="Content" type="Node" parent="RootControl/Rumbler/ViewportContainer/Viewport"] | ||||
| unique_name_in_owner = true | ||||
| process_mode = 1 | ||||
| @ -9,6 +9,7 @@ | ||||
| [resource] | ||||
| script = ExtResource("4_8ybyj") | ||||
| name = "DEBUG Gfolfer" | ||||
| life = 100.0 | ||||
| driver = ExtResource("1_sn8fd") | ||||
| iron = ExtResource("2_piku2") | ||||
| wedge = ExtResource("5_wm4ae") | ||||
|  | ||||
| @ -28,6 +28,9 @@ const CAMERA_SNAP_TIME := 0.3 | ||||
| 
 | ||||
| const WASTED_BALL_RETURN_DELAY := 3.5 | ||||
| 
 | ||||
| ## Shots above this threshold trigger a "big power" effect | ||||
| const BIG_POWER_THRESHOLD := 0.7 | ||||
| 
 | ||||
| ## In Driving Range mode, the ball can be retrieved in the shot phase. | ||||
| @export var driving_range := false | ||||
| 
 | ||||
| @ -142,6 +145,7 @@ var _tracking_camera: OrbitalCamera | ||||
| @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 game: Game = get_tree().get_first_node_in_group(Game.group) | ||||
| 
 | ||||
| @onready var _target_rotation := Vector2(pitch.rotation.x, direction.rotation.y) | ||||
| 
 | ||||
| @ -206,6 +210,17 @@ func get_shot_impulse(meter_pct: float) -> Vector3: | ||||
| 
 | ||||
| 
 | ||||
| func take_shot() -> void: | ||||
| 	# Impact screenshake & hitlag | ||||
| 	if game: | ||||
| 		if shot_power > BIG_POWER_THRESHOLD: | ||||
| 			game.viewport.hit_lag_big() | ||||
| 			var shake_intensity: float = ( | ||||
| 				10.0 * (shot_power - BIG_POWER_THRESHOLD) / (1.0 - BIG_POWER_THRESHOLD) | ||||
| 			) | ||||
| 			game.viewport.screen_shake(shake_intensity, 1.0) | ||||
| 		else: | ||||
| 			game.viewport.hit_lag_small() | ||||
| 
 | ||||
| 	print_debug("WHACK!\nPower: ", shot_power, "\nCurve: ", shot_curve) | ||||
| 
 | ||||
| 	var impulse := get_shot_impulse(shot_power) | ||||
|  | ||||
| @ -179,7 +179,7 @@ tracks/2/keys = { | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_u8k07"] | ||||
| resource_name = "swing_delay" | ||||
| length = 0.2 | ||||
| length = 0.0667 | ||||
| step = 0.01 | ||||
| tracks/0/type = "method" | ||||
| tracks/0/imported = false | ||||
| @ -188,7 +188,7 @@ tracks/0/path = NodePath("%Direction/..") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "times": PackedFloat32Array(0.18), | ||||
| "times": PackedFloat32Array(0.0667), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "values": [{ | ||||
| "args": [], | ||||
|  | ||||
| @ -1,8 +1,18 @@ | ||||
| class_name WorldPlayer extends Resource | ||||
| ## Container for the state of the player within the world. | ||||
| 
 | ||||
| signal on_life_changed(new_value: float) | ||||
| 
 | ||||
| @export_range(0, 100) var life: float = 100.0: | ||||
| 	set(value): | ||||
| 		if value != life: | ||||
| 			life = value | ||||
| 			on_life_changed.emit(value) | ||||
| 
 | ||||
| @export_category("Profile") | ||||
| # TODO character select | ||||
| @export var name: String = "Gfolfer" | ||||
| @export var color: Color = Color("ff7070") | ||||
| 
 | ||||
| @export_category("Equipment") | ||||
| @export var driver: Club | ||||
|  | ||||
							
								
								
									
										15
									
								
								src/ui/decorations/rumbler.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/ui/decorations/rumbler.gd
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| @tool | ||||
| class_name Rumbler extends Control | ||||
| ## Rumbles children. | ||||
| 
 | ||||
| const EPSILON := 1e-6 | ||||
| 
 | ||||
| @export var intensity := 0.0 | ||||
| 
 | ||||
| 
 | ||||
| func _process(_delta: float) -> void: | ||||
| 	if intensity > EPSILON: | ||||
| 		position.x = randfn(0, intensity) | ||||
| 		position.y = randfn(0, intensity) | ||||
| 	else: | ||||
| 		position = Vector2.ZERO | ||||
							
								
								
									
										71
									
								
								src/ui/game_viewport_container.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/ui/game_viewport_container.gd
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| class_name GameViewportContainer extends SubViewportContainer | ||||
| ## SubViewportContainer with game-specific special effects | ||||
| 
 | ||||
| const SMALL_HIT_LAG_FRAMES := 5 | ||||
| const BIG_HIT_LAG_FRAMES := 10 | ||||
| const HUGE_HIT_LAG_FRAMES := 20 | ||||
| 
 | ||||
| var _hit_lag_frames := -1 | ||||
| 
 | ||||
| @onready var content: Node = %Content | ||||
| @onready var rumbler: Rumbler = %Rumbler | ||||
| 
 | ||||
| 
 | ||||
| ## Start playing a screen shake effect. | ||||
| func screen_shake(intensity: float, duration: float = 0.2) -> void: | ||||
| 	if not ProjectSettings.get_setting("game/config/accessibility/enable_screen_shake"): | ||||
| 		return | ||||
| 
 | ||||
| 	var tween := get_tree().create_tween() | ||||
| 	rumbler.intensity = intensity | ||||
| 	tween.tween_property(rumbler, "intensity", 0.0, duration).set_trans(Tween.TRANS_CUBIC) | ||||
| 	tween.tween_callback(_reset_position) | ||||
| 
 | ||||
| 
 | ||||
| ## Rumble the screen indefinitely. | ||||
| func set_rumble(intensity: float) -> void: | ||||
| 	if not ProjectSettings.get_setting("game/config/accessibility/enable_screen_shake"): | ||||
| 		return | ||||
| 
 | ||||
| 	rumbler.intensity = intensity | ||||
| 
 | ||||
| 
 | ||||
| ## Stop rumbling the screen. | ||||
| func stop_rumble() -> void: | ||||
| 	set_rumble(0) | ||||
| 
 | ||||
| 
 | ||||
| ## Hit lag for a small impact. | ||||
| func hit_lag_small() -> void: | ||||
| 	hit_lag(SMALL_HIT_LAG_FRAMES) | ||||
| 
 | ||||
| 
 | ||||
| ## Hit lag for a big impact. | ||||
| func hit_lag_big() -> void: | ||||
| 	hit_lag(BIG_HIT_LAG_FRAMES) | ||||
| 
 | ||||
| 
 | ||||
| ## Hit lag for a huge impact. | ||||
| func hit_lag_huge() -> void: | ||||
| 	hit_lag(HUGE_HIT_LAG_FRAMES) | ||||
| 
 | ||||
| 
 | ||||
| ## Stop processing for some number of frames. | ||||
| func hit_lag(frames: int = 1) -> void: | ||||
| 	if not ProjectSettings.get_setting("game/config/accessibility/enable_hit_lag"): | ||||
| 		return | ||||
| 
 | ||||
| 	_hit_lag_frames = frames | ||||
| 
 | ||||
| 
 | ||||
| func _reset_position() -> void: | ||||
| 	position = Vector2.ZERO | ||||
| 
 | ||||
| 
 | ||||
| func _process(_delta: float) -> void: | ||||
| 	if _hit_lag_frames >= 0: | ||||
| 		if _hit_lag_frames == 0: | ||||
| 			content.process_mode = Node.PROCESS_MODE_INHERIT | ||||
| 		else: | ||||
| 			content.process_mode = Node.PROCESS_MODE_DISABLED | ||||
| 		_hit_lag_frames -= 1 | ||||
| @ -1,8 +1,9 @@ | ||||
| class_name ShotHUD extends Control | ||||
| ## HUD for main gameplay loop | ||||
| 
 | ||||
| @onready var power_bar: ProgressBar = %PowerBar | ||||
| @onready var power_bar: TextureProgressBar = %PowerBar | ||||
| @onready var curve_bar: ProgressBar = %CurveBar | ||||
| @onready var life_bar: TextureProgressBar = %LifeBar | ||||
| 
 | ||||
| @onready var club_selector: ClubSelector = %ClubSelector | ||||
| 
 | ||||
| @ -14,6 +15,8 @@ class_name ShotHUD extends Control | ||||
| @onready var _nice_animation: AnimationPlayer = %NiceAnimation | ||||
| @onready var _wasted_animation: AnimationPlayer = %WastedAnimation | ||||
| 
 | ||||
| @onready var _player_name: Label = %PlayerName | ||||
| 
 | ||||
| @onready var _state: AnimationNodeStateMachinePlayback = hud_state_machine["parameters/playback"] | ||||
| 
 | ||||
| 
 | ||||
| @ -21,7 +24,10 @@ class_name ShotHUD extends Control | ||||
| 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 | ||||
| 	_player_name.text = player.name | ||||
| 	# TODO animate on life loss? | ||||
| 	life_bar.value = player.life | ||||
| 	life_bar.tint_progress = player.color | ||||
| 	# TODO special equipment | ||||
| 	# TODO abilities | ||||
| 
 | ||||
|  | ||||
| @ -1,8 +1,15 @@ | ||||
| [gd_scene load_steps=27 format=3 uid="uid://c4ifdiohng830"] | ||||
| [gd_scene load_steps=34 format=3 uid="uid://c4ifdiohng830"] | ||||
| 
 | ||||
| [ext_resource type="Script" path="res://src/ui/shot_hud/shot_hud.gd" id="1_x5b4c"] | ||||
| [ext_resource type="Shader" path="res://src/shaders/canvas_retro.gdshader" id="1_ybxxp"] | ||||
| [ext_resource type="PackedScene" uid="uid://445qd7m4qe2j" path="res://src/ui/shot_hud/club_selector/club_selector.tscn" id="2_1hdub"] | ||||
| [ext_resource type="Script" path="res://src/ui/decorations/rumbler.gd" id="3_6groq"] | ||||
| [ext_resource type="Texture2D" uid="uid://b5812y3pmmgg5" path="res://assets/ui/gauge_patch.png" id="4_5kcpe"] | ||||
| [ext_resource type="Texture2D" uid="uid://76fjx2ukavqe" path="res://assets/ui/power_gauge_fill.png" id="5_3i1yq"] | ||||
| [ext_resource type="Texture2D" uid="uid://4a8tvjgwegv3" path="res://assets/ui/power_gauge_tab.png" id="6_sw48q"] | ||||
| [ext_resource type="FontFile" uid="uid://dsa0oh7c0h4pu" path="res://assets/fonts/Racing_Sans_One/RacingSansOne-Regular.ttf" id="8_bejx4"] | ||||
| [ext_resource type="Texture2D" uid="uid://bvwh0yunmvirp" path="res://assets/ui/lifebar_patch.png" id="9_4f1d7"] | ||||
| [ext_resource type="Texture2D" uid="uid://dtdqninlnu10o" path="res://assets/ui/lifebar_fill_grey.png" id="10_130v7"] | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_3xds6"] | ||||
| resource_name = "RESET" | ||||
| @ -280,7 +287,7 @@ length = 0.001 | ||||
| tracks/0/type = "bezier" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:value") | ||||
| tracks/0/path = NodePath("../Rumbler/PowerBar:value") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| @ -288,6 +295,18 @@ tracks/0/keys = { | ||||
| "points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), | ||||
| "times": PackedFloat32Array(0) | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath("../Rumbler:intensity") | ||||
| tracks/1/interp = 1 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(0), | ||||
| "transitions": PackedFloat32Array(1), | ||||
| "update": 0, | ||||
| "values": [0.0] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="Animation" id="Animation_67gmp"] | ||||
| resource_name = "fill" | ||||
| @ -295,14 +314,26 @@ length = 1.618 | ||||
| tracks/0/type = "bezier" | ||||
| tracks/0/imported = false | ||||
| tracks/0/enabled = true | ||||
| tracks/0/path = NodePath(".:value") | ||||
| tracks/0/path = NodePath("../Rumbler/PowerBar:value") | ||||
| tracks/0/interp = 1 | ||||
| tracks/0/loop_wrap = true | ||||
| tracks/0/keys = { | ||||
| "handle_modes": PackedInt32Array(0, 0), | ||||
| "points": PackedFloat32Array(0, -0.25, 0, 0.233333, 0.0884774, 1, -0.267469, -0.483539, 0.25, 0), | ||||
| "points": PackedFloat32Array(0, -0.25, 0, 0.233333, 0.598765, 1, -0.351333, -0.246032, 0.25, 0), | ||||
| "times": PackedFloat32Array(0, 1.618) | ||||
| } | ||||
| tracks/1/type = "value" | ||||
| tracks/1/imported = false | ||||
| tracks/1/enabled = true | ||||
| tracks/1/path = NodePath("../Rumbler:intensity") | ||||
| tracks/1/interp = 1 | ||||
| tracks/1/loop_wrap = true | ||||
| tracks/1/keys = { | ||||
| "times": PackedFloat32Array(1.06667, 1.618), | ||||
| "transitions": PackedFloat32Array(2.618, 1), | ||||
| "update": 0, | ||||
| "values": [0.0, 2.0] | ||||
| } | ||||
| 
 | ||||
| [sub_resource type="AnimationLibrary" id="AnimationLibrary_coah5"] | ||||
| _data = { | ||||
| @ -526,26 +557,53 @@ grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| mouse_filter = 1 | ||||
| 
 | ||||
| [node name="PowerBar" type="ProgressBar" parent="ShotGauges/PowerGauge"] | ||||
| unique_name_in_owner = true | ||||
| visible = false | ||||
| custom_minimum_size = Vector2(30, 0) | ||||
| [node name="Rumbler" type="Control" parent="ShotGauges/PowerGauge"] | ||||
| layout_mode = 1 | ||||
| anchors_preset = 13 | ||||
| anchor_left = 0.5 | ||||
| anchor_right = 0.5 | ||||
| anchor_bottom = 1.0 | ||||
| offset_left = -2.0 | ||||
| offset_right = 2.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| mouse_filter = 1 | ||||
| script = ExtResource("3_6groq") | ||||
| 
 | ||||
| [node name="PowerBar" type="TextureProgressBar" parent="ShotGauges/PowerGauge/Rumbler"] | ||||
| unique_name_in_owner = true | ||||
| visible = false | ||||
| texture_filter = 5 | ||||
| custom_minimum_size = Vector2(64, 0) | ||||
| layout_mode = 1 | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| max_value = 1.0 | ||||
| step = 0.01 | ||||
| fill_mode = 2 | ||||
| nine_patch_stretch = true | ||||
| stretch_margin_left = 16 | ||||
| stretch_margin_top = 16 | ||||
| stretch_margin_right = 16 | ||||
| stretch_margin_bottom = 16 | ||||
| texture_under = ExtResource("4_5kcpe") | ||||
| texture_progress = ExtResource("5_3i1yq") | ||||
| 
 | ||||
| [node name="TitleTab" type="TextureRect" parent="ShotGauges/PowerGauge/Rumbler/PowerBar"] | ||||
| layout_mode = 1 | ||||
| anchors_preset = 1 | ||||
| anchor_left = 1.0 | ||||
| anchor_right = 1.0 | ||||
| offset_left = -8.0 | ||||
| offset_right = 19.0 | ||||
| offset_bottom = 48.0 | ||||
| grow_horizontal = 0 | ||||
| texture = ExtResource("6_sw48q") | ||||
| stretch_mode = 2 | ||||
| 
 | ||||
| [node name="PowerAnimation" type="AnimationPlayer" parent="ShotGauges/PowerGauge"] | ||||
| unique_name_in_owner = true | ||||
| root_node = NodePath("../PowerBar") | ||||
| root_node = NodePath(".") | ||||
| libraries = { | ||||
| "": SubResource("AnimationLibrary_coah5") | ||||
| } | ||||
| @ -603,3 +661,53 @@ unique_name_in_owner = true | ||||
| root_node = NodePath("%HUDStateMachine/..") | ||||
| tree_root = SubResource("AnimationNodeStateMachine_osrbp") | ||||
| anim_player = NodePath("../HUDAnimation") | ||||
| 
 | ||||
| [node name="SouthWest" type="MarginContainer" parent="."] | ||||
| layout_mode = 1 | ||||
| anchors_preset = -1 | ||||
| anchor_top = 1.0 | ||||
| anchor_right = 0.333 | ||||
| anchor_bottom = 1.0 | ||||
| offset_top = -40.0 | ||||
| offset_right = 40.0 | ||||
| grow_vertical = 0 | ||||
| theme_override_constants/margin_left = 16 | ||||
| theme_override_constants/margin_bottom = 16 | ||||
| 
 | ||||
| [node name="VBoxContainer" type="VBoxContainer" parent="SouthWest"] | ||||
| layout_mode = 2 | ||||
| theme_override_constants/separation = -8 | ||||
| 
 | ||||
| [node name="HBoxContainer" type="HBoxContainer" parent="SouthWest/VBoxContainer"] | ||||
| layout_mode = 2 | ||||
| 
 | ||||
| [node name="Spacer" type="Control" parent="SouthWest/VBoxContainer/HBoxContainer"] | ||||
| custom_minimum_size = Vector2(24, 0) | ||||
| layout_mode = 2 | ||||
| 
 | ||||
| [node name="PlayerName" type="Label" parent="SouthWest/VBoxContainer/HBoxContainer"] | ||||
| unique_name_in_owner = true | ||||
| layout_mode = 2 | ||||
| theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) | ||||
| theme_override_colors/font_outline_color = Color(0, 0, 0, 1) | ||||
| theme_override_constants/shadow_offset_x = 3 | ||||
| theme_override_constants/shadow_offset_y = 0 | ||||
| theme_override_constants/outline_size = 2 | ||||
| theme_override_constants/shadow_outline_size = 2 | ||||
| theme_override_fonts/font = ExtResource("8_bejx4") | ||||
| theme_override_font_sizes/font_size = 32 | ||||
| text = "PLAYER NAME" | ||||
| 
 | ||||
| [node name="LifeBar" type="TextureProgressBar" parent="SouthWest/VBoxContainer"] | ||||
| unique_name_in_owner = true | ||||
| custom_minimum_size = Vector2(0, 48) | ||||
| layout_mode = 2 | ||||
| min_value = -4.0 | ||||
| step = 0.01 | ||||
| nine_patch_stretch = true | ||||
| stretch_margin_left = 32 | ||||
| stretch_margin_top = 16 | ||||
| stretch_margin_right = 32 | ||||
| stretch_margin_bottom = 16 | ||||
| texture_under = ExtResource("9_4f1d7") | ||||
| texture_progress = ExtResource("10_130v7") | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user