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 @@ -68,8 +68,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"
// DARKPACK TODO - refactor these traits into mutant bodyparts and a component maybe
/// If eyes are uncovered, they will be obviously supernatural to everyone nearby
#define TRAIT_MASQUERADE_VIOLATING_EYES "masquerade_violating_eyes"
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 @@ -11,3 +11,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 @@ -403,7 +403,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT,
"TRAIT_LITERATE" = TRAIT_LITERATE,
"TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM,
"TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD
"TRAIT_DIFFICULT_FRENZY" = TRAIT_DIFFICULT_FRENZY, // DARKPACK EDIT ADD
"TRAIT_LOUD_BINARY" = TRAIT_LOUD_BINARY,
"TRAIT_LUMINESCENT_EYES" = TRAIT_LUMINESCENT_EYES,
"TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE,
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 @@ -460,6 +460,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 @@ -13,10 +13,8 @@
if(brain)
brain.organ_flags |= ORGAN_FAILING

/*
if(HAS_TRAIT(src, TRAIT_IN_FRENZY))
exit_frenzymod()
*/
exit_frenzy_mode()
SEND_SOUND(src, sound('modular_darkpack/modules/vampire_the_masquerade/sounds/final_death.ogg', volume = 50))

switch (chronological_age)
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)
12 changes: 1 addition & 11 deletions modular_darkpack/modules/blood_drinking/code/vamp_bite.dm
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,7 @@
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
if(!skipface)
if(iskindred(src) && HAS_TRAIT(src, TRAIT_NEEDS_BLOOD))
var/datum/splat/vampire/kindred/kindred_species = iskindred(src)
var/stat_to_roll = kindred_species.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)
bit_living.visible_message(span_warning(span_bold("[src] bites [bit_living]'s neck!")), span_warning(span_bold("[src] bites your neck!")))
Expand Down
193 changes: 133 additions & 60 deletions modular_darkpack/modules/frenzy/code/frenzy.dm
Original file line number Diff line number Diff line change
@@ -1,90 +1,143 @@
//Here's things for future madness
// V20 p.298 + W20 p.261

//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
..()
*/


/*
/datum/storyteller_roll/frenzy
/mob/living/carbon/proc/rollfrenzy()
if(client)
if(isgarou(src) || iswerewolf(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(iskindred(src))
to_chat(src, "I need [span_danger("<b>BLOOD</b>")]. The [span_danger("<b>BEAST</b>")] is calling. Rolling...")
if(!client && !isnpc(src)) // I guess this is to make sure afk players dont have there characters frenzy while they arent here?
return

if(iskindred(src))
to_chat(src, "I need [span_danger("<b>BLOOD</b>")]. The [span_danger("<b>BEAST</b>")] is calling. Rolling...")
/* // DARKPACK TODO - WEREWOLF
else if(isshifter(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
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_DIFFICULT_FRENZY) ? 2 : 1

switch(check)
if (DICE_CRIT_FAILURE)
enter_frenzy_mode()
addtimer(CALLBACK(src, PROC_REF(exit_frenzy_mode)), 3 TURNS * length_modifier)
frenzy_hardness = 1
if (DICE_FAILURE)
enter_frenzy_mode()
addtimer(CALLBACK(src, PROC_REF(exit_frenzy_mode)), 1 TURNS * length_modifier)
frenzy_hardness = 1
if (DICE_CRIT_WIN)
frenzy_hardness = max(1, frenzy_hardness - 1)
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)
frenzy_hardness = min(10, frenzy_hardness + 1)
*/

/mob/living/carbon/proc/enter_frenzymod()
if (in_frenzy)
/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)), 3 TURNS)

/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

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/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)
return
// Mabye change some logic to signals as well.
if(iskindred(src))
enter_frenzy_mode(fire, TRUE)

/mob/living/carbon/proc/trigger_kindred_frenzy(atom/target, difficulty = 6, flavor_text = "Something")
var/datum/splat/vampire/kindred/kindred_species = iskindred(src)
var/stat_to_roll = kindred_species.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


/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(iskindred(src))
if(fear)
step_away(src,fear,99)
Expand Down Expand Up @@ -122,7 +175,9 @@
else
step_to(src,frenzy_target,0)
face_atom(frenzy_target)
*/

/*
/mob/living/carbon/proc/get_frenzy_targets()
var/list/targets = list()
if(iskindred(src))
Expand All @@ -141,7 +196,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 +210,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
/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(iskindred(src))
trigger_kindred_frenzy(AM)
else
enter_frenzy_mode(AM)
40 changes: 40 additions & 0 deletions modular_darkpack/modules/frenzy/code/status_effect.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/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_ref

/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_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,
))

/datum/status_effect/frenzy/on_remove()
var/datum/atom_hud/hud = frenzy_ref.resolve()
if(hud)
qdel(hud)
QDEL_NULL(frenzy_ref)
owner.remove_client_colour(FRENZY_TRAIT)
return ..()

/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 @@ -13,7 +13,7 @@

add_verb(parent_mob, /mob/verb/emotion_panel)
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()
Expand All @@ -22,7 +22,7 @@
target_hud.remove_atom_from_hud(parent_mob)

remove_verb(parent_mob, /mob/verb/emotion_panel)
UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA))
UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, 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