added keep shield ui onscreen option

This commit is contained in:
2026-02-10 19:56:01 +11:00
parent 1f91e0aef7
commit bb7e563e77
7 changed files with 77 additions and 9 deletions

View File

@@ -12,6 +12,7 @@ const SAVE_PATH: String = "user://preferences.tres"
@export var display_self_damage_indicators: bool = true @export var display_self_damage_indicators: bool = true
@export var display_party_damage_indicators: bool = true @export var display_party_damage_indicators: bool = true
@export var display_status_effect_damage_indicators: bool = true @export var display_status_effect_damage_indicators: bool = true
@export var always_show_shield_ui: bool = false
func save_profile_to_disk() -> void: func save_profile_to_disk() -> void:

View File

@@ -1,10 +1,36 @@
class_name EnemyGoal class_name EnemyGoal
extends Node3D extends Node3D
signal goal_cleared()
signal goal_occupied()
@export var audio_player: AudioStreamPlayer3D @export var audio_player: AudioStreamPlayer3D
var enemies_inside: int
func _on_area_3d_body_entered(body: Node3D) -> void: func _on_area_3d_body_entered(body: Node3D) -> void:
if body is EnemyController: if body is EnemyController:
body.goal_entered() body.goal_entered()
audio_player.play() audio_player.play()
func enemy_entered_shield_range(body: Node3D) -> void:
if body is EnemyController:
if enemies_inside == 0:
goal_occupied.emit()
enemies_inside += 1
body.died.connect(enemy_died)
body.reached_goal.connect(enemy_reached_goal)
func enemy_died(enemy: Enemy) -> void:
enemies_inside -= 1
if enemies_inside == 0:
goal_cleared.emit()
func enemy_reached_goal(enemy: Enemy, penalty: int) -> void:
enemies_inside -= 1
if enemies_inside == 0:
goal_cleared.emit()

View File

@@ -140,6 +140,8 @@ func spawn_players() -> void:
var player: Hero = player_scene.instantiate() as Hero var player: Hero = player_scene.instantiate() as Hero
player.placed_tower.connect(connect_tower_to_music) player.placed_tower.connect(connect_tower_to_music)
player.name = str(peer_id) player.name = str(peer_id)
level.enemy_goals[0].goal_cleared.connect(player.hud.shield_ui.fade_ui)
level.enemy_goals[0].goal_occupied.connect(player.hud.shield_ui.show_ui)
player.game_manager = self player.game_manager = self
player.edit_tool.level = level player.edit_tool.level = level
player.hud.map_anchor = level player.hud.map_anchor = level
@@ -159,8 +161,6 @@ func spawn_players() -> void:
base_took_damage.connect(player.hud.set_lives_count) base_took_damage.connect(player.hud.set_lives_count)
root_scene.add_child(player) root_scene.add_child(player)
p_i += 1 p_i += 1
print("objective health: " + str(objective_health))
print("player ui health: " + str(player.hud.shield_ui.health))
func ready_player(player_ready_true: bool) -> void: func ready_player(player_ready_true: bool) -> void:

View File

@@ -12,6 +12,7 @@ extends VBoxContainer
@export var self_damage: Button @export var self_damage: Button
@export var party_damage: Button @export var party_damage: Button
@export var status_damage: Button @export var status_damage: Button
@export var show_shield: Button
func _ready() -> void: func _ready() -> void:
@@ -29,6 +30,7 @@ func _ready() -> void:
self_damage.button_pressed = Data.preferences.display_self_damage_indicators self_damage.button_pressed = Data.preferences.display_self_damage_indicators
party_damage.button_pressed = Data.preferences.display_party_damage_indicators party_damage.button_pressed = Data.preferences.display_party_damage_indicators
status_damage.button_pressed = Data.preferences.display_status_effect_damage_indicators status_damage.button_pressed = Data.preferences.display_status_effect_damage_indicators
show_shield.button_pressed = Data.preferences.always_show_shield_ui
func save() -> void: func save() -> void:
@@ -41,6 +43,7 @@ func save() -> void:
Data.preferences.display_self_damage_indicators = self_damage.button_pressed Data.preferences.display_self_damage_indicators = self_damage.button_pressed
Data.preferences.display_party_damage_indicators = party_damage.button_pressed Data.preferences.display_party_damage_indicators = party_damage.button_pressed
Data.preferences.display_status_effect_damage_indicators = status_damage.button_pressed Data.preferences.display_status_effect_damage_indicators = status_damage.button_pressed
Data.preferences.always_show_shield_ui = show_shield.button_pressed
func _on_mouse_sens_spin_box_value_changed(value: float) -> void: func _on_mouse_sens_spin_box_value_changed(value: float) -> void:

