diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 5291c3c51d00..393e5b1c1a7d 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -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" diff --git a/code/__DEFINES/~darkpack/traits/sources.dm b/code/__DEFINES/~darkpack/traits/sources.dm index 6402f89925de..27de70c1cba1 100644 --- a/code/__DEFINES/~darkpack/traits/sources.dm +++ b/code/__DEFINES/~darkpack/traits/sources.dm @@ -11,3 +11,5 @@ // used by the obfuscate ability #define OBFUSCATE_TRAIT "obfuscate_trait" + +#define FRENZY_TRAIT "frenzy" // FRENZY diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 4b30fcfba89b..95c8a5b7a44d 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -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, diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index 4a4ab465f0ae..b587f47cfd8d 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -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() . = ..() diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm index 5e1cc763e372..0c8450e0362f 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm @@ -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) diff --git a/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm b/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm index d7bb45fbd1a6..a0d21c6823b7 100644 --- a/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm +++ b/modular_darkpack/modules/blood_drinking/code/kiss_status_effect/status_effect_kiss.dm @@ -7,7 +7,7 @@ /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) @@ -15,7 +15,7 @@ /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 @@ -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) diff --git a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm index 5317381c1521..eed5592b5510 100644 --- a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm +++ b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm @@ -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!"))) diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index 0c92e39d15a0..a339d2a91d8f 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -1,7 +1,7 @@ -//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)) @@ -9,82 +9,135 @@ 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("ANGER")], and I'm about to flare up in [span_danger("RAGE")]. Rolling...") - else if(iskindred(src)) - to_chat(src, "I need [span_danger("BLOOD")]. The [span_danger("BEAST")] 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("BLOOD")]. The [span_danger("BEAST")] is calling. Rolling...") + /* // DARKPACK TODO - WEREWOLF + else if(isshifter(src)) + to_chat(src, "I'm full of [span_danger("ANGER")], and I'm about to flare up in [span_danger("RAGE")]. Rolling...") + */ + else + to_chat(src, "I'm too [span_danger("AFRAID")] 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("AFRAID")] 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) @@ -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)) @@ -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) @@ -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) diff --git a/modular_darkpack/modules/frenzy/code/status_effect.dm b/modular_darkpack/modules/frenzy/code/status_effect.dm new file mode 100644 index 000000000000..9b87b8ffdafd --- /dev/null +++ b/modular_darkpack/modules/frenzy/code/status_effect.dm @@ -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" + diff --git a/modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi b/modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi new file mode 100644 index 000000000000..229075cd7c69 Binary files /dev/null and b/modular_darkpack/modules/frenzy/icons/frenzy_overlay.dmi differ diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm index dbe6f5ed2ef3..702bfbb74a02 100644 --- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm +++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm @@ -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() @@ -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) diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm index 15fae4a95cb5..c78fc8700176 100644 --- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm +++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm @@ -48,15 +48,16 @@ return ROLL_FAILURE var/dice_amount = calculate_used_dice(roller, bonus) + var/used_difficulty = calculate_used_difficulty(roller) var/list/rolled_dice = roll_dice(dice_amount) - var/first_line = "[span_tooltip(show_rolling_with(roller, bonus), "[dice_amount] dice")] vs. difficulty [difficulty]." + var/first_line = "[span_tooltip(show_rolling_with(roller, bonus), "[dice_amount] dice")] vs. difficulty [used_difficulty]." if(successes_needed > 1) first_line += " [successes_needed] successes needed." last_output_text += span_notice(first_line) - last_sucess_amount = count_success(rolled_dice, difficulty, last_output_text) + last_sucess_amount = count_success(rolled_dice, used_difficulty, last_output_text) var/output = roll_result(last_sucess_amount) var/title @@ -121,6 +122,9 @@ /datum/storyteller_roll/proc/using_stats(mob/living/roller) return applicable_stats +/datum/storyteller_roll/proc/calculate_used_difficulty(mob/living/roller) + return difficulty + /datum/storyteller_roll/proc/show_rolling_with(mob/living/roller, bonus = 0) var/output = "" var/stuff = list() diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm index 805920fed25e..b95f06b05c6a 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/brujah.dm @@ -10,7 +10,7 @@ /datum/discipline/presence ) clan_traits = list( - TRAIT_LONGER_FRENZY + TRAIT_DIFFICULT_FRENZY ) male_clothes = /obj/item/clothing/under/vampire/brujah female_clothes = /obj/item/clothing/under/vampire/brujah/female diff --git a/tgstation.dme b/tgstation.dme index 367abcf91a06..1a98fa6aaf2b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7152,6 +7152,8 @@ #include "modular_darkpack\modules\forensics\code\forensic_gatherer.dm" #include "modular_darkpack\modules\forensics\code\serial_number_log.dm" #include "modular_darkpack\modules\forensics\code\serial_numbering.dm" +#include "modular_darkpack\modules\frenzy\code\frenzy.dm" +#include "modular_darkpack\modules\frenzy\code\status_effect.dm" #include "modular_darkpack\modules\government\code\carry_permit.dm" #include "modular_darkpack\modules\government\code\drivers_license.dm" #include "modular_darkpack\modules\government\code\passport.dm"