diff --git a/Ability/AbilityTemplateScripts/melee_ability.gd b/Ability/AbilityTemplateScripts/melee_ability.gd new file mode 100644 index 0000000..30eba44 --- /dev/null +++ b/Ability/AbilityTemplateScripts/melee_ability.gd @@ -0,0 +1,24 @@ +extends AbilityLogic + +var HitboxScene = preload("res://Ability/hitbox.tscn") + + +func use(user): + if (data.melee_hitbox_enable): + melee_attack(user) + data.add_exp(50) + pass + +func stop_use(user): + print(data.name+" has stopped.") + pass + +func while_use(user, delta: float): + pass + + +func melee_attack(user): + var hitbox = HitboxScene.instantiate() + hitbox.initHitbox(data, user) + print("you melee attacked, what???") + diff --git a/Ability/AbilityTemplateScripts/melee_ability.gd.uid b/Ability/AbilityTemplateScripts/melee_ability.gd.uid new file mode 100644 index 0000000..bc06d08 --- /dev/null +++ b/Ability/AbilityTemplateScripts/melee_ability.gd.uid @@ -0,0 +1 @@ +uid://dah4filbmo0p7 diff --git a/Ability/AbilityTemplateScripts/practice_ability.gd b/Ability/AbilityTemplateScripts/practice_ability.gd new file mode 100644 index 0000000..6433032 --- /dev/null +++ b/Ability/AbilityTemplateScripts/practice_ability.gd @@ -0,0 +1,13 @@ +extends AbilityLogic + +func use(user): + print(data.name + " has started.") + data.add_exp(50) + pass + +func stop_use(user): + print(data.name+" has stopped.") + pass + +func while_use(user, delta: float): + pass diff --git a/Ability/AbilityTemplateScripts/practice_ability.gd.uid b/Ability/AbilityTemplateScripts/practice_ability.gd.uid new file mode 100644 index 0000000..3f0502b --- /dev/null +++ b/Ability/AbilityTemplateScripts/practice_ability.gd.uid @@ -0,0 +1 @@ +uid://ckychlwohd8nf diff --git a/Ability/AbilityTemplateScripts/sprint_ability.gd b/Ability/AbilityTemplateScripts/sprint_ability.gd new file mode 100644 index 0000000..488919c --- /dev/null +++ b/Ability/AbilityTemplateScripts/sprint_ability.gd @@ -0,0 +1,12 @@ +extends AbilityLogic + +func use(user): + print("started sprinting") + +func while_use(user, delta): + data.add_exp(20 * delta) + +func stop_use(user): + print("stopped sprinting") + pass + diff --git a/Ability/AbilityTemplateScripts/sprint_ability.gd.uid b/Ability/AbilityTemplateScripts/sprint_ability.gd.uid new file mode 100644 index 0000000..a4546d6 --- /dev/null +++ b/Ability/AbilityTemplateScripts/sprint_ability.gd.uid @@ -0,0 +1 @@ +uid://bym661bu8r72n diff --git a/Ability/AbilityTres/melee_big_hit.tres b/Ability/AbilityTres/melee_big_hit.tres new file mode 100644 index 0000000..150d4c7 --- /dev/null +++ b/Ability/AbilityTres/melee_big_hit.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" load_steps=4 format=3 uid="uid://r0aqeukqqt6h"] + +[ext_resource type="Script" uid="uid://cdrbhji2r6eti" path="res://Ability/ability.gd" id="1_5ocnk"] +[ext_resource type="Script" uid="uid://dah4filbmo0p7" path="res://Ability/AbilityTemplateScripts/melee_ability.gd" id="2_5ocnk"] + +[sub_resource type="Resource" id="Resource_itdyd"] +script = ExtResource("1_5ocnk") +name = "Melee Big Hit" +base_damage = 1.0 +melee_hitbox_enable = true +melee_hitbox_offset = Vector2(0, 50) +metadata/_custom_type_script = "uid://cdrbhji2r6eti" + +[resource] +script = ExtResource("2_5ocnk") +data = SubResource("Resource_itdyd") +metadata/_custom_type_script = "uid://c14dw11f4rkhi" diff --git a/Ability/AbilityTres/practice_ability.tres b/Ability/AbilityTres/practice_ability.tres new file mode 100644 index 0000000..a5182d1 --- /dev/null +++ b/Ability/AbilityTres/practice_ability.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" load_steps=4 format=3 uid="uid://c4sd6smpa721x"] + +[ext_resource type="Script" uid="uid://cdrbhji2r6eti" path="res://Ability/ability.gd" id="1_70usm"] +[ext_resource type="Script" uid="uid://ckychlwohd8nf" path="res://Ability/AbilityTemplateScripts/practice_ability.gd" id="1_i4u7c"] + +[sub_resource type="Resource" id="Resource_itdyd"] +script = ExtResource("1_70usm") +name = "Practice Ability" +base_damage = 1000.0 +metadata/_custom_type_script = "uid://cdrbhji2r6eti" + +[resource] +script = ExtResource("1_i4u7c") +data = SubResource("Resource_itdyd") +metadata/_custom_type_script = "uid://c14dw11f4rkhi" diff --git a/Ability/AbilityTres/sprint_ability.tres b/Ability/AbilityTres/sprint_ability.tres new file mode 100644 index 0000000..94c5146 --- /dev/null +++ b/Ability/AbilityTres/sprint_ability.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" load_steps=4 format=3 uid="uid://wwa6n3kvae7i"] + +[ext_resource type="Script" uid="uid://cdrbhji2r6eti" path="res://Ability/ability.gd" id="1_80pgq"] +[ext_resource type="Script" uid="uid://bym661bu8r72n" path="res://Ability/AbilityTemplateScripts/sprint_ability.gd" id="2_0q0tn"] + +[sub_resource type="Resource" id="Resource_t24na"] +script = ExtResource("1_80pgq") +name = "Sprint" +metadata/_custom_type_script = "uid://cdrbhji2r6eti" + +[resource] +script = ExtResource("2_0q0tn") +data = SubResource("Resource_t24na") +metadata/_custom_type_script = "uid://c14dw11f4rkhi" diff --git a/Ability/ability.gd b/Ability/ability.gd new file mode 100644 index 0000000..acd919b --- /dev/null +++ b/Ability/ability.gd @@ -0,0 +1,45 @@ + +extends Resource +class_name AbilityData + +@export var name: String +@export var base_damage := 10.0 +@export var cooldown := 0.5 +@export var consumption := 10.0 # IS IT STAMINA??? I DONT KNOW I FORGOT TS GAME IS DOOMED BRO +@export var hp_consumption := 0.0 + +@export var level := 1 +@export var exp := 0.0 +@export var starting_exp := 100.0 +@export var exp_scaling := 100.0 # +100 exp needed for every additional level +@export var exp_to_level := 100.0 + +@export var melee_hitbox_enable := false +@export var melee_hitbox_size : Vector2 = Vector2(5,5) +@export var melee_hitbox_offset : Vector2 = Vector2(0,0) +@export var melee_hitbox_delay := 0.0 +@export var melee_hitbox_duration := 0.2 + +func get_damage(): + return base_damage * level + +func add_exp(amount): + exp += amount + calc_level() + +func calc_level(): # calc is short for calculator by the way + while (exp >= exp_to_level): + exp -= exp_to_level + level += 1 + exp_to_level = level * exp_scaling + print(name+" has leveled up to Level "+str(level)) + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/Ability/ability.gd.uid b/Ability/ability.gd.uid new file mode 100644 index 0000000..8e6cc52 --- /dev/null +++ b/Ability/ability.gd.uid @@ -0,0 +1 @@ +uid://cdrbhji2r6eti diff --git a/Ability/ability_logic.gd b/Ability/ability_logic.gd new file mode 100644 index 0000000..7480ba2 --- /dev/null +++ b/Ability/ability_logic.gd @@ -0,0 +1,18 @@ +extends Resource +class_name AbilityLogic + + +@export var data: AbilityData + + +# make sure to override this. +func use(user): + pass + +func stop_use(user): + pass + +func while_use(user, delta: float): + pass + + diff --git a/Ability/ability_logic.gd.uid b/Ability/ability_logic.gd.uid new file mode 100644 index 0000000..98532e7 --- /dev/null +++ b/Ability/ability_logic.gd.uid @@ -0,0 +1 @@ +uid://c14dw11f4rkhi diff --git a/Ability/hitbox.gd b/Ability/hitbox.gd new file mode 100644 index 0000000..956b41c --- /dev/null +++ b/Ability/hitbox.gd @@ -0,0 +1,32 @@ +extends Area2D + + +# Called when the node enters the scene tree for the first time. + +var damage := 0.0; + +func initHitbox(data : AbilityData, user : CharacterBody2D): + damage = data.base_damage + + user.add_child(self) + + var mouse_pos = get_global_mouse_position() + var direction = (mouse_pos - user.global_position).normalized() + + global_position = user.global_position + direction * data.melee_hitbox_offset.length() + rotation = direction.angle() + + scale = data.melee_hitbox_size + + await get_tree().create_timer(data.melee_hitbox_delay).timeout + connect("body_entered", _on_body_entered) + await get_tree().create_timer(data.melee_hitbox_duration).timeout + + queue_free() + +func _on_body_entered(body): + if body.has_method("take_damage"): + body.take_damage(damage) + + + diff --git a/Ability/hitbox.gd.uid b/Ability/hitbox.gd.uid new file mode 100644 index 0000000..941bf6b --- /dev/null +++ b/Ability/hitbox.gd.uid @@ -0,0 +1 @@ +uid://1tluihp70q2r diff --git a/Ability/hitbox.tscn b/Ability/hitbox.tscn new file mode 100644 index 0000000..16364b3 --- /dev/null +++ b/Ability/hitbox.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://bh8du3opop534"] + +[ext_resource type="Script" uid="uid://1tluihp70q2r" path="res://Ability/hitbox.gd" id="1_esvl6"] +[ext_resource type="Texture2D" uid="uid://llcca3vhihbv" path="res://Misc/gallopon.jpg" id="2_lcefl"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_22vse"] + +[node name="Hitbox" type="Area2D"] +collision_layer = 16 +collision_mask = 8 +script = ExtResource("1_esvl6") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_22vse") + +[node name="Sprite2D" type="Sprite2D" parent="."] +modulate = Color(1, 1, 1, 0.44705883) +position = Vector2(0, -3.799796e-07) +scale = Vector2(0.07272726, 0.10928961) +texture = ExtResource("2_lcefl") diff --git a/Base/Power_up.tscn b/Base/Power_up.tscn index 5187eed..745b948 100644 --- a/Base/Power_up.tscn +++ b/Base/Power_up.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://dtn477wyv7hn7"] +[gd_scene load_steps=3 format=3 uid="uid://dtn477wyv7hn7"] -[ext_resource type="Texture2D" uid="uid://e306v7nsc7us" path="res://Projectiles/icon.svg" id="1_ci57c"] -[ext_resource type="Script" path="res://Base/power_up.gd" id="1_g3h1e"] +[ext_resource type="Script" uid="uid://cknqloq6salyv" path="res://Base/power_up.gd" id="1_g3h1e"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_qtu7q"] size = Vector2(112, 112) @@ -15,7 +14,6 @@ metadata/_edit_group_ = true [node name="Sprite2D" type="Sprite2D" parent="."] use_parent_material = true -texture = ExtResource("1_ci57c") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_qtu7q") diff --git a/Enemy/Enemy.tscn b/Enemy/Enemy.tscn new file mode 100644 index 0000000..910ee66 --- /dev/null +++ b/Enemy/Enemy.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=8 format=3 uid="uid://m2spfqyeopd6"] + +[ext_resource type="Script" uid="uid://btbo1qgfb7n2n" path="res://Player/health_bar.gd" id="1_3o4wt"] +[ext_resource type="Script" uid="uid://0v8h0wqe0iyt" path="res://Enemy/enemy.gd" id="1_vonkd"] +[ext_resource type="Texture2D" uid="uid://d38wbkf4k45v8" path="res://Enemy/veriglius.jpg" id="2_epr5s"] +[ext_resource type="Resource" uid="uid://dvyc820lqfjrx" path="res://Player/DefaultPlayerCharacter.tres" id="2_vso2s"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vonkd"] +size = Vector2(10, 12) + +[sub_resource type="CircleShape2D" id="CircleShape2D_epr5s"] +radius = 3.0 + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_vonkd"] +radius = 5.0 +height = 12.0 + +[node name="Enemy" type="CharacterBody2D"] +collision_layer = 8 +script = ExtResource("1_vonkd") +character_data = ExtResource("2_vso2s") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_vonkd") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] + +[node name="Detection" type="Node2D" parent="."] + +[node name="Damage" type="Area2D" parent="Detection"] +collision_mask = 2 + +[node name="DamageHitbox" type="CollisionShape2D" parent="Detection/Damage"] +shape = SubResource("CircleShape2D_epr5s") + +[node name="Heal" type="Area2D" parent="Detection"] +collision_mask = 4 + +[node name="HealHitbox" type="CollisionShape2D" parent="Detection/Heal"] +shape = SubResource("CapsuleShape2D_vonkd") + +[node name="HealthBar" type="ProgressBar" parent="."] +offset_left = -7.0 +offset_top = 8.0 +offset_right = 94.0 +offset_bottom = 35.0 +scale = Vector2(0.15, 0.15) +script = ExtResource("1_3o4wt") + +[node name="Label" type="Label" parent="HealthBar"] +layout_mode = 1 +anchors_preset = -1 +offset_left = 30.0 +offset_top = 30.0 +offset_right = 83.0 +offset_bottom = 56.0 + +[node name="Sprite2D" type="Sprite2D" parent="."] +scale = Vector2(0.055, 0.045) +texture = ExtResource("2_epr5s") diff --git a/Enemy/enemy.gd b/Enemy/enemy.gd new file mode 100644 index 0000000..1999b58 --- /dev/null +++ b/Enemy/enemy.gd @@ -0,0 +1,32 @@ +extends CharacterBody2D + +@export var character_data : PlayerCharacterData + +@onready var healthBar = $HealthBar + +@onready var maxHealth : float = character_data.HP + + +func _ready() -> void: + healthBar.set_health_bar(character_data.HP, maxHealth) + +func take_damage(damage:int): + character_data.HP -= damage + if character_data.HP < 0: character_data.HP = 0 + healthBar.change_health(-damage) + +func take_heal(heal:int): + character_data.HP += heal + healthBar.change_health(heal) + +func _on_damage_area_entered(area: Area2D) -> void: + if area.is_in_group("damage"): + take_damage(1) + +func _on_heal_area_entered(area: Area2D) -> void: + if area.is_in_group("heal"): + take_heal(1) + + +func _physics_process(delta: float) -> void: + move_and_slide() diff --git a/Enemy/enemy.gd.uid b/Enemy/enemy.gd.uid new file mode 100644 index 0000000..fd98d49 --- /dev/null +++ b/Enemy/enemy.gd.uid @@ -0,0 +1 @@ +uid://0v8h0wqe0iyt diff --git a/Enemy/veriglius.jpg b/Enemy/veriglius.jpg new file mode 100644 index 0000000..5e02a86 Binary files /dev/null and b/Enemy/veriglius.jpg differ diff --git a/Enemy/veriglius.jpg.import b/Enemy/veriglius.jpg.import new file mode 100644 index 0000000..37d2c38 --- /dev/null +++ b/Enemy/veriglius.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d38wbkf4k45v8" +path="res://.godot/imported/veriglius.jpg-154c13058ac7c6f47068db0358fc552d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Enemy/veriglius.jpg" +dest_files=["res://.godot/imported/veriglius.jpg-154c13058ac7c6f47068db0358fc552d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Heals/Heart.tscn b/Heals/Heart.tscn index a3121ca..fc161cb 100644 --- a/Heals/Heart.tscn +++ b/Heals/Heart.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=4 format=3 uid="uid://wqcuyddc0728"] +[gd_scene load_steps=3 format=3 uid="uid://wqcuyddc0728"] [ext_resource type="Texture2D" uid="uid://crh0ru01dofl2" path="res://Misc/Screenshot 2026-04-04 113440.png" id="1_23dhv"] diff --git a/Main.tscn b/Main.tscn index b819cde..9c86445 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://di36bxkcrnr52"] +[gd_scene load_steps=9 format=3 uid="uid://di36bxkcrnr52"] [ext_resource type="PackedScene" uid="uid://d2l1oof6loxxe" path="res://Player/Player.tscn" id="1_uu6xs"] [ext_resource type="Script" uid="uid://dw0yxse7nva8" path="res://Player/PlayerCharacterData.gd" id="2_r0du0"] [ext_resource type="PackedScene" uid="uid://b5yaa70qbh3li" path="res://Damage/Saw.tscn" id="3_cm0pq"] [ext_resource type="PackedScene" uid="uid://wqcuyddc0728" path="res://Heals/Heart.tscn" id="4_fos0i"] [ext_resource type="Script" uid="uid://btbo1qgfb7n2n" path="res://Player/health_bar.gd" id="5_fos0i"] +[ext_resource type="PackedScene" uid="uid://m2spfqyeopd6" path="res://Enemy/Enemy.tscn" id="6_3dxm6"] [sub_resource type="Resource" id="Resource_cm0pq"] resource_local_to_scene = true @@ -12,6 +13,12 @@ script = ExtResource("2_r0du0") speed = 150.0 air_acceleration = 3000.0 +[sub_resource type="Resource" id="Resource_lgr22"] +resource_local_to_scene = true +script = ExtResource("2_r0du0") +speed = 150.0 +air_acceleration = 3000.0 + [node name="Main" type="Node"] [node name="Player" parent="." node_paths=PackedStringArray("healthBar") instance=ExtResource("1_uu6xs")] @@ -50,3 +57,7 @@ offset_top = 1.0 offset_right = 76.0 offset_bottom = 27.0 horizontal_alignment = 1 + +[node name="Enemy" parent="." instance=ExtResource("6_3dxm6")] +position = Vector2(54, 32) +character_data = SubResource("Resource_lgr22") diff --git a/Main.tscn3245094987.tmp b/Main.tscn3245094987.tmp new file mode 100644 index 0000000..1d118ba --- /dev/null +++ b/Main.tscn3245094987.tmp @@ -0,0 +1,35 @@ +[gd_scene load_steps=8 format=3 uid="uid://di36bxkcrnr52"] + +[ext_resource type="PackedScene" uid="uid://d2l1oof6loxxe" path="res://Player/Player.tscn" id="1_uu6xs"] +[ext_resource type="Script" uid="uid://dw0yxse7nva8" path="res://Player/PlayerCharacterData.gd" id="2_r0du0"] +[ext_resource type="PackedScene" uid="uid://b5yaa70qbh3li" path="res://Damage/Saw.tscn" id="3_cm0pq"] +[ext_resource type="PackedScene" uid="uid://wqcuyddc0728" path="res://Heals/Heart.tscn" id="4_fos0i"] +[ext_resource type="PackedScene" uid="uid://m2spfqyeopd6" path="res://Enemy/Enemy.tscn" id="5_fos0i"] + +[sub_resource type="Resource" id="Resource_cm0pq"] +resource_local_to_scene = true +script = ExtResource("2_r0du0") +speed = 150.0 +air_acceleration = 3000.0 + +[sub_resource type="Resource" id="Resource_fos0i"] +resource_local_to_scene = true +script = ExtResource("2_r0du0") +speed = 150.0 +air_acceleration = 3000.0 + +[node name="Main" type="Node"] + +[node name="Player" parent="." instance=ExtResource("1_uu6xs")] +position = Vector2(-1, 0) +character_data = SubResource("Resource_cm0pq") + +[node name="Saw" parent="." instance=ExtResource("3_cm0pq")] +position = Vector2(105, 67) + +[node name="Heart" parent="." instance=ExtResource("4_fos0i")] +position = Vector2(222, 73) + +[node name="Enemy" parent="." instance=ExtResource("5_fos0i")] +position = Vector2(26, 0) +character_data = SubResource("Resource_fos0i") diff --git a/Misc/gallopon.jpg b/Misc/gallopon.jpg new file mode 100644 index 0000000..e0dbed4 Binary files /dev/null and b/Misc/gallopon.jpg differ diff --git a/Misc/gallopon.jpg.import b/Misc/gallopon.jpg.import new file mode 100644 index 0000000..0bb0ee2 --- /dev/null +++ b/Misc/gallopon.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://llcca3vhihbv" +path="res://.godot/imported/gallopon.jpg-737057b62538c41c98724e10cc2d492e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Misc/gallopon.jpg" +dest_files=["res://.godot/imported/gallopon.jpg-737057b62538c41c98724e10cc2d492e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Player/Player.tscn b/Player/Player.tscn index 5fc03a6..085672c 100644 --- a/Player/Player.tscn +++ b/Player/Player.tscn @@ -6,8 +6,11 @@ [ext_resource type="Resource" uid="uid://dvyc820lqfjrx" path="res://Player/DefaultPlayerCharacter.tres" id="3_vcj7w"] [ext_resource type="Texture2D" uid="uid://cjooboer2dbvg" path="res://Player/test_attack-Sheet.png" id="6_1m13p"] [ext_resource type="Script" uid="uid://c2e8n7ejelcjv" path="res://Player/player_movement.gd" id="8_ip4se"] +[ext_resource type="Resource" uid="uid://wwa6n3kvae7i" path="res://Ability/AbilityTres/sprint_ability.tres" id="8_p7tob"] [ext_resource type="Script" uid="uid://btbo1qgfb7n2n" path="res://Player/health_bar.gd" id="8_s1rgi"] [ext_resource type="Script" uid="uid://b1ogharj5fnex" path="res://Player/player_default.gd" id="8_u63yy"] +[ext_resource type="Script" uid="uid://b5pm23s8n8nke" path="res://Player/player_ability.gd" id="8_v0k0e"] +[ext_resource type="Resource" uid="uid://r0aqeukqqt6h" path="res://Ability/AbilityTres/melee_big_hit.tres" id="10_v0k0e"] [sub_resource type="AtlasTexture" id="AtlasTexture_3kltw"] atlas = ExtResource("3_lnawk") @@ -257,6 +260,30 @@ script = ExtResource("8_ip4se") actor = NodePath("../..") animator = NodePath("../../AnimatedSprite2D") animation = NodePath("../../AnimationPlayer") +movementAbility = ExtResource("8_p7tob") + +[node name="PlayerAbility" type="Node" parent="FiniteStateMachine" node_paths=PackedStringArray("actor", "animator", "animation")] +script = ExtResource("8_v0k0e") +actor = NodePath("../..") +animator = NodePath("../../AnimatedSprite2D") +animation = NodePath("../../AnimationPlayer") +ability = ExtResource("10_v0k0e") + +[node name="HealthBar" type="ProgressBar" parent="."] +offset_left = -7.0 +offset_top = 8.0 +offset_right = 94.0 +offset_bottom = 35.0 +scale = Vector2(0.15, 0.15) +script = ExtResource("8_s1rgi") + +[node name="Label" type="Label" parent="HealthBar"] +layout_mode = 1 +anchors_preset = -1 +offset_left = 30.0 +offset_top = 30.0 +offset_right = 83.0 +offset_bottom = 56.0 [connection signal="area_entered" from="Detection/Damage" to="." method="_on_damage_area_entered"] [connection signal="area_entered" from="Detection/Heal" to="." method="_on_heal_area_entered"] diff --git a/Player/ability_manager.gd b/Player/ability_manager.gd new file mode 100644 index 0000000..2dd0dee --- /dev/null +++ b/Player/ability_manager.gd @@ -0,0 +1,37 @@ +extends Node + +@export var slottedAbilities: Array[AbilityLogic] = [] +var abilitiesInfo := {} + +@export var movementAbility : AbilityLogic # will probably only be sprinting by the way lol. + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + for ability in slottedAbilities: + abilitiesInfo.set(ability, { + Ability = ability, + Active = false, + Cooldown = 0, + }) + +func use_ability(ability_logic: AbilityLogic): + if abilitiesInfo[ability_logic].Cooldown > 0: return + var abilityInfo = abilitiesInfo[ability_logic] + abilityInfo.Active = true + abilityInfo.Cooldown = abilitiesInfo.Ability.Data.Cooldown + abilitiesInfo.Ability.use(get_parent()) + +func stop_using_ability(ability_logic: AbilityLogic): + var abilityInfo = abilitiesInfo[ability_logic] + abilityInfo.Active = false + abilityInfo.Cooldown = abilitiesInfo.Ability.Data.Cooldown + abilitiesInfo.Ability.stop_use(get_parent()) + +func _process(delta): + for values in abilitiesInfo: + values.Cooldown = max(0, values.Cooldown - delta) + if (values.Active): + values.Ability.while_use(get_parent(), delta) + + + diff --git a/Player/ability_manager.gd.uid b/Player/ability_manager.gd.uid new file mode 100644 index 0000000..97f9012 --- /dev/null +++ b/Player/ability_manager.gd.uid @@ -0,0 +1 @@ +uid://g8nsp75yfies diff --git a/Player/player.gd b/Player/player.gd index 5a7e228..5d03e3e 100644 --- a/Player/player.gd +++ b/Player/player.gd @@ -18,6 +18,7 @@ var example : bool = true @onready var fsm: FiniteStateMachine = $FiniteStateMachine @onready var player_movement: PlayerMovement = $FiniteStateMachine/PlayerMovement @onready var player_default: PlayerDefault = $FiniteStateMachine/PlayerDefault +@onready var player_ability : PlayerAbility = $FiniteStateMachine/PlayerAbility @export var healthBar : ProgressBar @@ -25,14 +26,20 @@ func _ready() -> void: # FSM Signals default_signals() movement_signals() + ability_signals() healthBar.set_health_bar(character_data.HP, maxHealth) func movement_signals() -> void: player_movement.default.connect(fsm.change_state.bind(player_default)) + player_movement.ability.connect(fsm.change_state.bind(player_ability)) func default_signals() -> void: player_default.walk.connect(fsm.change_state.bind(player_movement)) + player_default.ability.connect(fsm.change_state.bind(player_ability)) + +func ability_signals() -> void: + player_ability.default.connect(fsm.change_state.bind(player_default)) func _physics_process(_delta: float) -> void: move_and_slide() diff --git a/Player/player_ability.gd b/Player/player_ability.gd new file mode 100644 index 0000000..aff5e6c --- /dev/null +++ b/Player/player_ability.gd @@ -0,0 +1,46 @@ +extends State +class_name PlayerAbility + +@export var actor: Player +@export var animator: AnimatedSprite2D +@export var animation: AnimationPlayer + +@export var ability : AbilityLogic + +signal default + +var timeStarted : float + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + set_physics_process(false) + set_process(false) + +func _enter_state() -> void: + set_physics_process(true) + set_process(true) + timeStarted = Time.get_ticks_msec() + ability.use(actor) + +func _exit_state() -> void: + set_process(false) + set_physics_process(false) + ability.stop_use(actor) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + if (Time.get_ticks_msec() - timeStarted > ability.data.cooldown * 1000): + default.emit() + return + ability.while_use(actor, delta) + handle_friction_x(0, delta) + handle_friction_y(0, delta) + pass + +func handle_friction_x(input_axis: float, delta: float) -> void: + if (input_axis == 0): + actor.velocity.x = move_toward(actor.velocity.x, 0, actor.character_data.friction * delta) + +func handle_friction_y(input_axis: float, delta: float) -> void: + if (input_axis == 0): + actor.velocity.y = move_toward(actor.velocity.y, 0, actor.character_data.friction * delta) diff --git a/Player/player_ability.gd.uid b/Player/player_ability.gd.uid new file mode 100644 index 0000000..f0fc15d --- /dev/null +++ b/Player/player_ability.gd.uid @@ -0,0 +1 @@ +uid://b5pm23s8n8nke diff --git a/Player/player_default.gd b/Player/player_default.gd index 485a5fe..8e5f296 100644 --- a/Player/player_default.gd +++ b/Player/player_default.gd @@ -2,6 +2,7 @@ class_name PlayerDefault extends State signal walk +signal ability @export var actor: Player @export var animation: AnimationPlayer @@ -21,10 +22,17 @@ func _physics_process(delta: float) -> void: var input_axis_y := Input.get_axis("move_up", "move_down") handle_friction_x(input_axis_x,delta) handle_friction_y(input_axis_y,delta) + animator.play("idle") # Cases - if (input_axis_x != 0 or input_axis_y != 0): walk.emit() + if (input_axis_x != 0 or input_axis_y != 0): + walk.emit() + return + + if (Input.is_action_just_pressed("ability1")): + ability.emit() + return func handle_friction_x(input_axis: float, delta: float) -> void: if (input_axis == 0): diff --git a/Player/player_movement.gd b/Player/player_movement.gd index dabd55f..85cc77b 100644 --- a/Player/player_movement.gd +++ b/Player/player_movement.gd @@ -4,8 +4,12 @@ extends State @export var actor: Player @export var animator: AnimatedSprite2D @export var animation: AnimationPlayer +@export var movementAbility : AbilityLogic signal default +signal ability + +var speedMultiplier : float = 1 func _ready() -> void: set_physics_process(false) @@ -22,6 +26,7 @@ func _exit_state() -> void: func _physics_process(delta: float) -> void: var input_axis_x := Input.get_axis("move_left", "move_right") var input_axis_y := Input.get_axis("move_up", "move_down") + handle_sprint(delta) handle_acceleration_x(input_axis_x,delta) handle_acceleration_y(input_axis_y,delta) handle_friction_x(input_axis_x,delta) @@ -34,11 +39,11 @@ func _process(_delta: float) -> void: func handle_acceleration_x(input_axis: float, delta: float) -> void: if (input_axis != 0): - actor.velocity.x = move_toward(actor.velocity.x, input_axis * actor.character_data.speed, actor.character_data.acceleration * delta) + actor.velocity.x = move_toward(actor.velocity.x, input_axis * actor.character_data.speed * speedMultiplier, actor.character_data.acceleration * delta) func handle_acceleration_y(input_axis: float, delta: float) -> void: if (input_axis != 0): - actor.velocity.y = move_toward(actor.velocity.y, input_axis * actor.character_data.speed, actor.character_data.acceleration * delta) + actor.velocity.y = move_toward(actor.velocity.y, input_axis * actor.character_data.speed * speedMultiplier, actor.character_data.acceleration * delta) func handle_friction_x(input_axis: float, delta: float) -> void: if (input_axis == 0): @@ -48,5 +53,19 @@ func handle_friction_y(input_axis: float, delta: float) -> void: if (input_axis == 0): actor.velocity.y = move_toward(actor.velocity.y, 0, actor.character_data.friction * delta) +func handle_sprint(delta : float): + if (Input.is_action_just_pressed("sprint")): + movementAbility.use(actor) + + if (Input.is_action_pressed("sprint")): + speedMultiplier = 1.3 + movementAbility.while_use(actor, delta) + else: + speedMultiplier = 1 + + if (Input.is_action_just_released("sprint")): + speedMultiplier = 1 + movementAbility.stop_use(actor) + func update_animation() -> void: animator.play("walk") diff --git a/project.godot b/project.godot index b238755..fd9730e 100644 --- a/project.godot +++ b/project.godot @@ -16,7 +16,7 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true config/name="Phoenix" run/main_scene="uid://di36bxkcrnr52" -config/features=PackedStringArray("4.6", "GL Compatibility") +config/features=PackedStringArray("4.5", "GL Compatibility") config/icon="res://Misc/icon.svg" [autoload] @@ -38,6 +38,7 @@ enabled=PackedStringArray("res://addons/dialogue_manager/plugin.cfg") [file_customization] folder_colors={ +"res://Ability/": "orange", "res://Base/": "red", "res://Damage/": "pink", "res://Heals/": "green", @@ -76,6 +77,16 @@ move_down={ , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +ability1={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null) +] +} +sprint={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} [rendering]