From 63d2a59042fb9d90a586ad85d8364de7c38aea8e Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Wed, 6 Nov 2024 22:35:04 +0100 Subject: next commit --- Towers/Components/AttackComponent.gd | 29 ++++------ Towers/Components/AttackComponent.tscn | 19 +++++++ Towers/Components/BurnComponent.gd | 5 -- Towers/Components/BurnComponent.tscn | 12 ++++ Towers/Components/FrostComponent.gd | 5 -- Towers/Components/FrostComponent.tscn | 12 ++++ Towers/Components/RangeComponent.gd | 33 ++++------- Towers/Components/RangeComponent.tscn | 22 +++++++ Towers/Components/TowerComponent.gd | 27 +++++---- Towers/Components/TowerComponent.tscn | 14 +++++ Towers/Tower.gd | 101 ++++----------------------------- Towers/Tower.tscn | 24 +------- 12 files changed, 129 insertions(+), 174 deletions(-) create mode 100644 Towers/Components/AttackComponent.tscn create mode 100644 Towers/Components/BurnComponent.tscn create mode 100644 Towers/Components/FrostComponent.tscn create mode 100644 Towers/Components/RangeComponent.tscn create mode 100644 Towers/Components/TowerComponent.tscn (limited to 'Towers') diff --git a/Towers/Components/AttackComponent.gd b/Towers/Components/AttackComponent.gd index c7660cf..0b09ac1 100644 --- a/Towers/Components/AttackComponent.gd +++ b/Towers/Components/AttackComponent.gd @@ -4,32 +4,33 @@ extends TowerComponent var power := 1 -var speed_base := 1.0 +var speed_base := 2.0 var speed := 1 -var shoot_cooldown := Timer.new() -var shoot_sound := AudioStreamPlayer2D.new() +@onready var shoot_cooldown := $ShootCooldown +@onready var shoot_sound := $ShootSound -@export var range_component: RangeTowerComponent: +var range_component: RangeTowerComponent: get(): return current_tower.components[ComponentType.Range] -func _init() -> void: - type = ComponentType.Attack - set_sprite(preload("res://Towers/Components/Assets/attack-component.png")) - +func _ready() -> void: update_power() - update_speed() level_changed.connect(update_power) + + update_speed() level_changed.connect(update_speed) func update_power(): - power = ceil(level / 2.0) + if level <= 2: + power = level + else: + power = 1 + max(1, level - ceil(level / 2.0)) func update_speed(): - speed = level - ceil(level / 2.0) + speed = max(1, ceil(level / 2.0)) shoot_cooldown.wait_time = speed_base / speed func update_range(): @@ -39,12 +40,6 @@ func update_range(): func on_add(tower: Tower): super.on_add(tower) - shoot_cooldown.one_shot = true - tower.add_child(shoot_cooldown) - - shoot_sound.stream = preload("res://Towers/Assets/shoot.ogg") - tower.add_child(shoot_sound) - update_range() range_component.range_changed.connect(update_range) diff --git a/Towers/Components/AttackComponent.tscn b/Towers/Components/AttackComponent.tscn new file mode 100644 index 0000000..2cad794 --- /dev/null +++ b/Towers/Components/AttackComponent.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://4nd1npteqvh3"] + +[ext_resource type="PackedScene" uid="uid://cly4agfoqhq2q" path="res://Towers/Components/TowerComponent.tscn" id="1_j2cqy"] +[ext_resource type="Script" path="res://Towers/Components/AttackComponent.gd" id="2_dbyck"] +[ext_resource type="Texture2D" uid="uid://gbknvb38euuq" path="res://Towers/Components/Assets/attack-component.png" id="2_vr0du"] +[ext_resource type="AudioStream" uid="uid://cpkwvp5llf7x6" path="res://Towers/Assets/shoot.ogg" id="4_ytht8"] + +[node name="AttackTowerComponent" instance=ExtResource("1_j2cqy")] +script = ExtResource("2_dbyck") +type = 1 + +[node name="Sprite" parent="." index="0"] +texture = ExtResource("2_vr0du") + +[node name="ShootCooldown" type="Timer" parent="." index="1"] +one_shot = true + +[node name="ShootSound" type="AudioStreamPlayer2D" parent="." index="2"] +stream = ExtResource("4_ytht8") diff --git a/Towers/Components/BurnComponent.gd b/Towers/Components/BurnComponent.gd index d708d4f..ddac88b 100644 --- a/Towers/Components/BurnComponent.gd +++ b/Towers/Components/BurnComponent.gd @@ -1,11 +1,6 @@ extends TowerComponent -func _init() -> void: - type = ComponentType.Burn - set_sprite(preload("res://Towers/Components/Assets/burn-component.png")) - - func on_shoot(target: Unit): var effect = preload("res://Effects/BurnEffect.tscn").instantiate() effect.level = level diff --git a/Towers/Components/BurnComponent.tscn b/Towers/Components/BurnComponent.tscn new file mode 100644 index 0000000..285cfa0 --- /dev/null +++ b/Towers/Components/BurnComponent.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=4 format=3 uid="uid://c0xtty8n0lwpr"] + +[ext_resource type="PackedScene" uid="uid://cly4agfoqhq2q" path="res://Towers/Components/TowerComponent.tscn" id="1_56lm4"] +[ext_resource type="Script" path="res://Towers/Components/BurnComponent.gd" id="2_nevgj"] +[ext_resource type="Texture2D" uid="uid://2djpswd6sgng" path="res://Towers/Components/Assets/burn-component.png" id="3_o6seh"] + +[node name="TowerComponent" instance=ExtResource("1_56lm4")] +script = ExtResource("2_nevgj") +type = 4 + +[node name="Sprite" parent="." index="0"] +texture = ExtResource("3_o6seh") diff --git a/Towers/Components/FrostComponent.gd b/Towers/Components/FrostComponent.gd index 2443b70..4d2b04c 100644 --- a/Towers/Components/FrostComponent.gd +++ b/Towers/Components/FrostComponent.gd @@ -1,11 +1,6 @@ extends TowerComponent -func _init() -> void: - type = ComponentType.Frost - set_sprite(preload("res://Towers/Components/Assets/frost-component.png")) - - func on_shoot(target: Unit): var effect = preload("res://Effects/SlowEffect.tscn").instantiate() effect.level = level diff --git a/Towers/Components/FrostComponent.tscn b/Towers/Components/FrostComponent.tscn new file mode 100644 index 0000000..976d3e8 --- /dev/null +++ b/Towers/Components/FrostComponent.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=4 format=3 uid="uid://b1opnngyr3de4"] + +[ext_resource type="PackedScene" uid="uid://cly4agfoqhq2q" path="res://Towers/Components/TowerComponent.tscn" id="1_8hes5"] +[ext_resource type="Script" path="res://Towers/Components/FrostComponent.gd" id="2_bsb0f"] +[ext_resource type="Texture2D" uid="uid://ba3dmlce1wv2p" path="res://Towers/Components/Assets/frost-component.png" id="3_qwp1n"] + +[node name="FrostTowerComponent" instance=ExtResource("1_8hes5")] +script = ExtResource("2_bsb0f") +type = 3 + +[node name="Sprite" parent="." index="0"] +texture = ExtResource("3_qwp1n") diff --git a/Towers/Components/RangeComponent.gd b/Towers/Components/RangeComponent.gd index a2f7ae7..74a6eeb 100644 --- a/Towers/Components/RangeComponent.gd +++ b/Towers/Components/RangeComponent.gd @@ -9,17 +9,14 @@ var range := 0: range = value range_changed.emit() -var area := Area2D.new() -var collision_shape := CollisionShape2D.new() -var shape := CircleShape2D.new() +@onready var area: Area2D = $Range +@onready var collision_shape := $Range/CollisionShape2D +@onready var shape: CircleShape2D = collision_shape.shape var units_in_range: Array[Unit] -func _init() -> void: - type = ComponentType.Range - set_sprite(preload("res://Towers/Components/Assets/range-component.png")) - +func _ready() -> void: update_range() level_changed.connect(update_range) @@ -34,19 +31,11 @@ func update_range(): func on_add(tower: Tower): super.on_add(tower) - area.set_collision_layer_value(1, false) - area.set_collision_mask_value(1, true) - - area.body_entered.connect(func(body: Node2D): - units_in_range.append(body) - ) - area.body_exited.connect(func(body: Node2D): - units_in_range.erase(body) - ) - area.position = tower.get_node("CenterAnchor").position - - collision_shape.shape = shape - area.add_child(collision_shape) - - tower.add_child(area) + + +func _on_range_body_entered(body: Node2D) -> void: + units_in_range.append(body) + +func _on_range_body_exited(body: Node2D) -> void: + units_in_range.erase(body) diff --git a/Towers/Components/RangeComponent.tscn b/Towers/Components/RangeComponent.tscn new file mode 100644 index 0000000..1047529 --- /dev/null +++ b/Towers/Components/RangeComponent.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=5 format=3 uid="uid://b0bdw5n6p5k8u"] + +[ext_resource type="PackedScene" uid="uid://cly4agfoqhq2q" path="res://Towers/Components/TowerComponent.tscn" id="1_738xf"] +[ext_resource type="Script" path="res://Towers/Components/RangeComponent.gd" id="2_4fk2a"] +[ext_resource type="Texture2D" uid="uid://dx07y4scyi5a1" path="res://Towers/Components/Assets/range-component.png" id="3_7nqma"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_q388v"] + +[node name="RangeTowerComponent" instance=ExtResource("1_738xf")] +script = ExtResource("2_4fk2a") + +[node name="Sprite" parent="." index="0"] +texture = ExtResource("3_7nqma") + +[node name="Range" type="Area2D" parent="." index="1"] +collision_layer = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Range" index="0"] +shape = SubResource("CircleShape2D_q388v") + +[connection signal="body_entered" from="Range" to="." method="_on_range_body_entered"] +[connection signal="body_exited" from="Range" to="." method="_on_range_body_exited"] diff --git a/Towers/Components/TowerComponent.gd b/Towers/Components/TowerComponent.gd index 7ca766a..30b1c44 100644 --- a/Towers/Components/TowerComponent.gd +++ b/Towers/Components/TowerComponent.gd @@ -1,8 +1,10 @@ class_name TowerComponent -extends Node +extends Node2D -var current_tower: Tower +var current_tower: Tower: + get(): + return get_parent() enum ComponentType { Range, @@ -13,8 +15,15 @@ enum ComponentType { Poison, } -var type: ComponentType -var sprite: TextureRect = TextureRect.new() +@export var type: ComponentType +var sprite: TextureRect: + get(): + @warning_ignore("shadowed_variable") + var sprite := $Sprite.duplicate() + sprite.name = get_type_name() + + return sprite + var id: String: get(): @@ -28,12 +37,8 @@ var level: int = 1: func set_sprite(texture: Texture2D): + sprite = get_node("Sprite") sprite.texture = texture - - sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST - #sprite.centered = false - sprite.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - #sprite.scale = Vector2(2, 2) sprite.name = get_type_name() @@ -57,8 +62,8 @@ func to_network_data() -> NetworkData: return data -func update_with_network_data(_data: NetworkData): - pass +func update_with_network_data(data: NetworkData): + level = data.level static func from_network_data(data: NetworkData) -> TowerComponent: var component = preload("res://Towers/Components/TowerComponent.gd").new() diff --git a/Towers/Components/TowerComponent.tscn b/Towers/Components/TowerComponent.tscn new file mode 100644 index 0000000..6b1d7b2 --- /dev/null +++ b/Towers/Components/TowerComponent.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3 uid="uid://cly4agfoqhq2q"] + +[ext_resource type="Script" path="res://Towers/Components/TowerComponent.gd" id="1_jb46t"] + +[node name="TowerComponent" type="Node2D"] +visible = false +script = ExtResource("1_jb46t") + +[node name="Sprite" type="TextureRect" parent="."] +texture_filter = 1 +offset_right = 40.0 +offset_bottom = 40.0 +stretch_mode = 5 +metadata/_edit_use_anchors_ = true diff --git a/Towers/Tower.gd b/Towers/Tower.gd index 1d856f3..34e12ae 100644 --- a/Towers/Tower.gd +++ b/Towers/Tower.gd @@ -40,10 +40,6 @@ var is_highlighted := false: is_highlighted = value queue_redraw() -#var mobs_in_range: Array = [] - -#var selection_area: Area2D - signal selection_group_id_changed(previous_id: String) @onready var selection_group_id := get_group_id(): set(value): @@ -54,20 +50,6 @@ signal selection_group_id_changed(previous_id: String) # rpc owner id @export var owner_id = 1 -#@export var attack_range: int = 32: - #set(value): - #attack_range = value - #$Range/CollisionShape2D.shape.radius = attack_range - #$SoundShoot.max_distance = attack_range * Client.current_stage.map.tile_set.tile_size.x - -#@export var attack_power: int = 1 - -#var attack_speed_base: float = 2.0 -#@export var attack_speed: int = 1: - #set(value): - #attack_speed = value - #%ShootCooldown.wait_time = attack_speed_base / attack_speed - signal components_changed @export var components: Dictionary @@ -79,7 +61,7 @@ func _init(): func _ready(): $AnimatedSprite2D.play() - for component in [RangeTowerComponent.new(), AttackTowerComponent.new()]: + for component in [preload("res://Towers/Components/RangeComponent.tscn").instantiate(), preload("res://Towers/Components/AttackComponent.tscn").instantiate()]: add_component(component) redraw_components() @@ -120,17 +102,6 @@ func _process(delta: float) -> void: for component in components.values(): if component.has_method("process"): component.process(delta) - - #if $ShootCooldown.is_stopped() and not mobs_in_range.is_empty(): - #shoot() - #$ShootCooldown.start() - - #if selection_area and is_instance_valid(selection_area): - #var bodies = selection_area.get_overlapping_bodies() - #if bodies.size() > 0: - #selection_area.queue_free() - #for body in bodies: - #Client.select_tower(body) func _on_input_event(_viewport: Node, event: InputEvent, _shape_idx: int): @@ -146,13 +117,6 @@ func _on_input_event(_viewport: Node, event: InputEvent, _shape_idx: int): Client.remove_tower(self) -#func _on_range_body_entered(body: Node2D) -> void: - #mobs_in_range.append(body) -# -#func _on_range_body_exited(body: Node2D) -> void: - #mobs_in_range.erase(body) - - func _on_selectable_area_hover_enter() -> void: is_hovered = true @@ -176,24 +140,15 @@ func _on_selectable_area_select_primary(event: InputEvent) -> void: func add_component(component: TowerComponent): components[component.type] = component + add_child(component) component.on_add(self) - var sprite = component.sprite + var sprite = component.sprite.duplicate() %ComponentsAnchor.add_child(sprite) redraw_components() components_changed.emit() -func remove_component(component: TowerComponent): - components.erase(component.type) - %ComponentsAnchor.remove_child(%ComponentsAnchor.get_node(NodePath(component.id))) - #for component in components: - #if component.name == component_name: - #components.erase(component) - #$ComponentsAnchor.remove_child($ComponentsAnchor.get_node(NodePath(component.name))) - #break - redraw_components() - components_changed.emit() func redraw_components(): var keys = components.keys() @@ -204,30 +159,6 @@ func redraw_components(): sprite.position.y = (idx + 1) * -16 -#func is_melee_range(): - #return attack_range <= (Client.current_stage.map.tile_set.tile_size.x * 2) - - -#func shoot(): - #var target = mobs_in_range[0] as Unit - # - #for component in components: - #if component.has_method("on_shoot"): - #component.on_shoot(target) - # - #shoot_fx.rpc() - # - #if is_melee_range(): - #target.set_hp(target.hp - 1) - #else: # TODO - #target.set_hp(target.hp - 1) -# -#@rpc("authority", "call_local") -#func shoot_fx(): - #$SoundShoot.play() - - - func get_region(): var collision_shape := $CollisionShape2D var shape = $CollisionShape2D.shape as RectangleShape2D @@ -241,10 +172,6 @@ func get_region(): func get_group_id() -> String: var string := "" - #string += str(attack_range) - #string += str(attack_power) - #string += str(attack_speed) - for component: TowerComponent in components.values(): string += component.id string += str(component.level) @@ -277,11 +204,11 @@ func to_network_data() -> NetworkData: data.owner_id = owner_id data.position = global_position - #data.attack_range = attack_range - #data.attack_power = attack_power - #data.attack_speed = attack_speed data.components = components.values().map(func(item: TowerComponent): - return inst_to_dict(item.to_network_data()) + var component_data = inst_to_dict(item.to_network_data()) + component_data["path"] = item.get_path() + + return component_data ) data.sprite_modulate = $AnimatedSprite2D.modulate @@ -292,14 +219,10 @@ func to_network_data() -> NetworkData: return data func update_with_network_data(data: NetworkData): - for component in components.duplicate(): - remove_component(component.id) - for component_data in data.components: - var component_network_data: TowerComponent.NetworkData = dict_to_inst(component_data) - var component = load("res://Towers/Components/" + component_network_data.name + "Component.gd").new() - component.level = component_network_data.level - add_component(component) + var component = get_node(component_data.path) as TowerComponent + component.update_with_network_data(dict_to_inst(component_data)) + redraw_components() static func from_network_data(data: NetworkData) -> Tower: var tower: Tower = preload("res://Towers/Tower.tscn").instantiate() @@ -308,10 +231,6 @@ static func from_network_data(data: NetworkData) -> Tower: tower.owner_id = data.owner_id tower.global_position = data.position - #tower.attack_range = data.attack_range - #tower.attack_power = data.attack_power - #tower.attack_speed = data.attack_speed - tower.get_node("AnimatedSprite2D").modulate = data.sprite_modulate tower.get_node("%ComponentsAnchor").modulate = data.components_anchor_modulate diff --git a/Towers/Tower.tscn b/Towers/Tower.tscn index 0bd4579..839917c 100644 --- a/Towers/Tower.tscn +++ b/Towers/Tower.tscn @@ -1,10 +1,9 @@ -[gd_scene load_steps=16 format=3 uid="uid://by1x56w21o165"] +[gd_scene load_steps=14 format=3 uid="uid://by1x56w21o165"] [ext_resource type="Script" path="res://Towers/Tower.gd" id="1_axo1d"] [ext_resource type="Texture2D" uid="uid://b1b18rd0tqbar" path="res://core_outdoor.png" id="1_mrep8"] [ext_resource type="PackedScene" uid="uid://cqktpc8c7ecn3" path="res://Game/Selection/SelectableArea.tscn" id="3_57d5u"] [ext_resource type="Texture2D" uid="uid://dujcs2ls3u6tj" path="res://Towers/Assets/spritesheet.png" id="3_brkps"] -[ext_resource type="AudioStream" uid="uid://cpkwvp5llf7x6" path="res://Towers/Assets/shoot.ogg" id="5_i05ow"] [sub_resource type="AtlasTexture" id="AtlasTexture_1ubf7"] atlas = ExtResource("3_brkps") @@ -59,8 +58,6 @@ animations = [{ [sub_resource type="RectangleShape2D" id="RectangleShape2D_atm5x"] size = Vector2(31, 31) -[sub_resource type="CircleShape2D" id="CircleShape2D_qa8kt"] - [sub_resource type="RectangleShape2D" id="RectangleShape2D_312i7"] size = Vector2(32, 32) @@ -91,19 +88,6 @@ centered = false position = Vector2(16, 16) shape = SubResource("RectangleShape2D_atm5x") -[node name="Range" type="Area2D" parent="."] -unique_name_in_owner = true -visible = false -collision_layer = 0 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Range"] -position = Vector2(16, 16) -shape = SubResource("CircleShape2D_qa8kt") - -[node name="ShootCooldown" type="Timer" parent="."] -unique_name_in_owner = true -one_shot = true - [node name="SelectableArea" parent="." instance=ExtResource("3_57d5u")] [node name="CollisionShape2D" type="CollisionShape2D" parent="SelectableArea"] @@ -125,14 +109,8 @@ position = Vector2(16, 29) [node name="CenterAnchor" type="Marker2D" parent="."] position = Vector2(16, 16) -[node name="SoundShoot" type="AudioStreamPlayer2D" parent="."] -visible = false -stream = ExtResource("5_i05ow") - [connection signal="input_event" from="." to="." method="_on_input_event"] [connection signal="tree_exiting" from="." to="." method="_on_tree_exiting"] -[connection signal="body_entered" from="Range" to="." method="_on_range_body_entered"] -[connection signal="body_exited" from="Range" to="." method="_on_range_body_exited"] [connection signal="hover_enter" from="SelectableArea" to="." method="_on_selectable_area_hover_enter"] [connection signal="hover_exit" from="SelectableArea" to="." method="_on_selectable_area_hover_exit"] [connection signal="select_primary" from="SelectableArea" to="." method="_on_selectable_area_select_primary"] -- cgit v1.2.3