diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 88f221851525..1937cc8f39fa 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. @@ -136,7 +139,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Sixth sense restricted to view range #define TRAIT_LOCAL_SIXTHSENSE "local_sixth_sense" - +/// If the mob can't have surgery done on it. See: Blood form Tzimisce +#define TRAIT_SURGERY_INAPPLICABLE "surgery_inapplicable" // BELOW ARE ALL MERITS/FLAWS #define TRAIT_ILLEGAL_IDENTITY "illegal_identity" // GOVERNMENT #define TRAIT_PERMAFANGS "permafangs" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 7aea7d150afd..902a97c95bc9 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -585,6 +585,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE, "TRAIT_SUICIDED" = TRAIT_SUICIDED, "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, + "TRAIT_SURGERY_INAPPLICABLE" = TRAIT_SURGERY_INAPPLICABLE, // DARKPACK EDIT ADD "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_SWIMMER" = TRAIT_SWIMMER, "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, @@ -698,6 +699,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 19756aefc033..ae8c5d1e3a73 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -304,6 +304,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_STURDY_FRAME" = TRAIT_STURDY_FRAME, "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, "TRAIT_SWIMMER" = TRAIT_SWIMMER, + "TRAIT_SURGERY_INAPPLICABLE" = TRAIT_SURGERY_INAPPLICABLE, "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, "TRAIT_TACKLING_TAILED_DEFENDER" = TRAIT_TACKLING_TAILED_DEFENDER, @@ -390,6 +391,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.dm b/code/modules/surgery/operations/_operation.dm index c5d378a10694..059d08ac4792 100644 --- a/code/modules/surgery/operations/_operation.dm +++ b/code/modules/surgery/operations/_operation.dm @@ -492,6 +492,11 @@ GLOBAL_DATUM_INIT(operations, /datum/operation_holder, new) if(!(operation_flags & OPERATION_SELF_OPERABLE) && patient == surgeon && !HAS_TRAIT(surgeon, TRAIT_SELF_SURGERY)) return FALSE + // DARKPACK EDIT START + if(HAS_TRAIT(patient, TRAIT_SURGERY_INAPPLICABLE)) + return FALSE + // DARKPACK EDIT END + return snowflake_check_availability(operating_on, surgeon, tool, operated_zone) /** diff --git a/code/modules/surgery/operations/operation_plastic_surgery.dm b/code/modules/surgery/operations/operation_plastic_surgery.dm index 1203702d1d61..bc1bbb8fa4ad 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/meat = 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/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_tzimisce_blood_form.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_tzimisce_blood_form.png new file mode 100644 index 000000000000..43ae8a38804c Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_tzimisce_blood_form.png differ 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..e4df8f4adb79 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/meat = 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..40b7408f828b 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/meat = 10) combat_mode = TRUE melee_damage_lower = 35 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..c691fce46dce 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/meat = 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..670e11686028 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/blood_form.dm @@ -0,0 +1,156 @@ +#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, + ) + mutanteyes = /obj/item/organ/eyes/bloodform + mutantbrain = /obj/item/organ/brain/bloodform + mutantears = /obj/item/organ/ears/bloodform + fixed_mut_color = "#990000a9" + hair_color_mode = USE_FIXED_MUTANT_COLOR + hair_alpha = 70 + facial_hair_alpha = 70 + 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) + +/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) + return ..() + +/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 = 1 + +/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.bloodpool >= 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.bloodpool >= blood_per_limb * length(limbs_to_heal)) + H.regenerate_limbs() + H.adjust_blood_pool(-blood_per_limb * length(limbs_to_heal)) + to_chat(H, span_notice("...and after a moment you finish reforming!")) + return + else if(H.bloodpool >= blood_per_limb) //We can partially heal some limbs + while(H.bloodpool >= blood_per_limb) + var/healed_limb = pick(limbs_to_heal) + H.regenerate_limb(healed_limb) + limbs_to_heal -= healed_limb + H.adjust_blood_pool(-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 + +/// Organs +/obj/item/organ/eyes/bloodform + name = "bloody eyes" + desc = "Development bug! Report this to github if you see this!" + zone = BODY_ZONE_CHEST + iris_overlay = null + eye_color_left = "#990000a9" + eye_color_right = "#990000a9" + +/obj/item/organ/ears/bloodform + name = "bloody ears" + desc = "Development bug! Report this to github if you see this!" + zone = BODY_ZONE_CHEST + +/obj/item/organ/brain/bloodform + name = "bloody... brain?" + desc = "Development bug! Report this to github if you see this!" + zone = BODY_ZONE_CHEST + +#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..601c202741b4 --- /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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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 52% 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 d9559c9f0368..0f49ab59723a 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/meat = 1) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -27,6 +27,7 @@ bloodpool = 2 maxbloodpool = 2 ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles + custom_materials = list(/datum/material/meat = SHEET_MATERIAL_AMOUNT * 2) /mob/living/basic/szlachta/fister name = "fister" @@ -36,7 +37,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/meat = 2) melee_damage_lower = 30 melee_damage_upper = 30 attack_verb_continuous = "punches" @@ -46,6 +47,7 @@ status_flags = CANPUSH bloodpool = 5 maxbloodpool = 5 + custom_materials = list(/datum/material/meat = SHEET_MATERIAL_AMOUNT * 5) /mob/living/basic/szlachta/tanker name = "tanker" @@ -55,7 +57,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/meat = 4) melee_damage_lower = 25 melee_damage_upper = 25 attack_verb_continuous = "slashes" @@ -64,47 +66,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/meat = SHEET_MATERIAL_AMOUNT * 10) /mob/living/basic/szlachta/hostile faction = list(FACTION_HOSTILE) @@ -114,18 +76,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..3663469de8b9 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/objects/flesh_items.dm @@ -0,0 +1,108 @@ +/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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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/meat = 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..83fbc3c2dce4 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/shapeshifting.dm @@ -0,0 +1,238 @@ +#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 + +/datum/action/cooldown/mob_cooldown/shapeshift/New(Target, original) + . = ..() + update_choices() + +/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.real_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/hair_colour_change.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/hair_colour_change.dm new file mode 100644 index 000000000000..37302fde79f8 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/hair_colour_change.dm @@ -0,0 +1,83 @@ +/datum/surgery_operation/limb/modify_hair + name = "hair pigmentation surgery" + desc = "Change the patient's hair color." + 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 + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/modify_hair/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/modify_hair/state_check(obj/item/bodypart/chest/limb) + return limb.body_zone == BODY_ZONE_HEAD + +/datum/surgery_operation/limb/modify_hair/on_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/patient = get_patient(operating_on) + display_results( + surgeon, + patient, + span_notice("You begin to alter [patient]'s hair..."), + span_notice("[surgeon] begins to alter [patient]'s hair."), + span_notice("[surgeon] begins to make an incision in [patient]'s head."), + ) + display_pain(patient, "You feel a slicing pain across your head!") + +/datum/surgery_operation/limb/modify_hair/on_success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(operating_on) + + var/new_style = tgui_input_list(surgeon, "Select a hairstyle", "Grooming", SSaccessories.hairstyles_list) + if(!new_style) + return FALSE + if(!IN_GIVEN_RANGE(surgeon, patient, 1)) + return FALSE + patient.set_hairstyle(new_style, update = TRUE) + SEND_SIGNAL(surgeon, COMSIG_MASQUERADE_VIOLATION) + playsound(patient, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(surgeon, span_notice("You finish altering the hair style of [patient].")) + + display_results( + surgeon, + patient, + span_notice("You alter [patient]'s hair style."), + span_notice("[surgeon] alters [patient]'s hair style."), + span_notice("[surgeon] finishes the operation on [patient]'s hair."), + ) + display_pain(patient, "The pain fades!") + + var/new_hair_color = tgui_color_picker(surgeon, "Choose a hair color", "Hair Color", patient.hair_color) + if(!new_hair_color) + return FALSE + if(!IN_GIVEN_RANGE(surgeon, patient, 1)) + return FALSE + patient.set_haircolor(sanitize_hexcolor(new_hair_color)) + patient.dna.update_ui_block(/datum/dna_block/identity/hair_color) + SEND_SIGNAL(surgeon, COMSIG_MASQUERADE_VIOLATION) + playsound(patient, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + + display_results( + surgeon, + patient, + span_notice("You alter [patient]'s hair color."), + span_notice("[surgeon] alters [patient]'s hair color."), + span_notice("[surgeon] finishes the operation on [patient]'s hair."), + ) + display_pain(patient, "The pain fades again!") + +/datum/surgery_operation/limb/modify_hair/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(limb.owner) + display_results( + surgeon, + patient, + span_warning("Your screw up, leaving [patient]'s head bruised!"), + span_warning("[surgeon] screws up, bruising [patient]'s head!"), + span_notice("[surgeon] finishes the operation on [patient]'s head."), + ) + display_pain(patient, "Your head feels torn!") + limb.receive_damage(rand(4, 8), wound_bonus = 10, sharpness = SHARP_EDGED, damage_source = tool) 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..3bebe798caa8 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/height_change.dm @@ -0,0 +1,72 @@ +/datum/surgery_operation/limb/height_change + name = "height surgery" + desc = "Change the patient's height." + 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 + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_SAWED + +/datum/surgery_operation/limb/height_change/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/height_change/state_check(obj/item/bodypart/chest/limb) + return limb.body_zone == BODY_ZONE_CHEST + +/datum/surgery_operation/limb/height_change/on_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/patient = get_patient(operating_on) + display_results( + surgeon, + patient, + span_notice("You begin to alter [patient]'s height..."), + span_notice("[surgeon] begins to alter [patient]'s height."), + span_notice("[surgeon] begins to make an incision in [patient]'s back."), + ) + display_pain(patient, "You feel a slicing pain across your back!") + +/datum/surgery_operation/limb/height_change/on_success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(operating_on) + + 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(surgeon, "Choose a height", "Height change", heights) + new_height = heights[new_height] + if(!new_height) + return FALSE + if(!IN_GIVEN_RANGE(surgeon, patient, 1)) + return FALSE + patient.set_mob_height(new_height) + SEND_SIGNAL(surgeon, COMSIG_MASQUERADE_VIOLATION) + playsound(patient, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + + display_results( + surgeon, + patient, + span_notice("You alter [patient]'s spine completely."), + span_notice("[surgeon] alters [patient]'s spine completely."), + span_notice("[surgeon] finishes the operation on [patient]'s spine."), + ) + display_pain(patient, "The pain fades, the world seems different!") + +/datum/surgery_operation/limb/height_change/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(limb.owner) + display_results( + surgeon, + patient, + span_warning("Your screw up, leaving [patient]'s spine bruised!"), + span_warning("[surgeon] screws up, bruising [patient]'s spine!"), + span_notice("[surgeon] finishes the operation on [patient]'s spine."), + ) + display_pain(patient, "Your back feels torn!") + limb.receive_damage(rand(4, 8), wound_bonus = 10, sharpness = SHARP_EDGED, damage_source = tool) 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..c13d54100152 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/sex_change.dm @@ -0,0 +1,86 @@ +/datum/surgery_operation/limb/sex_change + name = "sex change surgery" // someone come back and woke-ify this + desc = "Change the patient's sex." + 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 + required_bodytype = ~BODYTYPE_ROBOTIC + time = 20 SECONDS + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_SAWED + +/datum/surgery_operation/limb/sex_change/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/sex_change/state_check(obj/item/bodypart/chest/limb) + return limb.body_zone == BODY_ZONE_CHEST + +/datum/surgery_operation/limb/sex_change/on_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/patient = get_patient(operating_on) + display_results( + surgeon, + patient, + span_notice("You begin to reshape [patient]..."), + span_notice("[surgeon] begins to manipulate [patient]'s flesh in truly horrific ways!"), + span_notice("[surgeon] begins to manipulate [patient]'s flesh in truly horrific ways!"), + ) + display_pain(patient, "You feel like your flesh is moving!") + +/datum/surgery_operation/limb/sex_change/on_success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(operating_on) + + var/chosen_sex = tgui_input_list(surgeon, "Choose a gender.", "Confirmation", list("Male", "Female", "Plural", "Neuter")) + if(!chosen_sex) + return FALSE + if(!IN_GIVEN_RANGE(surgeon, patient, 1)) + return FALSE + switch(chosen_sex) + if("Male") + patient.gender = MALE + if("Female") + patient.gender = FEMALE + if("Plural") + patient.gender = PLURAL + if("Neuter") + patient.gender = NEUTER + to_chat(surgeon, span_notice("You finish altering the gender of [patient].")) + SEND_SIGNAL(surgeon, COMSIG_MASQUERADE_VIOLATION) + playsound(patient, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + + var/chosen_physique = tgui_input_list(surgeon, "Alter physique as well?", "Confirmation", list("Masculine", "Feminine")) + if(!chosen_physique) + return FALSE + if(!IN_GIVEN_RANGE(surgeon, patient, 1)) + return FALSE + patient.physique = (chosen_physique == "Masculine") ? MALE : FEMALE + patient.dna.update_ui_block(/datum/dna_block/identity/gender) + patient.update_body(is_creating = TRUE) // or else physique won't change properly + patient.update_mutations_overlay() + patient.update_clothing(ITEM_SLOT_ICLOTHING) // update gender shaped clothing + SEND_SIGNAL(surgeon, COMSIG_MASQUERADE_VIOLATION) + playsound(patient, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + to_chat(surgeon, span_notice("You finish altering the physique of [patient].")) + + display_results( + surgeon, + patient, + span_notice("You finish changing [patient]'s sex!"), + span_notice("[surgeon] changes [patient] into something new."), + span_notice("[surgeon] finishes the operation on [patient].")) + display_pain(patient, "The pain fades, you feel refreshed!") + +/datum/surgery_operation/limb/sex_change/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(limb.owner) + display_results( + surgeon, + patient, + span_warning("Your screw up, leaving [patient] bruised!"), + span_warning("[surgeon] screws up, bruising [patient]!"), + span_notice("[surgeon] finishes the operation on [patient]."), + ) + display_pain(patient, "Your chest feels torn!") + limb.receive_damage(rand(4, 8), wound_bonus = 10, sharpness = SHARP_EDGED, damage_source = tool) 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..ad065ef70350 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/surgeries/skin_colour_change.dm @@ -0,0 +1,72 @@ +/datum/surgery_operation/limb/modify_skin + name = "skin pigmentation surgery" + desc = "Change the patient's skin color." + 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 + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/modify_skin/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/modify_skin/state_check(obj/item/bodypart/chest/limb) + return limb.body_zone == BODY_ZONE_CHEST + +/datum/surgery_operation/limb/modify_skin/on_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/patient = get_patient(operating_on) + display_results( + surgeon, + patient, + span_notice("You begin to alter [patient]'s skin color..."), + span_notice("[surgeon] begins to alter [patient]'s skin color."), + span_notice("[surgeon] begins to make an incision in [patient]'s body."), + ) + display_pain(patient, "You feel a slicing pain across your body!") + +/datum/surgery_operation/limb/modify_skin/on_success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(operating_on) + + 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(surgeon, "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(surgeon, patient, 1)) + return FALSE + patient.skin_tone = new_s_tone + patient.dna.update_ui_block(/datum/dna_block/identity/skin_tone) + patient.update_body(is_creating = TRUE) + patient.update_mutations_overlay() + SEND_SIGNAL(surgeon, COMSIG_MASQUERADE_VIOLATION) + playsound(patient, 'modular_darkpack/modules/powers/sounds/vicissitude.ogg', 50, TRUE) + + display_results( + surgeon, + patient, + span_notice("You alter [patient]'s skin color completely."), + span_notice("[surgeon] alters [patient]'s skin color."), + span_notice("[surgeon] finishes the operation on [patient]'s skin."), + ) + display_pain(patient, "The pain fades, the world seems different!") + +/datum/surgery_operation/limb/modify_skin/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + var/mob/living/carbon/human/patient = get_patient(limb.owner) + display_results( + surgeon, + patient, + span_warning("Your screw up, leaving [patient]'s skin bruised!"), + span_warning("[surgeon] screws up, bruising [patient]'s skin!"), + span_notice("[surgeon] finishes the operation on [patient]'s skin."), + ) + display_pain(patient, "Your body feels torn!") + limb.receive_damage(rand(4, 8), wound_bonus = 10, sharpness = SHARP_EDGED, damage_source = tool) diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm index 80887a24685b..dabc53419709 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." @@ -9,414 +12,184 @@ 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 + + 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 + tzimisce_operations += /datum/surgery_operation/limb/sex_change + tzimisce_operations += /datum/surgery_operation/limb/height_change + tzimisce_operations += /datum/surgery_operation/limb/modify_hair + tzimisce_operations += /datum/surgery_operation/limb/modify_skin + + possible_operations |= tzimisce_operations + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - 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) - -//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/meat/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/pre_activation_checks() + . = ..() + owner.do_jitter_animation(1 TURNS) + if(!do_after(owner, 1 TURNS, owner)) + return FALSE + return TRUE /datum/discipline_power/vicissitude/horrid_form/activate() . = ..() - if (!horrid_form_shapeshift) - horrid_form_shapeshift = new(owner) + if(!zulo_form) + zulo_form = new(owner) + zulo_form.Grant(owner) + zulo_form.Activate(owner) - horrid_form_shapeshift.Shapeshift(owner) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/discipline_power/vicissitude/horrid_form/deactivate() - . = ..() - horrid_form_shapeshift.Restore(horrid_form_shapeshift.myshape) - owner.Stun(2 SECONDS) - owner.do_jitter_animation(50) - -/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) - - bloodform_shapeshift.Shapeshift(owner) + owner.set_species(mrace = /datum/species/tzimisce_blood_form, icon_update = TRUE, pref_load = TRUE, replace_missing = FALSE) /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.do_jitter_animation(1 TURNS) + if(!do_after(owner, 1 TURNS, owner)) + return FALSE + owner.set_species(mrace = /datum/species/human, icon_update = TRUE, pref_load = TRUE, replace_missing = FALSE) + return TRUE 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/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..04c9a010d1f6 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/meat = SHEET_MATERIAL_AMOUNT * 10) 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 b4ce6641365a..619e07f0dbc7 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/joining) . = ..() diff --git a/tgstation.dme b/tgstation.dme index b6025d75e62a..2a2c81f68455 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7453,9 +7453,20 @@ #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\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" @@ -7634,10 +7645,7 @@ #include "modular_darkpack\modules\vampire_the_masquerade\code\vampire_clan\clans\kiasyd\kiasyd.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"