Refactor recent gameplay systems after code review
This commit is contained in:
parent
3f3a22227d
commit
d68f4d4f88
57 changed files with 530 additions and 572 deletions
84
VesselCooldownFillComponent.gd
Normal file
84
VesselCooldownFillComponent.gd
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
class_name VesselCooldownFillComponent
|
||||
extends Node2D
|
||||
|
||||
# Shared per-vessel cooldown state and hull-fill feedback for abilities that
|
||||
# grant one independently recharging shot per ship.
|
||||
|
||||
var cooldown_duration: float = 1.0
|
||||
var cooldown_left: float = 0.0
|
||||
|
||||
|
||||
func setup() -> void:
|
||||
show_behind_parent = true
|
||||
queue_redraw()
|
||||
|
||||
|
||||
func is_ready() -> bool:
|
||||
return cooldown_left <= 0.0
|
||||
|
||||
|
||||
func _begin_cooldown(duration: float) -> bool:
|
||||
if not is_ready():
|
||||
return false
|
||||
cooldown_duration = maxf(duration, 0.001)
|
||||
cooldown_left = cooldown_duration
|
||||
queue_redraw()
|
||||
return true
|
||||
|
||||
|
||||
func tick(delta: float) -> void:
|
||||
if cooldown_left <= 0.0:
|
||||
return
|
||||
cooldown_left = maxf(cooldown_left - delta, 0.0)
|
||||
queue_redraw()
|
||||
|
||||
|
||||
func cooldown_progress() -> float:
|
||||
return 1.0 - cooldown_left / maxf(cooldown_duration, 0.001)
|
||||
|
||||
|
||||
func _filled_hull(points: PackedVector2Array, progress: float) -> PackedVector2Array:
|
||||
if points.size() < 3 or progress <= 0.001:
|
||||
return PackedVector2Array()
|
||||
if progress >= 0.999:
|
||||
return points.duplicate()
|
||||
var top: float = INF
|
||||
var bottom: float = -INF
|
||||
for point in points:
|
||||
top = minf(top, point.y)
|
||||
bottom = maxf(bottom, point.y)
|
||||
var fill_y: float = lerpf(bottom, top, clampf(progress, 0.0, 1.0))
|
||||
var clipped := PackedVector2Array()
|
||||
var previous: Vector2 = points[-1]
|
||||
var previous_inside: bool = previous.y >= fill_y
|
||||
for current in points:
|
||||
var current_inside: bool = current.y >= fill_y
|
||||
if current_inside != previous_inside:
|
||||
var amount: float = (fill_y - previous.y) / (current.y - previous.y)
|
||||
clipped.append(previous.lerp(current, amount))
|
||||
if current_inside:
|
||||
clipped.append(current)
|
||||
previous = current
|
||||
previous_inside = current_inside
|
||||
return clipped
|
||||
|
||||
|
||||
func _draw() -> void:
|
||||
var ship: Node = get_parent()
|
||||
if ship == null or ship.definition == null:
|
||||
return
|
||||
var hull: PackedVector2Array = ship.definition.hull_points
|
||||
var ready_color: Color = _ready_color()
|
||||
if is_ready():
|
||||
draw_colored_polygon(hull, Color(ready_color, 0.42))
|
||||
NeonDraw.draw_glowing_polygon(self, hull, ready_color, 0.75,
|
||||
ship.core_color, 0.75)
|
||||
return
|
||||
draw_colored_polygon(hull, Color(_cooling_color(), 0.58))
|
||||
var filled: PackedVector2Array = _filled_hull(hull, cooldown_progress())
|
||||
if filled.size() >= 3:
|
||||
draw_colored_polygon(filled, Color(ready_color, 0.68))
|
||||
|
||||
|
||||
func _ready_color() -> Color: return Color.WHITE
|
||||
func _cooling_color() -> Color: return Color(0.2, 0.2, 0.2)
|
||||
Loading…
Reference in a new issue