diff --git a/objects/entities/brick.tscn b/objects/entities/brick.tscn index 5b46066..af57a9c 100644 --- a/objects/entities/brick.tscn +++ b/objects/entities/brick.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://bymro4t7angv5"] +[gd_scene load_steps=6 format=3 uid="uid://bymro4t7angv5"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_1c3jb"] -[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_i6t5k"] +[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_i6t5k"] [ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_8xipx"] +[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="4_rdtjq"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"] size = Vector2(16, 10) @@ -20,12 +21,11 @@ hframes = 12 vframes = 12 frame = 80 -[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")] +[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "timer")] script = ExtResource("2_i6t5k") root = NodePath("..") speed = 320.0 area2d = NodePath("..") -visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") life_time = 2.0 timer = NodePath("../Timer") @@ -38,3 +38,8 @@ scale = Vector2(0.8, 0.5) [node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")] script = ExtResource("3_8xipx") area2d = NodePath("..") + +[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")] +script = ExtResource("4_rdtjq") +visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") +root = NodePath("..") diff --git a/objects/entities/brick_player.tscn b/objects/entities/brick_player.tscn index a3fc701..9e847c1 100644 --- a/objects/entities/brick_player.tscn +++ b/objects/entities/brick_player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=30 format=3 uid="uid://bqi5s710xb1ju"] +[gd_scene load_steps=32 format=3 uid="uid://bqi5s710xb1ju"] [ext_resource type="Script" uid="uid://ccuddyoakg04u" path="res://scripts/player.gd" id="1_8j4h4"] [ext_resource type="Texture2D" uid="uid://b7gp0gqvkv8j4" path="res://sprites/MrBrick_base.png" id="2_bc55y"] @@ -26,6 +26,8 @@ [ext_resource type="Script" uid="uid://bya240e627ti6" path="res://scripts/resources/skill_data.gd" id="21_d0oiv"] [ext_resource type="Resource" uid="uid://d3bjre2etov1n" path="res://resources/skills/magnetic.tres" id="22_vnsgd"] [ext_resource type="Script" uid="uid://bjsyeo1n7bsri" path="res://scripts/components/skill_unlocker_component.gd" id="23_qsv2c"] +[ext_resource type="Script" uid="uid://c6fclevp3peuo" path="res://scripts/components/charge_throw_component.gd" id="27_h8c1m"] +[ext_resource type="PackedScene" uid="uid://bg76mtpcmfm2j" path="res://objects/ui/charging_bar_layer.tscn" id="28_3f5nm"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_hdsg1"] size = Vector2(16, 31) @@ -157,5 +159,16 @@ stream = ExtResource("19_7anly") [node name="sfx_heal" type="AudioStreamPlayer2D" parent="."] stream = ExtResource("20_bptj5") +[node name="ChargeThrowComponent" type="Node" parent="."] +script = ExtResource("27_h8c1m") +metadata/_custom_type_script = "uid://c6fclevp3peuo" + +[node name="ChargingBarLayer" parent="." node_paths=PackedStringArray("charge_throw_component") instance=ExtResource("28_3f5nm")] +offset_left = -17.0 +offset_top = -30.0 +offset_right = 23.0 +offset_bottom = -20.0 +charge_throw_component = NodePath("../ChargeThrowComponent") + [connection signal="on_death" from="HealthComponent" to="PlayerDeathComponent" method="_on_health_component_on_death"] [connection signal="on_health_change" from="HealthComponent" to="KnockbackComponent" method="_on_health_component_on_health_change"] diff --git a/objects/entities/bullet.tscn b/objects/entities/bullet.tscn index 03e6349..3003a9b 100644 --- a/objects/entities/bullet.tscn +++ b/objects/entities/bullet.tscn @@ -1,8 +1,12 @@ -[gd_scene load_steps=5 format=3 uid="uid://bhc7y4xugu4q7"] +[gd_scene load_steps=9 format=3 uid="uid://bhc7y4xugu4q7"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_w543f"] [ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="2_ll0xw"] -[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="3_keogl"] +[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="3_keogl"] +[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="4_lqg4f"] +[ext_resource type="Script" uid="uid://bvsgg8lu0a8m6" path="res://scripts/components/lifetime_component.gd" id="5_qsc5m"] +[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="6_6th6w"] +[ext_resource type="Script" uid="uid://cvcnfrr1udco5" path="res://scripts/components/straight_motion_component.gd" id="7_e0mqp"] [sub_resource type="CircleShape2D" id="CircleShape2D_txsw8"] radius = 4.0 @@ -29,13 +33,34 @@ scale = Vector2(0.4, 0.4) script = ExtResource("2_ll0xw") area2d = NodePath("..") -[node name="BulletComponent" type="Node2D" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")] -script = ExtResource("3_keogl") -root = NodePath("..") -speed = 120.0 -area2d = NodePath("..") +[node name="Timer" type="Timer" parent="."] +wait_time = 5.0 +autostart = true + +[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")] +script = ExtResource("4_lqg4f") visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") +root = NodePath("..") + +[node name="LifetimeComponent" type="Node" parent="." node_paths=PackedStringArray("root", "timer")] +script = ExtResource("5_qsc5m") +root = NodePath("..") +life_time = 10.0 timer = NodePath("../Timer") -[node name="Timer" type="Timer" parent="."] -autostart = true +[node name="LaunchComponent" type="Node2D" parent="." node_paths=PackedStringArray("root")] +script = ExtResource("6_6th6w") +root = NodePath("..") +speed = 120.0 +metadata/_custom_type_script = "uid://873un8agkyja" + +[node name="StraightMotionComponent" type="Node" parent="." node_paths=PackedStringArray("root", "launch_component")] +script = ExtResource("7_e0mqp") +root = NodePath("..") +launch_component = NodePath("../LaunchComponent") + +[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d")] +script = ExtResource("3_keogl") +root = NodePath("..") +area2d = NodePath("..") +metadata/_custom_type_script = "uid://cdnwrn8v05qhi" diff --git a/objects/entities/exploding_brick.tscn b/objects/entities/exploding_brick.tscn index 36d1002..9d1d5c3 100644 --- a/objects/entities/exploding_brick.tscn +++ b/objects/entities/exploding_brick.tscn @@ -1,10 +1,14 @@ -[gd_scene load_steps=8 format=3 uid="uid://5surx230gfw3"] +[gd_scene load_steps=13 format=3 uid="uid://5surx230gfw3"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_rcgxf"] -[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_1i2y5"] [ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_y0uai"] [ext_resource type="Script" uid="uid://beg4dk7d5pvhp" path="res://scripts/components/explosive_component.gd" id="4_8lw0n"] [ext_resource type="PackedScene" uid="uid://dyp4i4ru2j2jh" path="res://objects/fxs/explosion_fx.tscn" id="5_6oopj"] +[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="6_5jrjx"] +[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="7_a2b5x"] +[ext_resource type="Script" uid="uid://bvsgg8lu0a8m6" path="res://scripts/components/lifetime_component.gd" id="7_nqeob"] +[ext_resource type="Script" uid="uid://c2gbumw4x4t1v" path="res://scripts/components/gravity_motion_component.gd" id="8_4ly8b"] +[ext_resource type="Script" uid="uid://ciowd622nk0i7" path="res://scripts/components/chargable_component.gd" id="9_a2b5x"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"] size = Vector2(16, 10) @@ -12,9 +16,12 @@ size = Vector2(16, 10) [sub_resource type="CircleShape2D" id="CircleShape2D_e6vaq"] radius = 32.0 -[node name="Brick" type="Area2D"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_nqeob"] +size = Vector2(16, 10) + +[node name="ExplosiveBrick" type="CharacterBody2D"] collision_layer = 16 -collision_mask = 9 +collision_mask = 8 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_ar0xf") @@ -25,40 +32,63 @@ hframes = 12 vframes = 12 frame = 80 -[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")] -script = ExtResource("2_1i2y5") -root = NodePath("..") -speed = 120.0 -area2d = NodePath("..") -visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") -life_time = 2.0 -timer = NodePath("../Timer") - [node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."] position = Vector2(0, 2.38419e-07) scale = Vector2(0.8, 0.5) [node name="Timer" type="Timer" parent="."] -[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")] +[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d", "damage_timer")] script = ExtResource("3_y0uai") damage = 5.0 -area2d = NodePath("..") +area2d = NodePath("../Explosion area") +damage_timer = NodePath("../Timer") [node name="ExplosiveComponent" type="Node" parent="." node_paths=PackedStringArray("root", "damage", "area2d", "explosion_area2d")] script = ExtResource("4_8lw0n") root = NodePath("..") damage = NodePath("../DamageComponent") -area2d = NodePath("..") +area2d = NodePath("../BulletArea") explosion_area2d = NodePath("../Explosion area") explosion_effect = ExtResource("5_6oopj") [node name="Explosion area" type="Area2D" parent="."] collision_layer = 0 -collision_mask = 9 +collision_mask = 8 [node name="CollisionShape2D" type="CollisionShape2D" parent="Explosion area"] shape = SubResource("CircleShape2D_e6vaq") +debug_color = Color(0.919034, 6.36289e-05, 0.69998, 0.42) [node name="ExplosionFX" parent="." instance=ExtResource("5_6oopj")] randomness = 0.24 + +[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")] +script = ExtResource("6_5jrjx") +visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") +root = NodePath("..") + +[node name="LifetimeComponent" type="Node" parent="." node_paths=PackedStringArray("root", "timer")] +script = ExtResource("7_nqeob") +root = NodePath("..") +timer = NodePath("../Timer") + +[node name="LaunchComponent" type="Node2D" parent="." node_paths=PackedStringArray("root")] +script = ExtResource("7_a2b5x") +root = NodePath("..") +speed = 240.0 +metadata/_custom_type_script = "uid://873un8agkyja" + +[node name="GravityMotionComponent" type="Node2D" parent="." node_paths=PackedStringArray("character_body", "launch_component")] +script = ExtResource("8_4ly8b") +character_body = NodePath("..") +launch_component = NodePath("../LaunchComponent") + +[node name="BulletArea" type="Area2D" parent="."] +collision_layer = 16 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="BulletArea"] +shape = SubResource("RectangleShape2D_nqeob") + +[node name="ChargableComponent" type="Node" parent="."] +script = ExtResource("9_a2b5x") diff --git a/objects/entities/fire_brick.tscn b/objects/entities/fire_brick.tscn index 2d174b0..979b6c5 100644 --- a/objects/entities/fire_brick.tscn +++ b/objects/entities/fire_brick.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://daau4j5hbklk0"] +[gd_scene load_steps=8 format=3 uid="uid://daau4j5hbklk0"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_52l28"] -[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_hjcob"] +[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_hjcob"] [ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_sog2h"] [ext_resource type="Resource" uid="uid://obodgnkhxuhe" path="res://resources/status_effect/fire.tres" id="4_xx5l4"] [ext_resource type="Script" uid="uid://d3brcje121krs" path="res://scripts/components/effect_inflictor_component.gd" id="5_ofrqk"] +[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="6_64yur"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"] size = Vector2(16, 10) @@ -22,12 +23,11 @@ hframes = 12 vframes = 12 frame = 80 -[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")] +[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "timer")] script = ExtResource("2_hjcob") root = NodePath("..") speed = 330.0 area2d = NodePath("..") -visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") life_time = 2.0 timer = NodePath("../Timer") @@ -46,3 +46,8 @@ status_effect_data = ExtResource("4_xx5l4") [node name="EffectInflictorComponent" type="Node" parent="." node_paths=PackedStringArray("damage")] script = ExtResource("5_ofrqk") damage = NodePath("../DamageComponent") + +[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")] +script = ExtResource("6_64yur") +visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") +root = NodePath("..") diff --git a/objects/entities/ice_brick.tscn b/objects/entities/ice_brick.tscn index 1410237..486da1c 100644 --- a/objects/entities/ice_brick.tscn +++ b/objects/entities/ice_brick.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://bcmx07k12gcsc"] +[gd_scene load_steps=8 format=3 uid="uid://bcmx07k12gcsc"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_xusxl"] -[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_ilnf5"] +[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_ilnf5"] [ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_3yf4g"] [ext_resource type="Resource" uid="uid://02l4nbnf2aft" path="res://resources/status_effect/ice.tres" id="4_da7hn"] [ext_resource type="Script" uid="uid://d3brcje121krs" path="res://scripts/components/effect_inflictor_component.gd" id="5_x7vqb"] +[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="6_7tdxt"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"] size = Vector2(16, 10) @@ -22,12 +23,11 @@ hframes = 12 vframes = 12 frame = 80 -[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")] +[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "timer")] script = ExtResource("2_ilnf5") root = NodePath("..") speed = 250.0 area2d = NodePath("..") -visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") life_time = 2.0 timer = NodePath("../Timer") @@ -46,3 +46,8 @@ status_effect_data = ExtResource("4_da7hn") [node name="EffectInflictorComponent" type="Node" parent="." node_paths=PackedStringArray("damage")] script = ExtResource("5_x7vqb") damage = NodePath("../DamageComponent") + +[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")] +script = ExtResource("6_7tdxt") +visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") +root = NodePath("..") diff --git a/objects/ui/charging_bar_layer.tscn b/objects/ui/charging_bar_layer.tscn new file mode 100644 index 0000000..9e2c4f7 --- /dev/null +++ b/objects/ui/charging_bar_layer.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://bg76mtpcmfm2j"] + +[ext_resource type="Script" uid="uid://q32rtephu1t1" path="res://scripts/ui/charge_progress_bar.gd" id="1_014ut"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_arbva"] +bg_color = Color(0, 0, 0, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_014ut"] +bg_color = Color(0.921569, 0.827451, 0.12549, 1) + +[node name="ProgressBar" type="ProgressBar" node_paths=PackedStringArray("progress_bar")] +offset_right = 40.0 +offset_bottom = 10.0 +theme_override_styles/background = SubResource("StyleBoxFlat_arbva") +theme_override_styles/fill = SubResource("StyleBoxFlat_014ut") +script = ExtResource("1_014ut") +progress_bar = NodePath(".") diff --git a/resources/skills/brick_throw.tres b/resources/skills/brick_throw.tres index d99ccef..a295e1b 100644 --- a/resources/skills/brick_throw.tres +++ b/resources/skills/brick_throw.tres @@ -9,6 +9,7 @@ name = "Brick power" description = "Allows you to throw bricks at enemies" node = ExtResource("1_5gnea") config = { +"charge_throw_component": NodePath("ChargeThrowComponent"), "player_controller": NodePath("."), "timer": NodePath("ThrowTimer") } diff --git a/resources/skills/explosive_brick.tres b/resources/skills/explosive_brick.tres index 177d8ad..6c6a377 100644 --- a/resources/skills/explosive_brick.tres +++ b/resources/skills/explosive_brick.tres @@ -11,6 +11,7 @@ description = "Allows you to throw explosive bricks at enemies" node = ExtResource("2_e0o8w") config = { "brick_scene": ExtResource("1_6pfoa"), +"charge_throw_component": NodePath("./ChargeThrowComponent"), "player_controller": NodePath("."), "timer": NodePath("ThrowTimer") } diff --git a/scripts/components/brick_throw.gd b/scripts/components/brick_throw.gd index 3b396e1..ae5af7e 100644 --- a/scripts/components/brick_throw.gd +++ b/scripts/components/brick_throw.gd @@ -5,35 +5,50 @@ extends Node @export var fire_rate: float = 1.0 @export var player_controller: PlayerController @export var timer: Timer +@export var charge_throw_component: ChargeThrowComponent var can_throw: bool = true + func _ready() -> void: setup_timer() can_throw = true - - + + func _input(event: InputEvent) -> void: - if event.is_action_pressed("attack") and can_throw: - throw_brick() - + if event.is_action_pressed("attack") and can_throw and charge_throw_component: + charge_throw_component.start_charging() + + if event.is_action_released("attack") and can_throw and charge_throw_component: + var power_multiplier: float = charge_throw_component.stop_charging() + print("Power Multiplier: ", power_multiplier) + throw_brick(power_multiplier) + + func setup_timer() -> void: timer.wait_time = fire_rate timer.one_shot = false timer.autostart = false timer.timeout.connect(on_timer_timeout) - + func on_timer_timeout() -> void: can_throw = true - - -func throw_brick() -> void: + + +func throw_brick(power_multiplier: float = 1.0) -> void: var brick_instance: Node2D = brick_scene.instantiate() - var brick: BulletComponent = brick_instance.get_node("BulletComponent") - brick_instance.position = player_controller.position - brick.direction = player_controller.last_direction + + var launch_component := brick_instance.get_node_or_null("LaunchComponent") as LaunchComponent + var chargable_component := brick_instance.get_node_or_null("ChargableComponent") as ChargableComponent + if launch_component: + launch_component.initial_direction = player_controller.last_direction + launch_component.spawn_position = player_controller.global_position + launch_component.spawn_rotation = player_controller.rotation + launch_component.speed *= power_multiplier if chargable_component else 1.0 + + brick_instance.global_position = player_controller.global_position get_tree().current_scene.add_child(brick_instance) - + can_throw = false timer.start() diff --git a/scripts/components/bullet.gd b/scripts/components/bullet.gd deleted file mode 100644 index cab74db..0000000 --- a/scripts/components/bullet.gd +++ /dev/null @@ -1,40 +0,0 @@ -class_name BulletComponent -extends Node - -@export var root: Node2D -@export var direction: Vector2 = Vector2.RIGHT -@export var speed: float = 10.0 -@export var area2d: Area2D -@export var visibility_notifier: VisibleOnScreenNotifier2D -@export var life_time: float = 5.0 -@export var timer: Timer - - -func _ready() -> void: - root = get_parent() - visibility_notifier.screen_exited.connect(_on_screen_exited) - area2d.body_entered.connect(on_area2d_body_entered) - area2d.area_entered.connect(on_area2d_area_entered) - - timer.wait_time = life_time - timer.timeout.connect(on_timer_timeout) - - -func _physics_process(delta: float) -> void: - root.position += direction * speed * delta - - -func _on_screen_exited() -> void: - root.queue_free() - - -func on_area2d_body_entered(_body: Node2D) -> void: - root.queue_free() - - -func on_area2d_area_entered(_area: Area2D) -> void: - root.queue_free() - - -func on_timer_timeout() -> void: - root.queue_free() \ No newline at end of file diff --git a/scripts/components/bullet.gd.uid b/scripts/components/bullet.gd.uid deleted file mode 100644 index 824c57e..0000000 --- a/scripts/components/bullet.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bh2vrkdbrtpin diff --git a/scripts/components/bullet_component.gd b/scripts/components/bullet_component.gd new file mode 100644 index 0000000..076052b --- /dev/null +++ b/scripts/components/bullet_component.gd @@ -0,0 +1,18 @@ +class_name BulletComponent +extends Node + +@export var root: Node2D +@export var area2d: Area2D + + +func _ready() -> void: + area2d.body_entered.connect(on_area2d_body_entered) + area2d.area_entered.connect(on_area2d_area_entered) + + +func on_area2d_body_entered(_body: Node2D) -> void: + root.queue_free() + + +func on_area2d_area_entered(_area: Area2D) -> void: + root.queue_free() diff --git a/scripts/components/bullet_component.gd.uid b/scripts/components/bullet_component.gd.uid new file mode 100644 index 0000000..e5986bb --- /dev/null +++ b/scripts/components/bullet_component.gd.uid @@ -0,0 +1 @@ +uid://cdnwrn8v05qhi diff --git a/scripts/components/chargable_component.gd b/scripts/components/chargable_component.gd new file mode 100644 index 0000000..97858f1 --- /dev/null +++ b/scripts/components/chargable_component.gd @@ -0,0 +1,2 @@ +class_name ChargableComponent +extends Node \ No newline at end of file diff --git a/scripts/components/chargable_component.gd.uid b/scripts/components/chargable_component.gd.uid new file mode 100644 index 0000000..7e6aa7c --- /dev/null +++ b/scripts/components/chargable_component.gd.uid @@ -0,0 +1 @@ +uid://ciowd622nk0i7 diff --git a/scripts/components/charge_throw_component.gd b/scripts/components/charge_throw_component.gd new file mode 100644 index 0000000..ff49b0a --- /dev/null +++ b/scripts/components/charge_throw_component.gd @@ -0,0 +1,45 @@ +class_name ChargeThrowComponent +extends Node + +@export var min_power: float = 0.5 +@export var max_power: float = 2.0 +@export var max_charge_time: float = 1.5 + +var charge_start_time: float = 0.0 +var is_charging: bool = false +signal charge_started +signal charge_updated(charge_ratio: float) +signal charge_stopped + + +func _process(_delta: float) -> void: + if not is_charging: + return + + var charge_ratio := get_charge_ratio() + charge_updated.emit(charge_ratio) + + +func start_charging() -> void: + is_charging = true + charge_start_time = Time.get_ticks_msec() / 1000.0 + charge_started.emit() + + +func get_charge_ratio() -> float: + if not is_charging: + return 0.0 + + var held_time := (Time.get_ticks_msec() / 1000.0) - charge_start_time + var t = clamp(held_time / max_charge_time, 0.0, 1.0) + + return lerp(min_power, max_power, t) + + +func stop_charging() -> float: + is_charging = false + var held_time := (Time.get_ticks_msec() / 1000.0) - charge_start_time + var t = clamp(held_time / max_charge_time, 0.0, 1.0) + charge_start_time = 0.0 + charge_stopped.emit() + return lerp(min_power, max_power, t) \ No newline at end of file diff --git a/scripts/components/charge_throw_component.gd.uid b/scripts/components/charge_throw_component.gd.uid new file mode 100644 index 0000000..07b7876 --- /dev/null +++ b/scripts/components/charge_throw_component.gd.uid @@ -0,0 +1 @@ +uid://c6fclevp3peuo diff --git a/scripts/components/gravity_motion_component.gd b/scripts/components/gravity_motion_component.gd new file mode 100644 index 0000000..d01e1ba --- /dev/null +++ b/scripts/components/gravity_motion_component.gd @@ -0,0 +1,30 @@ +class_name GravityMotionComponent +extends Node2D + +@export var character_body: CharacterBody2D +@export var launch_component: LaunchComponent +@export var gravity: Vector2 = Vector2(0, 980.0) +@export var target_direction: Vector2 = Vector2(1.0, -1.0) + +var velocity: Vector2 = Vector2.ZERO + + +func _ready() -> void: + if not launch_component: + return + var direction := target_direction if launch_component.initial_direction.x > 0 else Vector2(-target_direction.x, target_direction.y) + direction = direction.normalized() + velocity = direction * launch_component.speed + + +func _physics_process(delta: float) -> void: + if not character_body: + return + + velocity += gravity * delta + character_body.velocity = velocity + + character_body.move_and_slide() + + if velocity.length_squared() > 0.01: + character_body.rotation = velocity.angle() \ No newline at end of file diff --git a/scripts/components/gravity_motion_component.gd.uid b/scripts/components/gravity_motion_component.gd.uid new file mode 100644 index 0000000..fcf4f44 --- /dev/null +++ b/scripts/components/gravity_motion_component.gd.uid @@ -0,0 +1 @@ +uid://c2gbumw4x4t1v diff --git a/scripts/components/launch_component.gd b/scripts/components/launch_component.gd new file mode 100644 index 0000000..9a936ff --- /dev/null +++ b/scripts/components/launch_component.gd @@ -0,0 +1,17 @@ +class_name LaunchComponent +extends Node2D + +@export var root: Node2D +@export var initial_direction: Vector2 = Vector2.RIGHT +@export var speed: float = 16.0 +@export var spawn_position: Vector2 = Vector2.ZERO +@export var spawn_rotation: float = 0.0 + + +func _ready() -> void: + root.global_position = spawn_position + root.global_rotation = spawn_rotation + + +func get_initial_velocity() -> Vector2: + return initial_direction.normalized() * speed diff --git a/scripts/components/launch_component.gd.uid b/scripts/components/launch_component.gd.uid new file mode 100644 index 0000000..e4dd57e --- /dev/null +++ b/scripts/components/launch_component.gd.uid @@ -0,0 +1 @@ +uid://873un8agkyja diff --git a/scripts/components/lifetime_component.gd b/scripts/components/lifetime_component.gd new file mode 100644 index 0000000..212eda8 --- /dev/null +++ b/scripts/components/lifetime_component.gd @@ -0,0 +1,22 @@ +class_name LifetimeComponent +extends Node + +@export var root: Node +@export var life_time: float = 5.0 +@export var timer: Timer + + +func _ready() -> void: + if not root: + printerr("Root node not set.") + return + + if not timer: + printerr("Timer node not set.") + return + + timer.timeout.connect(on_timer_timeout) + + +func on_timer_timeout() -> void: + root.queue_free() diff --git a/scripts/components/lifetime_component.gd.uid b/scripts/components/lifetime_component.gd.uid new file mode 100644 index 0000000..b19f460 --- /dev/null +++ b/scripts/components/lifetime_component.gd.uid @@ -0,0 +1 @@ +uid://bvsgg8lu0a8m6 diff --git a/scripts/components/out_of_screen_component.gd b/scripts/components/out_of_screen_component.gd new file mode 100644 index 0000000..6d991a6 --- /dev/null +++ b/scripts/components/out_of_screen_component.gd @@ -0,0 +1,21 @@ +class_name OutOfScreenComponent +extends Node + +@export var visibility_notifier: VisibleOnScreenNotifier2D +@export var root: Node + + +func _ready() -> void: + if not visibility_notifier: + printerr("Visibility notifier not set.") + return + + visibility_notifier.screen_exited.connect(_on_screen_exited) + + +func _on_screen_exited() -> void: + if not root: + printerr("Root node not set.") + return + + root.queue_free() diff --git a/scripts/components/out_of_screen_component.gd.uid b/scripts/components/out_of_screen_component.gd.uid new file mode 100644 index 0000000..6c1e3f3 --- /dev/null +++ b/scripts/components/out_of_screen_component.gd.uid @@ -0,0 +1 @@ +uid://1tnr46o1ib4u diff --git a/scripts/components/periodic_shooting.gd b/scripts/components/periodic_shooting.gd index e65b800..6a629bc 100644 --- a/scripts/components/periodic_shooting.gd +++ b/scripts/components/periodic_shooting.gd @@ -27,10 +27,14 @@ func shoot() -> void: return var bullet_instance: Node2D = bullet_scene.instantiate() - var bullet_component: BulletComponent = bullet_instance.get_node("BulletComponent") + var launch_component: LaunchComponent = bullet_instance.get_node_or_null("LaunchComponent") var spawn_position: Vector2 = bullet_spawn_right.global_position if shoot_direction == Vector2.RIGHT else bullet_spawn_left.global_position + if launch_component: + launch_component.initial_direction = shoot_direction + launch_component.spawn_position = spawn_position + launch_component.spawn_rotation = root.rotation + bullet_instance.position = spawn_position - bullet_component.direction = shoot_direction get_tree().current_scene.add_child(bullet_instance) diff --git a/scripts/components/projectile_component.gd b/scripts/components/projectile_component.gd new file mode 100644 index 0000000..43aeefe --- /dev/null +++ b/scripts/components/projectile_component.gd @@ -0,0 +1,21 @@ +class_name ProjectileComponent +extends Node2D + +@export var speed: float = 16.0 +@export var dir: float +@export var spawn_position: Vector2 +@export var spawn_rotation: float +@export var character_body: CharacterBody2D + + +func _ready() -> void: + global_position = spawn_position + global_rotation = spawn_rotation + + +func _physics_process(delta: float) -> void: + if not character_body: + return + + character_body.velocity = Vector2(0, -speed).rotated(dir) + character_body.move_and_slide() \ No newline at end of file diff --git a/scripts/components/projectile_component.gd.uid b/scripts/components/projectile_component.gd.uid new file mode 100644 index 0000000..e7c911d --- /dev/null +++ b/scripts/components/projectile_component.gd.uid @@ -0,0 +1 @@ +uid://bk2fvcv0g4x1q diff --git a/scripts/components/straight_motion_component.gd b/scripts/components/straight_motion_component.gd new file mode 100644 index 0000000..5857fb7 --- /dev/null +++ b/scripts/components/straight_motion_component.gd @@ -0,0 +1,9 @@ +class_name StraightMotionComponent +extends Node + +@export var root: Node2D +@export var launch_component: LaunchComponent + + +func _physics_process(delta: float) -> void: + root.position += launch_component.get_initial_velocity() * delta diff --git a/scripts/components/straight_motion_component.gd.uid b/scripts/components/straight_motion_component.gd.uid new file mode 100644 index 0000000..f925350 --- /dev/null +++ b/scripts/components/straight_motion_component.gd.uid @@ -0,0 +1 @@ +uid://cvcnfrr1udco5 diff --git a/scripts/skill_manager.gd b/scripts/skill_manager.gd index 0589725..bad0083 100644 --- a/scripts/skill_manager.gd +++ b/scripts/skill_manager.gd @@ -28,7 +28,6 @@ func add_skill(skill_data: SkillData) -> void: elif skill_instance.has_node(value): value = skill_instance.get_node(value) else: - print("NodePath not found: ", value) continue skill_instance[key] = value diff --git a/scripts/ui/charge_progress_bar.gd b/scripts/ui/charge_progress_bar.gd new file mode 100644 index 0000000..e16efbb --- /dev/null +++ b/scripts/ui/charge_progress_bar.gd @@ -0,0 +1,52 @@ +extends Node + +@export var progress_bar: ProgressBar +@export var charge_throw_component: ChargeThrowComponent + + +func _ready() -> void: + if not charge_throw_component: + return + + if not progress_bar: + return + + setup_progress_bar() + progress_bar.hide() + + charge_throw_component.charge_started.connect(on_charge_started) + charge_throw_component.charge_updated.connect(on_charge_updated) + charge_throw_component.charge_stopped.connect(on_charge_stopped) + + +func on_charge_updated(charge_ratio: float) -> void: + if not progress_bar: + return + + progress_bar.value = charge_ratio + progress_bar.show() + + +func on_charge_stopped() -> void: + if not progress_bar: + return + + progress_bar.hide() + + +func on_charge_started() -> void: + if not progress_bar: + return + + progress_bar.show() + + +func setup_progress_bar() -> void: + if not progress_bar: + return + + progress_bar.min_value = charge_throw_component.min_power + progress_bar.max_value = charge_throw_component.max_power + progress_bar.value = charge_throw_component.min_power + progress_bar.step = 0.01 + progress_bar.show() \ No newline at end of file diff --git a/scripts/ui/charge_progress_bar.gd.uid b/scripts/ui/charge_progress_bar.gd.uid new file mode 100644 index 0000000..6236916 --- /dev/null +++ b/scripts/ui/charge_progress_bar.gd.uid @@ -0,0 +1 @@ +uid://q32rtephu1t1