diff --git a/Scripts/Resources/player_preferences.gd b/Scripts/Resources/player_preferences.gd index e63fdff..9f13297 100644 --- a/Scripts/Resources/player_preferences.gd +++ b/Scripts/Resources/player_preferences.gd @@ -12,6 +12,7 @@ const SAVE_PATH: String = "user://preferences.tres" @export var display_self_damage_indicators: bool = true @export var display_party_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: diff --git a/Scripts/enemy_goal.gd b/Scripts/enemy_goal.gd index 049d47c..dcbb53a 100644 --- a/Scripts/enemy_goal.gd +++ b/Scripts/enemy_goal.gd @@ -1,10 +1,36 @@ class_name EnemyGoal extends Node3D +signal goal_cleared() +signal goal_occupied() + @export var audio_player: AudioStreamPlayer3D +var enemies_inside: int + func _on_area_3d_body_entered(body: Node3D) -> void: if body is EnemyController: body.goal_entered() 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() diff --git a/Scripts/game.gd b/Scripts/game.gd index 5a465f8..823f93f 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -140,6 +140,8 @@ func spawn_players() -> void: var player: Hero = player_scene.instantiate() as Hero player.placed_tower.connect(connect_tower_to_music) 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.edit_tool.level = level player.hud.map_anchor = level @@ -159,8 +161,6 @@ func spawn_players() -> void: base_took_damage.connect(player.hud.set_lives_count) root_scene.add_child(player) 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: diff --git a/UI/Menus/OptionsMenu/gameplay_options.gd b/UI/Menus/OptionsMenu/gameplay_options.gd index 5ffcac6..eb84be5 100644 --- a/UI/Menus/OptionsMenu/gameplay_options.gd +++ b/UI/Menus/OptionsMenu/gameplay_options.gd @@ -12,6 +12,7 @@ extends VBoxContainer @export var self_damage: Button @export var party_damage: Button @export var status_damage: Button +@export var show_shield: Button func _ready() -> void: @@ -29,6 +30,7 @@ func _ready() -> void: self_damage.button_pressed = Data.preferences.display_self_damage_indicators party_damage.button_pressed = Data.preferences.display_party_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: @@ -41,6 +43,7 @@ func save() -> void: Data.preferences.display_self_damage_indicators = self_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.always_show_shield_ui = show_shield.button_pressed func _on_mouse_sens_spin_box_value_changed(value: float) -> void: diff --git a/UI/Menus/OptionsMenu/gameplay_options.tscn b/UI/Menus/OptionsMenu/gameplay_options.tscn index bf2bc7a..7570ca9 100644 --- a/UI/Menus/OptionsMenu/gameplay_options.tscn +++ b/UI/Menus/OptionsMenu/gameplay_options.tscn @@ -4,7 +4,7 @@ [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 anchor_right = 1.0 anchor_bottom = 1.0 @@ -22,6 +22,7 @@ tower_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/ self_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/SelfDamage") party_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/PartyDamage") status_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/StatusDamage") +show_shield = NodePath("AlwaysShowShield/CenterContainer/CheckButton") [node name="Resolution" type="HBoxContainer" parent="." unique_id=1996706644] layout_mode = 2 @@ -186,6 +187,23 @@ toggle_mode = true button_pressed = true 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="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"] diff --git a/UI/ShieldUI/shield_ui.gd b/UI/ShieldUI/shield_ui.gd index d05da62..b8810ac 100644 --- a/UI/ShieldUI/shield_ui.gd +++ b/UI/ShieldUI/shield_ui.gd @@ -17,14 +17,23 @@ var cell_tweens: Array[Tween] = [] func _ready() -> void: for x: int in cells.size(): cell_tweens.append(null) - fade_timer.start() + fade_ui() -func take_damage(damage: int) -> void: +func show_ui() -> void: if fade_tween: fade_tween.kill() fade_tween = null 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 remaining_damage: int = damage - damage_to_deal_with 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_interval(0.07) 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: diff --git a/Zones/Moat/scn_moat.tscn b/Zones/Moat/scn_moat.tscn index 447a8ee..7aa40a4 100644 --- a/Zones/Moat/scn_moat.tscn +++ b/Zones/Moat/scn_moat.tscn @@ -23,6 +23,9 @@ [sub_resource type="BoxShape3D" id="BoxShape3D_awjk1"] 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"] 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") 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 -[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) 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] 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")] 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"] [editable path="bridge"]