Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions code/__DEFINES/~darkpack/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_REPELLED_BY_HOLINESS "repelled_by_holiness"
/// Any changes in this Kindred's Humanity will be doubled
#define TRAIT_SENSITIVE_HUMANITY "sensitive_humanity"
/// Duration of frenzy is doubled
#define TRAIT_LONGER_FRENZY "longer_frenzy"
/// Difficultie rolls to resist or guide frenzy are two higher. They can also never spend willpower to avoid frenzy
#define TRAIT_DIFFICULT_FRENZY "difficult_frenzy"
// Setite weakness, sunlight is particularly bad bad.
#define TRAIT_LIGHT_WEAKNESS "light_weakness"
// DARKPACK TODO - refactor these traits into mutant bodyparts and a component maybe
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/~darkpack/traits/sources.dm
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@

// used by the obfuscate ability
#define OBFUSCATE_TRAIT "obfuscate_trait"

#define FRENZY_TRAIT "frenzy" // FRENZY
2 changes: 1 addition & 1 deletion code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
"TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD
"TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD
"TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw
"TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD
Expand Down Expand Up @@ -744,6 +743,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_WTA_GAROU_TRIBE" = TRAIT_WTA_GAROU_TRIBE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_DIFFICULT_FRENZY" = TRAIT_DIFFICULT_FRENZY, // DARKPACK EDIT ADD - FRENZY
),
/mob/living/carbon = list(
"TRAIT_BRAINLESS_CARBON" = TRAIT_BRAINLESS_CARBON,
Expand Down
2 changes: 1 addition & 1 deletion code/_globalvars/traits/admin_tooling.dm
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
"TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD
"TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD
"TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw
"TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD
Expand Down Expand Up @@ -427,6 +426,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_WTA_GAROU_TRIBE" = TRAIT_WTA_GAROU_TRIBE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_DIFFICULT_FRENZY" = TRAIT_DIFFICULT_FRENZY, // DARKPACK EDIT ADD - FRENZY
),
/obj/item = list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/cigarettes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/mob/living/carbon/smoker = loc
if(src == smoker.wear_mask)
make_mob_smoke(smoker)
smoker.trigger_rotschreck(src, 3) // DARKPACK EDIT ADD - FRENZY

/obj/item/cigarette/extinguish()
. = ..()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
/datum/status_effect/kissed/on_apply()
. = ..()
to_chat(owner, span_userlove("Sharp fangs pierce your skin, but the pain quickly fades as a numbing warmth sets in...")) //feel free to change these
owner.add_client_colour(/datum/client_colour/brightened)
owner.add_client_colour(/datum/client_colour/brightened, "kissed")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.adjust_eye_blur(15)
H.adjust_dizzy(10)

/datum/status_effect/kissed/on_remove()
to_chat(owner, span_userlove("As you wake, you find it hard to recall anything of the past few minutes. All you remember is a pleasant, warm feeling.")) //feel free to change these
owner.remove_client_colour(/datum/client_colour/brightened)
owner.remove_client_colour("kissed")
owner.SetSleeping(50)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
Expand All @@ -28,5 +28,5 @@
icon_state = "in_love" //would be good to give this it's own icon eventually

/datum/client_colour/brightened
priority = CLIENT_COLOR_HELMET_PRIORITY
priority = CLIENT_COLOR_IMPORTANT_PRIORITY
color = list(1.15,0,0,0,1.15,0,0,0,1.15,0,0,0)
10 changes: 1 addition & 9 deletions modular_darkpack/modules/blood_drinking/code/vamp_bite.dm
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,7 @@
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
if(!skipface)
if(get_kindred_splat(src) && HAS_TRAIT(src, TRAIT_NEEDS_BLOOD))
var/stat_to_roll = is_enlightenment() ? STAT_INSTINCT : STAT_SELF_CONTROL
var/datum/storyteller_roll/frezy_roll = new()
frezy_roll.applicable_stats = list(stat_to_roll)
var/frenzy_result = frezy_roll.st_roll(src, bit_living)
if(frenzy_result != ROLL_SUCCESS)
to_chat(src, span_userdanger("The taste of blood sends you into a frenzy as you feed!"))
// DARKPACK TODO: frenzy, please put the call here
else
to_chat(src, span_green("The taste of fresh blood while hungry almost drives you into frenzy!"))
trigger_kindred_frenzy(bit_living, 6, "The taste of blood while hungry")

