diff options
Diffstat (limited to 'Towers/Tower.gd')
-rw-r--r-- | Towers/Tower.gd | 120 |
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 |