View File

@@ -4,7 +4,7 @@
[sub_resource type="ImageTexture" id="ImageTexture_03x6q"] [sub_resource type="ImageTexture" id="ImageTexture_03x6q"]
[node name="Gameplay" type="VBoxContainer" unique_id=9533751 node_paths=PackedStringArray("resolution_drop_down", "look_sens_slider", "look_sens_input", "toggle_sprint_checkbox", "invert_lookY", "invert_lookX", "fixed_minimap", "tower_damage", "self_damage", "party_damage", "status_damage")] [node name="Gameplay" type="VBoxContainer" unique_id=9533751 node_paths=PackedStringArray("resolution_drop_down", "look_sens_slider", "look_sens_input", "toggle_sprint_checkbox", "invert_lookY", "invert_lookX", "fixed_minimap", "tower_damage", "self_damage", "party_damage", "status_damage", "show_shield")]
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
@@ -22,6 +22,7 @@ tower_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/
self_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/SelfDamage") self_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/SelfDamage")
party_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/PartyDamage") party_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/PartyDamage")
status_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/StatusDamage") status_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/StatusDamage")
show_shield = NodePath("AlwaysShowShield/CenterContainer/CheckButton")
[node name="Resolution" type="HBoxContainer" parent="." unique_id=1996706644] [node name="Resolution" type="HBoxContainer" parent="." unique_id=1996706644]
layout_mode = 2 layout_mode = 2
@@ -186,6 +187,23 @@ toggle_mode = true
button_pressed = true button_pressed = true
text = "OPTION_STATUS_DAMAGE" text = "OPTION_STATUS_DAMAGE"
[node name="AlwaysShowShield" type="HBoxContainer" parent="." unique_id=745573840]
layout_mode = 2
[node name="Label" type="Label" parent="AlwaysShowShield" unique_id=856331565]
layout_mode = 2
size_flags_horizontal = 3
text = "OPTION_ALWAYS_SHOW_SHIELD"
horizontal_alignment = 1
vertical_alignment = 1
[node name="CenterContainer" type="CenterContainer" parent="AlwaysShowShield" unique_id=726349358]
layout_mode = 2
size_flags_horizontal = 3
[node name="CheckButton" type="CheckButton" parent="AlwaysShowShield/CenterContainer" unique_id=263220323]
layout_mode = 2
[connection signal="item_selected" from="Resolution/HBoxContainer/OptionButton" to="." method="_on_option_button_item_selected"] [connection signal="item_selected" from="Resolution/HBoxContainer/OptionButton" to="." method="_on_option_button_item_selected"]
[connection signal="value_changed" from="MouseSens/HBoxContainer/SpinBox" to="." method="_on_mouse_sens_spin_box_value_changed"] [connection signal="value_changed" from="MouseSens/HBoxContainer/SpinBox" to="." method="_on_mouse_sens_spin_box_value_changed"]
[connection signal="value_changed" from="MouseSens/HBoxContainer/HSlider" to="." method="_on_mouse_sens_h_slider_value_changed"] [connection signal="value_changed" from="MouseSens/HBoxContainer/HSlider" to="." method="_on_mouse_sens_h_slider_value_changed"]

View File