if(!HAS_TRAIT(src, TRAIT_BLOODY_LOVER))
playsound(src, 'modular_darkpack/modules/blood_drinking/sounds/drinkblood1.ogg', 50, TRUE)
Expand Down
167 changes: 96 additions & 71 deletions modular_darkpack/modules/frenzy/code/frenzy.dm
Original file line number Diff line number Diff line change
@@ -1,90 +1,95 @@
//Here's things for future madness

//add_client_colour(/datum/client_colour/glass_colour/red)
//remove_client_colour(/datum/client_colour/glass_colour/red)
/client/Click(object,location,control,params)
if(isatom(object))
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
if(H.in_frenzy)
return
..()

/mob/living/carbon/proc/rollfrenzy()
if(client)
if(get_garou_splat(src))
to_chat(src, "I'm full of [span_danger("<b>ANGER</b>")], and I'm about to flare up in [span_danger("<b>RAGE</b>")]. Rolling...")
else if(get_kindred_splat(src))
to_chat(src, "I need [span_danger("<b>BLOOD</b>")]. The [span_danger("<b>BEAST</b>")] is calling. Rolling...")
else
to_chat(src, "I'm too [span_danger("<b>AFRAID</b>")] to continue doing this. Rolling...")
SEND_SOUND(src, sound('modular_darkpack/modules/deprecated/sounds/bloodneed.ogg', volume = 50))

var/check = SSroll.storyteller_roll(max(1, round(humanity/2)), min(frenzy_chance_boost, frenzy_hardness), src)

// Modifier for frenzy duration
var/length_modifier = HAS_TRAIT(src, TRAIT_LONGER_FRENZY) ? 2 : 1

switch(check)
if (DICE_CRIT_FAILURE)
enter_frenzymod()
addtimer(CALLBACK(src, PROC_REF(exit_frenzymod)), 20 SECONDS * length_modifier)
frenzy_hardness = 1
if (DICE_FAILURE)
enter_frenzymod()
addtimer(CALLBACK(src, PROC_REF(exit_frenzymod)), 10 SECONDS * length_modifier)
frenzy_hardness = 1
if (DICE_CRIT_WIN)
frenzy_hardness = max(1, frenzy_hardness - 1)
else
frenzy_hardness = min(10, frenzy_hardness + 1)
// V20 p.298 + W20 p.261

/mob/living/carbon/proc/enter_frenzymod()
if (in_frenzy)
// Fleeing is used for either fox frenzies, or rotschreck
/mob/living/carbon/proc/enter_frenzy_mode(atom/target, fleeing = FALSE)
if(HAS_TRAIT(src, TRAIT_IN_FRENZY))
return
ADD_TRAIT(src, TRAIT_IN_FRENZY, FRENZY_TRAIT)
message_admins("[ADMIN_LOOKUPFLW(src)] has entered frenzy")
log_message("entered frenzy.", LOG_GAME)

if(fleeing)
to_chat(src, span_danger("FLEE."))
else
to_chat(src, span_bolddanger("FRENZY."))

SEND_SOUND(src, sound('modular_darkpack/modules/frenzy/sounds/frenzy.ogg', volume = 50))
in_frenzy = TRUE
add_client_colour(/datum/client_colour/glass_colour/red)
demon_chi = 0
GLOB.frenzy_list += src

/mob/living/carbon/proc/exit_frenzymod()
if (!in_frenzy)
apply_status_effect(/datum/status_effect/frenzy, target)

// This is assuming no other interaction happens to remove it before this.
addtimer(CALLBACK(src, PROC_REF(exit_frenzy_mode)), 1 SCENES)

/mob/living/carbon/proc/exit_frenzy_mode()
if(!HAS_TRAIT(src, TRAIT_IN_FRENZY))
return
REMOVE_TRAIT(src, TRAIT_IN_FRENZY, FRENZY_TRAIT)
log_message("exited frenzy.", LOG_GAME)

remove_status_effect(/datum/status_effect/frenzy)

/datum/storyteller_roll/frenzy
abstract_type = /datum/storyteller_roll/frenzy
bumper_text = "frenzy"
numerical = TRUE

