From 7d8c51504bc971b1da84eea575e509055dd475ff Mon Sep 17 00:00:00 2001 From: MisterMikah Date: Fri, 27 Mar 2026 15:49:23 -0700 Subject: [PATCH] Lifesteal and 2 New Actions (Steal_Status and Lifesteal) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Life Steal • Steal HP from the enemy Level 2 • Increased damage and HP Steal Level 3 (Life Thief) • Chance to steal a positive status effect from an enemy Level 4 • Increased damage • HP stolen completely matches damage dealt StealStatusAction — Created a new action that steals a random positive status effect from the target and applies it to the source, with a configurable number of stacks to steal. LifestealAction — Created a new action that deals damage and heals the source for a percentage of the raw damage rolled. BaseStatusEffect — Added an EffectType enum (POSITIVE, NEGATIVE, LOCKED) to classify status effects, used to filter which effects can be stolen. --- .../abilities/coralleine/lifesteal_1.tres | 17 +++++++++ .../abilities/coralleine/lifesteal_2.tres | 17 +++++++++ .../abilities/coralleine/lifesteal_3.tres | 35 ++++++++++++++++++ .../abilities/coralleine/lifesteal_4.tres | 36 +++++++++++++++++++ scripts/ability/action/lifesteal_action.gd | 16 +++++++++ .../ability/action/lifesteal_action.gd.uid | 1 + scripts/ability/action/steal_status_action.gd | 15 ++++++++ .../ability/action/steal_status_action.gd.uid | 1 + scripts/status_effects/base_status_effect.gd | 10 ++++++ workspaces/artemis/artemis-main.tscn | 8 ++--- 10 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 resources/abilities/coralleine/lifesteal_1.tres create mode 100644 resources/abilities/coralleine/lifesteal_2.tres create mode 100644 resources/abilities/coralleine/lifesteal_3.tres create mode 100644 resources/abilities/coralleine/lifesteal_4.tres create mode 100644 scripts/ability/action/lifesteal_action.gd create mode 100644 scripts/ability/action/lifesteal_action.gd.uid create mode 100644 scripts/ability/action/steal_status_action.gd create mode 100644 scripts/ability/action/steal_status_action.gd.uid 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 deb2b23..5d6e52e 100644 --- a/scripts/status_effects/base_status_effect.gd +++ b/scripts/status_effects/base_status_effect.gd @@ -11,6 +11,16 @@ class_name BaseStatusEffect ## 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. diff --git a/workspaces/artemis/artemis-main.tscn b/workspaces/artemis/artemis-main.tscn index 5a5ef29..f64e8d2 100644 --- a/workspaces/artemis/artemis-main.tscn +++ b/workspaces/artemis/artemis-main.tscn @@ -4,11 +4,11 @@ [ext_resource type="Script" uid="uid://c2dcuh7wij0sh" path="res://scripts/battle_logic/battle_character.gd" id="1_ha2wl"] [ext_resource type="Script" uid="uid://ny1mjfoo1mqc" path="res://scripts/ability/ability.gd" id="2_dq3ge"] [ext_resource type="Script" uid="uid://doviul66xwvvb" path="res://workspaces/artemis/health_label.gd" id="3_dq3ge"] -[ext_resource type="Resource" uid="uid://b6mlqpxywhb6g" path="res://resources/abilities/heal.tres" id="3_lhvlb"] +[ext_resource type="Resource" uid="uid://b6mlqpxywhb6g" path="res://resources/abilities/umi/heal.tres" id="3_lhvlb"] [ext_resource type="Resource" uid="uid://c71y0pm2tt1g" path="res://resources/abilities/fortune/pierce/pierce_1.tres" id="4_lhvlb"] -[ext_resource type="Resource" uid="uid://bnv8ckim477pc" path="res://resources/abilities/strength.tres" id="6_vmnyc"] -[ext_resource type="Resource" uid="uid://y06qhqwsm5s3" path="res://resources/abilities/burn.tres" id="7_ra02i"] -[ext_resource type="Resource" uid="uid://sg2oek573oja" path="res://resources/abilities/bleed.tres" id="8_6onex"] +[ext_resource type="Resource" uid="uid://bnv8ckim477pc" path="res://resources/abilities/fortune/strength.tres" id="6_vmnyc"] +[ext_resource type="Resource" uid="uid://y06qhqwsm5s3" path="res://resources/abilities/umi/burn.tres" id="7_ra02i"] +[ext_resource type="Resource" uid="uid://sg2oek573oja" path="res://resources/abilities/fortune/bleed.tres" id="8_6onex"] [ext_resource type="Script" uid="uid://b1qn3ek7b7ps4" path="res://workspaces/artemis/turn_label.gd" id="8_h88bq"] [node name="Node2D" type="Node2D" unique_id=217755439 node_paths=PackedStringArray("player_team", "boss_team")]