diff --git a/resources/abilities/coralleine/lifesteal_1.tres b/resources/abilities/coralleine/lifesteal_1.tres new file mode 100644 index 0000000..2851d2d --- /dev/null +++ b/resources/abilities/coralleine/lifesteal_1.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Ability" format=3 uid="uid://cp1djbgsqcqsx"] + +[ext_resource type="Script" uid="uid://ny1mjfoo1mqc" path="res://scripts/ability/ability.gd" id="1_mnbr0"] +[ext_resource type="Script" uid="uid://coagjoj2grxm7" path="res://scripts/ability/action/lifesteal_action.gd" id="1_ntos2"] + +[sub_resource type="Resource" id="Resource_l5dib"] +script = ExtResource("1_ntos2") +damage_minimum = 10 +damage_maximum = 30 +metadata/_custom_type_script = "uid://coagjoj2grxm7" + +[resource] +script = ExtResource("1_mnbr0") +name = "Lifesteal" +description = "Steal a percentage of the damage dealt to the enemy as health." +action = SubResource("Resource_l5dib") +metadata/_custom_type_script = "uid://ny1mjfoo1mqc" diff --git a/resources/abilities/coralleine/lifesteal_2.tres b/resources/abilities/coralleine/lifesteal_2.tres new file mode 100644 index 0000000..ec5d35a --- /dev/null +++ b/resources/abilities/coralleine/lifesteal_2.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="Ability" format=3 uid="uid://db3vxvsbuyf36"] + +[ext_resource type="Script" uid="uid://coagjoj2grxm7" path="res://scripts/ability/action/lifesteal_action.gd" id="1_7humo"] +[ext_resource type="Script" uid="uid://ny1mjfoo1mqc" path="res://scripts/ability/ability.gd" id="2_aqbhc"] + +[sub_resource type="Resource" id="Resource_l5dib"] +script = ExtResource("1_7humo") +damage_minimum = 20 +damage_maximum = 40 +metadata/_custom_type_script = "uid://coagjoj2grxm7" + +[resource] +script = ExtResource("2_aqbhc") +name = "Lifesteal Level 2" +description = "Steal a percentage of the increased damage dealt to the enemy as health." +action = SubResource("Resource_l5dib") +metadata/_custom_type_script = "uid://ny1mjfoo1mqc" diff --git a/resources/abilities/coralleine/lifesteal_3.tres b/resources/abilities/coralleine/lifesteal_3.tres new file mode 100644 index 0000000..11d4d7e --- /dev/null +++ b/resources/abilities/coralleine/lifesteal_3.tres @@ -0,0 +1,35 @@ +[gd_resource type="Resource" script_class="Ability" format=3 uid="uid://7fj07lgcsb2a"] + +[ext_resource type="Script" uid="uid://xwcbloqu4nwu" path="res://scripts/ability/action/abstracts/action.gd" id="1_12m1p"] +[ext_resource type="Script" uid="uid://coagjoj2grxm7" path="res://scripts/ability/action/lifesteal_action.gd" id="1_yvopc"] +[ext_resource type="Script" uid="uid://ny1mjfoo1mqc" path="res://scripts/ability/ability.gd" id="2_rj37m"] +[ext_resource type="Script" uid="uid://dkyoonc2qagl3" path="res://scripts/ability/action/luck_chance_action.gd" id="3_fay2i"] +[ext_resource type="Script" uid="uid://deeb01dip6syv" path="res://scripts/ability/action/steal_status_action.gd" id="4_8txq8"] +[ext_resource type="Script" uid="uid://da17dshmjafs6" path="res://scripts/ability/action/group_action.gd" id="5_fn34d"] + +[sub_resource type="Resource" id="Resource_qh8t0"] +script = ExtResource("1_yvopc") +damage_minimum = 20 +damage_maximum = 40 +metadata/_custom_type_script = "uid://coagjoj2grxm7" + +[sub_resource type="Resource" id="Resource_r4dnt"] +script = ExtResource("4_8txq8") +metadata/_custom_type_script = "uid://deeb01dip6syv" + +[sub_resource type="Resource" id="Resource_v7apg"] +script = ExtResource("3_fay2i") +success_action = SubResource("Resource_r4dnt") +metadata/_custom_type_script = "uid://dkyoonc2qagl3" + +[sub_resource type="Resource" id="Resource_ly7en"] +script = ExtResource("5_fn34d") +actions = Array[ExtResource("1_12m1p")]([SubResource("Resource_qh8t0"), SubResource("Resource_v7apg")]) +metadata/_custom_type_script = "uid://da17dshmjafs6" + +[resource] +script = ExtResource("2_rj37m") +name = "Lifesteal Level 3" +description = "Steal a percentage of the increased damage dealt to the enemy as health and there is a chance to steal a positive status effect from the enemy. " +action = SubResource("Resource_ly7en") +metadata/_custom_type_script = "uid://ny1mjfoo1mqc" diff --git a/resources/abilities/coralleine/lifesteal_4.tres b/resources/abilities/coralleine/lifesteal_4.tres new file mode 100644 index 0000000..9bbf17a --- /dev/null +++ b/resources/abilities/coralleine/lifesteal_4.tres @@ -0,0 +1,36 @@ +[gd_resource type="Resource" script_class="Ability" format=3 uid="uid://cjl4tl2emlhod"] + +[ext_resource type="Script" uid="uid://xwcbloqu4nwu" path="res://scripts/ability/action/abstracts/action.gd" id="1_qd3ra"] +[ext_resource type="Script" uid="uid://coagjoj2grxm7" path="res://scripts/ability/action/lifesteal_action.gd" id="2_3s6es"] +[ext_resource type="Script" uid="uid://dkyoonc2qagl3" path="res://scripts/ability/action/luck_chance_action.gd" id="3_weeie"] +[ext_resource type="Script" uid="uid://deeb01dip6syv" path="res://scripts/ability/action/steal_status_action.gd" id="4_er3r1"] +[ext_resource type="Script" uid="uid://da17dshmjafs6" path="res://scripts/ability/action/group_action.gd" id="5_4frgf"] +[ext_resource type="Script" uid="uid://ny1mjfoo1mqc" path="res://scripts/ability/ability.gd" id="6_ga7il"] + +[sub_resource type="Resource" id="Resource_qh8t0"] +script = ExtResource("2_3s6es") +damage_minimum = 30 +damage_maximum = 60 +lifesteal_percent = 1.0 +metadata/_custom_type_script = "uid://coagjoj2grxm7" + +[sub_resource type="Resource" id="Resource_r4dnt"] +script = ExtResource("4_er3r1") +metadata/_custom_type_script = "uid://deeb01dip6syv" + +[sub_resource type="Resource" id="Resource_v7apg"] +script = ExtResource("3_weeie") +success_action = SubResource("Resource_r4dnt") +metadata/_custom_type_script = "uid://dkyoonc2qagl3" + +[sub_resource type="Resource" id="Resource_ly7en"] +script = ExtResource("5_4frgf") +actions = Array[ExtResource("1_qd3ra")]([SubResource("Resource_qh8t0"), SubResource("Resource_v7apg")]) +metadata/_custom_type_script = "uid://da17dshmjafs6" + +[resource] +script = ExtResource("6_ga7il") +name = "Lifesteal Level 4" +description = "Steal ALL of the damage dealt to the enemy as health and there is a chance to steal a positive status effect from the enemy. " +action = SubResource("Resource_ly7en") +metadata/_custom_type_script = "uid://ny1mjfoo1mqc" diff --git a/scripts/ability/action/lifesteal_action.gd b/scripts/ability/action/lifesteal_action.gd new file mode 100644 index 0000000..3cb7086 --- /dev/null +++ b/scripts/ability/action/lifesteal_action.gd @@ -0,0 +1,16 @@ +extends TargetAction +class_name LifestealAction + +@export var damage_minimum: int +@export var damage_maximum: int +@export var can_miss: bool = true + +## Percent of damage to heal back (0.0 - 1.0) +@export_range(0.0, 1.0, 0.05) var lifesteal_percent: float = 0.5 + +func run(context: ActionContext) -> void: + var damage = randi_range(damage_minimum, damage_maximum) + var heal = roundi(damage * lifesteal_percent) + for target in resolve_targets(context): + BattleManager.apply_damage(damage, context.source, target) + BattleManager.apply_healing(heal, context.source, context.source) diff --git a/scripts/ability/action/lifesteal_action.gd.uid b/scripts/ability/action/lifesteal_action.gd.uid new file mode 100644 index 0000000..4083a54 --- /dev/null +++ b/scripts/ability/action/lifesteal_action.gd.uid @@ -0,0 +1 @@ +uid://coagjoj2grxm7 diff --git a/scripts/ability/action/steal_status_action.gd b/scripts/ability/action/steal_status_action.gd new file mode 100644 index 0000000..97af362 --- /dev/null +++ b/scripts/ability/action/steal_status_action.gd @@ -0,0 +1,15 @@ +extends TargetAction +class_name StealStatusAction + +const EffectType = BaseStatusEffect.EffectType + +@export var stacks_to_steal: int = 1 + +func run(context: ActionContext) -> void: + for target in resolve_targets(context): + var effects = target.get_all_status_effects().filter(func(e): return e.effect.effect_type == EffectType.POSITIVE) + if effects.is_empty(): + return + var stolen: StatusEffectContainer = effects.pick_random() + target.remove_status_effect(stolen.effect, stacks_to_steal) + context.source.add_status_effect(stolen.effect, stolen.source, stacks_to_steal, 0) diff --git a/scripts/ability/action/steal_status_action.gd.uid b/scripts/ability/action/steal_status_action.gd.uid new file mode 100644 index 0000000..7ab2adc --- /dev/null +++ b/scripts/ability/action/steal_status_action.gd.uid @@ -0,0 +1 @@ +uid://deeb01dip6syv diff --git a/scripts/status_effects/base_status_effect.gd b/scripts/status_effects/base_status_effect.gd index 5adbed2..ce5c12e 100644 --- a/scripts/status_effects/base_status_effect.gd +++ b/scripts/status_effects/base_status_effect.gd @@ -13,6 +13,16 @@ signal updated ## The icon to show next to the character. @export var icon: Texture2D +## Type of status effect +enum EffectType { + POSITIVE, + NEGATIVE, + LOCKED +} + +## Whether this effect is positive, negative, or locked (cannot be transferred). +@export var effect_type: EffectType = EffectType.NEGATIVE + # --- Virtual Methods --- # Override in subclasses to customize behavior.