/datum/storyteller_roll/frenzy/calculate_used_difficulty(mob/living/roller)
. = ..()
// V20 p.51
if(HAS_TRAIT(roller, TRAIT_DIFFICULT_FRENZY))
. += 2

/datum/storyteller_roll/frenzy/rotschreck
applicable_stats = list(STAT_COURAGE)

/datum/storyteller_roll/frenzy/kindred

/mob/living/carbon/proc/trigger_rotschreck(atom/fire, difficulty = 6)
var/datum/storyteller_roll/frenzy/rotschreck/frenzy_roll = new()
frenzy_roll.difficulty = difficulty
var/frenzy_result = frenzy_roll.st_roll(src, fire)
if(frenzy_result >= 5) // five is to COMPLTELY ignore it. anything lower.... delays it?
return
// Mabye change some logic to signals as well.
if(get_kindred_splat(src))
enter_frenzy_mode(fire, TRUE)

/mob/living/carbon/proc/trigger_kindred_frenzy(atom/target, difficulty = 6, flavor_text = "Something")
var/stat_to_roll = is_enlightenment() ? STAT_INSTINCT : STAT_SELF_CONTROL
var/datum/storyteller_roll/frenzy/kindred/frenzy_roll = new()
frenzy_roll.applicable_stats = list(stat_to_roll)
frenzy_roll.difficulty = difficulty
var/frenzy_result = frenzy_roll.st_roll(src, target)
if(frenzy_result >= 5)
to_chat(src, span_green("[flavor_text] almost drives you into frenzy!"))
return
to_chat(src, span_userdanger("[flavor_text] sends you into a frenzy!"))
enter_frenzy_mode(target)

// Unimplemented


in_frenzy = FALSE
remove_client_colour(/datum/client_colour/glass_colour/red)
GLOB.frenzy_list -= src

/mob/living/carbon/proc/CheckFrenzyMove()
if(stat >= SOFT_CRIT)
return TRUE
if(IsSleeping())
return TRUE
if(IsUnconscious())
return TRUE
if(IsParalyzed())
return TRUE
if(IsKnockdown())
return TRUE
if(IsStun())
return TRUE
/mob/living/carbon/proc/can_frenzy_move()
if(HAS_TRAIT(src, TRAIT_INCAPACITATED))
return FALSE
if(HAS_TRAIT(src, TRAIT_RESTRAINED))
return TRUE
return FALSE

return TRUE

/mob/living/carbon/proc/frenzystep()
if(!isturf(loc) || CheckFrenzyMove())
if(!isturf(loc) || can_frenzy_move())
return
if(move_intent == MOVE_INTENT_WALK)
toggle_move_intent(src)
set_glide_size(DELAY_TO_GLIDE_SIZE(cached_multiplicative_slowdown))

var/atom/fear = get_closest_atom(/obj/effect/abstract/turf_fire, view(7, src), src)

// if(!fear && !frenzy_target)
// return
var/frenzy_target
if(!fear && !frenzy_target)
return

/*
if(get_kindred_splat(src))
if(fear)
step_away(src,fear,99)
Expand Down Expand Up @@ -122,7 +127,9 @@
else
step_to(src,frenzy_target,0)
face_atom(frenzy_target)
*/

/*
/mob/living/carbon/proc/get_frenzy_targets()
var/list/targets = list()
if(get_kindred_splat(src))
Expand All @@ -141,7 +148,9 @@
return pick(targets)
else
return null
*/

/*
/mob/living/carbon/proc/handle_automated_frenzy()
for(var/mob/living/carbon/human/npc/NPC in viewers(5, src))
NPC.Aggro(src)
Expand All @@ -153,8 +162,24 @@
for(var/i in 1 to reqsteps)
addtimer(cb, (i - 1)*cached_multiplicative_slowdown)
else
if(!CheckFrenzyMove())
if(!can_frenzy_move())
if(isturf(loc))
var/turf/T = get_step(loc, pick(NORTH, SOUTH, WEST, EAST))
face_atom(T)
Move(T)
*/

#warn placeholder, mostly for easy debugging atm

Check warning on line 172 in modular_darkpack/modules/frenzy/code/frenzy.dm

View workflow job for this annotation