@@ -17,14 +17,23 @@ var cell_tweens: Array[Tween] = []
func _ready() -> void: func _ready() -> void:
for x: int in cells.size(): for x: int in cells.size():
cell_tweens.append(null) cell_tweens.append(null)
fade_timer.start() fade_ui()
func take_damage(damage: int) -> void: func show_ui() -> void:
if fade_tween: if fade_tween:
fade_tween.kill() fade_tween.kill()
fade_tween = null fade_tween = null
modulate = Color.WHITE modulate = Color.WHITE
func fade_ui() -> void:
if !Data.preferences.always_show_shield_ui:
fade_timer.start()
func take_damage(damage: int) -> void:
show_ui()
var damage_to_deal_with: int = min(damage, current_cell_health) var damage_to_deal_with: int = min(damage, current_cell_health)
var remaining_damage: int = damage - damage_to_deal_with var remaining_damage: int = damage - damage_to_deal_with
var current_cell: int = ceili(float(health) / CELL_HEALTH) var current_cell: int = ceili(float(health) / CELL_HEALTH)
@@ -60,7 +69,6 @@ func take_damage(damage: int) -> void:
cell_tweens[current_cell - 1].tween_callback(change_cell_color.bind(current_cell - 1, cell_level)) cell_tweens[current_cell - 1].tween_callback(change_cell_color.bind(current_cell - 1, cell_level))
cell_tweens[current_cell - 1].tween_interval(0.07) cell_tweens[current_cell - 1].tween_interval(0.07)
cell_tweens[current_cell - 1].tween_callback(func() -> void: hit_glow.visible = false) cell_tweens[current_cell - 1].tween_callback(func() -> void: hit_glow.visible = false)
fade_timer.start()
func change_cell_color(cell: int, color: int) -> void: func change_cell_color(cell: int, color: int) -> void:

View File

@@ -23,6 +23,9 @@
[sub_resource type="BoxShape3D" id="BoxShape3D_awjk1"] [sub_resource type="BoxShape3D" id="BoxShape3D_awjk1"]
size = Vector3(3.6270146, 6.87512, 10) size = Vector3(3.6270146, 6.87512, 10)
[sub_resource type="BoxShape3D" id="BoxShape3D_s81wy"]
size = Vector3(24.37746, 16.368866, 32.543457)
[sub_resource type="BoxShape3D" id="BoxShape3D_134um"] [sub_resource type="BoxShape3D" id="BoxShape3D_134um"]
size = Vector3(260.6662, 2.4995117, 318.20755) size = Vector3(260.6662, 2.4995117, 318.20755)
@@ -45,13 +48,21 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 40.123978, 0.5, 0)
script = ExtResource("9_s3rd7") script = ExtResource("9_s3rd7")
audio_player = NodePath("AudioStreamPlayer3D") audio_player = NodePath("AudioStreamPlayer3D")
[node name="Area3D" type="Area3D" parent="EnemyGoal" unique_id=80277049] [node name="DeathArea" type="Area3D" parent="EnemyGoal" unique_id=80277049]
collision_mask = 4 collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyGoal/Area3D" unique_id=1234164927] [node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyGoal/DeathArea" unique_id=1234164927]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.40402222, 3.43756, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.40402222, 3.43756, 0)
shape = SubResource("BoxShape3D_awjk1") shape = SubResource("BoxShape3D_awjk1")
[node name="ShieldArea" type="Area3D" parent="EnemyGoal" unique_id=1344850092]
collision_layer = 0
collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyGoal/ShieldArea" unique_id=1341930873]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.271231, 7.8232956, -0.27661133)
shape = SubResource("BoxShape3D_s81wy")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="EnemyGoal" unique_id=1838624313] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="EnemyGoal" unique_id=1838624313]
stream = ExtResource("11_l537x") stream = ExtResource("11_l537x")
@@ -433,7 +444,8 @@ transform = Transform3D(-0.7581457, 0, 0.6520852, 0, 1, 0, -0.6520852, 0, -0.758
[node name="Node3D50" parent="." unique_id=293622677 instance=ExtResource("21_6tcu8")] [node name="Node3D50" parent="." unique_id=293622677 instance=ExtResource("21_6tcu8")]
transform = Transform3D(-0.7581457, 0, 0.6520852, 0, 1, 0, -0.6520852, 0, -0.7581457, -35.033936, 0.422287, -72.41817) transform = Transform3D(-0.7581457, 0, 0.6520852, 0, 1, 0, -0.6520852, 0, -0.7581457, -35.033936, 0.422287, -72.41817)
[connection signal="body_entered" from="EnemyGoal/Area3D" to="EnemyGoal" method="_on_area_3d_body_entered"] [connection signal="body_entered" from="EnemyGoal/DeathArea" to="EnemyGoal" method="_on_area_3d_body_entered"]
[connection signal="body_entered" from="EnemyGoal/ShieldArea" to="EnemyGoal" method="enemy_entered_shield_range"]
[connection signal="body_entered" from="Killbox" to="Killbox" method="_on_body_entered"] [connection signal="body_entered" from="Killbox" to="Killbox" method="_on_body_entered"]
[editable path="bridge"] [editable path="bridge"]