Compose vessels from definitions and capabilities
This commit is contained in:
parent
0504b24d8d
commit
14081ad230
39 changed files with 705 additions and 386 deletions
47
VesselWeaponComponent.gd
Normal file
47
VesselWeaponComponent.gd
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
class_name VesselWeaponComponent
|
||||
extends Node
|
||||
|
||||
var capability_id: String = "weapon"
|
||||
var fire_range: float
|
||||
var fire_cooldown: float
|
||||
var projectile_damage: int
|
||||
var fire_timer: float = 0.0
|
||||
var projectile_scene: PackedScene = preload("res://Projectile.tscn")
|
||||
|
||||
|
||||
func apply_stats() -> void:
|
||||
var ship: Node = get_parent()
|
||||
var state: Node = ship.get_tree().root.get_node("GameState")
|
||||
fire_range = state.vessel_stat(ship.vessel_type, "fire_range")
|
||||
fire_cooldown = state.vessel_stat(ship.vessel_type, "fire_cooldown")
|
||||
projectile_damage = int(state.vessel_stat(ship.vessel_type, "damage"))
|
||||
|
||||
|
||||
func tick(delta: float) -> void:
|
||||
fire_timer -= delta
|
||||
if fire_timer > 0.0:
|
||||
return
|
||||
var ship: Node2D = get_parent()
|
||||
var target: Node2D = _find_nearest_enemy(ship)
|
||||
if target == null:
|
||||
fire_timer = 0.25
|
||||
return
|
||||
var projectile: Node2D = projectile_scene.instantiate()
|
||||
projectile.position = ship.position
|
||||
projectile.damage = projectile_damage
|
||||
ship.get_tree().root.add_child(projectile)
|
||||
projectile.launch(target.position - ship.position)
|
||||
fire_timer = fire_cooldown
|
||||
|
||||
|
||||
func _find_nearest_enemy(ship: Node2D) -> Node2D:
|
||||
var nearest: Node2D = null
|
||||
var best_distance: float = fire_range
|
||||
for enemy in ship.get_tree().get_nodes_in_group("enemies"):
|
||||
if not is_instance_valid(enemy):
|
||||
continue
|
||||
var distance: float = ship.position.distance_to(enemy.position)
|
||||
if distance <= best_distance:
|
||||
best_distance = distance
|
||||
nearest = enemy
|
||||
return nearest
|
||||
Loading…
Reference in a new issue