diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm index cd889cce6054..1c2468d0cf2c 100644 --- a/code/__DEFINES/~darkpack/splats.dm +++ b/code/__DEFINES/~darkpack/splats.dm @@ -11,11 +11,15 @@ #define SPLAT_CORAX "splat_corax" // DARKPACK TODO - CORAX #define SPLAT_SHIFTERS list(SPLAT_GAROU, SPLAT_CORAX) +#define SPLAT_FOMORI "splat_fomori" + #define SPLAT_PRIO_HALFSPLAT 100 #define SPLAT_PRIO_SPLAT 200 #define SPLAT_PRIO_KINFOLK 40 + SPLAT_PRIO_HALFSPLAT #define SPLAT_PRIO_GHOUL 70 + SPLAT_PRIO_HALFSPLAT +#define SPLAT_PRIO_FOMORI 20 + SPLAT_PRIO_SPLAT #define SPLAT_PRIO_SHIFTER 40 + SPLAT_PRIO_SPLAT #define SPLAT_PRIO_KINDRED 60 + SPLAT_PRIO_SPLAT + diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 15d361e121fa..668839579f5c 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -28,6 +28,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOODY_SUCKER "bloody_sucker" #define TRAIT_NON_INT "non_intellectual" #define TRAIT_COFFIN_THERAPY "coffin_therapy" +// If we use combat_bite instead of vamp_bite +#define TRAIT_COMBAT_BITE "combat_bite" #define TRAIT_RUBICON "rubicon" #define TRAIT_HUNGRY "hungry" #define TRAIT_STAKE_RESISTANT "stake_resistant" @@ -151,6 +153,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LOUD_HOWLER "loud_howler" #define TRAIT_RAZOR_CLAWS "razor_claws" +// Fomori Traits +#define TRAIT_FOMOR_REGEN "fomor_regen" + /// Sixth sense restricted to view range #define TRAIT_LOCAL_SIXTHSENSE "local_sixth_sense" /// If the mob can't have surgery done on it. See: Blood form Tzimisce diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 34ede6349de4..4aea72e4c2ff 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -679,6 +679,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD "TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD "TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD + "TRAIT_COMBAT_BITE" = TRAIT_COMBAT_BITE, // DARKPACK EDIT ADD "TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD "TRAIT_DECEPTIVE_AURA" = TRAIT_DECEPTIVE_AURA, // DARKPACK EDIT ADD "TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD @@ -695,6 +696,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FERA_FORMS" = TRAIT_FERA_FORMS, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_FOMOR_REGEN" = TRAIT_FOMOR_REGEN, // DARKPACK EDIT ADD - FOMORI "TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index a361a289db94..eb8c8c6e8924 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -370,6 +370,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD "TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD "TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD + "TRAIT_COMBAT_BITE" = TRAIT_COMBAT_BITE, // DARKPACK EDIT ADD "TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD "TRAIT_DECEPTIVE_AURA" = TRAIT_DECEPTIVE_AURA, // DARKPACK EDIT ADD "TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD @@ -384,6 +385,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD "TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_FOMOR_REGEN" = TRAIT_FOMOR_REGEN, // DARKPACK EDIT ADD - FOMORI "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) "TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index 5e8029099242..5f83d2d54ed7 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -43,6 +43,7 @@ ROUNDSTART_SPLATS splat_kindred ROUNDSTART_SPLATS splat_ghoul ROUNDSTART_SPLATS splat_kinfolk ROUNDSTART_SPLATS splat_garou +ROUNDSTART_SPLATS splat_fomori ## If dead people and ghosts can LOOC to people who are alive. DISABLE_GHOST_LOOC diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm index 1c3c3d17781d..254e564d5cc2 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm @@ -9,3 +9,7 @@ var/fakediablerist = FALSE var/can_be_embraced = TRUE + //stats for combat bites // used for lupus, crinos, hispo, fomori, etc. + var/list/combat_bite_damages = list(BRUTE = 1 LETHAL_TTRPG_DAMAGE, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 0) + var/list/combat_bite_stats = list(STAT_DEXTERITY, STAT_BRAWL) + var/list/combat_bite_difficulty = 5 diff --git a/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm b/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm index 39fcf252ca67..9c12cfa95be8 100644 --- a/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm +++ b/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm @@ -12,6 +12,9 @@ if(ishuman(user.mob)) var/mob/living/carbon/human/human_user = user.mob - human_user.vamp_bite() + if(HAS_TRAIT(human_user, TRAIT_COMBAT_BITE)) + human_user.combat_bite() + else + human_user.vamp_bite() return TRUE diff --git a/modular_darkpack/modules/blood_drinking/code/combat_bite.dm b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm new file mode 100644 index 000000000000..8b6cc4fb605a --- /dev/null +++ b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm @@ -0,0 +1,71 @@ +// Thanks to @hex37 for most of this +/** + * Biting for purposes other than drinking blood + * + * Arguments: + * * pulling - The mob we're biting + * * damage_type - What kind of damage we're doing as a list. If blank, grabs from vars. (ex. list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 0)) + */ +/mob/living/carbon/proc/combat_bite(list/damage_types) + if(!COOLDOWN_FINISHED(src, drinkblood_use_cd) || !COOLDOWN_FINISHED(src, drinkblood_click_cd)) + return + COOLDOWN_START(src, drinkblood_click_cd, 1 SECONDS) + if(!damage_types) + damage_types = combat_bite_damages + + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if(skipface) + to_chat(src, span_warning("Take your mask off first!")) + return + + if(grab_state > GRAB_PASSIVE) + if(isliving(pulling)) + var/mob/living/bit_living = pulling + visible_message(span_warning("[src] starts biting [bit_living] with [p_their()] sharp teeth!"), span_warning("You start biting [bit_living] with your sharp teeth!"), span_warning("You hear the sound of flesh tearing!")) + bit_living.emote("scream") + if(ishuman(bit_living)) + var/mob/living/carbon/human/bit_human = bit_living + bit_human.add_bite_animation() + + do_combat_bite(bit_living, damage_types, TRUE) + +/mob/living/carbon/proc/do_combat_bite(mob/living/chewed_on, list/damage_types, first_bite = FALSE) + + COOLDOWN_START(src, drinkblood_use_cd, 3 SECONDS) + + if(isnpc(chewed_on)) + var/mob/living/carbon/human/npc/NPC = chewed_on + NPC.danger_source = null + chewed_on.Stun(10) // NPCs can't resist right away + + if(chewed_on.health < (values_sum(damage_types)*1.5)) + to_chat(src, span_userdanger("Your victim is near death.")) + + if(!do_after(src, 2 SECONDS, target = chewed_on, timed_action_flags = NONE, progress = FALSE)) + stop_chewing(chewed_on) + return + + if(iscarbon(chewed_on)) + var/mob/living/carbon/chewtoy = chewed_on + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/damage/bite + roll_datum.difficulty = combat_bite_difficulty + var/roll_result = roll_datum.st_roll(src, chewtoy)+1 + if(roll_result) + for(var/damage_type, damage_amount in damage_types) + if(roll_result > 0) + chewtoy.apply_damage((damage_amount*roll_result), damage_type, sharpness = SHARP_POINTY) + playsound(get_turf(src), 'sound/items/weapons/bite.ogg', 50, TRUE) + + if(chewtoy.reagents) // We might ingest some blood on accident + if(length(chewtoy.reagents.reagent_list)) + if(prob(15)) // We might ingest some blood on accident + chewtoy.reagents.trans_to(src, min(10, chewtoy.reagents.total_volume), transferred_by = chewed_on, methods = INGEST) + + if(grab_state > GRAB_PASSIVE) + stop_sound_channel(CHANNEL_BLOOD) + do_combat_bite(chewed_on, damage_types) + +/mob/living/carbon/proc/stop_chewing() + stop_sound_channel(CHANNEL_BLOOD) + COOLDOWN_RESET(src, drinkblood_use_cd) + return diff --git a/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm b/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm index 594c1e6205b8..78ce63ff6242 100644 --- a/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm +++ b/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm @@ -10,4 +10,7 @@ /atom/movable/screen/drinkblood/proc/bite() if(ishuman(usr)) var/mob/living/carbon/human/human_user = usr - human_user.vamp_bite() + if(HAS_TRAIT(human_user, TRAIT_COMBAT_BITE)) + human_user.combat_bite() + else + human_user.vamp_bite() diff --git a/modular_darkpack/modules/fomori/README.md b/modular_darkpack/modules/fomori/README.md new file mode 100644 index 000000000000..2dac2a5c9c9c --- /dev/null +++ b/modular_darkpack/modules/fomori/README.md @@ -0,0 +1,25 @@ +https://github.com/DarkPack13/SecondCity/pull/953 + +## \ + +Module ID: FOMORI + +### Description: + +This module handles everything related to Fomori and their Powers, Taints, and Merits/Flaws. Dependent on BLOOD_DRINKING for the Combat Bite code. + +### TG Proc/File Changes: + +### Modular Overrides: + +### Defines: + +- N/A + +### Included files that are not contained in this module: + +- modular_darkpack/modules/blood_drinking/code/combat_bite.dm + +### Credits: + +dwinters99 (code), Major00 (sprites), Minzeyes (sprites) ((BLOCK PR IF THIS WARNING IS STILL HERE)), FalloutFallcon (troubleshooting), Chazzyjazzy (for gargoyle wings), hex37 (for blood-drinking code) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm new file mode 100644 index 000000000000..3f07982a16f9 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm @@ -0,0 +1,64 @@ +// Presently a dummy placeholder, might want to do stuff like flavor the ui, change the dice roll, make fomori_powers private by default or the like +/datum/storyteller_roll/fomori_power + +/datum/action/cooldown/power/fomori_power + background_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + background_icon_state = "bg_fomori_power" + button_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + //button_icon_state = "" + overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + + check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + + // Snowflake toggle behavior + var/deployed = FALSE + + // Body feature for horns, fangs, etc. + var/datum/bodypart_overlay/simple/fomor_part + // What bodypart are we putting our feature on? + var/feature_bodypart = BODY_ZONE_HEAD + + // What organ are we adding? + var/obj/item/organ/fomor_organ + // Where are we inserting it? + var/fomor_organ_slot + +/atom/movable/screen/alert/status_effect/fomori_power + icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + icon_state = "bg_fomori_power" + overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + + +///checks if we lose a limb a feature is attached to +/datum/action/cooldown/power/fomori_power/proc/on_removed_limb(datum/source, obj/item/bodypart/removed_limb, special, dismembered) + SIGNAL_HANDLER + + var/mob/living/carbon/human/carbon_owner = astype(owner, /mob/living/carbon) + var/obj/item/bodypart/bodypart = carbon_owner.get_bodypart(feature_bodypart) + + if(fomor_part && istype(removed_limb, bodypart.type)) + remove_feature() + +///for adding fomor features i.e. fangs, horns +/datum/action/cooldown/power/fomori_power/proc/add_feature() + var/mob/living/carbon/human/fomor = owner + var/obj/item/bodypart/bodypart = fomor?.get_bodypart(feature_bodypart) + if(isnull(bodypart)) + return + fomor_part = new fomor_part() //creates our overlay + bodypart.add_bodypart_overlay(fomor_part) + +///removes the fomor feature +/datum/action/cooldown/power/fomori_power/proc/remove_feature() + var/mob/living/carbon/human/fomor = owner + var/obj/item/bodypart/bodypart = fomor?.get_bodypart(feature_bodypart) + bodypart?.remove_bodypart_overlay(fomor_part) + QDEL_NULL(fomor_part) + +///toggles the feature, TRUE for remove and FALSE for add +/datum/action/cooldown/power/fomori_power/proc/toggle_feature(current_state) + if(current_state) + remove_feature() + fomor_part = initial(fomor_part) + else + add_feature() diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm new file mode 100644 index 000000000000..97883e7f6b14 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm @@ -0,0 +1,46 @@ +/datum/action/cooldown/power/fomori_power/weapon + name = "fomor weapon power" + desc = "Report on github if you see this!" + cooldown_time = 1 TURNS // Can't sheathe/unsheathe for at least 5 seconds after use + + shared_cooldown = MOB_SHARED_COOLDOWN_2 + + var/sheathe_text = "Your skub melts back into your skin." + + var/weapon_type = /obj/item/skub + var/unsheathe_sound = 'sound/effects/blob/blobattack.ogg' + var/sheathe_sound = 'sound/effects/meatslap.ogg' + +/datum/action/cooldown/power/fomori_power/weapon/Activate(atom/target) + var/obj/item/held = owner.get_active_held_item() + var/obj/item/off_held = owner.get_inactive_held_item() + if(held && off_held && deployed) + qdel(held) + qdel(off_held) + to_chat(owner, span_warning(sheathe_text)) + playsound(get_turf(owner), sheathe_sound, 50) + deployed = FALSE + return + + if(held && !owner.dropItemToGround(held)) + owner.balloon_alert(owner, "hand occupied!") + return FALSE + else if(off_held && !owner.dropItemToGround(off_held)) + owner.balloon_alert(owner, "off-hand occupied!") + return FALSE + + . = ..() + + var/obj/item/weapon = new weapon_type(owner) + var/obj/item/weapon_offhand = new weapon_type(owner) + + deployed = TRUE + + playsound(get_turf(owner), unsheathe_sound, 50) + owner.put_in_l_hand(weapon) + owner.put_in_r_hand(weapon_offhand) + + + + + diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm new file mode 100644 index 000000000000..99b6dd7af096 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -0,0 +1,65 @@ +/obj/item/melee/body_barbs // Largely copied from changeling armblade + name = "body barb" + icon = 'modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi' + icon_state = "body_barb" + inhand_icon_state = "body_barb" + lefthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi' + righthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi' + item_flags = ABSTRACT | DROPDEL + w_class = WEIGHT_CLASS_HUGE + force = 40 // Identical to Machete + throwforce = 0 + throw_range = 0 + throw_speed = 0 + hitsound = 'sound/items/weapons/bladeslice.ogg' + wound_bonus = 10 + exposed_wound_bonus = 10 + armour_penetration = 35 + attack_verb_continuous = list("attacks", "slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("attack", "slash", "slice", "tear", "lacerate", "rip", "dice", "cut") + sharpness = SHARP_EDGED + wound_bonus = 10 + exposed_wound_bonus = 10 + armour_penetration = 35 + var/list/alt_continuous = list("stabs", "pierces", "impales") + var/list/alt_simple = list("stab", "pierce", "impale") + + abstract_type = /obj/item/melee/body_barbs + +/obj/item/melee/body_barbs/Initialize(mapload,silent) // Largely copied from changeling armblade + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + alt_continuous = string_list(alt_continuous) + alt_simple = string_list(alt_simple) + AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -5) + AddComponent(/datum/component/butchering, \ + speed = 6 SECONDS, \ + effectiveness = 80, \ + ) + +/datum/action/cooldown/power/fomori_power/weapon/body_barbs + name = "Body Barbs" + desc = "Use the grotesque spikes on your body to amplify your brawling ability." + button_icon_state = "body_barbs" + rank = 1 // of 10 // Determines how many extra dice we get + weapon_type = /obj/item/melee/body_barbs + sheathe_text = "Your body barbs retract into your arms." + +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/Activate(atom/target) + . = ..() + if(deployed) + owner.visible_message(span_warning("A pair of grotesque barbs extend from [owner]\'s arms!"), \ + span_warning("Your body barbs extend from your arms."), \ + span_hear("You hear organic matter ripping and tearing!")) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/two + rank = 2 + +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/three + rank = 3 + +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/four + rank = 4 +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/five + rank = 5 diff --git a/modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm b/modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm new file mode 100644 index 000000000000..702373827d53 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm @@ -0,0 +1,50 @@ +/datum/action/cooldown/power/fomori_power/chameleon_coloration + name = "Chameleon Coloration" + desc = "Blend into the background to strike unseen." + button_icon_state = "chameleon_coloration" + rank = 1 // of 1 + + var/activated = FALSE + +/datum/action/cooldown/power/fomori_power/chameleon_coloration/Activate(atom/target) + . = ..() + if(activated) + activated = FALSE + owner.alpha = 255 + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_UNARMED_ATTACK)) + else + activated = TRUE + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_attack_hand)) + var/mob/living/living_owner = astype(owner) + living_owner.apply_status_effect(/datum/status_effect/chameleon_coloration) + +/datum/action/cooldown/power/fomori_power/chameleon_coloration/proc/on_move(atom/movable/source, atom/old_loc, move_dir, forced, list/atom/old_locs) + SIGNAL_HANDLER + + owner.alpha = 200 + +/datum/action/cooldown/power/fomori_power/chameleon_coloration/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, list/modifiers) + SIGNAL_HANDLER + + if(!proximity) + return + owner.alpha = 200 + +/datum/status_effect/chameleon_coloration + id = "chameleon_coloration" + duration = INFINITY + + status_type = STATUS_EFFECT_UNIQUE + + alert_type = /atom/movable/screen/alert/status_effect/chameleon_coloration + +/datum/status_effect/chameleon_coloration/tick(seconds_per_tick) + . = ..() + owner.alpha = max(owner.alpha - 50, 0) // TODO: use animate magic to make this look better + +/atom/movable/screen/alert/status_effect/chameleon_coloration + name = "Chameleon Coloration" + desc = "You are blending in with your surroundings." + icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi' + icon_state = "riddle" // TODO: get an icon for this diff --git a/modular_darkpack/modules/fomori/code/powers/claws.dm b/modular_darkpack/modules/fomori/code/powers/claws.dm new file mode 100644 index 000000000000..15528af0f7e0 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/claws.dm @@ -0,0 +1,37 @@ +/obj/item/knife/fomor_claws // Just a normal knife, but part of our hands! + name = "claw" + icon = 'modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi' + icon_state = "claw" + inhand_icon_state = "claw" + lefthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi' + righthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi' + icon_angle = 0 + item_flags = ABSTRACT | DROPDEL + w_class = WEIGHT_CLASS_HUGE + throwforce = 0 + throw_speed = 0 + throw_range = 0 + + abstract_type = /obj/item/knife/fomor_claws + +/obj/item/knife/fomor_claws/Initialize(mapload,silent) // Largely copied from changeling armblade + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -5) + +/datum/action/cooldown/power/fomori_power/weapon/claws + name = "Claws" + desc = "Use the grotesque claws on your hands to slice and dice." + button_icon_state = "claws" + rank = 1 // of 1 + weapon_type = /obj/item/knife/fomor_claws + unsheathe_sound = 'sound/items/weapons/parry.ogg' + sheathe_text = "Your claws retract into your arms." + +/datum/action/cooldown/power/fomori_power/weapon/claws/Activate(atom/target) + . = ..() + if(deployed) + owner.visible_message(span_warning("A pair of grotesque claws extend from [owner]\'s hands!"), \ + span_warning("Your claws extend from your hands."), \ + span_hear("You hear organic matter ripping and tearing!")) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/darksight.dm b/modular_darkpack/modules/fomori/code/powers/darksight.dm new file mode 100644 index 000000000000..221f08b32383 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/darksight.dm @@ -0,0 +1,34 @@ +/datum/action/cooldown/power/fomori_power/darksight // TODO: Make this work with more light sources + name = "Darksight" + desc = "See in the dark unbidden, but beware bright lights." + button_icon_state = "darksight" + rank = 1 // of 1 + + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 1 SECONDS // So we don't click too fast + + var/activated = FALSE + +/datum/action/cooldown/power/fomori_power/darksight/Activate(atom/target) + . = ..() + to_chat(owner, span_notice("You [activated ? "activate" : "deactivate"] Darksight.")) + if(activated) + activated = FALSE + REMOVE_TRAIT(owner, TRAIT_TRUE_NIGHT_VISION, "fomor_darksight") + owner.remove_client_colour("fomor_darksight") + UnregisterSignal(owner, COMSIG_MOB_FLASHED, PROC_REF(on_flashed)) + else + activated = TRUE + ADD_TRAIT(owner, TRAIT_TRUE_NIGHT_VISION, "fomor_darksight") + owner.add_client_colour(/datum/client_colour/monochrome, "fomor_darksight") + RegisterSignal(owner, COMSIG_MOB_FLASHED) + owner.update_sight() + +/datum/action/cooldown/power/fomori_power/darksight/proc/on_flashed() + SIGNAL_HANDLER + + var/mob/living/carbon/carbon_owner = owner + var/our_perception = carbon_owner.st_get_stat(STAT_PERCEPTION) + carbon_owner.Stun(our_perception TURNS) // Stunned 1 TURNS per dot in perception + if(our_perception > 1) + to_chat(owner, span_userdanger("Your enhanced vision causes you to be stunned for an extra [our_perception] turns!")) diff --git a/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm new file mode 100644 index 000000000000..d50706be6173 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm @@ -0,0 +1,30 @@ +/datum/bodypart_overlay/simple/fomor_exoskeleton + icon_state = "exoskeleton" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = BENEATH_HAIR_LAYER + +/datum/action/cooldown/power/fomori_power/exoskeleton + name = "Exoskeleton" + desc = "(NEED SPRITES) Form a thick carapace around your body, protecting you from harm and increasing your strength." + button_icon_state = "exoskeleton" + rank = 1 // of 1 + + fomor_part = /datum/bodypart_overlay/simple/fomor_exoskeleton + +/datum/action/cooldown/power/fomori_power/exoskeleton/Activate(atom/target) + . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + toggle_feature(deployed) + + if(deployed) + deployed = FALSE + carbon_owner.st_remove_stat_mod(STAT_STAMINA, 1, "exoskeleton") + carbon_owner.st_remove_stat_mod(STAT_STRENGTH, 1, "exoskeleton") + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_deactivate.ogg', 50) + else + deployed = TRUE + carbon_owner.st_add_stat_mod(STAT_STAMINA, 1, "exoskeleton") + carbon_owner.st_add_stat_mod(STAT_STRENGTH, 1, "exoskeleton") + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm new file mode 100644 index 000000000000..b0753f5a8ec1 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -0,0 +1,31 @@ +/datum/bodypart_overlay/simple/fomor_fangs + icon_state = "fangs" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = MUTATIONS_LAYER + +/datum/bodypart_overlay/simple/fomor_fangs/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner, mob/living/carbon/owner, is_husked = FALSE) + return ..() && !(bodypart_owner.owner?.obscured_slots & HIDEFACE) + +/datum/action/cooldown/power/fomori_power/fangs + name = "Fangs" + desc = "Use the grotesque fangs spilling from your mouth to bite your enemies." + button_icon_state = "fangs" + rank = 1 // of 1 + + fomor_part = /datum/bodypart_overlay/simple/fomor_fangs + +/datum/action/cooldown/power/fomori_power/fangs/Activate(atom/target) + . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + toggle_feature(deployed) + + if(deployed) + REMOVE_TRAITS_IN(owner, "fomor_fangs") + deployed = FALSE + carbon_owner.combat_bite_damages = carbon_owner::combat_bite_damages + else + ADD_TRAIT(owner, TRAIT_COMBAT_BITE, "fomor_fangs") + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, "fomor_fangs") + deployed = TRUE + carbon_owner.combat_bite_damages = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 1 TTRPG_DAMAGE) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm b/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm new file mode 100644 index 000000000000..fead00fed926 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm @@ -0,0 +1,33 @@ +/datum/bodypart_overlay/simple/hide_of_the_wyrm + icon_state = "hide_of_the_wyrm" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = EXTERNAL_FRONT + +/datum/action/cooldown/power/fomori_power/hide_of_the_wyrm + name = "Hide of the Wyrm" + desc = "Form a hard, leathery hide around your body, protecting you from harm." + button_icon_state = "hide_of_the_wyrm" + rank = 1 // of 1 + + fomor_part = /datum/bodypart_overlay/simple/hide_of_the_wyrm + feature_bodypart = BODY_ZONE_CHEST + +/datum/action/cooldown/power/fomori_power/hide_of_the_wyrm/Activate(atom/target) // TODO: replace fortitude with soak dice if/when we get it + . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + toggle_feature(deployed) + + if(deployed) + deployed = FALSE + owner.visible_message(span_warning("[owner]'s skin is no longer hard and leathery."), \ + span_warning("Your skin is no longer hard and leathery.")) + carbon_owner.remove_status_effect(/datum/status_effect/fortitude/one) + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_deactivate.ogg', 50) + else + deployed = TRUE + owner.visible_message(span_warning("[owner]'s skin becomes hard and leathery!"), \ + span_warning("Your skin becomes hard and leathery.")) + carbon_owner.apply_status_effect(/datum/status_effect/fortitude/one) // ! if we ever plan on allowing vampiric fomor, give this it's own status effect ! + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm new file mode 100644 index 000000000000..3d1f68699765 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -0,0 +1,22 @@ +/datum/bodypart_overlay/simple/fomor_horns + icon_state = "horns" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = LOW_FACEMASK_LAYER + +/datum/action/cooldown/power/fomori_power/horns + name = "Horns" + desc = "(UNIMPLEMENTED) Use the grotesque horns atop your head to gore your enemies." + button_icon_state = "horns" + rank = 1 // of 1 + + fomor_part = /datum/bodypart_overlay/simple/fomor_horns + +/datum/action/cooldown/power/fomori_power/horns/Activate(atom/target) + . = ..() + toggle_feature(deployed) + + if(deployed) + deployed = FALSE + else + deployed = TRUE + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm b/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm new file mode 100644 index 000000000000..2bb31ab8635a --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm @@ -0,0 +1,39 @@ +/datum/storyteller_roll/infectious_touch + bumper_text = "infectious touch" + difficulty = 7 + applicable_stats = list(STAT_STAMINA, STAT_MEDICINE) + numerical = TRUE + roll_output_type = ROLL_PRIVATE + +/datum/storyteller_roll/infectious_touch/defender + applicable_stats = list(STAT_STAMINA) + +/datum/action/cooldown/power/fomori_power/infectious_touch + name = "Infectious Touch" + desc = "With just a touch, cause an unnatural sickness to set in to your target's body." + button_icon_state = "infectious_touch" + rank = 1 // of 1 + click_to_activate = TRUE + willpower_cost = 1 + +/datum/action/cooldown/power/fomori_power/infectious_touch/Activate(atom/target) + if(!isliving(target)) + return + if(!(target in range(1, owner))) + return + + . = ..() + var/mob/living/defender = target + + to_chat(owner, span_warning("You touch [defender], intending to infect them with a grotesque illness...")) + + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/infectious_touch + var/datum/storyteller_roll/roll_datum_defender = new /datum/storyteller_roll/infectious_touch/defender + var/our_power = roll_datum.st_roll(owner) + var/their_power = roll_datum_defender.st_roll(defender) + + if(our_power > their_power) + var/net_power = our_power - their_power + if(get_vampire_splat(defender)) + return // Stops just before applying damage without feedback so it's not a splat detector + defender.apply_damage(30*net_power, TOX) // Rules as written it's supposed to be aggravated, but this is better for flavor I think. diff --git a/modular_darkpack/modules/fomori/code/powers/regeneration.dm b/modular_darkpack/modules/fomori/code/powers/regeneration.dm new file mode 100644 index 000000000000..ffef8bbd9318 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/regeneration.dm @@ -0,0 +1,62 @@ +/datum/storyteller_roll/fomor_regeneration + bumper_text = "regeneration" + difficulty = 6 + applicable_stats = list(STAT_STAMINA) + numerical = FALSE + roll_output_type = ROLL_PRIVATE + +/datum/action/cooldown/power/fomori_power/regeneration + name = "Regeneration" + desc = "Recover from your wounds much the same as the bestial Garou do." + button_icon_state = "regeneration" + rank = 1 // of 1 + +/datum/action/cooldown/power/fomori_power/regeneration/Grant(mob/granted_to) + . = ..() + ADD_TRAIT(owner, TRAIT_FOMOR_REGEN, "regeneration") + +/datum/action/cooldown/power/fomori_power/regeneration/Activate(atom/target) + . = ..() + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/fomor_regeneration + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result) + force_heal() + +/datum/action/cooldown/power/fomori_power/regeneration/proc/force_heal() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + //normal bashing/lethal damage + carbon_owner.heal_ordered_damage(30, list(BRUTE, TOX, OXY, STAMINA)) + + if(length(carbon_owner.all_wounds)) + for (var/i in 1 to min(rank, length(carbon_owner.all_wounds))) + var/datum/wound/wound = carbon_owner.all_wounds[i] + wound.remove_wound() + + //brain damage and traumas healing + var/obj/item/organ/brain/brain = carbon_owner.get_organ_slot(ORGAN_SLOT_BRAIN) + if (brain) + brain.apply_organ_damage(-30) + + for (var/i in 1 to min(rank, length(brain.get_traumas_type()))) + var/datum/brain_trauma/healing_trauma = pick(brain.get_traumas_type()) + brain.cure_trauma_type(healing_trauma, resilience = TRAUMA_RESILIENCE_WOUND) + + //miscellaneous organ damage healing + var/obj/item/organ/eyes/eyes = carbon_owner.get_organ_slot(ORGAN_SLOT_EYES) + if (eyes) + eyes.apply_organ_damage(-30) + + carbon_owner.adjust_temp_blindness(-6) + carbon_owner.adjust_eye_blur(-6) + + carbon_owner.visible_message( + span_warning("[carbon_owner]'s wounds heal with unnatural speed!"), + span_warning("Your wounds visibly heal with unnatural speed!")) + + SEND_SIGNAL(carbon_owner, COMSIG_MASQUERADE_VIOLATION) + + //update UI + carbon_owner.update_damage_overlays() + carbon_owner.update_health_hud() diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm new file mode 100644 index 000000000000..42127f4f05ed --- /dev/null +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -0,0 +1,63 @@ +/datum/splat/fomori + name = "Fomori" + desc = "Mortals who have lost themselves to the Wyrm's corruption. \ + A slow death of the self — most do not even realize what has happened to them before the bane takes over completely. \ + Tools of Dancers, and wretched things to mercifully be slain by Gaians. \ + You are but another pawn in a scheme older and grander than you could've ever imagined." + + id = SPLAT_FOMORI + + splat_priority = SPLAT_PRIO_FOMORI + + power_type = /datum/action/cooldown/power/fomori_power + + uses_veil = TRUE + COOLDOWN_DECLARE(passive_healing_cd) + +/datum/splat/fomori/splat_life(seconds_per_tick) + if(HAS_TRAIT(owner, TRAIT_FOMOR_REGEN)) + if(COOLDOWN_FINISHED(src, passive_healing_cd)) + owner.heal_storyteller_health(1, heal_scars = TRUE, heal_blood = TRUE) + COOLDOWN_START(src, passive_healing_cd, 1 TURNS) + +/mob/living/carbon/human/splat/fomori + auto_splats = list(/datum/splat/fomori) + +/datum/splat/fomori/on_gain() // WIP: Will be pointbuy eventually. Don't merge with this code in-tact + owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/body_barbs, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/claws, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/horns, 1) // unfinished + owner.give_st_power(/datum/action/cooldown/power/fomori_power/fangs, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/chameleon_coloration, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/darksight, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/exoskeleton, 1) // unfinished + owner.give_st_power(/datum/action/cooldown/power/fomori_power/regeneration, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/hide_of_the_wyrm, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/infectious_touch, 1) // + +/datum/splat/fomori/get_power(power_type) + RETURN_TYPE(/datum/action/cooldown/power/fomori_power) + + for(var/datum/action/cooldown/power/fomori_power/found_action as anything in powers) + if(!istype(found_action, power_type)) + continue + + return found_action + +/datum/splat/fomori/add_power(power_type, level) + // Prevent duplicates + if(get_power(power_type)) + return FALSE + var/datum/action/cooldown/power/fomori_power/adding_action = new power_type() + adding_action.Grant(owner) + LAZYADD(powers, adding_action) + return TRUE + +/datum/splat/fomori/remove_power(power_type) + var/datum/action/cooldown/power/fomori_power/found_action = get_power(power_type) + if(!found_action) + return FALSE + + LAZYREMOVE(powers, found_action) + qdel(found_action) + return TRUE diff --git a/modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm b/modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm new file mode 100644 index 000000000000..a7ac7efc8c5d --- /dev/null +++ b/modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm @@ -0,0 +1,4 @@ +/proc/get_fomori_splat(mob/character) + RETURN_TYPE(/datum/splat/fomori) + + return character.get_splat(/datum/splat/fomori) diff --git a/modular_darkpack/modules/fomori/code/splats/pref_lore.dm b/modular_darkpack/modules/fomori/code/splats/pref_lore.dm new file mode 100644 index 000000000000..6bae1f91109b --- /dev/null +++ b/modular_darkpack/modules/fomori/code/splats/pref_lore.dm @@ -0,0 +1,39 @@ +/datum/splat/fomori/prepare_human_for_preview(mob/living/carbon/human/human) + human.set_haircolor("#554435", update = FALSE) + human.set_hairstyle("Boddicker", update = TRUE) + human.set_facial_hairstyle("Beard (Seven o Clock Shadow)", update = TRUE) + human.set_eye_color("#8281ca") + human.undershirt = "Tank Top (White)" + human.update_body() + human.equipOutfit(/datum/outfit/civillian4, TRUE) + +/datum/splat/fomori/get_splat_description() + return "Mortals who have lost themselves to the Wyrm's corruption. \ + A slow death of the self — most do not even realize what has happened to them before the bane takes over completely. \ + Tools of Dancers, and wretched things to mercifully be slain by Gaians. \ + You are but another pawn in a scheme older and grander than you could've ever imagined." + +/datum/splat/fomori/get_splat_lore() + return list( + "The fomori are created when a Bane possesses a human or an animal via a spiritual \"hole\" left by some form of sin or spiritual corruption. The Bane will slowly gain more and more influence, until they are completely fused with the host and cannot be separated.", + ) + +/datum/splat/fomori/create_pref_unique_perks() + var/list/to_add = list() + + to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_BOOK_DEAD, + SPECIES_PERK_NAME = "Bane Possession", + SPECIES_PERK_DESC = "Fomori are possessed by spirits called Banes, which imbues them with various powers and taints.", + ), + list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_CROSSHAIRS, + SPECIES_PERK_NAME = "Hunted and Subservient", + SPECIES_PERK_DESC = "Fomori are hunted by Gaians and expected to serve the Wyrm.", + ), + ) + + return to_add diff --git a/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi b/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi new file mode 100644 index 000000000000..81a704e13e05 Binary files /dev/null and b/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi differ diff --git a/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi b/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi new file mode 100644 index 000000000000..805605e6f620 Binary files /dev/null and b/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi differ diff --git a/modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi b/modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi new file mode 100644 index 000000000000..71392944059f Binary files /dev/null and b/modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi differ diff --git a/modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi b/modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi new file mode 100644 index 000000000000..cfa738b7871e Binary files /dev/null and b/modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi differ diff --git a/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi b/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi new file mode 100644 index 000000000000..c2e67ab58586 Binary files /dev/null and b/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi differ diff --git a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm index 50662339f8f6..ea06e61fd2a1 100644 --- a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm +++ b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm @@ -67,17 +67,27 @@ source.observe_masquerade_reinforce(player_breacher) breached_players -= player_breacher -/atom/proc/observe_masquerade_violation(player_breacher) +/atom/proc/observe_masquerade_violation(mob/living/player_breacher) do_alert_animation() - if(get_werewolf_splat(player_breacher)) + var/should_use_veil + for(var/datum/splat/breacher_splat in player_breacher.splats) + if(breacher_splat.uses_veil) + should_use_veil = TRUE + + if(should_use_veil) to_chat(player_breacher, span_userdanger(span_bold("VEIL VIOLATION"))) playsound(player_breacher, 'modular_darkpack/modules/masquerade/sound/veil_violation.ogg', 50, FALSE, -5) return playsound(player_breacher, 'modular_darkpack/modules/masquerade/sound/masquerade_violation.ogg', 50, FALSE, -5) to_chat(player_breacher, span_userdanger(span_bold("MASQUERADE VIOLATION"))) -/atom/proc/observe_masquerade_reinforce(player_breacher) - if(get_werewolf_splat(player_breacher)) +/atom/proc/observe_masquerade_reinforce(mob/living/player_breacher) + var/should_use_veil + for(var/datum/splat/breacher_splat in player_breacher.splats) + if(breacher_splat.uses_veil) + should_use_veil = TRUE + + if(should_use_veil) to_chat(player_breacher, span_big(span_boldnicegreen("VEIL REINFORCED"))) playsound(player_breacher, 'modular_darkpack/modules/masquerade/sound/humanity_gain.ogg', 50, FALSE, -5) return diff --git a/modular_darkpack/modules/splats/code/__splat.dm b/modular_darkpack/modules/splats/code/__splat.dm index 0791d389f72f..d4bd3f6d5fc2 100644 --- a/modular_darkpack/modules/splats/code/__splat.dm +++ b/modular_darkpack/modules/splats/code/__splat.dm @@ -35,6 +35,8 @@ var/splat_biotypes /// Base type of the powers that this splat has var/power_type + /// Whether or not we use the MASQUERADE or the VEIL + var/uses_veil /// Splats that someone with this splat cannot gain var/list/incompatible_splats diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index b6d6eab37e21..cb2532fd70f0 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm @@ -4,6 +4,8 @@ power_type = /datum/action/cooldown/power/gift + uses_veil = TRUE + // Perm is for rolls // Non-perm/ or temp is for expenditure var/uses_rage = FALSE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm index 08665939ddf5..e4c47f144655 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm @@ -27,4 +27,3 @@ RETURN_TYPE(/datum/splat/werewolf/kinfolk) return character.get_splat(/datum/splat/werewolf/kinfolk) - diff --git a/tgstation.dme b/tgstation.dme index a01a0abf082c..010a7822d4fb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7143,6 +7143,7 @@ #include "modular_darkpack\modules\bitcoinminer\code\bitcoinminer.dm" #include "modular_darkpack\modules\blood_drinking\code\bite_helper_procs.dm" #include "modular_darkpack\modules\blood_drinking\code\bite_keybinding.dm" +#include "modular_darkpack\modules\blood_drinking\code\combat_bite.dm" #include "modular_darkpack\modules\blood_drinking\code\drinksomeblood.dm" #include "modular_darkpack\modules\blood_drinking\code\vamp_bite.dm" #include "modular_darkpack\modules\blood_drinking\code\kiss_status_effect\status_effect_kiss.dm" @@ -7291,6 +7292,21 @@ #include "modular_darkpack\modules\flavor_text\code\preferences\masked_flavor_text_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\nsfw_content_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\record_preferences.dm" +#include "modular_darkpack\modules\fomori\code\powers\_fomori_power.dm" +#include "modular_darkpack\modules\fomori\code\powers\_fomori_power_weapon.dm" +#include "modular_darkpack\modules\fomori\code\powers\body_barbs.dm" +#include "modular_darkpack\modules\fomori\code\powers\chameleon_coloration.dm" +#include "modular_darkpack\modules\fomori\code\powers\claws.dm" +#include "modular_darkpack\modules\fomori\code\powers\darksight.dm" +#include "modular_darkpack\modules\fomori\code\powers\exoskeleton.dm" +#include "modular_darkpack\modules\fomori\code\powers\fangs.dm" +#include "modular_darkpack\modules\fomori\code\powers\hide_of_the_wyrm.dm" +#include "modular_darkpack\modules\fomori\code\powers\horns.dm" +#include "modular_darkpack\modules\fomori\code\powers\infectious_touch.dm" +#include "modular_darkpack\modules\fomori\code\powers\regeneration.dm" +#include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" +#include "modular_darkpack\modules\fomori\code\splats\is_fomori_helpers.dm" +#include "modular_darkpack\modules\fomori\code\splats\pref_lore.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" #include "modular_darkpack\modules\food\code\drinks.dm"