GitHub Actions / Run Linters / linters

OD1201: #warn placeholder, mostly for easy debugging atm

Check warning on line 172 in modular_darkpack/modules/frenzy/code/frenzy.dm

View workflow job for this annotation

GitHub Actions / Run Linters / linters

#warn placeholder, mostly for easy debugging atm
/mob/living/carbon/verb/manual_frenzy(atom/movable/AM as mob|obj in oview(7))
set name = "Frenzy"
set category = "Object"

if(!istype(AM))
return
if(!issupernatural(src))
return

if(get_kindred_splat(src))
trigger_kindred_frenzy(AM)
else
enter_frenzy_mode(AM)
61 changes: 61 additions & 0 deletions modular_darkpack/modules/frenzy/code/status_effect.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/datum/client_colour/frenzy
priority = CLIENT_COLOR_IMPORTANT_PRIORITY
color = COLOR_RED

/datum/status_effect/frenzy
id = "frenzy"
duration = STATUS_EFFECT_PERMANENT
status_type = STATUS_EFFECT_REFRESH
alert_type = /atom/movable/screen/alert/status_effect/frenzy
var/datum/weakref/frenzy_target_ref
var/datum/weakref/frenzy_overlay_ref
var/seconds_alone = 0

/datum/status_effect/frenzy/on_creation(mob/living/new_owner, atom/frenzy_target)
. = ..()
if(!.)
return
new_owner.add_client_colour(/datum/client_colour/frenzy, FRENZY_TRAIT)

if(frenzy_target)
frenzy_overlay_ref = WEAKREF(frenzy_target.add_alt_appearance(
/datum/atom_hud/alternate_appearance/basic/one_person,
"frenzy_target",
image(icon = 'modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi', icon_state = "frenzy_overlay", loc = frenzy_target),
null,
new_owner,
))
frenzy_target_ref = WEAKREF(frenzy_target)

/datum/status_effect/frenzy/on_remove()
var/datum/atom_hud/hud = frenzy_overlay_ref.resolve()
if(hud)
qdel(hud)
QDEL_NULL(frenzy_overlay_ref)
owner.remove_client_colour(FRENZY_TRAIT)
var/mob/living/carbon/carbon_owner = astype(owner)
carbon_owner?.exit_frenzy_mode()
return ..()

/datum/status_effect/frenzy/tick(seconds_between_ticks)
. = ..()

// If left alone for an extended time, frenzies can end on their own
if(locate(/mob/living/carbon/human) in oview(world.view, owner))
seconds_alone = 0
// If our target is nearby, keep frenzying (a human or even a fire)
else if(frenzy_target_ref?.resolve() in view(world.view, owner))
seconds_alone = 0
else
seconds_alone += seconds_between_ticks

if(seconds_alone >= 15)
qdel(src)


/atom/movable/screen/alert/status_effect/frenzy
name = "Frenzy"
desc = "FRENZY."
icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi'
icon_state = "fear"

Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
target_hud.add_atom_to_hud(parent_mob)

RegisterSignal(parent_mob, COMSIG_MOB_EMOTION_CHANGED, PROC_REF(update_emotions))
RegisterSignal(parent_mob, COMSIG_MOB_UPDATE_AURA, PROC_REF(update_aura))
RegisterSignals(parent_mob, list(COMSIG_MOB_UPDATE_AURA, COMSIG_LIVING_GAINED_SPLAT, COMSIG_LIVING_LOSE_SPLAT, SIGNAL_ADDTRAIT(TRAIT_IN_FRENZY), SIGNAL_REMOVETRAIT(TRAIT_IN_FRENZY)), PROC_REF(update_aura))
update_aura()

/datum/component/aura/UnregisterFromParent()
var/mob/parent_mob = parent
var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS]
target_hud.remove_atom_from_hud(parent_mob)

UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA))
UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA, COMSIG_LIVING_GAINED_SPLAT, COMSIG_LIVING_LOSE_SPLAT, SIGNAL_ADDTRAIT(TRAIT_IN_FRENZY), SIGNAL_REMOVETRAIT(TRAIT_IN_FRENZY)))
return ..()

/datum/component/aura/proc/update_emotions(mob/changed_mob, new_emotion)
Expand Down
Loading
Loading