summaryrefslogtreecommitdiff
path: root/Towers/Tower.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Towers/Tower.gd')
-rw-r--r--Towers/Tower.gd120
1 files changed, 114 insertions, 6 deletions
diff --git a/Towers/Tower.gd b/Towers/Tower.gd
index 54687fd..4262af1 100644
--- a/Towers/Tower.gd
+++ b/Towers/Tower.gd
@@ -6,6 +6,7 @@ signal selected
signal deselected
static var selected_towers: Array[Tower]
+static var hovered_tower: Tower
var is_selected = false :
set(value):
@@ -16,12 +17,19 @@ var is_selected = false :
else:
Tower.selected_towers.erase(self)
deselected.emit()
- Client.stage.hud.tower.text = ""
is_selected = value
queue_redraw()
+ toggle_ui()
var is_hovered = false :
set(value):
+ if value:
+ hovered_tower = self
+ Input.set_default_cursor_shape(Input.CURSOR_POINTING_HAND)
+ else:
+ if hovered_tower == self:
+ hovered_tower = null
+ Input.set_default_cursor_shape(Input.CURSOR_ARROW)
is_hovered = value
queue_redraw()
@@ -30,16 +38,26 @@ var mobs_in_range: Array = []
#var selection_area: Area2D
# rpc owner id
-var owner_id = 1
+@export var owner_id = 1
@export var attack_range: int = 32
@export var attack_power: int = 1
@export var attack_speed: int = 1
+@export var components: Array[TowerComponent] = []
+
func _ready():
$Range/CollisionShape2D.shape.radius = attack_range
$ShootCooldown.wait_time = attack_speed
+
+ toggle_ui()
+
+ #for component in [
+ #preload("res://Towers/Components/FrostComponent.gd").new(),
+ #preload("res://Towers/Components/BurnComponent.gd").new(),
+ #]:
+ #add_component(component)
func _draw():
@@ -122,26 +140,50 @@ func _on_selectable_area_select(event: InputEvent) -> void:
+func add_component(component: TowerComponent):
+ components.append(component)
+ var sprite = component.sprite
+ $ComponentsAnchor.add_child(sprite)
+ redraw_components()
+
+func remove_component(component_name: String):
+ for component in components:
+ if component.name == component_name:
+ components.erase(component)
+ $ComponentsAnchor.remove_child($ComponentsAnchor.get_node(NodePath(component.name)))
+ break
+ redraw_components()
+
+func redraw_components():
+ for idx in range(components.size()):
+ var component = components[idx]
+ var sprite = $ComponentsAnchor.get_node(NodePath(component.name))
+ sprite.position.y = (idx + 1) * -16
+
+
func is_melee_range():
return attack_range <= (Client.stage.map.tile_set.tile_size.x * 2)
func shoot():
- if get_multiplayer_authority() != multiplayer.get_unique_id():
+ if not multiplayer.is_server():
# TODO: do shoot animation, but don't subtract hp
return
var target = mobs_in_range[0] as Unit
+ for component in components:
+ if component.has_method("on_shoot"):
+ component.on_shoot(target)
+
if is_melee_range():
target.set_hp(target.hp - 1)
else: # TODO
target.set_hp(target.hp - 1)
-func show_ui():
- # todo: show ui
- pass
+func toggle_ui():
+ $HUD.visible = is_selected
func get_region():
@@ -163,4 +205,70 @@ func get_rpc_properties() -> Dictionary:
"name": null,
"global_position": null,
"owner_id": null,
+ "attack_range": null,
}
+
+
+func _on_h_box_container_gui_input(event: InputEvent) -> void:
+ if event.is_action_pressed("select"):
+ get_viewport().set_input_as_handled()
+
+ for tower in selected_towers:
+ var found = false
+ for idx in range(tower.components.size()):
+ var component = tower.components[idx]
+ if component.name == "Frost":
+ found = true
+ tower.remove_component(component.name)
+ break
+
+ if not found:
+ tower.add_component(preload("res://Towers/Components/FrostComponent.gd").new())
+
+ var data = {"components": []}
+ for c in tower.components:
+ data["components"].append(c.name)
+ Client.update_tower(tower, data)
+
+
+func _on_h_box_container_2_gui_input(event: InputEvent) -> void:
+ if event.is_action_pressed("select"):
+ get_viewport().set_input_as_handled()
+
+ for tower in selected_towers:
+ var found = false
+ for idx in range(tower.components.size()):
+ var component = tower.components[idx]
+ if component.name == "Burn":
+ found = true
+ tower.remove_component(component.name)
+ break
+
+ if not found:
+ tower.add_component(preload("res://Towers/Components/BurnComponent.gd").new())
+
+ var data = {"components": []}
+ for c in tower.components:
+ data["components"].append(c.name)
+ Client.update_tower(tower, data)
+
+
+class NetworkData extends Resource:
+ var name: String
+ var position: Vector2
+
+func to_network_data() -> NetworkData:
+ var data = NetworkData.new()
+
+ data.name = name
+ data.position = global_position
+
+ return data
+
+static func from_network_data(data: NetworkData) -> Tower:
+ var tower: Tower = preload("res://Towers/Tower.tscn").instantiate()
+
+ tower.name = data.name
+ tower.global_position = data.position
+
+ return tower