Reworked weapons and projectiles
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
class_name Health
|
||||
extends Node
|
||||
|
||||
|
||||
signal shield_updated(value: int, max_value: int)
|
||||
signal armor_updated(value: int, max_value: int)
|
||||
signal hull_updated(value: int, max_value: int)
|
||||
|
||||
signal depleted
|
||||
|
||||
|
||||
@export_range(0, 5000) var max_shield: int = 0:
|
||||
set(value):
|
||||
max_shield = value
|
||||
shield_updated.emit(shield, max_shield)
|
||||
|
||||
@export_range(0, 5000) var max_armor: int = 0:
|
||||
set(value):
|
||||
max_armor = value
|
||||
armor_updated.emit(armor, max_armor)
|
||||
|
||||
@export_range(1, 5000) var max_hull: int = 1:
|
||||
set(value):
|
||||
max_hull = value
|
||||
hull_updated.emit(hull, max_hull)
|
||||
|
||||
|
||||
var shield: int:
|
||||
set(value):
|
||||
shield = value
|
||||
shield_updated.emit(shield, max_shield)
|
||||
var armor: int:
|
||||
set(value):
|
||||
armor = value
|
||||
armor_updated.emit(armor, max_armor)
|
||||
var hull: int:
|
||||
set(value):
|
||||
hull = value
|
||||
hull_updated.emit(hull, max_hull)
|
||||
|
||||
|
||||
@onready var shield_regen_delay_timer : Timer = $ShieldRegenDelayTimer
|
||||
@onready var shield_regen_tick_timer : Timer = $ShieldRegenTickTimer
|
||||
|
||||
|
||||
@onready var _shield_regen := floori(max_shield/30.0)
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
shield = max_shield
|
||||
armor = max_armor
|
||||
hull = max_hull
|
||||
|
||||
|
||||
func apply_damage(damage: AbstractDamage) -> void:
|
||||
if shield > 0:
|
||||
var damage_value := ceili(damage.value * damage.shield_damage_multiplier())
|
||||
shield = max(shield - damage_value, 0)
|
||||
shield_regen_delay_timer.start()
|
||||
elif armor > 0:
|
||||
var damage_value := ceili(damage.value * damage.armor_damage_multiplier())
|
||||
armor = max(armor - damage_value, 0)
|
||||
else:
|
||||
if hull == 0: return
|
||||
|
||||
var damage_value := ceili(damage.value * damage.hull_damage_multiplier())
|
||||
hull = max(hull - damage_value, 0)
|
||||
|
||||
if hull == 0:
|
||||
depleted.emit()
|
||||
|
||||
if not shield_regen_delay_timer.is_stopped():
|
||||
shield_regen_delay_timer.start()
|
||||
shield_regen_tick_timer.stop()
|
||||
|
||||
|
||||
func _on_shield_regen_delay_timer_timeout() -> void:
|
||||
shield_regen_tick_timer.start()
|
||||
|
||||
|
||||
func _on_shield_regen_tick_timer_timeout() -> void:
|
||||
var new_shield_value := shield + _shield_regen
|
||||
if new_shield_value >= max_shield:
|
||||
new_shield_value = max_shield
|
||||
shield_regen_tick_timer.stop()
|
||||
shield = new_shield_value
|
||||
@@ -0,0 +1 @@
|
||||
uid://d3g4xbq45qmpr
|
||||
@@ -0,0 +1,16 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://clkymhkv3cevm"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d3g4xbq45qmpr" path="res://game/entities/health_system/health.gd" id="1_gwdg4"]
|
||||
|
||||
[node name="Health" type="Node"]
|
||||
script = ExtResource("1_gwdg4")
|
||||
|
||||
[node name="ShieldRegenDelayTimer" type="Timer" parent="."]
|
||||
wait_time = 3.0
|
||||
one_shot = true
|
||||
|
||||
[node name="ShieldRegenTickTimer" type="Timer" parent="."]
|
||||
wait_time = 0.1
|
||||
|
||||
[connection signal="timeout" from="ShieldRegenDelayTimer" to="." method="_on_shield_regen_delay_timer_timeout"]
|
||||
[connection signal="timeout" from="ShieldRegenTickTimer" to="." method="_on_shield_regen_tick_timer_timeout"]
|
||||
@@ -0,0 +1,61 @@
|
||||
class_name HealthBarPart
|
||||
extends Control
|
||||
|
||||
|
||||
const TICK_COUNT = 5
|
||||
|
||||
|
||||
@export var texture_value : Texture2D
|
||||
@export var texture_shade : Texture2D
|
||||
|
||||
|
||||
var _tick_size : int = 0
|
||||
var _target_value: float = 0
|
||||
|
||||
|
||||
@onready var value_bar : TextureProgressBar = $ValueBar
|
||||
@onready var shade_bar : TextureProgressBar = $ShadeBar
|
||||
|
||||
@onready var shade_delay_timer : Timer = $ShadeDelayTimer
|
||||
@onready var shade_tick_timer : Timer = $ShadeTickTimer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
value_bar.texture_progress = texture_value
|
||||
shade_bar.texture_progress = texture_shade
|
||||
|
||||
|
||||
func set_value(value: int) -> void:
|
||||
if value_bar.value == value: return
|
||||
|
||||
value_bar.value = value
|
||||
if shade_bar.value < value_bar.value:
|
||||
shade_bar.value = value_bar.value
|
||||
else:
|
||||
shade_delay_timer.start()
|
||||
|
||||
|
||||
func set_max_value(max_value: int) -> void:
|
||||
value_bar.max_value = max_value
|
||||
shade_bar.max_value = max_value
|
||||
|
||||
if max_value == 0:
|
||||
value_bar.hide()
|
||||
shade_bar.hide()
|
||||
else:
|
||||
value_bar.show()
|
||||
shade_bar.show()
|
||||
|
||||
|
||||
func _on_shade_delay_timer_timeout() -> void:
|
||||
var value_delta := shade_bar.value - value_bar.value
|
||||
_tick_size = ceil(value_delta / TICK_COUNT)
|
||||
_target_value = value_bar.value
|
||||
shade_tick_timer.start()
|
||||
|
||||
|
||||
func _on_shade_tick_timer_timeout() -> void:
|
||||
shade_bar.value -= _tick_size
|
||||
if shade_bar.value <= _target_value:
|
||||
shade_bar.value = _target_value
|
||||
shade_tick_timer.stop()
|
||||
@@ -0,0 +1 @@
|
||||
uid://drwgq8fxaclvn
|
||||
@@ -0,0 +1,48 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://xbfxsiumbgkp"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://drwgq8fxaclvn" path="res://game/entities/health_system/health_bar_part.gd" id="1_nuv67"]
|
||||
|
||||
[node name="HealthBarPart" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
script = ExtResource("1_nuv67")
|
||||
|
||||
[node name="ShadeBar" type="TextureProgressBar" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -16.0
|
||||
offset_top = -1.0
|
||||
offset_right = 16.0
|
||||
offset_bottom = 2.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
pivot_offset = Vector2(16, 1)
|
||||
|
||||
[node name="ValueBar" type="TextureProgressBar" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -16.0
|
||||
offset_top = -1.0
|
||||
offset_right = 16.0
|
||||
offset_bottom = 2.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
pivot_offset = Vector2(16, 1)
|
||||
|
||||
[node name="ShadeDelayTimer" type="Timer" parent="."]
|
||||
wait_time = 0.5
|
||||
one_shot = true
|
||||
|
||||
[node name="ShadeTickTimer" type="Timer" parent="."]
|
||||
wait_time = 0.1
|
||||
|
||||
[connection signal="timeout" from="ShadeDelayTimer" to="." method="_on_shade_delay_timer_timeout"]
|
||||
[connection signal="timeout" from="ShadeTickTimer" to="." method="_on_shade_tick_timer_timeout"]
|
||||
@@ -0,0 +1,22 @@
|
||||
class_name HealthBar
|
||||
extends Control
|
||||
|
||||
|
||||
@export var health: Health
|
||||
|
||||
|
||||
@onready var hull_part : HealthBarPart = $HullPart
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not health: return
|
||||
|
||||
hull_part.set_max_value(health.max_hull)
|
||||
hull_part.set_value(health.hull)
|
||||
|
||||
health.hull_updated.connect(_on_hull_updated)
|
||||
|
||||
|
||||
func _on_hull_updated(value: int, max_value: int) -> void:
|
||||
hull_part.set_value(value)
|
||||
hull_part.set_max_value(max_value)
|
||||
@@ -0,0 +1 @@
|
||||
uid://be7k64p2kel8b
|
||||
@@ -0,0 +1,36 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://d2snum2pxc2ui"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://be7k64p2kel8b" path="res://game/entities/health_system/heath_bar.gd" id="1_bx561"]
|
||||
[ext_resource type="PackedScene" uid="uid://xbfxsiumbgkp" path="res://game/entities/health_system/health_bar_part.tscn" id="2_wb6me"]
|
||||
[ext_resource type="Texture2D" uid="uid://do586oblhwuc5" path="res://images/health.png" id="3_fogsl"]
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_sgr4k"]
|
||||
atlas = ExtResource("3_fogsl")
|
||||
region = Rect2(0, 6, 32, 3)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_wb6me"]
|
||||
atlas = ExtResource("3_fogsl")
|
||||
region = Rect2(0, 0, 32, 3)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_fogsl"]
|
||||
atlas = ExtResource("3_fogsl")
|
||||
region = Rect2(0, 3, 32, 3)
|
||||
|
||||
[node name="HeathBar" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
script = ExtResource("1_bx561")
|
||||
|
||||
[node name="Background" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = -16.0
|
||||
offset_top = -1.0
|
||||
offset_right = 16.0
|
||||
offset_bottom = 2.0
|
||||
pivot_offset = Vector2(16, 1)
|
||||
texture = SubResource("AtlasTexture_sgr4k")
|
||||
|
||||
[node name="HullPart" parent="." instance=ExtResource("2_wb6me")]
|
||||
layout_mode = 0
|
||||
texture_value = SubResource("AtlasTexture_wb6me")
|
||||
texture_shade = SubResource("AtlasTexture_fogsl")
|
||||
Reference in New Issue
Block a user