Adds two fantasy affixes (#89257)

## About The Pull Request

- Adds a fantasy affix that makes your attacks with the item cause a
chain lightning, which shocks people. The damage, distance, and limit
are all based on quality.
- Adds a fantasy affix that makes your attacks with the item slow the
target's click cd, making them take longer between attacks. The penalty
is based on quality.

## Why It's Good For The Game

BiS for main tanks

## Changelog

🆑 Melbert
add: Adds two fantasy affixes
/🆑
This commit is contained in:
MrMelbert
2025-02-08 17:35:11 -06:00
committed by GitHub
parent f8f3f698ae
commit a2afa509aa
6 changed files with 142 additions and 4 deletions
@@ -161,3 +161,26 @@
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/soul_stealer)
return "soul-[pick("stealing", "hungering", "devouring")] [newName]"
// On hitting a mob chain lightning will jump to another mob within 2 tiles of the original target
/datum/fantasy_affix/thunderfury
name = "Thunderfury"
placement = AFFIX_PREFIX
alignment = AFFIX_GOOD
weight = 3
/datum/fantasy_affix/thunderfury/apply(datum/component/fantasy/comp, newName)
comp.parent.AddElement(/datum/element/chain_lightning_attack, get_damage(comp), get_range(comp), get_limit(comp))
return "Thunderfury, Blessed [newName]"
/datum/fantasy_affix/thunderfury/remove(datum/component/fantasy/comp)
comp.parent.RemoveElement(/datum/element/chain_lightning_attack, get_damage(comp), get_range(comp), get_limit(comp))
/datum/fantasy_affix/thunderfury/proc/get_damage(datum/component/fantasy/comp)
return min(round(comp.quality, 2), 20)
/datum/fantasy_affix/thunderfury/proc/get_range(datum/component/fantasy/comp)
return min(round(sqrt(comp.quality), 1), 3)
/datum/fantasy_affix/thunderfury/proc/get_limit(datum/component/fantasy/comp)
return min(round(sqrt(comp.quality), 1), 3)
@@ -290,3 +290,20 @@
/datum/fantasy_affix/doot/remove(datum/component/fantasy/comp)
comp.parent.RemoveElement(/datum/element/spooky, too_spooky = comp.quality > 17, stam_damage_mult = comp.quality * 0.15)
// On hitting a mob their click cd is slowed marginally
/datum/fantasy_affix/windseeker
name = "of the Windseeker"
placement = AFFIX_SUFFIX
alignment = AFFIX_GOOD
weight = 3
/datum/fantasy_affix/windseeker/apply(datum/component/fantasy/comp, newName)
comp.parent.AddElement(/datum/element/slow_target_click_cd_attack, get_cd_penalty(comp))
return "[newName] of the Windseeker"
/datum/fantasy_affix/windseeker/remove(datum/component/fantasy/comp)
comp.parent.RemoveElement(/datum/element/slow_target_click_cd_attack, get_cd_penalty(comp))
/datum/fantasy_affix/windseeker/proc/get_cd_penalty(datum/component/fantasy/comp)
return min(round(sqrt(comp.quality) * 0.1, 0.1), 0.4) // this gives you a small number, like 0.2 seconds
@@ -0,0 +1,46 @@
/// Applied to an item: Causes the item to deal shock damage to a target and jump to other targets
/datum/element/chain_lightning_attack
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY
argument_hash_start_idx = 2
/// Damage dealt by the shock of the chain lightning
var/shock_damage
/// Range the shock will jump to another target
var/shock_range
/// Maximum number of jumps the chain lightning can make
var/chain_limit
/datum/element/chain_lightning_attack/Attach(datum/target, shock_damage = 10, shock_range = 2, chain_limit = 3)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
src.shock_damage = shock_damage
src.shock_range = shock_range
src.chain_limit = chain_limit
RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(try_chain))
/datum/element/chain_lightning_attack/Detach(datum/source, ...)
. = ..()
UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK)
/datum/element/chain_lightning_attack/proc/try_chain(obj/item/source, atom/hit, mob/user)
SIGNAL_HANDLER
if(!isliving(hit))
return
do_chain(source, hit, user, list(user))
/datum/element/chain_lightning_attack/proc/do_chain(obj/item/source, mob/living/next_target, atom/last_target, list/dont_hit = list())
if(!next_target.electrocute_act(shock_damage, source, flags = SHOCK_NOGLOVES|SHOCK_NOSTUN))
return
if(last_target != next_target)
last_target.Beam(next_target, icon_state = "lightning[rand(1, 12)]", time = 0.5 SECONDS)
dont_hit += next_target
if(length(dont_hit) >= chain_limit + 1)
return
for(var/mob/living/other_victim in view(next_target, shock_range))
if(other_victim in dont_hit)
continue
do_chain(source, other_victim, next_target, dont_hit)
break
@@ -0,0 +1,54 @@
/// Applied to items: Applies a status effect to the target that slows their click CD
/datum/element/slow_target_click_cd_attack
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY
argument_hash_start_idx = 2
/// How much click CD to add to the target's clicks
var/reduction
/datum/element/slow_target_click_cd_attack/Attach(datum/target, reduction = 0.2 SECONDS)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
src.reduction = reduction
RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(try_slow))
/datum/element/slow_target_click_cd_attack/Detach(datum/source, ...)
. = ..()
UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK)
/datum/element/slow_target_click_cd_attack/proc/try_slow(obj/item/source, atom/hit, mob/user)
SIGNAL_HANDLER
if(!isliving(hit))
return
var/mob/living/target = hit
target.apply_status_effect(/datum/status_effect/cd_slow, reduction, REF(src))
/// Applied by [/datum/element/slow_target_click_cd_attack] to slow the target's click CD
/datum/status_effect/cd_slow
id = "cd_slow"
duration = 4 SECONDS
status_type = STATUS_EFFECT_MULTIPLE
alert_type = null
tick_interval = STATUS_EFFECT_NO_TICK
/// How much click CD to add to the target's clicks
var/reduction
/// The source of the slow, they don't stack
var/source
/datum/status_effect/cd_slow/on_creation(mob/living/new_owner, reduction, source)
src.reduction = reduction
src.source = source
return ..()
/datum/status_effect/cd_slow/on_apply()
for(var/datum/status_effect/cd_slow/slow in owner)
if(slow.source == src.source)
slow.reduction = max(slow.reduction, src.reduction)
return FALSE
return TRUE
/datum/status_effect/cd_slow/nextmove_adjust()
return reduction
-4
View File
@@ -520,10 +520,6 @@
add_fingerprint(usr)
return ..()
/obj/item/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION(VV_HK_ADD_FANTASY_AFFIX, "Add Fantasy Affix")
/obj/item/vv_do_topic(list/href_list)
. = ..()
+2
View File
@@ -1462,6 +1462,7 @@
#include "code\datums\elements\can_barricade.dm"
#include "code\datums\elements\can_shatter.dm"
#include "code\datums\elements\caseless.dm"
#include "code\datums\elements\chain_lightning_attack.dm"
#include "code\datums\elements\chemical_transfer.dm"
#include "code\datums\elements\chewable.dm"
#include "code\datums\elements\cleaning.dm"
@@ -1578,6 +1579,7 @@
#include "code\datums\elements\skill_reward.dm"
#include "code\datums\elements\skittish.dm"
#include "code\datums\elements\slapcrafting.dm"
#include "code\datums\elements\slow_target_click_cd_attack.dm"
#include "code\datums\elements\soft_landing.dm"
#include "code\datums\elements\spooky.dm"
#include "code\datums\elements\squish.dm"