diff --git a/code/__DEFINES/~darkpack/dcs/power_signals.dm b/code/__DEFINES/~darkpack/dcs/power_signals.dm index 7851940c2675..bdb54789d00a 100644 --- a/code/__DEFINES/~darkpack/dcs/power_signals.dm +++ b/code/__DEFINES/~darkpack/dcs/power_signals.dm @@ -1,14 +1,6 @@ /* Signals for the World of Darkness power system */ //Normal signals sent to the power and caster, _ON signals are sent to target -//can_activate() signals -///from datum/discipline_power/can_activate(): (datum/discipline_power/power, atom/target) -#define COMSIG_POWER_TRY_ACTIVATE "power_try_activate" -///from datum/discipline_power/can_activate(): (datum/discipline_power/power) -#define COMSIG_POWER_TRY_ACTIVATE_ON "power_try_activate_on" - ///Makes can_activate return false and prevent activation - #define POWER_PREVENT_ACTIVATE (1<<0) - //pre_activation() signals ///from datum/discipline_power/pre_activation(): (datum/discipline_power/power, atom/target) #define COMSIG_POWER_PRE_ACTIVATION "power_pre_activation" diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index ad4ab74a8f39..9d8a05dae348 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -111,6 +111,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // its called this because theres apparently already a defined quirk called 'hungry' which appears to lower your blood drawn from biting by half. #define TRAIT_NEEDS_BLOOD "vampire_hungry" +// If the vampire can't perform mental abilities that require eye contact, as an example: dominate. +#define TRAIT_NO_EYE_CONTACT "no_eye_contact" + /// If the species has garou breeds to select. #define TRAIT_WTA_GAROU_BREED "wta_garou_breeds" // if the species has garou tribes to select. diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 6c35637a7d3f..295333f2ff8b 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -697,6 +697,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD "TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy + "TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD "TRAIT_ORGANOVORE" = TRAIT_ORGANOVORE, // DARKPACK EDIT ADD - Nagaraja "TRAIT_SANGUINE_INCONGRUITY" = TRAIT_SANGUINE_INCONGRUITY, // DARKPACK EDIT ADD - Giovanni Quirk "TRAIT_MONSTROUS" = TRAIT_MONSTROUS, // DARKPACK EDIT ADD - MERITS/FLAWS diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 544540773ad1..de94b7825796 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -389,6 +389,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD "TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, //DARKPACK EDIT ADD - Hunger and Frenzy "TRAIT_NON_INT" = TRAIT_NON_INT, // DARKPACK EDIT ADD + "TRAIT_NO_EYE_CONTACT" = TRAIT_NO_EYE_CONTACT, // DARKPACK EDIT ADD "TRAIT_NO_LYING_ANGLE" = TRAIT_NO_LYING_ANGLE, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_OBFUSCATED" = TRAIT_OBFUSCATED, // DARKPACK EDIT ADD "TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, // DARKPACK EDIT ADD diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 53d3573c18f6..66e77139e592 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -467,12 +467,9 @@ if (recipe.category == CAT_CULT && !IS_CULTIST(user)) // Skip blood cult recipes if not cultist return FALSE // DARKPACK EDIT ADD - START - if (recipe.category == CAT_TZIMISCE) // TODO: [Disciplines] Uncomment when viscissitude is a thing. - return FALSE - /* DARKPACK TODO: Vicissitude + if (recipe.category == CAT_TZIMISCE) var/mob/living/living_user = astype(user) return living_user?.get_discipline(/datum/discipline/vicissitude) - */ // DARKPACK EDIT ADD - END return recipe.is_recipe_available(user) // DARKPACK EDIT CHANGE diff --git a/code/modules/surgery/operations/operation_plastic_surgery.dm b/code/modules/surgery/operations/operation_plastic_surgery.dm index 1203702d1d61..969017adc0cb 100644 --- a/code/modules/surgery/operations/operation_plastic_surgery.dm +++ b/code/modules/surgery/operations/operation_plastic_surgery.dm @@ -122,6 +122,7 @@ desc = "Apply plastic to a patient's face to to allow for greater customization in following plastic surgery." implements = list( /obj/item/stack/sheet/plastic = 1, + /obj/item/stack/sheet/human_flesh = 1, // DARKPACK EDIT ADD ) time = 4.8 SECONDS operation_flags = OPERATION_MORBID | OPERATION_LOCKED | OPERATION_NO_PATIENT_REQUIRED diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 62760b8c2b5b..78aab89e5308 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -214,6 +214,11 @@ to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) return + // DARKPACK EDIT START + var/datum/component/two_handed/two_handed = GetComponent(/datum/component/two_handed) + if(two_handed) + return + // DARKPACK EDIT END if(!active_item || (active_item in src)) active_item = null if(contents.len == 1) diff --git a/modular_darkpack/modules/clothes/code/suit.dm b/modular_darkpack/modules/clothes/code/suit.dm index 87093cd3eeff..cbf5207d5cd3 100644 --- a/modular_darkpack/modules/clothes/code/suit.dm +++ b/modular_darkpack/modules/clothes/code/suit.dm @@ -371,22 +371,6 @@ desc = "True power lies not in wealth, but in the things it affords you." icon_state = "strauss_coat" -/obj/item/clothing/suit/vampire/trench/tzi - name = "fleshcoat" - desc = "HUMAN LEATHER JACKET." - icon_state = "trench_tzi" - armor_type = /datum/armor/fleshcoat - clothing_traits = list(TRAIT_UNMASQUERADE) - -/datum/armor/fleshcoat - melee = 50 - bullet = 50 - laser = 10 - energy = 10 - bomb = 25 - acid = 10 - wound = 50 - /obj/item/clothing/suit/vampire/trench/voivode name = "regal coat" desc = "A beautiful jacket. Whoever owns this must be important." diff --git a/modular_darkpack/modules/deprecated/icons/64x64.dmi b/modular_darkpack/modules/deprecated/icons/64x64.dmi index a1ff60bfb5e8..c43aa1b2b89f 100644 Binary files a/modular_darkpack/modules/deprecated/icons/64x64.dmi and b/modular_darkpack/modules/deprecated/icons/64x64.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/icons.dmi b/modular_darkpack/modules/deprecated/icons/icons.dmi index e86bb13cbaa7..c8b80ed95f54 100644 Binary files a/modular_darkpack/modules/deprecated/icons/icons.dmi and b/modular_darkpack/modules/deprecated/icons/icons.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/onfloor.dmi b/modular_darkpack/modules/deprecated/icons/onfloor.dmi index e98035d0cf00..902bae5a9a7d 100644 Binary files a/modular_darkpack/modules/deprecated/icons/onfloor.dmi and b/modular_darkpack/modules/deprecated/icons/onfloor.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/props.dmi b/modular_darkpack/modules/deprecated/icons/props.dmi index 32981c55cb67..62c032191db7 100644 Binary files a/modular_darkpack/modules/deprecated/icons/props.dmi and b/modular_darkpack/modules/deprecated/icons/props.dmi differ diff --git a/modular_darkpack/modules/npc/code/nonhuman/hostile/baali_guard.dm b/modular_darkpack/modules/npc/code/nonhuman/hostile/baali_guard.dm index b380e30b888c..fbcb018512f3 100644 --- a/modular_darkpack/modules/npc/code/nonhuman/hostile/baali_guard.dm +++ b/modular_darkpack/modules/npc/code/nonhuman/hostile/baali_guard.dm @@ -10,7 +10,7 @@ maxHealth = 1500 health = 1500 - guaranteed_butcher_results = list(/obj/item/stack/human_flesh = 20) + guaranteed_butcher_results = list(/obj/item/stack/sheet/human_flesh = 20) combat_mode = TRUE melee_damage_type = AGGRAVATED diff --git a/modular_darkpack/modules/npc/code/nonhuman/hostile/werewolf.dm b/modular_darkpack/modules/npc/code/nonhuman/hostile/werewolf.dm index 070c2a9337e4..899cda5d67a4 100644 --- a/modular_darkpack/modules/npc/code/nonhuman/hostile/werewolf.dm +++ b/modular_darkpack/modules/npc/code/nonhuman/hostile/werewolf.dm @@ -13,7 +13,7 @@ maxHealth = 575 health = 575 - butcher_results = list(/obj/item/stack/human_flesh = 10) + butcher_results = list(/obj/item/stack/sheet/human_flesh = 10) combat_mode = TRUE melee_damage_lower = 35 diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm index e61c6b3da141..a5b58b1d8df4 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm @@ -76,7 +76,7 @@ */ /datum/discipline_power/proc/get_cooldown() var/time_left = timeleft(cooldown_timer) - if (isnull(time_left)) + if(isnull(time_left)) time_left = 0 return time_left @@ -88,11 +88,11 @@ */ /datum/discipline_power/proc/get_duration() var/highest_timeleft = 0 - for (var/timer_id in duration_timers) + for(var/timer_id in duration_timers) var/time_left = timeleft(timer_id) - if (isnull(time_left)) + if(isnull(time_left)) continue - if (time_left > highest_timeleft) + if(time_left > highest_timeleft) highest_timeleft = time_left return highest_timeleft @@ -128,99 +128,99 @@ SHOULD_CALL_PARENT(TRUE) //can't be casted without an actual caster - if (!owner) + if(!owner) return FALSE //can always be deactivated if that's an option - if (active && (toggled || cancelable)) - if (can_deactivate_untargeted()) + if(active && (toggled || cancelable)) + if(can_deactivate_untargeted()) return TRUE else return FALSE //the power is currently active - if (active && !multi_activate) - if (alert) + if(active && !multi_activate) + if(alert) to_chat(owner, span_warning("[src] is already active!")) return FALSE //a mutually exclusive power is already active or on cooldown - if (islist(grouped_powers)) - for (var/exclude_power in grouped_powers) + if(islist(grouped_powers)) + for(var/exclude_power in grouped_powers) var/datum/discipline_power/found_power = discipline.get_power(exclude_power) - if (!found_power || (found_power == src)) + if(!found_power || (found_power == src)) continue - if (found_power.active) - if (found_power.cancelable || found_power.toggled) - if (alert) + if(found_power.active) + if(found_power.cancelable || found_power.toggled) + if(alert) found_power.try_deactivate(direct = TRUE, alert = TRUE) return TRUE else - if (alert) + if(alert) to_chat(owner, span_warning("You cannot have [src] and [found_power] active at the same time!")) return FALSE - if (found_power.get_cooldown()) - if (alert) + if(found_power.get_cooldown()) + if(alert) to_chat(owner, span_warning("You cannot activate [src] before [found_power]'s cooldown expires in [DisplayTimeText(found_power.get_cooldown())].")) return FALSE //the user cannot afford the power's vitae expenditure - if (!can_afford()) - if (alert) + if(!can_afford()) + if(alert) do_afford_alert() return FALSE //the power's cooldown has not elapsed - if (get_cooldown()) - if (alert) + if(get_cooldown()) + if(alert) to_chat(owner, span_warning("[src] is still on cooldown for [DisplayTimeText(get_cooldown())]!")) return FALSE //status checks - if ((check_flags & DISC_CHECK_TORPORED) && HAS_TRAIT(owner, TRAIT_TORPOR)) - if (alert) + if((check_flags & DISC_CHECK_TORPORED) && HAS_TRAIT(owner, TRAIT_TORPOR)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] while in Torpor!")) return FALSE - if ((check_flags & DISC_CHECK_CONSCIOUS) && HAS_TRAIT(owner, TRAIT_KNOCKEDOUT)) - if (alert) + if((check_flags & DISC_CHECK_CONSCIOUS) && HAS_TRAIT(owner, TRAIT_KNOCKEDOUT)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] while unconscious!")) return FALSE - if ((check_flags & DISC_CHECK_CAPABLE) && HAS_TRAIT(owner, TRAIT_INCAPACITATED)) - if (alert) + if((check_flags & DISC_CHECK_CAPABLE) && HAS_TRAIT(owner, TRAIT_INCAPACITATED)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] while incapacitated!")) return FALSE - if ((check_flags & DISC_CHECK_IMMOBILE) && HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) - if (alert) + if((check_flags & DISC_CHECK_IMMOBILE) && HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] while immobilised!")) return FALSE - if ((check_flags & DISC_CHECK_LYING) && HAS_TRAIT(owner, TRAIT_FLOORED)) - if (alert) + if((check_flags & DISC_CHECK_LYING) && HAS_TRAIT(owner, TRAIT_FLOORED)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] while lying on the floor!")) return FALSE - if ((check_flags & DISC_CHECK_SEE) && owner.is_blind()) - if (alert) + if((check_flags & DISC_CHECK_SEE) && owner.is_blind()) + if(alert) to_chat(owner, span_warning("You cannot cast [src] without your sight!")) return FALSE - if ((check_flags & DISC_CHECK_SPEAK) && HAS_TRAIT(owner, TRAIT_MUTE)) - if (alert) + if((check_flags & DISC_CHECK_SPEAK) && HAS_TRAIT(owner, TRAIT_MUTE)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] without speaking!")) return FALSE - if ((check_flags & DISC_CHECK_FREE_HAND) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) - if (alert) + if((check_flags & DISC_CHECK_FREE_HAND) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] without free hands!")) return FALSE //respect pacifism, prevent hostile Discipline usage from pacifists - if (hostile && HAS_TRAIT(owner, TRAIT_PACIFISM)) - if (alert) + if(hostile && HAS_TRAIT(owner, TRAIT_PACIFISM)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] as a pacifist!")) return FALSE @@ -245,98 +245,71 @@ /datum/discipline_power/proc/can_activate(atom/target, alert = FALSE) SHOULD_CALL_PARENT(TRUE) - var/signal_return = SEND_SIGNAL(src, COMSIG_POWER_TRY_ACTIVATE, src, target) | SEND_SIGNAL(owner, COMSIG_POWER_TRY_ACTIVATE, src, target) - if (target) - signal_return |= SEND_SIGNAL(target, COMSIG_POWER_TRY_ACTIVATE_ON, src) - if (signal_return & POWER_PREVENT_ACTIVATE) - //feedback is sent by the proc preventing activation - return FALSE - //can't activate if the owner isn't capable of it - if (!can_activate_untargeted(alert)) + if(!can_activate_untargeted(alert)) return FALSE - if ((check_flags & DISC_CHECK_DIRECT_SEE) && !can_see(owner, target, range)) - if (alert) + if((check_flags & DISC_CHECK_DIRECT_SEE) && !can_see(owner, target, range)) + if(alert) to_chat(owner, span_warning("You cannot cast [src] without being in direct line of sight!")) return FALSE //self activated so target doesn't matter - if (target_type == NONE) + if(target_type == NONE) return TRUE - //check if distance is in range - if (get_dist(owner, target) > range) - if (alert) - to_chat(owner, span_warning("[target] is out of range!")) - return FALSE - //handling for if a ranged Discipline is being used on its caster - if (target == owner) - if (target_type & TARGET_SELF) + if(target == owner) + if(target_type & TARGET_SELF) return TRUE else - if (alert) + if(alert) to_chat(owner, span_warning("You can't use this power on yourself!")) return FALSE //account for complete supernatural resistance - if (HAS_TRAIT(target, TRAIT_ANTIMAGIC)) - if (alert) + if(HAS_TRAIT(target, TRAIT_ANTIMAGIC)) + if(alert) to_chat(owner, span_warning("[target] resists your Disciplines!")) return FALSE - //check target type - // mob/living with a bunch of extra conditions - if ((target_type & MOB_LIVING_TARGETING) && isliving(target)) - //make sure our LIVING target isn't DEAD - var/mob/living/living_target = target - if ((target_type & TARGET_LIVING) && (living_target.stat == DEAD)) - if (alert) - to_chat(owner, span_warning("You cannot cast [src] on dead things!")) - return FALSE - - if ((target_type & TARGET_PLAYER) && !living_target.client) - if (alert) - to_chat(owner, span_warning("You can only cast [src] on other players!")) - return FALSE - - if ((target_type & TARGET_VAMPIRE) && !iskindred(target)) - if (alert) - to_chat(owner, span_warning("You can only cast [src] on Kindred!")) - return FALSE - - if (ishuman(target)) - var/mob/living/carbon/human/human_target = living_target - //todo: remove this variable and refactor it into TRAIT_ANTIMAGIC - if (human_target.resistant_to_disciplines) - if (alert) - to_chat(owner, span_warning("[target] resists your Disciplines!")) - return FALSE + //check if distance is in range + if(!IN_GIVEN_RANGE(owner, target, range)) + if(alert) + to_chat(owner, span_warning("[target] is out of range!")) + return FALSE - if (target_type & TARGET_HUMAN) - return TRUE + //make sure our LIVING target isn't DEAD + var/mob/living/living_target = target + if((target_type & TARGET_LIVING) && (living_target?.stat == DEAD)) + if(alert) + to_chat(owner, span_warning("You cannot cast [src] on dead things!")) + return FALSE - if (target_type & TARGET_HUMAN) - if (alert) - to_chat(owner, span_warning("You can only cast [src] on humans!")) - return FALSE + if((target_type & TARGET_PLAYER) && !living_target?.client) + if(alert) + to_chat(owner, span_warning("You can only cast [src] on other players!")) + return FALSE - return TRUE + if((target_type & TARGET_VAMPIRE) && !iskindred(target)) + if(alert) + to_chat(owner, span_warning("You can only cast [src] on Kindred!")) + return FALSE - if ((target_type & TARGET_OBJ) && istype(target, /obj)) - return TRUE + if(target_type & TARGET_HUMAN && !ishuman(target)) + if(alert) + to_chat(owner, span_warning("You can only cast [src] on humans!")) + return FALSE - if ((target_type & TARGET_GHOST) && istype(target, /mob/dead)) - return TRUE + if((target_type & TARGET_OBJ) && !istype(target, /obj)) + return FALSE - if ((target_type & TARGET_TURF) && istype(target, /turf)) - return TRUE + if((target_type & TARGET_GHOST) && !istype(target, /mob/dead)) + return FALSE - //target doesn't match any targeted types, so can't activate on them - if (alert) - to_chat(owner, span_warning("You cannot cast [src] on [target]!")) - return FALSE + if((target_type & TARGET_TURF) && !istype(target, /turf)) + return FALSE + return TRUE /** * Spends necessary resources (vitae) and makes sure activation is valid @@ -359,13 +332,13 @@ spend_resources() var/signal_return = SEND_SIGNAL(src, COMSIG_POWER_PRE_ACTIVATION, src, target) | SEND_SIGNAL(owner, COMSIG_POWER_PRE_ACTIVATION, src, target) - if (target) + if(target) signal_return |= SEND_SIGNAL(target, COMSIG_POWER_PRE_ACTIVATION_ON, src) - if (signal_return & POWER_CANCEL_ACTIVATION) + if(signal_return & POWER_CANCEL_ACTIVATION) //feedback is sent by the proc cancelling activation return - if (!pre_activation_checks(target)) + if(!pre_activation_checks(target)) return activate(target) @@ -411,17 +384,17 @@ SEND_SIGNAL(src, COMSIG_POWER_ACTIVATE, src, target) SEND_SIGNAL(owner, COMSIG_POWER_ACTIVATE, src, target) - if (target) + if(target) SEND_SIGNAL(target, COMSIG_POWER_ACTIVATE_ON, src, was_hostile_usage(target)) //make it active if it can only have one active instance at a time - if (!multi_activate) + if(!multi_activate) active = TRUE - if (!cooldown_override) + if(!cooldown_override) do_cooldown(TRUE) - if (!duration_override) + if(!duration_override) do_duration(target) do_activate_sound() @@ -442,7 +415,7 @@ * only when using powers. */ /datum/discipline_power/proc/do_activate_sound() - if (activate_sound) + if(activate_sound) owner.playsound_local(owner, activate_sound, 50, FALSE) /** @@ -450,7 +423,7 @@ * effects, audible to everyone around it. */ /datum/discipline_power/proc/do_effect_sound(atom/target) - if (effect_sound) + if(effect_sound) playsound(target ? target : owner, effect_sound, 50, FALSE) /** @@ -466,7 +439,7 @@ * of using this power amongst NPCs. */ /datum/discipline_power/proc/do_masquerade_violation(atom/target) - if (violates_masquerade) + if(violates_masquerade) SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) /** @@ -475,7 +448,7 @@ * returns FALSE otherwise. */ /datum/discipline_power/proc/spend_resources() - if (can_afford()) + if(can_afford()) owner.adjust_blood_pool(-vitae_cost) owner.st_set_stat(STAT_TEMPORARY_WILLPOWER, owner.st_get_stat(STAT_TEMPORARY_WILLPOWER) - willpower_cost) owner.update_action_buttons() @@ -504,7 +477,7 @@ * try_deactivate(direct = TRUE). */ /datum/discipline_power/proc/do_duration(atom/target) - if (toggled && (duration_length == 0)) + if(toggled && (duration_length == 0)) return // DARKPACK TODO - (REFACTOR ME) @@ -523,7 +496,7 @@ * * on_activation - if this proc is being called by activate(), which will stop it from triggering unless multi_activate is true. */ /datum/discipline_power/proc/do_cooldown(on_activation = FALSE) - if (multi_activate && !on_activation) + if(multi_activate && !on_activation) return cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), cooldown_length, TIMER_STOPPABLE | TIMER_DELETE_ME) @@ -536,7 +509,7 @@ * * target - what the targeted Discipline (null otherwise) is being used on. */ /datum/discipline_power/proc/try_activate(atom/target) - if (can_activate(target, TRUE)) + if(can_activate(target, TRUE)) pre_activation(target) return TRUE @@ -552,7 +525,7 @@ clear_duration_timer() //proceed to deactivation or refreshing - if (toggled) + if(toggled) refresh(target) else try_deactivate(target) @@ -576,12 +549,29 @@ /datum/discipline_power/proc/can_deactivate_untargeted() SHOULD_CALL_PARENT(TRUE) - if (target_type == NONE) - if (isnull(owner)) + if(target_type == NONE) + if(isnull(owner)) return FALSE return TRUE +/** + * An overridable proc that allows for custom can_deactivate() behaviour. + * + * This is meant to be overridden by powers to allow for extra checks + * on deactivation (eg. Social vs. Mentality for mental disciplines), to + * delay deactivation with a do_after() (eg. Valeren 5 taking 10 seconds), + * or possibly to hijack the can_deactivate() proc by returning FALSE and + * using its own logic instead (like activating on several targets in an + * AoE rather than on one). Don't be fooled by the name, this is not just + * for checks. + * + * Arguments: + * * target - what the targeted Discipline (null otherwise) is being used on. + */ +/datum/discipline_power/proc/pre_deactivation_checks(atom/target) + return TRUE + /** * Overridable proc mirroring can_activate(), making sure * that deactivation won't result in a runtime in case of @@ -596,17 +586,20 @@ SHOULD_CALL_PARENT(TRUE) var/signal_return = SEND_SIGNAL(src, COMSIG_POWER_TRY_DEACTIVATE, src, target) | SEND_SIGNAL(owner, COMSIG_POWER_TRY_DEACTIVATE, src, target) - if (target) + if(target) signal_return |= SEND_SIGNAL(target, COMSIG_POWER_TRY_DEACTIVATE_ON, src) - if (signal_return & POWER_PREVENT_DEACTIVATE) + if(signal_return & POWER_PREVENT_DEACTIVATE) //feedback is sent by the proc cancelling activation return FALSE - if (!can_deactivate_untargeted()) + if(!can_deactivate_untargeted()) + return FALSE + + if(!pre_deactivation_checks(target)) return FALSE - if (target_type != NONE) - if (!target) + if(target_type != NONE) + if(!target) return FALSE return TRUE @@ -628,21 +621,21 @@ /datum/discipline_power/proc/deactivate(atom/target, direct = FALSE) SHOULD_CALL_PARENT(TRUE) - if (direct) + if(direct) clear_duration_timer() SEND_SIGNAL(src, COMSIG_POWER_DEACTIVATE, src, target) SEND_SIGNAL(owner, COMSIG_POWER_DEACTIVATE, src, target) - if (target) + if(target) SEND_SIGNAL(target, COMSIG_POWER_DEACTIVATE_ON, src) - if (!multi_activate) + if(!multi_activate) active = FALSE - if (!cooldown_override) + if(!cooldown_override) do_cooldown() - if (deactivate_sound) + if(deactivate_sound) owner.playsound_local(owner, deactivate_sound, 50, FALSE) owner.update_action_buttons() @@ -660,10 +653,10 @@ /datum/discipline_power/proc/try_deactivate(atom/target, direct = FALSE, alert = FALSE) SHOULD_NOT_OVERRIDE(TRUE) - if (can_deactivate(target)) + if(can_deactivate(target)) deactivate(target, direct) - if (alert) + if(alert) to_chat(owner, span_warning("You deactivate [src].")) /** @@ -682,21 +675,21 @@ * * target - what the targeted Discipline (null otherwise) is being used on. */ /datum/discipline_power/proc/refresh(atom/target) - if (!active) + if(!active) return - if (!owner) + if(!owner) return //cancels if overridable proc returns FALSE - if (!do_refresh_checks(target)) + if(!do_refresh_checks(target)) return - if (spend_resources()) + if(spend_resources()) if(vitae_cost > 0) to_chat(owner, span_warning("[src] consumes your blood to stay active.")) if(willpower_cost > 0) to_chat(owner, span_warning("[src] consumes your willpower to stay active.")) - if (!duration_override) + if(!duration_override) do_duration(target) else to_chat(owner, span_warning("You don't have enough blood to keep [src] active!")) @@ -717,7 +710,7 @@ * duration_timer expire without calling the relevant proc. */ /datum/discipline_power/proc/clear_duration_timer(to_clear = 1) - if (toggled && (duration_length == 0)) + if(toggled && (duration_length == 0)) return deltimer(duration_timers[to_clear]) diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm index 56d76f718711..3063c9d9f0bb 100644 --- a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm +++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm @@ -74,6 +74,10 @@ /datum/discipline_power/dominate/proc/dominate_check(mob/living/carbon/human/owner, mob/living/carbon/human/target, owner_stat, numerical = FALSE) var/datum/discipline/dominate/parent_disc = discipline + if(HAS_TRAIT(owner, TRAIT_NO_EYE_CONTACT)) + to_chat(owner, span_warning("You are unable to make eye contact!")) + return FALSE + //someone has botched a dominate against this human if(LAZYLEN(parent_disc.botched_targets)) for(var/datum/weakref/ref in parent_disc.botched_targets) diff --git a/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm b/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm index bd0d11e468bc..1d4f95882467 100644 --- a/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm +++ b/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm @@ -59,7 +59,7 @@ speed = -0.4 maxHealth = 275 health = 275 - butcher_results = list(/obj/item/stack/human_flesh = 10) + butcher_results = list(/obj/item/stack/sheet/human_flesh = 10) melee_damage_lower = 30 melee_damage_upper = 30 attack_verb_continuous = "slashes" diff --git a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm index 2491b5030918..c1c8828d89d3 100644 --- a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm +++ b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm @@ -66,7 +66,6 @@ /datum/discipline_power/protean/feral_claws/activate() . = ..() - sleep(1 TURNS) owner.drop_all_held_items() owner.put_in_r_hand(new /obj/item/gangrel_claws(owner)) owner.put_in_l_hand(new /obj/item/gangrel_claws(owner)) diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm new file mode 100644 index 000000000000..9cd778fc9f3e --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm @@ -0,0 +1,166 @@ +#define SPECIES_BLOODFORM "bloodform" + +/datum/species/tzimisce_blood_form + // Entirely alien beings that seem to be made entirely out of gel. They have three eyes and a skeleton visible within them. + name = "\improper Bloodform" + plural_form = "Bloodforms" + id = SPECIES_BLOODFORM + examine_limb_id = SPECIES_BLOODFORM + inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SLIME + inherent_traits = list( + TRAIT_MUTE, + TRAIT_NO_EYE_CONTACT, + TRAIT_MUTANT_COLORS, + ) + exotic_bloodtype = BLOOD_TYPE_KINDRED + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + bodypart_overrides = list( + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/blood_form, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/blood_form, + BODY_ZONE_HEAD = /obj/item/bodypart/head/blood_form, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/blood_form, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/blood_form, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/blood_form, + ) + fixed_mut_color = "#e60000d3" + hair_color_mode = USE_FIXED_MUTANT_COLOR + hair_alpha = 150 + facial_hair_alpha = 150 + var/datum/action/innate/regenerate_blood_limbs/regenerate_limbs + +/datum/species/tzimisce_blood_form/on_species_gain(mob/living/carbon/new_jellyperson, datum/species/old_species, pref_load, regenerate_icons) + . = ..() + if(ishuman(new_jellyperson)) + regenerate_limbs = new + regenerate_limbs.Grant(new_jellyperson) + new_jellyperson.AddElement(/datum/element/soft_landing) + RegisterSignal(new_jellyperson, COMSIG_HUMAN_ON_HANDLE_BLOOD, PROC_REF(slime_blood)) + +/datum/species/tzimisce_blood_form/on_species_loss(mob/living/carbon/former_jellyperson, datum/species/new_species, pref_load) + if(regenerate_limbs) + regenerate_limbs.Remove(former_jellyperson) + former_jellyperson.RemoveElement(/datum/element/soft_landing) + UnregisterSignal(former_jellyperson, COMSIG_HUMAN_ON_HANDLE_BLOOD) + return ..() + +/datum/species/tzimisce_blood_form/proc/slime_blood(mob/living/carbon/human/slime, seconds_per_tick) + SIGNAL_HANDLER + + if(slime.stat == DEAD) + return HANDLE_BLOOD_HANDLED + + if(slime.bloodpool < 1) // Oh shit, we're running out of blood. Save ourselves by cannibalizing a limb. + if(!cannibalize_body(slime)) + slime.death() // We couldnt cannibalize a limb, so that means we've hit critical blood. Time to die. + return HANDLE_BLOOD_HANDLED + + regenerate_limbs?.build_all_button_icons(UPDATE_BUTTON_STATUS) + return HANDLE_BLOOD_HANDLED + +/datum/species/tzimisce_blood_form/proc/cannibalize_body(mob/living/carbon/human/H) + var/list/limbs_to_consume = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - H.get_missing_limbs() + var/obj/item/bodypart/consumed_limb + if(!length(limbs_to_consume)) + H.losebreath++ + return FALSE + if(H.num_legs) //Legs go before arms + limbs_to_consume -= list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) + consumed_limb = H.get_bodypart(pick(limbs_to_consume)) + consumed_limb.drop_limb() + to_chat(H, span_userdanger("Your [consumed_limb] is drawn back into your body, unable to maintain its shape!")) + qdel(consumed_limb) + H.bloodpool += 1 + return TRUE + +/datum/action/innate/regenerate_blood_limbs + name = "Regenerate Limbs" + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "slimeheal" + button_icon = 'icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + + var/blood_per_limb = 100 + +/datum/action/innate/regenerate_blood_limbs/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return + var/mob/living/carbon/human/H = owner + var/list/limbs_to_heal = H.get_missing_limbs() + if(!length(limbs_to_heal)) + return FALSE + if(H.get_blood_volume() >= BLOOD_VOLUME_OKAY + blood_per_limb) + return TRUE + +/datum/action/innate/regenerate_blood_limbs/Activate() + var/mob/living/carbon/human/H = owner + var/list/limbs_to_heal = H.get_missing_limbs() + if(!length(limbs_to_heal)) + to_chat(H, span_notice("You feel intact enough as it is.")) + return + to_chat(H, span_notice("You focus intently on your missing [length(limbs_to_heal) >= 2 ? "limbs" : "limb"]...")) + if(H.get_blood_volume() >= blood_per_limb * length(limbs_to_heal) + BLOOD_VOLUME_OKAY) + H.regenerate_limbs() + H.adjust_blood_volume(-blood_per_limb * length(limbs_to_heal)) + to_chat(H, span_notice("...and after a moment you finish reforming!")) + return + else if(H.get_blood_volume() >= blood_per_limb)//We can partially heal some limbs + while(H.get_blood_volume() >= BLOOD_VOLUME_OKAY + blood_per_limb) + var/healed_limb = pick(limbs_to_heal) + H.regenerate_limb(healed_limb) + limbs_to_heal -= healed_limb + H.adjust_blood_volume(-blood_per_limb) + to_chat(H, span_warning("...but there is not enough of you to fix everything! You must attain more vitae to heal completely!")) + return + to_chat(H, span_warning("...but there is not enough of you to go around! You must attain more vitae to heal!")) + +/// Bodyparts +/obj/item/bodypart/head/blood_form + biological_state = (BIO_INORGANIC) + limb_id = SPECIES_SLIMEPERSON + dmg_overlay_type = null + teeth_count = 0 + head_flags = HEAD_EYECOLOR | HEAD_EYESPRITES | HEAD_HAIR | HEAD_FACIAL_HAIR + butcher_replacement = null + is_dimorphic = FALSE + +/obj/item/bodypart/chest/blood_form + biological_state = (BIO_INORGANIC) + limb_id = SPECIES_SLIMEPERSON + dmg_overlay_type = null + butcher_replacement = null + is_dimorphic = TRUE + +/obj/item/bodypart/chest/blood_form/get_butt_sprite() + return icon('icons/mob/butts.dmi', BUTT_SPRITE_SLIME) + +/obj/item/bodypart/arm/left/blood_form + biological_state = (BIO_INORGANIC) + limb_id = SPECIES_SLIMEPERSON + dmg_overlay_type = null + butcher_replacement = null + is_dimorphic = FALSE + +/obj/item/bodypart/arm/right/blood_form + biological_state = (BIO_INORGANIC) + limb_id = SPECIES_SLIMEPERSON + dmg_overlay_type = null + butcher_replacement = null + is_dimorphic = FALSE + +/obj/item/bodypart/leg/left/blood_form + biological_state = (BIO_INORGANIC) + limb_id = SPECIES_SLIMEPERSON + dmg_overlay_type = null + butcher_replacement = null + is_dimorphic = FALSE + +/obj/item/bodypart/leg/right/blood_form + biological_state = (BIO_INORGANIC) + limb_id = SPECIES_SLIMEPERSON + dmg_overlay_type = null + butcher_replacement = null + is_dimorphic = FALSE + +#undef SPECIES_BLOODFORM diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm new file mode 100644 index 000000000000..d5a0aab6112e --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/crafting_recipes.dm @@ -0,0 +1,88 @@ +/datum/crafting_recipe/tzi_trench + name = "Leather-Bone Trenchcoat (Armor)" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 50, /obj/item/spine = 1) + result = /obj/item/clothing/suit/vampire/trench/tzi + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_heart + name = "Second Heart (Antistun)" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 25, /obj/item/organ/heart = 1) + result = /obj/item/organ/cyberimp/brain/anti_stun/tzi + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_eyes + name = "Better Eyes (Nightvision)" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 15, /obj/item/organ/eyes = 1) + result = /obj/item/organ/eyes/night_vision/tzimisce + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_implant + name = "Implanting Flesh Device" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 10, /obj/item/knife/vamp = 1, /obj/item/reagent_containers/blood = 1) + result = /obj/item/autosurgeon/vicissitude + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzicreature + name = "Wretched Creature" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 10, /obj/item/organ/brain = 1) + result = /obj/item/toy/plush/tzi + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_floor + name = "Gut Floor" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 1, /obj/item/guts = 1) + result = /obj/effect/decal/gut_floor + category = CAT_TZIMISCE + crafting_flags = CRAFT_ON_SOLID_GROUND|CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/tzi_wall + name = "Flesh Wall" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 2) + result = /obj/structure/fleshwall + category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/tzijelly + name = "Living Meat Node" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 20, /obj/item/guts = 1, /obj/item/toy/plush/tzi = 1) + result = /obj/structure/tzijelly + category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/tzi_stool + name = "Arm Stool" + time = 50 + reqs = list(/obj/item/stack/sheet/human_flesh = 5, /obj/item/bodypart/arm/right = 2, /obj/item/bodypart/arm/left = 2) + result = /obj/structure/chair/old/tzimisce + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_biter + name = "Biting Abomination" + time = 100 + reqs = list(/obj/item/stack/sheet/human_flesh = 2, /obj/item/bodypart/arm/right = 2, /obj/item/bodypart/arm/left = 2, /obj/item/spine = 1) + result = /mob/living/basic/szlachta + category = CAT_TZIMISCE + +/datum/crafting_recipe/tzi_fister + name = "Punching Abomination" + time = 100 + reqs = list(/obj/item/stack/sheet/human_flesh = 5, /obj/item/bodypart/arm/right = 1, /obj/item/bodypart/arm/left = 1, /obj/item/spine = 1, /obj/item/guts = 1) + result = /mob/living/basic/szlachta/fister + category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/tzi_tanker + name = "Fat Abomination" + time = 100 + reqs = list(/obj/item/stack/sheet/human_flesh = 10, /obj/item/bodypart/arm/right = 1, /obj/item/bodypart/arm/left = 1, /obj/item/bodypart/leg/right = 1, /obj/item/bodypart/leg/left = 1, /obj/item/spine = 1, /obj/item/guts = 2) + result = /mob/living/basic/szlachta/tanker + category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/fleshwalls.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/fleshwalls.dm deleted file mode 100644 index 23112b415532..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/fleshwalls.dm +++ /dev/null @@ -1,22 +0,0 @@ - -/obj/structure/fleshwall - name = "flesh wall" - desc = "Wall from FLESH." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "fleshwall" - plane = GAME_PLANE - layer = ABOVE_MOB_LAYER - anchored = TRUE - density = TRUE - max_integrity = 100 - -/obj/structure/tzijelly - name = "jelly thing" - desc = "an important part of the meat matrix." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "tzijelly" - plane = GAME_PLANE - layer = ABOVE_MOB_LAYER - anchored = TRUE - density = TRUE - max_integrity = 100 diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/human_flesh.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/human_flesh.dm deleted file mode 100644 index f023ec1e8299..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/human_flesh.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/item/stack/human_flesh - name = "human flesh" - desc = "What the fuck..." - singular_name = "human flesh" - icon = 'modular_darkpack/modules/deprecated/icons/obj/stack_objects.dmi' - icon_state = "human" - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - mats_per_unit = list(/datum/material/pizza = SHEET_MATERIAL_AMOUNT) - merge_type = /obj/item/stack/human_flesh - max_amount = 50 - -/obj/item/stack/human_flesh/fifty - amount = 50 - -/obj/item/stack/human_flesh/twenty - amount = 20 - -/obj/item/stack/human_flesh/ten - amount = 10 - -/obj/item/stack/human_flesh/five - amount = 5 diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/creatures.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/creatures.dm similarity index 50% rename from modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/creatures.dm rename to modular_darkpack/modules/powers/code/discipline/vicissitude/objects/creatures.dm index 7e2f2193cde1..dd40d411f973 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/creatures.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/creatures.dm @@ -6,7 +6,7 @@ icon_living = "biter" icon_dead = "biter_dead" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - butcher_results = list(/obj/item/stack/human_flesh = 1) + butcher_results = list(/obj/item/stack/sheet/human_flesh = 1) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -26,6 +26,7 @@ bloodquality = BLOOD_QUALITY_LOW bloodpool = 2 maxbloodpool = 2 + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 2) /mob/living/basic/szlachta/fister name = "fister" @@ -35,7 +36,7 @@ icon_dead = "fister_dead" maxHealth = 125 health = 125 - butcher_results = list(/obj/item/stack/human_flesh = 2) + butcher_results = list(/obj/item/stack/sheet/human_flesh = 2) melee_damage_lower = 30 melee_damage_upper = 30 attack_verb_continuous = "punches" @@ -45,6 +46,7 @@ status_flags = CANPUSH bloodpool = 5 maxbloodpool = 5 + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 5) /mob/living/basic/szlachta/tanker name = "tanker" @@ -54,7 +56,7 @@ icon_dead = "tanker_dead" maxHealth = 350 health = 350 - butcher_results = list(/obj/item/stack/human_flesh = 4) + butcher_results = list(/obj/item/stack/sheet/human_flesh = 4) melee_damage_lower = 25 melee_damage_upper = 25 attack_verb_continuous = "slashes" @@ -63,47 +65,7 @@ combat_mode = TRUE bloodpool = 7 maxbloodpool = 7 - -/mob/living/basic/tzimisce_beast - name = "tzimisce beast form" - desc = "The peak of abominations armor. Unbelievably undamagable..." - icon = 'modular_darkpack/modules/deprecated/icons/64x64.dmi' - icon_state = "weretzi" - icon_living = "weretzi" - pixel_w = -16 - pixel_z = -16 - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - mob_size = MOB_SIZE_HUGE - speed = -0.55 - maxHealth = 575 - health = 575 - butcher_results = list(/obj/item/stack/human_flesh = 10) - melee_damage_lower = 35 - melee_damage_upper = 70 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/items/weapons/slash.ogg' - combat_mode = TRUE - bloodpool = 10 - maxbloodpool = 10 - -/mob/living/basic/bloodcrawler - name = "tzimisce blood form" - desc = "The peak of abominations. Unbelievably undamagable..." - icon = 'modular_darkpack/modules/deprecated/icons/mobs.dmi' - icon_state = "liquid" - icon_living = "liquid" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speed = 3 - butcher_results = list(/obj/item/stack/human_flesh = 1) - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/items/weapons/slash.ogg' - combat_mode = TRUE - bloodpool = 20 - maxbloodpool = 20 + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 10) /mob/living/basic/szlachta/hostile faction = list(FACTION_HOSTILE) @@ -113,18 +75,3 @@ /mob/living/basic/szlachta/tanker/hostile faction = list(FACTION_HOSTILE) - -/mob/living/basic/bloodcrawler - var/collected_blood = 0 - -/mob/living/basic/bloodcrawler/Move(NewLoc, direct) - . = ..() - var/obj/structure/vampdoor/V = locate() in NewLoc - if(V?.lockpick_difficulty <= 10) - forceMove(get_turf(V)) - for(var/obj/effect/decal/cleanable/blood/B in range(1, NewLoc)) - if(B.bloodiness) - collected_blood = collected_blood+1 - to_chat(src, span_info("You sense blood entering your mass...")) - var/turf/T = get_turf(B) - T?.wash(CLEAN_SCRUB) diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/flesh_items.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/flesh_items.dm new file mode 100644 index 000000000000..d131a468658b --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/flesh_items.dm @@ -0,0 +1,143 @@ +/datum/material/vicissitude_flesh + name = "flesh" + desc = "What remains of a person, when you really get down to it." + color = "#d8965b" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL = TRUE) + sheet_type = /obj/item/stack/sheet/human_flesh + value_per_unit = 0.05 + beauty_modifier = -0.3 + strength_modifier = 0.7 + item_sound_override = 'sound/effects/meatslap.ogg' + turf_sound_override = FOOTSTEP_MEAT + +/obj/item/stack/sheet/human_flesh + name = "human flesh" + desc = "What the fuck..." + singular_name = "human flesh" + icon = 'modular_darkpack/modules/powers/icons/flesh_stack.dmi' + icon_state = "human" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/powers/icons/flesh_onfloor.dmi') + mats_per_unit = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/human_flesh + max_amount = 50 + +/obj/item/stack/sheet/human_flesh/fifty + amount = 50 + +/obj/item/stack/sheet/human_flesh/twenty + amount = 20 + +/obj/item/stack/sheet/human_flesh/ten + amount = 10 + +/obj/item/stack/sheet/human_flesh/five + amount = 5 + +/obj/item/autosurgeon/vicissitude + name = "little brother" + desc = "A talented fleshcrafted creature that can insert an implant or organ into its master without the hassle of extensive surgery. \ + Its mouth is eagerly awaiting implants or organs. However, it's quite greedy, so a screwdriver must be used to pry away accidentally added items." + icon = 'modular_darkpack/modules/powers/icons/flesh_items.dmi' + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 10, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 6) + +/obj/structure/fleshwall + name = "flesh wall" + desc = "Wall from FLESH." + icon = 'modular_darkpack/modules/powers/icons/flesh_objects.dmi' + icon_state = "fleshwall" + plane = GAME_PLANE + layer = ABOVE_MOB_LAYER + anchored = TRUE + density = TRUE + max_integrity = 100 + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 2) + +/obj/structure/tzijelly + name = "jelly thing" + desc = "an important part of the meat matrix." + icon = 'modular_darkpack/modules/powers/icons/flesh_objects.dmi' + icon_state = "tzijelly" + plane = GAME_PLANE + layer = ABOVE_MOB_LAYER + anchored = TRUE + density = TRUE + max_integrity = 100 + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 30) + +/obj/item/ground_heir + name = "bag of ground" + desc = "Heroic strength is forged here..." + icon_state = "dirt" + icon = 'modular_darkpack/modules/powers/icons/flesh_items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/powers/icons/flesh_onfloor.dmi') + w_class = WEIGHT_CLASS_SMALL + +// Why is this NOT a floor type. +/obj/effect/decal/gut_floor + name = "gut floor" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "tzimisce_floor" + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT) + +/obj/effect/decal/gut_floor/Initialize(mapload) + . = ..() + if(isopenturf(get_turf(src))) + var/turf/open/T = get_turf(src) + if(T) + T.slowdown = 1 + +/obj/effect/decal/gut_floor/Destroy() + . = ..() + var/turf/open/T = get_turf(src) + if(T) + T.slowdown = initial(T.slowdown) + +/obj/structure/chair/old/tzimisce + icon = 'modular_darkpack/modules/powers/icons/flesh_objects.dmi' + icon_state = "tzimisce_stool" + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 5) + +/obj/item/guts + name = "guts" + desc = "Just blood and guts..." + icon_state = "guts" + icon = 'modular_darkpack/modules/powers/icons/flesh_items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/powers/icons/flesh_onfloor.dmi') + w_class = WEIGHT_CLASS_SMALL + +/obj/item/spine + name = "spine" + desc = "If only I had control..." + icon_state = "spine" + icon = 'modular_darkpack/modules/powers/icons/flesh_items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/powers/icons/flesh_onfloor.dmi') + w_class = WEIGHT_CLASS_SMALL + +/obj/item/clothing/suit/vampire/trench/tzi + name = "fleshcoat" + desc = "HUMAN LEATHER JACKET." + icon_state = "trench_tzi" + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 50) + armor_type = /datum/armor/fleshcoat + clothing_traits = list(TRAIT_UNMASQUERADE) + +/datum/armor/fleshcoat + melee = 50 + bullet = 50 + laser = 10 + energy = 10 + bomb = 25 + acid = 10 + wound = 50 + +/obj/item/organ/cyberimp/brain/anti_stun/tzi + name = "secondary adrenal gland" + desc = "This organ will secrete a potent cocktail of stimulants when stunned, reducing downtime. Installs to the head." + icon_state = "tongueayylmao" + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 25) + +/obj/item/organ/eyes/night_vision/tzimisce + low_light_cutoff = list(15, 6, 8) + medium_light_cutoff = list(35, 20, 25) + high_light_cutoff = list(50, 40, 40) + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 15) diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm new file mode 100644 index 000000000000..779654f68f62 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/surgery_tools.dm @@ -0,0 +1,120 @@ +/obj/item/organ/cyberimp/arm/toolkit/surgery/vicissitude + icon_state = "toolkit_implant_vic" + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + organ_flags = ORGAN_ORGANIC + aug_overlay = "" + items_to_create = list( + /obj/item/retractor/augment/vicissitude, + /obj/item/hemostat/augment/vicissitude, + /obj/item/cautery/augment/vicissitude, + /obj/item/surgicaldrill/augment/vicissitude, + /obj/item/scalpel/augment/vicissitude, + /obj/item/circular_saw/augment/vicissitude, + /obj/item/surgical_drapes/vicissitude, + /obj/item/bonesetter/augment/vicissitude, + /obj/item/blood_filter/augment/vicissitude, + /obj/item/healthanalyzer/vicissitude, + /obj/item/shockpaddles/cyborg/vicissitude) + +/obj/item/retractor/augment/vicissitude + name = "retracting appendage" + desc = "A pair of prehensile pincers." + icon_state = "retractor_vic" + inhand_icon_state = "clamps_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/hemostat/augment/vicissitude + name = "hemostatic pincers" + desc = "A pair of thin appendages that were once fingers, secreting a hemostatic fluid from the tips." + icon_state = "hemostat_vic" + inhand_icon_state = "clamps_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/cautery/augment/vicissitude + name = "chemical cautery" + desc = "A specialized organ drooling a chemical package that releases an extreme amount of heat, very quickly." + icon_state = "cautery_vic" + inhand_icon_state = "cautery_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/surgicaldrill/augment/vicissitude + name = "surgical fang" + desc = "A spiral fang that bores into the flesh with reckless glee." + icon_state = "drill_vic" + inhand_icon_state = "drill_vic" + hitsound = 'sound/effects/wounds/blood2.ogg' + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/scalpel/augment/vicissitude + name = "scalpel claw" + desc = "An altered nail, adjusted to make fine incisions." + icon_state = "scalpel_vic" + inhand_icon_state = "scalpel_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/circular_saw/augment/vicissitude + name = "circular jaw" + desc = "A spinning disc of teeth, screaming, as it bites through the flesh." + icon_state = "saw_vic" + inhand_icon_state = "saw_vic" + hitsound = 'sound/effects/wounds/blood2.ogg' + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/surgical_drapes/vicissitude + name = "skin drape" + desc = "A stretch of skin, sweating out antibiotics and disinfectants, to provide a sterile-ish environment to work in." + icon_state = "surgical_drapes_vic" + inhand_icon_state = "drapes_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/bonesetter/augment/vicissitude + name = "bonesetting appendage" + desc = "A pair of organic clamps for setting bones." + icon_state = "bone setter_vic" + inhand_icon_state = "clamps_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/blood_filter/augment/vicissitude + name = "filtering organ" + desc = "A specialised set of organs capable of filtering blood non-harmfully." + icon_state = "bone-gel_vic" + inhand_icon_state = "clamps_vic" + lefthand_file = 'modular_darkpack/modules/powers/icons/righthand.dmi' + righthand_file = 'modular_darkpack/modules/powers/icons/lefthand.dmi' + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + +/obj/item/healthanalyzer/vicissitude + name = "synaptic tendrils" + desc = "A set of sensory tendrils that swiftly assess the health conditions of a patient" + icon = 'icons/obj/medical/organs/organs.dmi' + icon_state = "hivenode" + advanced = TRUE + +/obj/item/shockpaddles/cyborg/vicissitude + name = "electrocyte stack" + desc = "A stack of electrocyte cells - they take too long to recharge for combat uses, but are able to produce powerful shocks." + icon = 'modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi' + icon_state = "shockpaddles0" + inhand_icon_state = "syndiepaddles0" + base_icon_state = "shockpaddles" + req_defib = FALSE + +/obj/item/shockpaddles/cyborg/vicissitude/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NEEDS_TWO_HANDS, "implant_requirement") diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/shapeshifting.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/shapeshifting.dm new file mode 100644 index 000000000000..20263789130b --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/shapeshifting.dm @@ -0,0 +1,267 @@ +#define CHANGE_HAIR "Change Hair" +#define CHANGE_BEARD "Change Beard" +#define CHANGE_SEX "Change Sex" +#define CHANGE_NAME "Change Name" +#define CHANGE_EYES "Change Eyes" +#define CHANGE_RACE "Change Race" +#define CHANGE_HEIGHT "Change Height" +#define CHOICE_OPTIONS list(CHANGE_HAIR, CHANGE_BEARD, CHANGE_SEX, CHANGE_EYES, CHANGE_NAME, CHANGE_RACE, CHANGE_HEIGHT) + +/datum/action/cooldown/mob_cooldown/shapeshift + owner_has_control = FALSE + /// What choices we get to pick. + var/list/choices = CHOICE_OPTIONS + /// The range of this action. + var/range = 1 + /// list of datum/changeling_profile + var/list/stored_profiles = list() + /// The original profile of this vicissitude holder. + var/datum/changeling_profile/first_profile = null + /// Keeps track of the currently selected profile. + var/datum/changeling_profile/current_profile + /// Satic list of what each slot associated with (in regard to changeling flesh items). + var/static/list/slot2type = list( + "head" = /obj/item/clothing/head/changeling, + "wear_mask" = /obj/item/clothing/mask/changeling, + "wear_neck" = /obj/item/changeling, + "back" = /obj/item/changeling, + "wear_suit" = /obj/item/clothing/suit/changeling, + "w_uniform" = /obj/item/clothing/under/changeling, + "shoes" = /obj/item/clothing/shoes/changeling, + "belt" = /obj/item/changeling, + "gloves" = /obj/item/clothing/gloves/changeling, + "glasses" = /obj/item/clothing/glasses/changeling, + "ears" = /obj/item/changeling, + "wear_id" = /obj/item/changeling/id, + "s_store" = /obj/item/changeling, + ) + /// How many different appearances we can choose from. + var/max_appearances = 6 + +/datum/action/cooldown/mob_cooldown/shapeshift/New(Target, original) + . = ..() + update_choices() + +/datum/action/cooldown/mob_cooldown/shapeshift/Destroy() + first_profile = null + current_profile = null + return ..() + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/update_choices() + for(var/i in choices) + choices[i] = icon('modular_darkpack/modules/powers/icons/shapeshifting_radial.dmi', i) + +/datum/action/cooldown/mob_cooldown/shapeshift/Activate(atom/target) + . = ..() + display_radial_menu(target) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/display_radial_menu(mob/target) + var/chosen_option = show_radial_menu(owner, target, choices, target, radius = 36, tooltips = TRUE) + if(!chosen_option) + return TRUE + + if(((target.pulledby == owner) && (owner.grab_state >= GRAB_AGGRESSIVE)) || (target == owner)) + switch(chosen_option) + if(CHANGE_HAIR) + change_hair(target) + if(CHANGE_BEARD) + change_beard(target) + if(CHANGE_SEX) + change_sex(target) + if(CHANGE_NAME) + change_name(target) + if(CHANGE_EYES) + change_eyes(target) + if(CHANGE_RACE) + change_race(target) + if(CHANGE_HEIGHT) + change_height(target) + else + to_chat(owner, span_danger("You need to have a firm grip on [target]!")) + return TRUE + + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + return display_radial_menu(target) + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_sex(mob/living/carbon/human/target) + var/chosen_sex = tgui_input_list(owner, "Choose a gender.", "Confirmation", list("Male", "Female", "Plural", "Neuter")) + if(!chosen_sex) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + switch(chosen_sex) + if("Male") + target.gender = MALE + if("Female") + target.gender = FEMALE + if("Plural") + target.gender = PLURAL + if("Neuter") + target.gender = NEUTER + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the gender of [target].")) + + var/chosen_physique = tgui_input_list(owner, "Alter physique as well?", "Confirmation", list("Masculine", "Feminine")) + if(!chosen_physique) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.physique = (chosen_physique == "Masculine") ? MALE : FEMALE + target.dna.update_ui_block(/datum/dna_block/identity/gender) + target.update_body(is_creating = TRUE) // or else physique won't change properly + target.update_mutations_overlay() //(hulk male/female) + target.update_clothing(ITEM_SLOT_ICLOTHING) // update gender shaped clothing + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the physique of [target].")) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_eyes(mob/living/carbon/human/target) + var/new_eye_color = input(owner, "Choose a eye color", "Eye Color", target.eye_color_left) as color|null + if(!new_eye_color) + return TRUE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.set_eye_color(sanitize_hexcolor(new_eye_color)) + target.dna.update_ui_block(/datum/dna_block/identity/eye_colors) + target.update_body() + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the eye color of [target].")) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_beard(mob/living/carbon/human/target) + var/new_style = tgui_input_list(owner, "Select a facial hairstyle", "Grooming", SSaccessories.facial_hairstyles_list) + if(!new_style) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.set_facial_hairstyle(new_style, update = TRUE) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the facial style of [target].")) + + var/new_face_color = input(owner, "Choose a facial hair color", "Hair Color", target.facial_hair_color) as color|null + if(!new_face_color) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.set_facial_haircolor(sanitize_hexcolor(new_face_color)) + target.dna.update_ui_block(/datum/dna_block/identity/facial_color) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the facial hair color of [target].")) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_hair(mob/living/carbon/human/target) + var/new_style = tgui_input_list(owner, "Select a hairstyle", "Grooming", SSaccessories.hairstyles_list) + if(!new_style) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.set_hairstyle(new_style, update = TRUE) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the hair style of [target].")) + + var/new_hair_color = input(owner, "Choose a hair color", "Hair Color", target.hair_color) as color|null + if(!new_hair_color) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.set_haircolor(sanitize_hexcolor(new_hair_color)) + target.dna.update_ui_block(/datum/dna_block/identity/hair_color) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the hair color of [target].")) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_name(mob/living/carbon/human/target) + var/newname = sanitize_name(tgui_input_text(owner, "Who are we again?", "Name change", target.name, MAX_NAME_LEN)) + if(!newname || newname == target.real_name) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.real_name = newname + if(target.dna) + target.dna.real_name = newname + if(target.mind) + target.mind.name = newname + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the name of [target].")) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_race(mob/living/carbon/human/target) + var/list/skin_tones = list() + for(var/skin_tone as anything in GLOB.skin_tone_names) + var/skin_tone_name = GLOB.skin_tone_names[skin_tone] + skin_tones[skin_tone_name] = skin_tone + + var/new_s_tone = tgui_input_list(owner, "Choose a skin tone", "Race change", skin_tones) + new_s_tone = skin_tones[new_s_tone] + if(!new_s_tone) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.skin_tone = new_s_tone + target.dna.update_ui_block(/datum/dna_block/identity/skin_tone) + target.update_body(is_creating = TRUE) + target.update_mutations_overlay() + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the race of [target].")) + return TRUE + +/datum/action/cooldown/mob_cooldown/shapeshift/proc/change_height(mob/living/carbon/human/target) + var/list/heights = list( + "Taller" = HUMAN_HEIGHT_TALLER, + "Tall" = HUMAN_HEIGHT_TALL, + "Average" = HUMAN_HEIGHT_MEDIUM, + "Short" = HUMAN_HEIGHT_SHORT, + "Shorter" = HUMAN_HEIGHT_SHORTEST, + ) + + var/new_height = tgui_input_list(owner, "Choose a height", "Height change", heights) + new_height = heights[new_height] + if(!new_height) + return FALSE + if(!IN_GIVEN_RANGE(owner, target, range)) + return FALSE + if(!do_after(owner, delay = 1 TURNS, target = target)) + return FALSE + target.set_mob_height(new_height) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(owner, span_notice("You finish altering the height of [target].")) + return TRUE + +#undef CHANGE_HAIR +#undef CHANGE_BEARD +#undef CHANGE_SEX +#undef CHANGE_EYES +#undef CHANGE_NAME +#undef CHANGE_RACE +#undef CHANGE_HEIGHT +#undef CHOICE_OPTIONS diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/eye_colour_change.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/eye_colour_change.dm new file mode 100644 index 000000000000..2319c2e24142 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/eye_colour_change.dm @@ -0,0 +1,40 @@ +/* +/datum/surgery/fleshcraft/eye_colour_change + name = "Change Eye Colour" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/modify_eyes, /datum/surgery_step/close) + possible_locs = list(BODY_ZONE_PRECISE_EYES) + replaced_by = null + requires_tech = TRUE + +//reshape_face +/datum/surgery_step/modify_eyes + name = "Change Eye Colour" + accept_hand = TRUE + time = 20 + repeatable = TRUE + +/datum/surgery_step/modify_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to reshape [target]'s eyes."), + span_notice("[user] begins to manipulate [target]'s head in truly horrific ways!"), + span_notice("[user] begins to manipulate [target]'s head in truly horrific ways!"), + ) + display_pain(target, "You feel a burning feeling in the back of your eyes!") + +/datum/surgery_step/modify_eyes/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/new_eye_color = input(user, "Choose a eye color", "Eye Color", target.eye_color_left) as color|null + if(!new_eye_color) + return TRUE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + target.set_eye_color(sanitize_hexcolor(new_eye_color)) + target.dna.update_ui_block(/datum/dna_block/identity/eye_colors) + target.update_body() + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the eye color of [target].")) + return TRUE + +*/ diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/hair_colour_change.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/hair_colour_change.dm new file mode 100644 index 000000000000..644693571347 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/hair_colour_change.dm @@ -0,0 +1,47 @@ +/* +/datum/surgery/fleshcraft/hair + name = "Change Hair Colour" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/modify_hair, /datum/surgery_step/close) + possible_locs = list(BODY_ZONE_HEAD) + replaced_by = null + requires_tech = TRUE + +//reshape_face +/datum/surgery_step/modify_hair + name = "Change Hair Colour" + accept_hand = TRUE + time = 20 + +/datum/surgery_step/modify_hair/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to reshape [target]'s hair."), + span_notice("[user] begins to manipulate [target]'s head in truly horrific ways!"), + span_notice("[user] begins to manipulate [target]'s head in truly horrific ways!"), + ) + display_pain(target, "You feel your hair being pulled in excruciating pain!") + +/datum/surgery_step/modify_hair/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", SSaccessories.hairstyles_list) + if(!new_style) + return FALSE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + target.set_hairstyle(new_style, update = TRUE) + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the hair style of [target].")) + + var/new_hair_color = input(user, "Choose a hair color", "Hair Color", target.hair_color) as color|null + if(!new_hair_color) + return FALSE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + target.set_haircolor(sanitize_hexcolor(new_hair_color)) + target.dna.update_ui_block(/datum/dna_block/identity/hair_color) + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the hair color of [target].")) + return TRUE +*/ diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/height_change.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/height_change.dm new file mode 100644 index 000000000000..e6b00b795337 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/height_change.dm @@ -0,0 +1,55 @@ +/* +/datum/surgery/fleshcraft/height_change + name = "Height Change" + possible_locs = list(BODY_ZONE_CHEST) + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/saw, + /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/incise, + /datum/surgery_step/change_spine, + /datum/surgery_step/close + ) + + replaced_by = null + requires_tech = TRUE + +/datum/surgery_step/change_spine + name = "Manipulate Spine" + accept_hand = TRUE + time = 100 + repeatable = TRUE + +/datum/surgery_step/change_spine/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to manipulate [target]'s spine like taffy."), + span_notice("[user] begins to manipulate [target]'s spine like taffy!"), + span_notice("[user] begins to manipulate [target]'s spine like taffy!"), + ) + display_pain(target, "You feel like your spine is carving its way through your back!") + +/datum/surgery_step/change_spine/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/list/heights = list( + "Taller" = HUMAN_HEIGHT_TALLER, + "Tall" = HUMAN_HEIGHT_TALL, + "Average" = HUMAN_HEIGHT_MEDIUM, + "Short" = HUMAN_HEIGHT_SHORT, + "Shorter" = HUMAN_HEIGHT_SHORTEST, + ) + + var/new_height = tgui_input_list(user, "Choose a height", "Height change", heights) + new_height = heights[new_height] + if(!new_height) + return FALSE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + target.set_mob_height(new_height) + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the height of [target].")) + return TRUE + +*/ diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/operation_eye_color.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/operation_eye_color.dm new file mode 100644 index 000000000000..13226fd23815 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/operation_eye_color.dm @@ -0,0 +1,80 @@ +#define OPERATION_NEW_COLOR "chosen_color" + +/datum/surgery_operation/organ/eye_color_surgery + name = "keratopigmentation surgery" + desc = "Change the color of a patient's eyes." + implements = list( + TOOL_HEMOSTAT = 1.15, + TOOL_SCREWDRIVER = 2.85, + /obj/item/pen = 6.67, + ) + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/scalpel2.ogg' + operation_flags = OPERATION_LOCKED | OPERATION_NOTABLE | OPERATION_MORBID + time = 20 SECONDS + target_type = /obj/item/organ/eyes + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_VESSELS_UNCLAMPED + required_organ_flag = NONE + +/datum/surgery_operation/organ/eye_color_surgery/all_required_strings() + return list("operate on eyes (target eyes)") + ..() + +/datum/surgery_operation/organ/eye_color_surgery/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/organ/eye_color_surgery/state_check(atom/movable/operating_on) + return TRUE + +/datum/surgery_operation/organ/eye_color_surgery/pre_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + operation_args[OPERATION_NEW_COLOR] = list() + operation_args[OPERATION_NEW_COLOR] += tgui_color_picker(surgeon, "Left Eye", "Keratopigmentation Surgery") + operation_args[OPERATION_NEW_COLOR] += tgui_color_picker(surgeon, "Right Eye", "Keratopigmentation Surgery") + return !!operation_args[OPERATION_NEW_COLOR][1] || !!operation_args[OPERATION_NEW_COLOR][2] + +/datum/surgery_operation/organ/eye_color_surgery/on_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/patient = get_patient(operating_on) + var/atom/movable/display_target = patient || operating_on + display_results( + surgeon, + patient, + span_notice("You begin to alter [patient.name]'s eyes..."), + span_notice("[surgeon] begins to alter [patient.name]'s eyes."), + span_notice("[surgeon] begins to make an incision in [patient.name]'s [display_target]."), + ) + display_pain(patient, "You feel a slicing pain across your face!") + +/datum/surgery_operation/organ/eye_color_surgery/on_success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(operating_on) + + var/eye_color_left = operation_args[OPERATION_NEW_COLOR][1] + var/eye_color_right = operation_args[OPERATION_NEW_COLOR][2] + patient.set_eye_color(sanitize_hexcolor(eye_color_left), sanitize_hexcolor(eye_color_right)) + patient.dna.update_ui_block(/datum/dna_block/identity/eye_colors) + patient.update_body() + + display_results( + surgeon, + patient, + span_notice("You alter [patient.name]'s eyes completely."), + span_notice("[surgeon] alters [patient.name]'s eyes completely."), + span_notice("[surgeon] finishes the operation on [patient.name]'s eyes."), + ) + display_pain(patient, "The pain fades, your eyes feel new and unfamiliar!") + +/datum/surgery_operation/organ/eye_color_surgery/on_failure(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(operating_on) + display_results( + surgeon, + patient, + span_warning("Your screw up, leaving [patient.name]'s eyes bruised!"), + span_warning("[surgeon] screws up, bruising [patient.name]'s eyes!"), + span_notice("[surgeon] finishes the operation on [patient.name]'s eyes."), + ) + display_pain(patient, "Your eyes feels torn!") + ADD_TRAIT(patient, TRAIT_DISFIGURED, TRAIT_GENERIC) + var/obj/item/organ/eyes/eyes = patient.get_organ_slot(ORGAN_SLOT_EYES) + eyes.apply_organ_damage(1) + +#undef OPERATION_NEW_COLOR + diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/sex_change.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/sex_change.dm new file mode 100644 index 000000000000..f7d034d2b6be --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/sex_change.dm @@ -0,0 +1,67 @@ +/* +/datum/surgery/fleshcraft/sex_change + name = "Sex Change" + steps = list(/datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/incise, + /datum/surgery_step/sex_change, + /datum/surgery_step/close) + + replaced_by = null + requires_tech = TRUE + +/datum/surgery_step/sex_change + name = "Sex Change" + accept_hand = TRUE + time = 180 + repeatable = TRUE + +/datum/surgery_step/sex_change/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to reshape [target]..."), + span_notice("[user] begins to manipulate [target]'s flesh in truly horrific ways!"), + span_notice("[user] begins to manipulate [target]'s flesh in truly horrific ways!"), + ) + display_pain(target, "You feel like your flesh is moving!") + +/datum/surgery_step/sex_change/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + display_results(user, target, span_notice("You finish changing [target]'s sex!"), + span_notice("[user] changes [target] into something... new."), + span_notice("[user] finishes.")) + var/chosen_sex = tgui_input_list(user, "Choose a gender.", "Confirmation", list("Male", "Female", "Plural", "Neuter")) + if(!chosen_sex) + return FALSE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + switch(chosen_sex) + if("Male") + target.gender = MALE + if("Female") + target.gender = FEMALE + if("Plural") + target.gender = PLURAL + if("Neuter") + target.gender = NEUTER + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the gender of [target].")) + + var/chosen_physique = tgui_input_list(user, "Alter physique as well?", "Confirmation", list("Masculine", "Feminine")) + if(!chosen_physique) + return FALSE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + target.physique = (chosen_physique == "Masculine") ? MALE : FEMALE + target.dna.update_ui_block(/datum/dna_block/identity/gender) + target.update_body(is_creating = TRUE) // or else physique won't change properly + target.update_mutations_overlay() //(hulk male/female) + target.update_clothing(ITEM_SLOT_ICLOTHING) // update gender shaped clothing + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the physique of [target].")) + return TRUE + +*/ diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/skin_colour_change.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/skin_colour_change.dm new file mode 100644 index 000000000000..533ba9dab9e3 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/skin_colour_change.dm @@ -0,0 +1,46 @@ +/* +/datum/surgery/fleshcraft/skin_colour_change + name = "Change Skin Colour" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/modify_skin, /datum/surgery_step/close) + possible_locs = list(BODY_ZONE_CHEST) + replaced_by = null + requires_tech = TRUE + +//Modify Skin Tone +/datum/surgery_step/modify_skin + name = "Change Skin Colour" + accept_hand = TRUE + time = 64 + repeatable = TRUE + +/datum/surgery_step/modify_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to alter [target]'s skin..."), + span_notice("[user] begins to alter [target]'s skin."), + span_notice("[user] begins to press against [target]'s skin."), + ) + display_pain(target, "Your skin stings like hell!") + +/datum/surgery_step/modify_skin/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/list/skin_tones = list() + for(var/skin_tone as anything in GLOB.skin_tone_names) + var/skin_tone_name = GLOB.skin_tone_names[skin_tone] + skin_tones[skin_tone_name] = skin_tone + + var/new_s_tone = tgui_input_list(user, "Choose a skin tone", "Race change", skin_tones) + new_s_tone = skin_tones[new_s_tone] + if(!new_s_tone) + return FALSE + if(!IN_GIVEN_RANGE(user, target, 1)) + return FALSE + target.skin_tone = new_s_tone + target.dna.update_ui_block(/datum/dna_block/identity/skin_tone) + target.update_body(is_creating = TRUE) + target.update_mutations_overlay() + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + playsound(target, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(user, span_notice("You finish altering the race of [target].")) + return TRUE +*/ diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm index 403d8d8a1806..661061dc5294 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm @@ -1,3 +1,6 @@ + +// Level 5: Slimegirl tzimisce + /datum/discipline/vicissitude name = "Vicissitude" desc = "It is widely known as Tzimisce art of flesh and bone shaping. Violates Masquerade." @@ -7,420 +10,191 @@ /datum/discipline/vicissitude/post_gain() . = ..() - owner.faction |= VAMPIRE_CLAN_TZIMISCE + owner.add_faction(VAMPIRE_CLAN_TZIMISCE) + +//////////////////////////////////////////////////////////////////////////////////////////// /datum/discipline_power/vicissitude name = "Vicissitude power name" desc = "Vicissitude power description" - activate_sound = 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg' + var/datum/action/cooldown/mob_cooldown/shapeshift/shapeshift_ability + +/datum/discipline_power/vicissitude/post_gain() + if(!shapeshift_ability) + shapeshift_ability = new(owner) + shapeshift_ability.Grant(owner) + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//MALLEABLE VISAGE /datum/discipline_power/vicissitude/malleable_visage name = "Malleable Visage" - desc = "Change your features to mimic those of a victim." + desc = "Shapeshift yourself." level = 1 - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND | DISC_CHECK_SEE | DISC_CHECK_LYING - - violates_masquerade = TRUE + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND + target_type = NONE + cooldown_length = 1 TURNS + vitae_cost = 1 + toggled = FALSE - cooldown_length = 10 SECONDS - - //why is this necessary why isn't transfer_identity working please fix this - var/datum/dna/original_dna - var/original_name - var/original_skintone - var/original_hairstyle - var/original_facialhair - var/original_haircolor - var/original_facialhaircolor - var/original_eyecolor - var/original_body_mod - var/original_body_sprite - - var/datum/dna/impersonating_dna - var/impersonating_name - var/impersonating_skintone - var/impersonating_hairstyle - var/impersonating_facialhair - var/impersonating_haircolor - var/impersonating_facialhaircolor - var/impersonating_eyecolor - var/impersonating_body_mod - var/impersonating_body_sprite - - var/is_shapeshifted = FALSE - -/datum/discipline_power/vicissitude/malleable_visage/activate() +/datum/discipline_power/vicissitude/malleable_visage/activate(atom/target) . = ..() + shapeshift_ability.Activate(owner) + return TRUE - if (is_shapeshifted) - var/choice = alert(owner, "What form do you wish to take?", name, "Yours", "Someone Else's") - if (choice == "Yours") - deactivate() - return +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - choose_impersonating() - shapeshift() - -/datum/discipline_power/vicissitude/malleable_visage/deactivate() - . = ..() - shapeshift(to_original = TRUE) - -/datum/discipline_power/vicissitude/malleable_visage/proc/choose_impersonating() - initialize_original() - - var/list/mob/living/carbon/human/potential_victims = list() - for (var/mob/living/carbon/human/adding_victim in oviewers(3, owner)) - potential_victims += adding_victim - if (!length(potential_victims)) - to_chat(owner, span_warning("No one is close enough for you to examine...")) - return - var/mob/living/carbon/human/victim = input(owner, "Who do you wish to impersonate?", name) as null|mob in potential_victims - if (!victim) - return - - impersonating_dna = new - victim.dna.copy_dna(impersonating_dna) - impersonating_name = victim.real_name - impersonating_skintone = victim.skin_tone - impersonating_hairstyle = victim.hairstyle - impersonating_facialhair = victim.facial_hairstyle - impersonating_haircolor = victim.hair_color - impersonating_facialhaircolor = victim.facial_hair_color - impersonating_eyecolor = victim.eye_color - impersonating_body_mod = victim.base_body_mod - impersonating_body_sprite = GET_BODY_SPRITE(victim) - -/datum/discipline_power/vicissitude/malleable_visage/proc/initialize_original() - if (is_shapeshifted) - return - if (original_dna) - return - - original_dna = new - owner.dna.copy_dna(original_dna) - original_name = owner.real_name - original_skintone = owner.skin_tone - original_hairstyle = owner.hairstyle - original_facialhair = owner.facial_hairstyle - original_haircolor = owner.hair_color - original_facialhaircolor = owner.facial_hair_color - original_eyecolor = owner.eye_color - original_body_mod = owner.base_body_mod - original_body_sprite = GET_BODY_SPRITE(owner) - -/datum/discipline_power/vicissitude/malleable_visage/proc/shapeshift(to_original = FALSE, instant = FALSE) - if (!impersonating_dna) - return - if (!instant) - var/time_delay = 10 SECONDS - if (original_body_mod != impersonating_body_mod) - time_delay += 5 SECONDS - if (original_body_sprite != impersonating_body_sprite) - time_delay += 10 SECONDS - to_chat(owner, span_notice("You begin molding your appearance... This will take [DisplayTimeText(time_delay)].")) - if (!do_after(owner, time_delay)) - return - - owner.Stun(1 SECONDS) - owner.do_jitter_animation(10) - playsound(get_turf(owner), 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 100, TRUE, -6) - - if (to_original) - original_dna.transfer_identity(destination = owner, transfer_SE = TRUE, superficial = TRUE) - owner.real_name = original_name - owner.skin_tone = original_skintone - owner.set_hairstyle(original_hairstyle) - owner.set_facial_hairstyle(original_facialhair) - owner.set_haircolor(original_haircolor) - owner.set_facial_haircolor(original_facialhaircolor) - owner.set_eye_color(original_eyecolor) - owner.set_body_sprite(original_body_sprite) - is_shapeshifted = FALSE - QDEL_NULL(impersonating_dna) - else - //Nosferatu, Cappadocians, Gargoyles, Kiasyd, etc. will revert instead of being indefinitely without their curse - if (!NORMAL_BODY_SPRITE(owner)) - addtimer(CALLBACK(src, PROC_REF(revert_to_cursed_form)), 1 SCENES) - impersonating_dna.transfer_identity(destination = owner, superficial = TRUE) - owner.real_name = impersonating_name - owner.skin_tone = impersonating_skintone - owner.set_hairstyle(impersonating_hairstyle) - owner.set_facial_hairstyle(impersonating_facialhair) - owner.set_haircolor(impersonating_haircolor) - owner.set_facial_haircolor(impersonating_facialhaircolor) - owner.set_eye_color(impersonating_eyecolor) - owner.set_body_sprite(impersonating_body_sprite) - is_shapeshifted = TRUE - - owner.update_body() - -/datum/discipline_power/vicissitude/malleable_visage/proc/revert_to_cursed_form() - if (!is_shapeshifted) - return - - owner.set_body_sprite(original_body_sprite) - - to_chat(owner, span_warning("Your cursed appearance reasserts itself!")) - -//FLESHCRAFTING /datum/discipline_power/vicissitude/fleshcrafting name = "Fleshcrafting" - desc = "Mold your victim's flesh and soft tissue to your desire." + desc = "Shapeshift yourself or others." level = 2 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND - target_type = TARGET_MOB + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE + target_type = TARGET_SELF | TARGET_HUMAN + vitae_cost = 1 range = 1 + toggled = FALSE + cooldown_length = 1 TURNS - effect_sound = 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg' - aggravating = TRUE - hostile = TRUE - violates_masquerade = TRUE - - cooldown_length = 5 SECONDS - grouped_powers = list(/datum/discipline_power/vicissitude/bonecrafting) - -/datum/discipline_power/vicissitude/fleshcrafting/activate(mob/living/target) +/datum/discipline_power/vicissitude/fleshcrafting/activate(atom/movable/target) . = ..() - if(target.stat >= HARD_CRIT) - if(target.stat != DEAD) - target.death() - new /obj/item/stack/human_flesh/ten(target.loc) - new /obj/item/guts(target.loc) - qdel(target) - else - target.emote("scream") - target.apply_damage(30, BRUTE, BODY_ZONE_CHEST) + shapeshift_ability.Activate(target) + return TRUE /datum/discipline_power/vicissitude/fleshcrafting/post_gain() . = ..() - var/obj/item/organ/cyberimp/arm/surgery/surgery_implant = new() + var/obj/item/organ/cyberimp/arm/toolkit/surgery/vicissitude/surgery_implant = new() surgery_implant.Insert(owner) + RegisterSignal(owner, COMSIG_LIVING_OPERATING_ON, PROC_REF(add_surgery)) + +/datum/discipline_power/vicissitude/fleshcrafting/Destroy(force) + UnregisterSignal(owner, COMSIG_LIVING_OPERATING_ON) + return ..() + +/datum/discipline_power/vicissitude/fleshcrafting/proc/add_surgery(datum/source, atom/movable/operating_on, list/possible_operations) + SIGNAL_HANDLER - if (!owner.mind) - return - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_wall) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_stool) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_floor) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_eyes) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_implant) + var/static/list/tzimisce_operations + if(!length(tzimisce_operations)) + tzimisce_operations = list() + tzimisce_operations += /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master + tzimisce_operations += /datum/surgery_operation/limb/add_plastic + tzimisce_operations += typesof(/datum/surgery_operation/limb/bioware) + tzimisce_operations += typesof(/datum/surgery_operation/organ/brainwash) + tzimisce_operations += typesof(/datum/surgery_operation/organ/lobotomy) + tzimisce_operations += typesof(/datum/surgery_operation/organ/pacify) + tzimisce_operations += /datum/surgery_operation/organ/eye_color_surgery + + possible_operations |= tzimisce_operations + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//BONECRAFTING /datum/discipline_power/vicissitude/bonecrafting name = "Bonecrafting" - desc = "Mold your victim's flesh and soft tissue to your desire." + desc = "Forcefully injure a body." level = 3 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE target_type = TARGET_MOB + vitae_cost = 1 range = 1 - - effect_sound = 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg' + toggled = FALSE aggravating = TRUE hostile = TRUE violates_masquerade = TRUE - - cooldown_length = 5 SECONDS - grouped_powers = list(/datum/discipline_power/vicissitude/fleshcrafting) + activate_sound = 'modular_darkpack/modules/powers/sounds/vicissitude.ogg' + cooldown_length = 1 TURNS /datum/discipline_power/vicissitude/bonecrafting/activate(mob/living/target) . = ..() - if (target.stat >= HARD_CRIT) + + var/roll = SSroll.storyteller_roll((owner.st_get_stat(STAT_STRENGTH) + owner.st_get_stat(STAT_MEDICINE)), 7, owner, target, TRUE) + + if(target.stat >= HARD_CRIT) if(target.stat != DEAD) target.death() - var/obj/item/bodypart/r_arm/r_arm = target.get_bodypart(BODY_ZONE_R_ARM) - var/obj/item/bodypart/l_arm/l_arm = target.get_bodypart(BODY_ZONE_L_ARM) - var/obj/item/bodypart/r_leg/r_leg = target.get_bodypart(BODY_ZONE_R_LEG) - var/obj/item/bodypart/l_leg/l_leg = target.get_bodypart(BODY_ZONE_L_LEG) - if(r_arm) - r_arm.drop_limb() - if(l_arm) - l_arm.drop_limb() - if(r_leg) - r_leg.drop_limb() - if(l_leg) - l_leg.drop_limb() - new /obj/item/stack/human_flesh/ten(target.loc) + var/obj/item/bodypart/arm/right/r_arm = target.get_bodypart(BODY_ZONE_R_ARM) + var/obj/item/bodypart/arm/left/l_arm = target.get_bodypart(BODY_ZONE_L_ARM) + var/obj/item/bodypart/leg/right/r_leg = target.get_bodypart(BODY_ZONE_R_LEG) + var/obj/item/bodypart/leg/left/l_leg = target.get_bodypart(BODY_ZONE_L_LEG) + r_arm?.drop_limb() + l_arm?.drop_limb() + r_leg?.drop_limb() + l_leg?.drop_limb() + new /obj/item/stack/sheet/human_flesh/twenty(target.loc) new /obj/item/guts(target.loc) new /obj/item/spine(target.loc) qdel(target) else target.emote("scream") - target.apply_damage(60, BRUTE, BODY_ZONE_CHEST) + target.apply_damage(roll LETHAL_TTRPG_DAMAGE, BRUTE, BODY_ZONE_CHEST) + if(roll >= 5) + target.visible_message(span_danger("[target]'s rib cage curves inwards grotesquely!"), span_danger("Your feel your ribcages curve inwards and pierce your heart!")) + target.adjust_blood_pool(-(round(target.bloodpool * 0.5))) // A vampire who scores five or more successes on the roll (...) cause the affected vampire to lose half his blood points. + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/discipline_power/vicissitude/bonecrafting/post_gain() - . = ..() - var/datum/action/basic_vicissitude/vicissitude_upgrade = new() - vicissitude_upgrade.Grant(owner) - - if (!owner.mind) - return - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_trench) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_biter) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_fister) - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_tanker) - -/datum/action/basic_vicissitude - name = "Vicissitude Upgrade" - desc = "Upgrade your body..." - button_icon_state = "basic" - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING|AB_CHECK_CONSCIOUS - vampiric = TRUE - var/selected_upgrade - var/mutable_appearance/upgrade_overlay - var/original_skin_tone - var/original_hairstyle - var/original_body_mod - -/datum/action/basic_vicissitude/Trigger() - . = ..() - if (selected_upgrade) - remove_upgrade() - else - give_upgrade() - - owner.update_body() - -/datum/action/basic_vicissitude/proc/give_upgrade() - var/mob/living/carbon/human/user = owner - var/upgrade = input(owner, "Choose basic upgrade:", "Vicissitude Upgrades") as null|anything in list("Skin armor", "Centipede legs", "Second pair of arms", "Leather wings") - if(!upgrade) - return - to_chat(user, span_notice("You begin molding your flesh and bone into a stronger form...")) - if (!do_after(user, 10 SECONDS)) - return - if(selected_upgrade) - return - selected_upgrade = upgrade - ADD_TRAIT(user, TRAIT_UNMASQUERADE, TRAUMA_TRAIT) - switch (upgrade) - if ("Skin armor") - user.set_body_sprite("tziarmor") - original_skin_tone = user.skin_tone - user.skin_tone = "albino" - original_hairstyle = user.hairstyle - user.set_hairstyle("Bald") - original_body_mod = user.base_body_mod - user.physiology.armor.melee += 20 - user.physiology.armor.bullet += 20 - if ("Centipede legs") - user.remove_overlay(PROTEAN_LAYER) - upgrade_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/64x64.dmi', "centipede", -PROTEAN_LAYER) - upgrade_overlay.pixel_z = -16 - upgrade_overlay.pixel_w = -16 - user.overlays_standing[PROTEAN_LAYER] = upgrade_overlay - user.apply_overlay(PROTEAN_LAYER) - user.add_movespeed_modifier(/datum/movespeed_modifier/centipede) - if ("Second pair of arms") - var/limbs = user.held_items.len - user.change_number_of_hands(limbs + 2) - user.remove_overlay(PROTEAN_LAYER) - upgrade_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "2hands", -PROTEAN_LAYER) - upgrade_overlay.color = "#[skintone2hex(user.skin_tone)]" - user.overlays_standing[PROTEAN_LAYER] = upgrade_overlay - user.apply_overlay(PROTEAN_LAYER) - if ("Leather wings") - user.dna.species.GiveSpeciesFlight(user) - - user.do_jitter_animation(10) - playsound(get_turf(user), 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 100, TRUE, -6) - -/datum/action/basic_vicissitude/proc/remove_upgrade() - var/mob/living/carbon/human/user = owner - if (!selected_upgrade) - return - to_chat(user, span_notice("You begin surgically removing your enhancements...")) - if (!do_after(user, 10 SECONDS)) - return - REMOVE_TRAIT(user, TRAIT_UNMASQUERADE, TRAUMA_TRAIT) - switch (selected_upgrade) - if ("Skin armor") - user.set_body_sprite() - user.skin_tone = original_skin_tone - user.set_hairstyle(original_hairstyle) - user.physiology.armor.melee -= 20 - user.physiology.armor.bullet -= 20 - if ("Centipede legs") - user.remove_overlay(PROTEAN_LAYER) - QDEL_NULL(upgrade_overlay) - user.remove_movespeed_modifier(/datum/movespeed_modifier/centipede) - if ("Second pair of arms") - var/limbs = user.held_items.len - user.change_number_of_hands(limbs - 2) - user.remove_overlay(PROTEAN_LAYER) - QDEL_NULL(upgrade_overlay) - if ("Leather wings") - user.dna.species.RemoveSpeciesFlight(user) - - user.do_jitter_animation(10) - playsound(get_turf(user), 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 100, TRUE, -6) - - selected_upgrade = null - -//HORRID FORM /datum/discipline_power/vicissitude/horrid_form name = "Horrid Form" - desc = "Shift your flesh and bone into that of a hideous monster." + desc = "Force yourself to become something truly monstrous." level = 4 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE - vitae_cost = 2 - violates_masquerade = TRUE + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE + target_type = NONE + vitae_cost = 2 + aggravating = TRUE + cooldown_length = 1 TURNS + activate_sound = 'modular_darkpack/modules/powers/sounds/vicissitude.ogg' + var/datum/action/cooldown/spell/shapeshift/zulo/zulo_form - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - var/datum/action/cooldown/spell/shapeshift/tzimisce/horrid_form_shapeshift - -/datum/discipline_power/vicissitude/horrid_form/activate() +/datum/discipline_power/vicissitude/horrid_form/pre_activation_checks() . = ..() - if (!horrid_form_shapeshift) - horrid_form_shapeshift = new(owner) - - horrid_form_shapeshift.Shapeshift(owner) + owner.do_jitter_animation(1 TURNS) + if(!do_after(owner, 1 TURNS, owner)) + return FALSE + return TRUE -/datum/discipline_power/vicissitude/horrid_form/deactivate() +/datum/discipline_power/vicissitude/horrid_form/activate() . = ..() - horrid_form_shapeshift.Restore(horrid_form_shapeshift.myshape) - owner.Stun(2 SECONDS) - owner.do_jitter_animation(50) + if(!zulo_form) + zulo_form = new(owner) + zulo_form.Grant(owner) + zulo_form.Activate(owner) -/datum/discipline_power/vicissitude/horrid_form/post_gain() - . = ..() - if (!owner.mind) - return - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/tzi_heart) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//BLOODFORM /datum/discipline_power/vicissitude/bloodform name = "Bloodform" - desc = "Liquefy into a shifting mass of sentient Vitae." + desc = "Liquify into a shifting mass of sentient Vitae." level = 5 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE - + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND + target_type = NONE violates_masquerade = TRUE + cooldown_length = 1 TURNS + toggled = TRUE + activate_sound = 'modular_darkpack/modules/powers/sounds/vicissitude.ogg' - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - var/datum/action/cooldown/spell/shapeshift/bloodcrawler/bloodform_shapeshift +/datum/discipline_power/vicissitude/bloodform/pre_activation_checks() + . = ..() + owner.do_jitter_animation(1 TURNS) + if(!do_after(owner, 1 TURNS, owner)) + return FALSE + return TRUE /datum/discipline_power/vicissitude/bloodform/activate() . = ..() - if (!bloodform_shapeshift) - bloodform_shapeshift = new(owner) + owner.set_species(mrace = /datum/species/tzimisce_blood_form, icon_update = TRUE, pref_load = TRUE, replace_missing = FALSE) - bloodform_shapeshift.Shapeshift(owner) +/datum/discipline_power/vicissitude/bloodform/pre_deactivation_checks(atom/target) + . = ..() + owner.do_jitter_animation(1 TURNS) + if(!do_after(owner, 1 TURNS, owner)) + return FALSE + return TRUE /datum/discipline_power/vicissitude/bloodform/deactivate() . = ..() - var/mob/living/simple_animal/hostile/bloodcrawler/bloodform = bloodform_shapeshift.myshape - owner.bloodpool = min(owner.bloodpool + round(bloodform.collected_blood / 2), owner.maxbloodpool) - bloodform_shapeshift.Restore(bloodform_shapeshift.myshape) - owner.Stun(1.5 SECONDS) - owner.do_jitter_animation(30) + owner.set_species(mrace = /datum/species/human, icon_update = TRUE, pref_load = TRUE, replace_missing = FALSE) diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/zulo.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/zulo.dm new file mode 100644 index 000000000000..3bde48206521 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/zulo.dm @@ -0,0 +1,65 @@ +GLOBAL_LIST_INIT(zulo_forms, list( + "Fiend" = "fiend", + "Leviathan" = "leviathan", + "Shrikebush" = "shrikebush", + "Impaler Steed" = "impalersteed", + "Black Fiend" = "black_fiend", + "Doctor" = "doctor", + "Dog" = "dog", + "Emily" = "emily", + "Dragon" = "dragon", + "Tendril Dragon" = "tendrildragon", +)) + +/datum/action/cooldown/spell/shapeshift/zulo + name = "Zulo Form" + desc = "Take on the shape a beast." + cooldown_time = 1 TURNS + revert_on_death = TRUE + die_with_shapeshifted_form = FALSE + spell_requirements = NONE + convert_damage = FALSE + possible_shapes = list(/mob/living/basic/zulo) + click_to_activate = FALSE + +/datum/action/cooldown/spell/shapeshift/zulo/do_unshapeshift(mob/living/caster) + . = ..() + Remove(caster) + +/mob/living/basic/zulo + name = "unknown creature" + desc = "What the hell is that thing!?" + icon = 'modular_darkpack/modules/powers/icons/zulo_forms.dmi' + icon_state = "fiend" // Default icon_state, changed by character preference + pixel_w = -16 + mob_biotypes = MOB_ORGANIC + mob_size = MOB_SIZE_HUGE + basic_mob_flags = PRECISE_ATTACK_ZONES | FLAMMABLE_MOB + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/items/weapons/slash.ogg' + combat_mode = TRUE + + maxHealth = 600 + health = 600 + speed = 0.5 + melee_damage_lower = 30 + melee_damage_upper = 30 + obj_damage = 30 + armour_penetration = 5 + wound_bonus = 0 + sharpness = SHARP_POINTY + attacked_sound = SFX_DESECRATION + + bloodpool = 2 + maxbloodpool = 2 + +/mob/living/basic/zulo/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_UNMASQUERADE, type) + +/mob/living/basic/zulo/mind_initialize() + . = ..() + var/preffered_form = client?.prefs.read_preference(/datum/preference/choiced/subsplat/zulo_form) + var/new_icon_state = GLOB.zulo_forms[preffered_form] + icon_state = new_icon_state ? new_icon_state : "fiend" diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/zulo_preferences.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/zulo_preferences.dm new file mode 100644 index 000000000000..d78f3e2e200e --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/zulo_preferences.dm @@ -0,0 +1,35 @@ +/datum/preference/choiced/subsplat/zulo_form + savefile_key = "zulo_form" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + priority = PREFERENCE_PRIORITY_REQUIRES_SUBSPLAT + main_feature_name = "Zulo Form" + should_generate_icons = TRUE + +/datum/preference/choiced/subsplat/zulo_form/has_relevant_feature(datum/preferences/preferences) + . = ..() + if(!.) // Make sure we acctually can select clan in the first place + return FALSE + var/clan_type = preferences.read_preference(/datum/preference/choiced/subsplat/vampire_clan) + var/datum/subsplat/vampire_clan/clan = get_vampire_clan(clan_type) + if(!clan) + return FALSE + for(var/discipline in clan.clan_disciplines) // DARKPACK TODO - reimplement choosing disciplines + if(ispath(discipline, /datum/discipline/vicissitude)) + return TRUE + return FALSE + +/datum/preference/choiced/subsplat/zulo_form/init_possible_values() + var/list/values = list() + for(var/name in GLOB.zulo_forms) + values[name] = GLOB.zulo_forms[name] + return values + +/datum/preference/choiced/subsplat/zulo_form/icon_for(value) + var/icon_state = GLOB.zulo_forms[value] + var/datum/universal_icon/zulo_icon = uni_icon('modular_darkpack/modules/powers/icons/zulo_forms.dmi', icon_state) + zulo_icon.scale(32, 32) + return zulo_icon + +/datum/preference/choiced/subsplat/zulo_form/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/modular_darkpack/modules/powers/code/discipline_actions.dm b/modular_darkpack/modules/powers/code/discipline_actions.dm index d94ef451dc99..66b81d982491 100644 --- a/modular_darkpack/modules/powers/code/discipline_actions.dm +++ b/modular_darkpack/modules/powers/code/discipline_actions.dm @@ -29,13 +29,13 @@ /datum/action/discipline/proc/register_to_availability_signals() //this should only go through if it's the first Discipline gained by the mob for (var/datum/action/action in owner.actions) - if (action == src) + if(action == src) continue - if (istype(action, /datum/action/discipline)) + if(istype(action, /datum/action/discipline)) return //irrelevant for NPCs - if (!owner.client) + if(!owner.client) return var/list/relevant_signals = list( @@ -71,49 +71,45 @@ build_all_button_icons(UPDATE_BUTTON_STATUS) //easy de-targeting - if (targeting) + if(targeting) end_targeting() - . = FALSE - return . + return FALSE //cancel targeting of other Disciplines when one is activated for (var/datum/action/action in owner.actions) - if (istype(action, /datum/action/discipline)) + if(istype(action, /datum/action/discipline)) var/datum/action/discipline/other_discipline = action other_discipline.end_targeting() //ensure it's actually possible to trigger this - if (!discipline?.current_power || !isliving(owner)) - . = FALSE - return . + if(!discipline?.current_power) + return FALSE var/datum/discipline_power/power = discipline.current_power - if (power.active) //deactivation logic - if (power.cancelable || power.toggled) + if(power.active) //deactivation logic + if(power.cancelable || power.toggled) power.try_deactivate(direct = TRUE, alert = TRUE) else to_chat(owner, span_warning("[power] is already active!")) else //activate - if (power.target_type == NONE) //self activation + if(power.target_type == NONE) //self activation power.try_activate() else //ranged targeted activation begin_targeting() build_all_button_icons(UPDATE_BUTTON_STATUS) - return . - /datum/action/discipline/proc/switch_level(to_advance = 1) SEND_SOUND(owner, sound('modular_darkpack/modules/deprecated/sounds/highlight.ogg', volume = 50)) - if (discipline.level_casting + to_advance > length(discipline.known_powers)) + if(discipline.level_casting + to_advance > length(discipline.known_powers)) discipline.level_casting = 1 - else if (discipline.level_casting + to_advance < 1) + else if(discipline.level_casting + to_advance < 1) discipline.level_casting = length(discipline.known_powers) else discipline.level_casting += to_advance - if (targeting) + if(targeting) end_targeting() discipline.current_power = discipline.known_powers[discipline.level_casting] @@ -128,45 +124,44 @@ /datum/action/discipline/proc/end_targeting() var/client/client = owner?.client - if (!client) + if(!client) return - if (!targeting) + if(!targeting) return - UnregisterSignal(owner, COMSIG_MOB_CLICKON) targeting = FALSE client.mouse_pointer_icon = initial(client.mouse_pointer_icon) + owner.update_mouse_pointer() + owner.click_intercept = null -/datum/action/discipline/proc/handle_click(mob/source, atom/target, click_parameters) +/datum/action/discipline/proc/handle_click(mob/user, atom/target, list/modifiers) SIGNAL_HANDLER - var/list/modifiers = params2list(click_parameters) - //ensure we actually need a target, or cancel on right click - if (!targeting || modifiers[RIGHT_CLICK]) + if(!targeting || modifiers[RIGHT_CLICK]) SEND_SOUND(owner, sound('modular_darkpack/modules/deprecated/sounds/highlight.ogg', volume = 50)) end_targeting() return //actually try to use the Discipline on the target - spawn() - if (discipline.current_power.try_activate(target)) - end_targeting() + if(discipline.current_power.try_activate(target)) + end_targeting() return COMSIG_MOB_CANCEL_CLICKON /datum/action/discipline/proc/begin_targeting() var/client/client = owner?.client - if (!client) + if(!client) return - if (targeting) + if(targeting) return - if (!discipline.current_power.can_activate_untargeted(TRUE)) + if(!discipline.current_power.can_activate_untargeted(TRUE)) return SEND_SOUND(owner, sound('modular_darkpack/modules/deprecated/sounds/highlight.ogg', volume = 50)) RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(handle_click)) targeting = TRUE client.mouse_pointer_icon = 'modular_darkpack/modules/deprecated/icons/effects/mouse_pointers/discipline.dmi' + owner.click_intercept = src /atom/movable/screen/movable/action_button/Click(location, control, params) if(istype(linked_action, /datum/action/discipline)) @@ -175,7 +170,7 @@ //increase on right click, decrease on shift right click if(LAZYACCESS(modifiers, RIGHT_CLICK)) var/datum/action/discipline/discipline = linked_action - if (LAZYACCESS(modifiers, "alt")) + if(LAZYACCESS(modifiers, ALT_CLICK)) discipline.switch_level(-1) else discipline.switch_level(1) diff --git a/modular_darkpack/modules/powers/icons/flesh_items.dmi b/modular_darkpack/modules/powers/icons/flesh_items.dmi new file mode 100644 index 000000000000..08333a261143 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/flesh_items.dmi differ diff --git a/modular_darkpack/modules/powers/icons/flesh_objects.dmi b/modular_darkpack/modules/powers/icons/flesh_objects.dmi new file mode 100644 index 000000000000..6371ef85c0f1 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/flesh_objects.dmi differ diff --git a/modular_darkpack/modules/powers/icons/flesh_onfloor.dmi b/modular_darkpack/modules/powers/icons/flesh_onfloor.dmi new file mode 100644 index 000000000000..7532b648df2e Binary files /dev/null and b/modular_darkpack/modules/powers/icons/flesh_onfloor.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/obj/stack_objects.dmi b/modular_darkpack/modules/powers/icons/flesh_stack.dmi similarity index 100% rename from modular_darkpack/modules/deprecated/icons/obj/stack_objects.dmi rename to modular_darkpack/modules/powers/icons/flesh_stack.dmi diff --git a/modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi b/modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi new file mode 100644 index 000000000000..3ae6883acad9 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/fleshcrafting_surgery_tools.dmi differ diff --git a/modular_darkpack/modules/powers/icons/lefthand.dmi b/modular_darkpack/modules/powers/icons/lefthand.dmi new file mode 100644 index 000000000000..09021561944e Binary files /dev/null and b/modular_darkpack/modules/powers/icons/lefthand.dmi differ diff --git a/modular_darkpack/modules/powers/icons/righthand.dmi b/modular_darkpack/modules/powers/icons/righthand.dmi new file mode 100644 index 000000000000..61bd4d56766f Binary files /dev/null and b/modular_darkpack/modules/powers/icons/righthand.dmi differ diff --git a/modular_darkpack/modules/powers/icons/shapeshifting_radial.dmi b/modular_darkpack/modules/powers/icons/shapeshifting_radial.dmi new file mode 100644 index 000000000000..ca760f338c1a Binary files /dev/null and b/modular_darkpack/modules/powers/icons/shapeshifting_radial.dmi differ diff --git a/modular_darkpack/modules/powers/icons/zulo_forms.dmi b/modular_darkpack/modules/powers/icons/zulo_forms.dmi new file mode 100644 index 000000000000..4632b7544d72 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/zulo_forms.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/vicissitude.ogg b/modular_darkpack/modules/powers/sounds/vicissitude.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/vicissitude.ogg rename to modular_darkpack/modules/powers/sounds/vicissitude.ogg diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm index 0465847e8db2..aa9fb174780c 100644 --- a/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm @@ -37,8 +37,7 @@ usr.visible_message(span_notice("[usr] begins invoking a ritual with [body_count] vampire bod[body_count == 1 ? "y" : "ies"]...")) playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) - // DARKPACK TODO - vicissitude, when its reintroduced re-path this - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 50, FALSE) + playsound(loc, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, FALSE) // Apply stun so that they cant just crawl away in crit - caster must also stay still for(var/mob/living/carbon/human/H in valid_bodies) @@ -106,7 +105,7 @@ addtimer(CALLBACK(src, PROC_REF(perfect_gargoyle_check_ai), G, last_activator), 31 SECONDS) playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 50, FALSE) + playsound(loc, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, FALSE) else // Create normal sentient gargoyle (1 body) var/mob/living/carbon/human/target_body = bodies[1] @@ -138,7 +137,7 @@ target_body.forceMove(original_location) playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) - playsound(target_body.loc, 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 50, FALSE) + playsound(target_body.loc, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, FALSE) // Handle key assignment if(!target_body.key) diff --git a/modular_darkpack/modules/toys/code/plushes.dm b/modular_darkpack/modules/toys/code/plushes.dm index 0eb39d560b05..badbac450f5d 100644 --- a/modular_darkpack/modules/toys/code/plushes.dm +++ b/modular_darkpack/modules/toys/code/plushes.dm @@ -29,3 +29,4 @@ attack_verb_continuous = list("tortures", "scourges") attack_verb_simple = list("torture", "scourge") squeak_override = list('modular_darkpack/modules/toys/sounds/femurbreaker.ogg'=1) + custom_materials = list(/datum/material/vicissitude_flesh = SHEET_MATERIAL_AMOUNT * 10) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm index f9c166327e0e..d939b45cadc4 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/__vampire_clan.dm @@ -74,6 +74,9 @@ for (var/trait in clan_traits) ADD_TRAIT(vampire, trait, CLAN_TRAIT) + if(isdummy(vampire)) + return + // Applies on_join_round effects when a client logs into this mob if (joining_round) RegisterSignal(vampire, COMSIG_MOB_LOGIN, PROC_REF(on_join_round), override = TRUE) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/crafting_recipes.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/crafting_recipes.dm deleted file mode 100644 index 56527f7a8559..000000000000 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/crafting_recipes.dm +++ /dev/null @@ -1,80 +0,0 @@ -/* // DARKPACK TODO - requires vicissitude material to pass unit tests. -/datum/crafting_recipe/tzi_trench - name = "Leather-Bone Trenchcoat (Armor)" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 50, /obj/item/spine = 1) - result = /obj/item/clothing/suit/vampire/trench/tzi - category = CAT_TZIMISCE - -/datum/crafting_recipe/tzi_heart - name = "Second Heart (Antistun)" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 25, /obj/item/organ/heart = 1) - result = /obj/item/organ/cyberimp/brain/anti_stun - category = CAT_TZIMISCE - -/datum/crafting_recipe/tzi_eyes - name = "Better Eyes (Nightvision)" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 15, /obj/item/organ/eyes = 1) - result = /obj/item/organ/eyes/night_vision/tzimisce - category = CAT_TZIMISCE - -/obj/item/organ/eyes/night_vision/tzimisce - low_light_cutoff = list(15, 6, 8) - medium_light_cutoff = list(35, 20, 25) - high_light_cutoff = list(50, 40, 40) - -/datum/crafting_recipe/tzi_implant - name = "Implanting Flesh Device" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 10, /obj/item/knife/vamp = 1, /obj/item/reagent_containers/blood = 1) - result = /obj/item/autosurgeon // DARKPACK TODO - Tzimisce autosurgeon - category = CAT_TZIMISCE - -/datum/crafting_recipe/tzi_floor - name = "Gut Floor" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 1, /obj/item/guts = 1) - result = /obj/effect/decal/gut_floor - category = CAT_TZIMISCE - crafting_flags = CRAFT_ON_SOLID_GROUND|CRAFT_CHECK_DENSITY - -/datum/crafting_recipe/tzi_wall - name = "Flesh Wall" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 2) - result = /turf/closed/wall/mineral/iron // DARKPACK TODO - Tzimisce walls - category = CAT_TZIMISCE - crafting_flags = CRAFT_CHECK_DENSITY - -/datum/crafting_recipe/tzi_stool - name = "Arm Stool" - time = 50 - reqs = list(/obj/item/stack/human_flesh = 5, /obj/item/bodypart/arm/right = 2, /obj/item/bodypart/arm/left = 2) - result = /obj/structure/chair/old/tzimisce - category = CAT_TZIMISCE - -/datum/crafting_recipe/tzi_biter - name = "Biting Abomination" - time = 100 - reqs = list(/obj/item/stack/human_flesh = 2, /obj/item/bodypart/arm/right = 2, /obj/item/bodypart/arm/left = 2, /obj/item/spine = 1) - result = /mob/living/basic/biter - category = CAT_TZIMISCE - -/datum/crafting_recipe/tzi_fister - name = "Punching Abomination" - time = 100 - reqs = list(/obj/item/stack/human_flesh = 5, /obj/item/bodypart/arm/right = 1, /obj/item/bodypart/arm/left = 1, /obj/item/spine = 1, /obj/item/guts = 1) - result = /mob/living/basic/fister - category = CAT_TZIMISCE - crafting_flags = CRAFT_CHECK_DENSITY - -/datum/crafting_recipe/tzi_tanker - name = "Fat Abomination" - time = 100 - reqs = list(/obj/item/stack/human_flesh = 10, /obj/item/bodypart/arm/right = 1, /obj/item/bodypart/arm/left = 1, /obj/item/bodypart/leg/right = 1, /obj/item/bodypart/leg/left = 1, /obj/item/spine = 1, /obj/item/guts = 2) - result = /mob/living/basic/tanker - category = CAT_TZIMISCE - crafting_flags = CRAFT_CHECK_DENSITY -*/ diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/needs_home_soil.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/needs_home_soil.dm index b195d6b4b1ba..e2da17fce37a 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/needs_home_soil.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/needs_home_soil.dm @@ -50,8 +50,6 @@ // Deal 25% of their health in clone damage and reduce their bloodpool size by 3, to a minimum of 8 var/mob/living/lacking_soil = parent lacking_soil.apply_damage(0.25 * lacking_soil.getMaxHealth(), AGGRAVATED) - // Currently nonfunctional, will be fixed in the splat rework - // lacking_soil.maxbloodpool = max(lacking_soil.maxbloodpool - 3, 8) lacking_soil.adjust_blood_pool(-3) to_chat(lacking_soil, span_danger("Your home soil has been destroyed! Its loss debilitates you.")) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/objects.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/objects.dm deleted file mode 100644 index b6f8f00b4e64..000000000000 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/objects.dm +++ /dev/null @@ -1,46 +0,0 @@ -/obj/item/ground_heir - name = "bag of ground" - desc = "Boghatyrskaya sila taitsa zdies'..." - icon_state = "dirt" - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL - -// Why is this NOT a floor type. -/obj/effect/decal/gut_floor - name = "gut floor" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "tzimisce_floor" - -/obj/effect/decal/gut_floor/Initialize(mapload) - . = ..() - if(isopenturf(get_turf(src))) - var/turf/open/T = get_turf(src) - if(T) - T.slowdown = 1 - -/obj/effect/decal/gut_floor/Destroy() - . = ..() - var/turf/open/T = get_turf(src) - if(T) - T.slowdown = initial(T.slowdown) - -/obj/structure/chair/old/tzimisce - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' - icon_state = "tzimisce_stool" - -/obj/item/guts - name = "guts" - desc = "Just blood and guts..." - icon_state = "guts" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL - -/obj/item/spine - name = "spine" - desc = "If only I had control..." - icon_state = "spine" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/tzimisce.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/tzimisce.dm index 992e8a55d86d..9ccb82f84485 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/tzimisce.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/tzimisce/tzimisce.dm @@ -6,7 +6,8 @@ clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/animalism, - // /datum/discipline/vicissitude + /datum/discipline/vicissitude + ) male_clothes = /obj/item/clothing/under/vampire/sport female_clothes = /obj/item/clothing/under/vampire/red @@ -14,26 +15,6 @@ accessories = list("spines", "spines_slim", "animal_skull", "none") accessories_layers = list("spines" = BODY_ADJ_LAYER, "spines_slim" = BODY_ADJ_LAYER, "animal_skull" = BODY_ADJ_LAYER, "none" = BODY_ADJ_LAYER) -/datum/action/cooldown/spell/shapeshift/tzimisce - name = "Tzimisce Form" - desc = "Take on the shape a beast." - cooldown_time = 10 SECONDS - revert_on_death = TRUE - die_with_shapeshifted_form = FALSE - spell_requirements = NONE - convert_damage = FALSE - possible_shapes = list(/mob/living/basic/tzimisce_beast) - -/datum/action/cooldown/spell/shapeshift/bloodcrawler - name = "Blood Crawler" - desc = "Take on the shape a beast." - cooldown_time = 5 SECONDS - revert_on_death = TRUE - convert_damage = FALSE - spell_requirements = NONE - die_with_shapeshifted_form = FALSE - possible_shapes = list(/mob/living/basic/bloodcrawler) - /datum/subsplat/vampire_clan/tzimisce/on_join_round(mob/living/carbon/human/H) . = ..() diff --git a/tgstation.dme b/tgstation.dme index 16f285eae546..2d7bd26e65f4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7449,9 +7449,21 @@ #include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\paths\lure_of_flames.dm" #include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\status_effects\blood_of_potency_effect.dm" #include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\status_effects\blood_rage_status.dm" -#include "modular_darkpack\modules\powers\code\discipline\vicissitude\fleshwalls.dm" -#include "modular_darkpack\modules\powers\code\discipline\vicissitude\human_flesh.dm" -#include "modular_darkpack\modules\preferences\height_preference.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\blood_form.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\crafting_recipes.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\shapeshifting.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\vicissitude.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\zulo.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\zulo_preferences.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\objects\creatures.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\objects\flesh_items.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\objects\surgery_tools.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\eye_colour_change.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\hair_colour_change.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\height_change.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\operation_eye_color.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\sex_change.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\surgeries\skin_colour_change.dm" #include "modular_darkpack\modules\quirks\code\negative_quirks\derangement.dm" #include "modular_darkpack\modules\radios\code\admin_verb.dm" #include "modular_darkpack\modules\radios\code\radio.dm" @@ -7630,10 +7642,7 @@ #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\lasombra\creatures.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\lasombra\lasombra.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\malkavian\malkavian.dm" -#include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\tzimisce\crafting_recipes.dm" -#include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\tzimisce\creatures.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\tzimisce\needs_home_soil.dm" -#include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\tzimisce\objects.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\tzimisce\tzimisce.dm" #include "modular_darkpack\modules\vaults\code\drill.dm" #include "modular_darkpack\modules\vaults\code\keypad.dm"