From 0ccaec817f2ef73d6fdda5dae788d45a7d7ae70d Mon Sep 17 00:00:00 2001 From: Rudy Date: Mon, 23 Mar 2026 14:33:16 -0700 Subject: [PATCH 01/13] Init --- .../adventurer/types/pilgrim/witch.dm | 1 + .../wildshape/wildshape_transformation.dm | 4 +- .../adventurer/types/pilgrim/witch.dm | 187 ++++++++++++++++++ .../human/species_types/witchshape/bat.dm | 112 +++++++++++ .../human/species_types/witchshape/cabbit.dm | 75 +++++++ .../human/species_types/witchshape/cat.dm | 82 ++++++++ .../species_types/witchshape/small_rous.dm | 76 +++++++ .../human/species_types/witchshape/vernard.dm | 75 +++++++ .../human/species_types/witchshape/volf.dm | 75 +++++++ .../human/species_types/witchshape/zad.dm | 112 +++++++++++ roguetown.dme | 10 +- 11 files changed, 806 insertions(+), 3 deletions(-) create mode 100644 modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm create mode 100644 modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index eecbfb8e1a8..4ad1250a6b6 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -1,3 +1,4 @@ +//CC Edit: Old Witch Class. New Witch Class can be found in modular_causticove, within is new and improved witch shapeshifting. /datum/advclass/witch name = "Witch" tutorial = "You are a witch, seen as wisefolk to some and a demon to many. Ostracized and sequestered for wrongthinks or outright heresy, your potions are what the commonfolk turn to when all else fails, and for this they tolerate you — at an arm's length. Take care not to end 'pon a pyre, for the church condemns your left handed arts." diff --git a/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm b/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm index 72405639a75..b5992ced9a1 100644 --- a/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm +++ b/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm @@ -24,8 +24,8 @@ W.regenerate_icons() W.stored_mob = src W.cmode_music = 'sound/music/cmode/garrison/combat_warden.ogg' - playsound(W.loc, pick('sound/combat/gib (1).ogg','sound/combat/gib (2).ogg'), 200, FALSE, 3) - //W.spawn_gibs(FALSE) //Caustic Edit - Turned off the gibs on Wildshaping + playsound(W.loc, 'sound/body/shapeshift-start.ogg', 75, FALSE, 3) //CC Edit, changed gib sounds to the appropriate shapeshift sounds for less strain on hearing. + //W.spawn_gibs(FALSE) //Caustic Edit - Turned off the gibs on Wildshaping, do not uncomment unless you want gibs to spawn. src.forceMove(W) W.after_creation() diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm new file mode 100644 index 00000000000..b00d7c55ba4 --- /dev/null +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -0,0 +1,187 @@ +//Copied from witch.dm on 3/23/26, update accordingly for any changes. + +/datum/advclass/witch + name = "Witch" + tutorial = "You are a witch, seen as wisefolk to some and a demon to many. Ostracized and sequestered for wrongthinks or outright heresy, your potions are what the commonfolk turn to when all else fails, and for this they tolerate you — at an arm's length. Take care not to end 'pon a pyre, for the church condemns your left handed arts." + allowed_sexes = list(MALE, FEMALE) + allowed_races = RACES_ALL_KINDS + outfit = /datum/outfit/job/roguetown/adventurer/witch + category_tags = list(CTAG_PILGRIM, CTAG_TOWNER) + traits_applied = list(TRAIT_DEATHSIGHT, TRAIT_WITCH, TRAIT_ALCHEMY_EXPERT) + subclass_stats = list( + STATKEY_INT = 3, + STATKEY_SPD = 2, + STATKEY_LCK = 1 + ) + age_mod = /datum/class_age_mod/witch + + subclass_skills = list( + /datum/skill/misc/reading = SKILL_LEVEL_EXPERT, + /datum/skill/craft/alchemy = SKILL_LEVEL_EXPERT, + /datum/skill/misc/medicine = SKILL_LEVEL_APPRENTICE, + /datum/skill/labor/farming = SKILL_LEVEL_NOVICE, + /datum/skill/craft/cooking = SKILL_LEVEL_NOVICE, + /datum/skill/craft/sewing = SKILL_LEVEL_NOVICE, + /datum/skill/craft/crafting = SKILL_LEVEL_APPRENTICE, + /datum/skill/craft/carpentry = SKILL_LEVEL_APPRENTICE, + ) + maximum_possible_slots = 20 // Should not fill, just a hack to make it shows what types of towners are in round + +/datum/outfit/job/roguetown/adventurer/witch/pre_equip(mob/living/carbon/human/H) + ..() + head = /obj/item/clothing/head/roguetown/witchhat + mask = /obj/item/clothing/head/roguetown/roguehood/black + armor = /obj/item/clothing/suit/roguetown/shirt/robe/phys + shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/priest + gloves = /obj/item/clothing/gloves/roguetown/leather/black + belt = /obj/item/storage/belt/rogue/leather/black + beltr = /obj/item/storage/belt/rogue/pouch/coins/poor + pants = /obj/item/clothing/under/roguetown/trou + shoes = /obj/item/clothing/shoes/roguetown/shortboots + backl = /obj/item/storage/backpack/rogue/satchel + backpack_contents = list( + /obj/item/reagent_containers/glass/mortar = 1, + /obj/item/pestle = 1, + /obj/item/candle/yellow = 2, + /obj/item/recipe_book/alchemy = 1, + /obj/item/recipe_book/survival = 1, + /obj/item/recipe_book/magic = 1, + /obj/item/chalk = 1 + ) + var/classes = list("Old Magick", "Godsblood", "Mystagogue") + var/classchoice = input("How do your powers manifest?", "THE OLD WAYS") as anything in classes + + //Shapeshifting choices are handled in the shapeshift spell itself. + + switch (classchoice) + if("Old Magick") + // the original witch: arcyne t2 with 9 spellpoints + ADD_TRAIT(H, TRAIT_ARCYNE_T2, TRAIT_GENERIC) + H.adjust_skillrank(/datum/skill/magic/arcane, SKILL_LEVEL_APPRENTICE, TRUE) + H.mind?.adjust_spellpoints(9) // twelve if you pick arcyne potential + beltl = /obj/item/storage/magebag/starter + if (H.age == AGE_OLD) + H.adjust_skillrank(/datum/skill/magic/arcane, SKILL_LEVEL_APPRENTICE, TRUE) + H.mind?.adjust_spellpoints(3) + if("Godsblood") + //miracle witch: capped at t2 miracles. cannot pray to regain devo, but has high innate regen because of it (2 instead of 1 from major) + var/datum/devotion/D = new /datum/devotion/(H, H.patron) + H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_APPRENTICE, TRUE) + D.grant_miracles(H, cleric_tier = CLERIC_T2, passive_gain = CLERIC_REGEN_WITCH, devotion_limit = CLERIC_REQ_2) + D.max_devotion *= 0.5 + neck = /obj/item/clothing/neck/roguetown/psicross/wood + if (H.age == AGE_OLD) + H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) + if("Mystagogue") + // hybrid arcane/holy witch with t1 arcane and t1 miracles, but less spellpoints, lower max devotion and less regen (0.5). Still can't pray. + var/datum/devotion/D = new /datum/devotion/(H, H.patron) + H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) + D.grant_miracles(H, cleric_tier = CLERIC_T1, passive_gain = CLERIC_REGEN_MINOR, devotion_limit = CLERIC_REQ_1) + D.max_devotion *= 0.5 + ADD_TRAIT(H, TRAIT_ARCYNE_T1, TRAIT_GENERIC) + H.adjust_skillrank(/datum/skill/magic/arcane, SKILL_LEVEL_NOVICE, TRUE) + H.mind?.adjust_spellpoints(6) // nine if you pick arcyne potential + beltl = /obj/item/storage/magebag/starter + neck = /obj/item/clothing/neck/roguetown/psicross/wood + if (H.age == AGE_OLD) + H.adjust_skillrank(/datum/skill/magic/arcane, SKILL_LEVEL_NOVICE, TRUE) + H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) + if(H.mind) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/wildshape/witch) + + switch (classchoice) + if("Old Magick") + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/guidance) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/fortitude) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/arcynebolt) + + if(H.gender == FEMALE) + armor = /obj/item/clothing/suit/roguetown/armor/corset + shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/lowcut + pants = /obj/item/clothing/under/roguetown/skirt/red + + switch(H.patron?.type) + if(/datum/patron/inhumen/zizo) + H.cmode_music = 'sound/music/combat_heretic.ogg' + ADD_TRAIT(H, TRAIT_HERESIARCH, TRAIT_GENERIC) + if(/datum/patron/inhumen/matthios) + H.cmode_music = 'sound/music/combat_matthios.ogg' + ADD_TRAIT(H, TRAIT_HERESIARCH, TRAIT_GENERIC) + if(/datum/patron/inhumen/graggar) + H.cmode_music = 'sound/music/combat_graggar.ogg' + ADD_TRAIT(H, TRAIT_HERESIARCH, TRAIT_GENERIC) + if(/datum/patron/inhumen/baotha) + H.cmode_music = 'sound/music/combat_baotha.ogg' + ADD_TRAIT(H, TRAIT_HERESIARCH, TRAIT_GENERIC) + if(H.mind) + SStreasury.give_money_account(ECONOMIC_LOWER_MIDDLE_CLASS, H, "Savings.") + +//Unique wildshape spell designed specifically for witches. +/obj/effect/proc_holder/spell/self/wildshape/witch + name = "Shapechange" + desc = "Take on the form of another creature. Cast to select your shape." + overlay_state = "tamebeast" + clothes_req = FALSE + human_req = FALSE + chargedrain = 0 + chargetime = 0 + recharge_time = 5 SECONDS + cooldown_min = 50 + //"Dyreform.", Norse for "Form of animal." + invocations = list("Dyreform.") + invocation_type = "none" + action_icon_state = "shapeshift" + devotion_cost = 0 + miracle = FALSE + + //Internal var. Empty on purpose. Fills with new mobs on first cast. + possible_shapes = list() + + var/list/cached_items = list() + var/picked_form = FALSE + +/obj/effect/proc_holder/spell/self/wildshape/witch/cast(list/targets, mob/living/carbon/human/user) + . = ..() + //Cast once to pick a form. + if(!picked_form) + pick_form(user) + return + +/obj/effect/proc_holder/spell/self/wildshape/witch/proc/pick_form(mob/living/carbon/human/user) + var/shapeshifts = list("Zad", "Bat", "Cabbit", "Volf", "Venard", "Cat", "Cat (Black)", "Rat", "Refund My Choice") + var/shapeshiftchoice = input(user, "What form does your second skin take?", "THE OLD WAYS") as anything in shapeshifts + switch (shapeshiftchoice) + if("Cabbit") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/cabbit) + action_icon_state = "familiar" //Default icon for animals without unique or similar icons. + desc = "Take on the form of a Cabbit." + if("Zad") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/zad) + action_icon_state = "zad" + desc = "Take on the form of a Zad." + if("Cat") //Contains 2 shapes for skin variants, default cat, and black cat. + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/cat, /mob/living/carbon/human/species/wildshape/witch/cat/black) + action_icon_state = "cat_transform" + desc = "Take on the form of a Cat." + if("Bat") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/bat) + action_icon_state = "bat_transform" + desc = "Take on the form of a Bat." + if("Volf") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/volf) + action_icon_state = "volf_transform" + desc = "Take on the form of a Wolf." + if("Venard") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/venard) + action_icon_state = "volf_transform" + desc = "Take on the form of a Venard." + if("Rat") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/small_rous) + action_icon_state = "familiar" + desc = "Take on the form of a Venard." + desc = "Take on the form of a Venard." + if("Refund My Choice") //Simply refunds the choice. + desc = "You: 'Hey! Dendor! Get me an animal form with nothing!' Camera pans to the right: 'Nothiiiiinnnn!?'" + return + if(length(possible_shapes)) + picked_form = TRUE diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm new file mode 100644 index 00000000000..f2f708716aa --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -0,0 +1,112 @@ +/mob/living/carbon/human/species/wildshape/witch/bat + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_bat" + race = /datum/species/witch/bat + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/mob/animal.dmi' + wildshape_icon_state = "bat" + movement_type = FLYING + var/fly_time = 2 SECONDS //You can now move and fly up/down at the same time. + +/mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_EXPERT, TRUE) + + STASTR = 2 + STACON = 4 + STAWIL = 5 + STAPER = 12 + STASPD = 20 + STALUC = 9 + + real_name = "Bat" + faction += "bats" + +/datum/species/witch/bat + name = "bat" + id = "witchshapebat" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +/datum/species/witch/bat/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/mob/animal.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "bat" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/bat/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/bat/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE + +//Handle Flight +/mob/living/carbon/human/species/wildshape/witch/bat/Initialize() + . = ..() + verbs += list(/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up, + /mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down) + +/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up(mob/user) + set category = "Winged Form" + set name = "Fly Up" + + if(pulledby != null) + to_chat(span_notice("I can't fly away while being grabbed!")) + return + visible_message(span_notice("[real_name] begins to ascend!"), span_notice("You take flight...")) + if(move_after(user, delay = fly_time, target = src)) + if(pulledby == null) + zMove(UP, TRUE) + to_chat(span_notice("I fly up.")) + else + to_chat(span_notice("I can't fly away while being grabbed!")) + +/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down(mob/user) + set category = "Winged Form" + set name = "Fly Down" + + if(pulledby != null) + to_chat(span_notice("I can't fly away while being grabbed!")) + return + visible_message(span_notice("[real_name] begins to descend!"), span_notice("You take flight...")) + if(move_after(user, delay = fly_time, target = src)) + if(pulledby == null) + zMove(DOWN, TRUE) + to_chat(span_notice("I fly down.")) + else + to_chat(span_notice("I can't fly away while being grabbed!")) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm new file mode 100644 index 00000000000..369b503936e --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm @@ -0,0 +1,75 @@ +/mob/living/carbon/human/species/wildshape/witch/cabbit + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_cabbit" + race = /datum/species/witch/cabbit + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/roguetown/mob/cabbit.dmi' + wildshape_icon_state = "cabbit" + +/mob/living/carbon/human/species/wildshape/witch/cabbit/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/swimming, SKILL_LEVEL_APPRENTICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_JOURNEYMAN, TRUE) + + STASTR = 2 + STACON = 2 + STAWIL = 7 + STAPER = 12 + STASPD = 20 + STALUC = 15 + + real_name = "Cabbit" + faction += "cabbits" + +/datum/species/witch/cabbit + name = "cabbit" + id = "witchshapecabbit" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +/datum/species/witch/cabbit/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/roguetown/mob/cabbit.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "cabbit" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/cabbit/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/cabbit/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm new file mode 100644 index 00000000000..9f13b6fb598 --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm @@ -0,0 +1,82 @@ +/mob/living/carbon/human/species/wildshape/witch/cat + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_cat" + race = /datum/species/witch/cat + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/mob/pets.dmi' + wildshape_icon_state = "cat2" + +//Black Cat variant. Only changes the icons/sprite. +/mob/living/carbon/human/species/wildshape/witch/cat/black + name = "witch_cat_black" + icon = 'icons/roguetown/topadd/takyon/Cat.dmi' + icon_state = "cat" + +/mob/living/carbon/human/species/wildshape/witch/cat/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/swimming, SKILL_LEVEL_APPRENTICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_JOURNEYMAN, TRUE) + + STASTR = 2 + STACON = 2 + STAWIL = 7 + STAPER = 12 + STASPD = 20 + STALUC = 15 + + real_name = "Cat" + faction += "cats" + +/datum/species/witch/cat + name = "cat" + id = "witchshapecat" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +//Unsure how to add black cat skin here just yet. Not touching for now. Shouldn't be a problem. +/datum/species/witch/cat/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/mob/pets.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "cat2" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/cat/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/cat/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm new file mode 100644 index 00000000000..6c29c095b5e --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm @@ -0,0 +1,76 @@ +/mob/living/carbon/human/species/wildshape/witch/small_rous + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_small_rous" + race = /datum/species/witch/small_rous + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/roguetown/mob/monster/rat.dmi' + wildshape_icon_state = "srat" + +/mob/living/carbon/human/species/wildshape/witch/small_rous/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/swimming, SKILL_LEVEL_APPRENTICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_JOURNEYMAN, TRUE) + + //Trade stats for smaller sprite size. Just remember this if you tweak this. + STASTR = 2 + STACON = 3 + STAWIL = 4 + STAPER = 12 + STASPD = 8 + STALUC = 6 + + real_name = "rat" + faction += "rats" + +/datum/species/witch/small_rous + name = "small_rous" + id = "witchshapesmall_rous" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +/datum/species/witch/small_rous/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/roguetown/mob/monster/rat.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "srat" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/small_rous/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/small_rous/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm new file mode 100644 index 00000000000..c548b46aa7d --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm @@ -0,0 +1,75 @@ +/mob/living/carbon/human/species/wildshape/witch/venard + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_venard" + race = /datum/species/witch/venard + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/roguetown/mob/monster/fox.dmi' + wildshape_icon_state = "fox" + +/mob/living/carbon/human/species/wildshape/witch/venard/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/swimming, SKILL_LEVEL_APPRENTICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_JOURNEYMAN, TRUE) + + STASTR = 2 + STACON = 3 + STAWIL = 4 + STAPER = 14 + STASPD = 15 + STALUC = 12 + + real_name = "venard" + faction += "venards" + +/datum/species/witch/venard + name = "venard" + id = "witchshapevenard" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +/datum/species/witch/venard/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/roguetown/mob/monster/fox.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "fox" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/venard/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/venard/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm new file mode 100644 index 00000000000..6cb9d434c87 --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm @@ -0,0 +1,75 @@ +/mob/living/carbon/human/species/wildshape/witch/volf + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_volf" + race = /datum/species/witch/volf + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/roguetown/mob/monster/vol.dmi' + wildshape_icon_state = "vv" + +/mob/living/carbon/human/species/wildshape/witch/volf/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/swimming, SKILL_LEVEL_APPRENTICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_JOURNEYMAN, TRUE) + + STASTR = 7 + STACON = 8 + STAWIL = 12 + STAPER = 8 + STASPD = 12 + STALUC = 4 + + real_name = "Volf" + faction += "wolves" + +/datum/species/witch/volf + name = "volf" + id = "witchshapevolf" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +/datum/species/witch/volf/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/roguetown/mob/monster/vol.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "vv" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/volf/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/volf/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm new file mode 100644 index 00000000000..47e97cec89a --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -0,0 +1,112 @@ +/mob/living/carbon/human/species/wildshape/witch/zad + //Must be unique from any other wildshape or else skills and procs will conflict. Treat the name like an ID. Unsure why this happens. + //Use real_name for the displayed name on examine. + name = "witch_zad" + race = /datum/species/witch/zad + footstep_type = FOOTSTEP_MOB_CLAW + ambushable = FALSE + wildshape_icon = 'icons/roguetown/mob/monster/crow.dmi' + wildshape_icon_state = "crow_flying" + movement_type = FLYING + var/fly_time = 2 SECONDS //You can now move and fly up/down at the same time. + +/mob/living/carbon/human/species/wildshape/witch/zad/gain_inherent_skills() + if(mind) + adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) + adjust_skillrank(/datum/skill/misc/athletics, SKILL_LEVEL_EXPERT, TRUE) + adjust_skillrank(/datum/skill/misc/sneaking, SKILL_LEVEL_EXPERT, TRUE) + + STASTR = 2 + STACON = 2 + STAWIL = 5 + STAPER = 20 + STASPD = 16 + STALUC = 7 + + real_name = "Zad" + faction += "zads" + +/datum/species/witch/zad + name = "zad" + id = "witchshapezad" + species_traits = list(NO_UNDERWEAR, NO_ORGAN_FEATURES, NO_BODYPART_FEATURES) + inherent_traits = list( + TRAIT_WILD_EATER, + TRAIT_HARDDISMEMBER, + TRAIT_DODGEEXPERT, + TRAIT_BRITTLE, + TRAIT_LEAPER + ) + inherent_biotypes = MOB_HUMANOID + no_equip = list(SLOT_SHIRT, SLOT_HEAD, SLOT_WEAR_MASK, SLOT_ARMOR, SLOT_GLOVES, SLOT_SHOES, SLOT_PANTS, SLOT_CLOAK, SLOT_BELT, SLOT_BACK_R, SLOT_BACK_L, SLOT_S_STORE) + nojumpsuit = 1 + sexes = 1 + offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/wild_tongue, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ) + + languages = list( + /datum/language/beast, + /datum/language/common, + ) + +/datum/species/witch/zad/regenerate_icons(mob/living/carbon/human/human) + human.icon = 'icons/roguetown/mob/monster/crow.dmi' + human.base_intents = list(INTENT_HELP) + human.icon_state = "crow_flying" + human.update_damage_overlays() + return TRUE + +/datum/species/witch/zad/on_species_gain(mob/living/carbon/carbon, datum/species/old_species) + . = ..() + RegisterSignal(carbon, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/species/witch/zad/update_damage_overlays(mob/living/carbon/human/human) + human.remove_overlay(DAMAGE_LAYER) + return TRUE + +//Handle Flight +/mob/living/carbon/human/species/wildshape/witch/zad/Initialize() + . = ..() + verbs += list(/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_up, + /mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_down) + +/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_up(mob/user) + set category = "Winged Form" + set name = "Fly Up" + + if(pulledby != null) + to_chat(span_notice("I can't fly away while being grabbed!")) + return + visible_message(span_notice("[real_name] begins to ascend!"), span_notice("You take flight...")) + if(move_after(user, delay = fly_time, target = src)) + if(pulledby == null) + zMove(UP, TRUE) + to_chat(span_notice("I fly up.")) + else + to_chat(span_notice("I can't fly away while being grabbed!")) + +/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_down(mob/user) + set category = "Winged Form" + set name = "Fly Down" + + if(pulledby != null) + to_chat(span_notice("I can't fly away while being grabbed!")) + return + visible_message(span_notice("[real_name] begins to descend!"), span_notice("You take flight...")) + if(move_after(user, delay = fly_time, target = src)) + if(pulledby == null) + zMove(DOWN, TRUE) + to_chat(span_notice("I fly down.")) + else + to_chat(span_notice("I can't fly away while being grabbed!")) diff --git a/roguetown.dme b/roguetown.dme index 5a15c93389a..6dcf944de74 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -1849,7 +1849,7 @@ #include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\seamstress.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\thug.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\townelder.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\witch.dm" +//#include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\witch.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\woodworker.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\rare\Lchef.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\rare\Lfish.dm" @@ -3107,6 +3107,7 @@ #include "modular_causticcove\code\modules\harpies\harpy_species.dm" #include "modular_causticcove\code\modules\harpies\wings.dm" #include "modular_causticcove\code\modules\jobs\job_types\roguetown\adventurer\types\combat\rogue.dm" +#include "modular_causticcove\code\modules\jobs\job_types\roguetown\adventurer\types\pilgrim\witch.dm" #include "modular_causticcove\code\modules\juices\juices.dm" #include "modular_causticcove\code\modules\juices\varmods.dm" #include "modular_causticcove\code\modules\merporgans\belly.dm" @@ -3117,6 +3118,13 @@ #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\hobgoblin.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\npc\hobgoblin_npc.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\species\hobgoblin_species.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\bat.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\cabbit.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\cat.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\small_rous.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\vernard.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\volf.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\human\species_types\witchshape\zad.dm" #include "modular_causticcove\code\modules\clothing\npc\hobgoblin_armor.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\ambush_config\ambush_hobgoblin.dm" #include "modular_causticcove\code\modules\nat_armor\nat_armor.dm" From c0e3d25c1358c4672a498fbd92e0af944abc9655 Mon Sep 17 00:00:00 2001 From: Rudy Date: Mon, 23 Mar 2026 16:09:55 -0700 Subject: [PATCH 02/13] Final --- code/modules/spells/spell_types/wildshape.dm | 11 ++++- .../adventurer/types/pilgrim/witch.dm | 13 +++--- .../human/species_types/witchshape/bat.dm | 40 ++++++++++--------- .../human/species_types/witchshape/zad.dm | 38 +++++++++--------- 4 files changed, 59 insertions(+), 43 deletions(-) diff --git a/code/modules/spells/spell_types/wildshape.dm b/code/modules/spells/spell_types/wildshape.dm index 0386054218d..a2a9450b15c 100644 --- a/code/modules/spells/spell_types/wildshape.dm +++ b/code/modules/spells/spell_types/wildshape.dm @@ -56,7 +56,16 @@ choices[shape.name] = icon_img - var/new_wildshape_type = show_radial_menu(user, user, choices) + //CC Edit Begin + //Grab all of the possible choices and show a radial menu. If there is none, default to picking the first one. + //This should never runtime unless possible_shapes is empty. + var/new_wildshape_type + if(length(choices) > 1) + new_wildshape_type = show_radial_menu(user, user, choices) + + if(!new_wildshape_type) + new_wildshape_type = choices[1] + //CC Edit End if(!new_wildshape_type) revert_cast() diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index b00d7c55ba4..70611ed4c0d 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -120,7 +120,7 @@ /obj/effect/proc_holder/spell/self/wildshape/witch name = "Shapechange" desc = "Take on the form of another creature. Cast to select your shape." - overlay_state = "tamebeast" + overlay_state = null clothes_req = FALSE human_req = FALSE chargedrain = 0 @@ -141,14 +141,14 @@ var/picked_form = FALSE /obj/effect/proc_holder/spell/self/wildshape/witch/cast(list/targets, mob/living/carbon/human/user) - . = ..() //Cast once to pick a form. if(!picked_form) pick_form(user) return + . = ..() /obj/effect/proc_holder/spell/self/wildshape/witch/proc/pick_form(mob/living/carbon/human/user) - var/shapeshifts = list("Zad", "Bat", "Cabbit", "Volf", "Venard", "Cat", "Cat (Black)", "Rat", "Refund My Choice") + var/shapeshifts = list("ALL - SHOWCASE ONLY", "Zad", "Bat", "Cabbit", "Volf", "Venard", "Cat", "Rat", "Refund My Choice") var/shapeshiftchoice = input(user, "What form does your second skin take?", "THE OLD WAYS") as anything in shapeshifts switch (shapeshiftchoice) if("Cabbit") @@ -159,8 +159,8 @@ possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/zad) action_icon_state = "zad" desc = "Take on the form of a Zad." - if("Cat") //Contains 2 shapes for skin variants, default cat, and black cat. - possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/cat, /mob/living/carbon/human/species/wildshape/witch/cat/black) + if("Cat") //If someone can figure out how to get skins to work and make 2 possible_shapes for a normal and black cat without a new species entirely plz do so ty ily + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/cat) action_icon_state = "cat_transform" desc = "Take on the form of a Cat." if("Bat") @@ -179,6 +179,9 @@ possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/small_rous) action_icon_state = "familiar" desc = "Take on the form of a Venard." + if("ALL - SHOWCASE ONLY") + possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/small_rous,/mob/living/carbon/human/species/wildshape/witch/cabbit,/mob/living/carbon/human/species/wildshape/witch/zad,/mob/living/carbon/human/species/wildshape/witch/cat,/mob/living/carbon/human/species/wildshape/witch/bat,/mob/living/carbon/human/species/wildshape/witch/volf,/mob/living/carbon/human/species/wildshape/witch/venard) + action_icon_state = "familiar" desc = "Take on the form of a Venard." if("Refund My Choice") //Simply refunds the choice. desc = "You: 'Hey! Dendor! Get me an animal form with nothing!' Camera pans to the right: 'Nothiiiiinnnn!?'" diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm index f2f708716aa..30762a77bc9 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -8,7 +8,7 @@ wildshape_icon = 'icons/mob/animal.dmi' wildshape_icon_state = "bat" movement_type = FLYING - var/fly_time = 2 SECONDS //You can now move and fly up/down at the same time. + var/fly_time = 0.5 SECONDS //You can now move and fly up/down at the same time. /mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() if(mind) @@ -81,32 +81,34 @@ verbs += list(/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up, /mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down) -/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up(mob/user) +/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up() set category = "Winged Form" set name = "Fly Up" - if(pulledby != null) - to_chat(span_notice("I can't fly away while being grabbed!")) + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) return - visible_message(span_notice("[real_name] begins to ascend!"), span_notice("You take flight...")) - if(move_after(user, delay = fly_time, target = src)) - if(pulledby == null) - zMove(UP, TRUE) - to_chat(span_notice("I fly up.")) + src.visible_message(span_notice("[src] begins to ascend!"), span_notice("You take flight...")) + + if(do_after(src, fly_time, target)) + if(src.pulledby == null) + src.zMove(UP, TRUE) + to_chat(src, span_notice("I fly up.")) else - to_chat(span_notice("I can't fly away while being grabbed!")) + to_chat(src, span_notice("I can't fly away while being grabbed!")) -/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down(mob/user) +/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down() set category = "Winged Form" set name = "Fly Down" - if(pulledby != null) - to_chat(span_notice("I can't fly away while being grabbed!")) + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) return - visible_message(span_notice("[real_name] begins to descend!"), span_notice("You take flight...")) - if(move_after(user, delay = fly_time, target = src)) - if(pulledby == null) - zMove(DOWN, TRUE) - to_chat(span_notice("I fly down.")) + src.visible_message(span_notice("[src] begins to descend!"), span_notice("You take flight...")) + + if(do_after(src, fly_time, target)) + if(src.pulledby == null) + src.zMove(DOWN, TRUE) + to_chat(src, span_notice("I fly down.")) else - to_chat(span_notice("I can't fly away while being grabbed!")) + to_chat(src, span_notice("I can't fly away while being grabbed!")) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm index 47e97cec89a..7506e593bee 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -81,32 +81,34 @@ verbs += list(/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_up, /mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_down) -/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_up(mob/user) +/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_up() set category = "Winged Form" set name = "Fly Up" - if(pulledby != null) - to_chat(span_notice("I can't fly away while being grabbed!")) + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) return - visible_message(span_notice("[real_name] begins to ascend!"), span_notice("You take flight...")) - if(move_after(user, delay = fly_time, target = src)) - if(pulledby == null) - zMove(UP, TRUE) - to_chat(span_notice("I fly up.")) + src.visible_message(span_notice("[src] begins to ascend!"), span_notice("You take flight...")) + + if(do_after(src, fly_time, target)) + if(src.pulledby == null) + src.zMove(UP, TRUE) + to_chat(src, span_notice("I fly up.")) else - to_chat(span_notice("I can't fly away while being grabbed!")) + to_chat(src, span_notice("I can't fly away while being grabbed!")) -/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_down(mob/user) +/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_down() set category = "Winged Form" set name = "Fly Down" - if(pulledby != null) - to_chat(span_notice("I can't fly away while being grabbed!")) + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) return - visible_message(span_notice("[real_name] begins to descend!"), span_notice("You take flight...")) - if(move_after(user, delay = fly_time, target = src)) - if(pulledby == null) - zMove(DOWN, TRUE) - to_chat(span_notice("I fly down.")) + src.visible_message(span_notice("[src] begins to descend!"), span_notice("You take flight...")) + + if(do_after(src, fly_time, target)) + if(src.pulledby == null) + src.zMove(DOWN, TRUE) + to_chat(src, span_notice("I fly down.")) else - to_chat(span_notice("I can't fly away while being grabbed!")) + to_chat(src, span_notice("I can't fly away while being grabbed!")) From edb14211de31d750b90050553d9b2a6ff6ab56a0 Mon Sep 17 00:00:00 2001 From: Rudy Date: Mon, 23 Mar 2026 19:30:29 -0700 Subject: [PATCH 03/13] Comment and Flight Time tweak --- .../mob/living/carbon/human/species_types/witchshape/bat.dm | 2 +- .../mob/living/carbon/human/species_types/witchshape/zad.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm index 30762a77bc9..e538eb03847 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -8,7 +8,7 @@ wildshape_icon = 'icons/mob/animal.dmi' wildshape_icon_state = "bat" movement_type = FLYING - var/fly_time = 0.5 SECONDS //You can now move and fly up/down at the same time. + var/fly_time = 0.5 SECONDS /mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() if(mind) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm index 7506e593bee..28dd80010ae 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -8,7 +8,7 @@ wildshape_icon = 'icons/roguetown/mob/monster/crow.dmi' wildshape_icon_state = "crow_flying" movement_type = FLYING - var/fly_time = 2 SECONDS //You can now move and fly up/down at the same time. + var/fly_time = 0.5 SECONDS //On par with bats for QoL sake /mob/living/carbon/human/species/wildshape/witch/zad/gain_inherent_skills() if(mind) From 8c3826809d6effe84d3e7771c6e7fb5bc4fac0b4 Mon Sep 17 00:00:00 2001 From: Rudy Date: Mon, 23 Mar 2026 20:34:00 -0700 Subject: [PATCH 04/13] Forgot to remove the all mobs for showcase choice --- .../roguetown/adventurer/types/pilgrim/witch.dm | 13 ++++++++----- .../carbon/human/species_types/witchshape/bat.dm | 3 ++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 70611ed4c0d..667c89f5ec1 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -148,7 +148,7 @@ . = ..() /obj/effect/proc_holder/spell/self/wildshape/witch/proc/pick_form(mob/living/carbon/human/user) - var/shapeshifts = list("ALL - SHOWCASE ONLY", "Zad", "Bat", "Cabbit", "Volf", "Venard", "Cat", "Rat", "Refund My Choice") + var/shapeshifts = list("Zad", "Bat", "Cabbit", "Volf", "Venard", "Cat", "Rat", "Refund My Choice") var/shapeshiftchoice = input(user, "What form does your second skin take?", "THE OLD WAYS") as anything in shapeshifts switch (shapeshiftchoice) if("Cabbit") @@ -179,12 +179,15 @@ possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/small_rous) action_icon_state = "familiar" desc = "Take on the form of a Venard." - if("ALL - SHOWCASE ONLY") - possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/small_rous,/mob/living/carbon/human/species/wildshape/witch/cabbit,/mob/living/carbon/human/species/wildshape/witch/zad,/mob/living/carbon/human/species/wildshape/witch/cat,/mob/living/carbon/human/species/wildshape/witch/bat,/mob/living/carbon/human/species/wildshape/witch/volf,/mob/living/carbon/human/species/wildshape/witch/venard) - action_icon_state = "familiar" - desc = "Take on the form of a Venard." if("Refund My Choice") //Simply refunds the choice. desc = "You: 'Hey! Dendor! Get me an animal form with nothing!' Camera pans to the right: 'Nothiiiiinnnn!?'" return if(length(possible_shapes)) picked_form = TRUE + +/mob/living/carbon/human/species/wildshape/witch/Initialize() + . = ..() + var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_L_ARM) + if(O) + O.drop_limb() + qdel(O) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm index e538eb03847..72ba2b127eb 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -10,6 +10,7 @@ movement_type = FLYING var/fly_time = 0.5 SECONDS + /mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) @@ -79,7 +80,7 @@ /mob/living/carbon/human/species/wildshape/witch/bat/Initialize() . = ..() verbs += list(/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up, - /mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down) + /mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down) /mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_up() set category = "Winged Form" From e8fb9facc9fa5cafe4e501100002df07439b9ca5 Mon Sep 17 00:00:00 2001 From: Rudy Date: Mon, 23 Mar 2026 20:49:26 -0700 Subject: [PATCH 05/13] Deathsight + Alchemy Expert traits --- .../job_types/roguetown/adventurer/types/pilgrim/witch.dm | 6 ++++++ .../mob/living/carbon/human/species_types/witchshape/bat.dm | 2 ++ .../living/carbon/human/species_types/witchshape/cabbit.dm | 1 + .../mob/living/carbon/human/species_types/witchshape/cat.dm | 1 + .../carbon/human/species_types/witchshape/small_rous.dm | 1 + .../living/carbon/human/species_types/witchshape/vernard.dm | 1 + .../living/carbon/human/species_types/witchshape/volf.dm | 1 + .../mob/living/carbon/human/species_types/witchshape/zad.dm | 1 + 8 files changed, 14 insertions(+) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 667c89f5ec1..8f86914fe84 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -185,9 +185,15 @@ if(length(possible_shapes)) picked_form = TRUE +//All Witch Mobs lose their arm upon creation. Sorry. /mob/living/carbon/human/species/wildshape/witch/Initialize() . = ..() var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_L_ARM) if(O) O.drop_limb() qdel(O) + +/mob/living/carbon/human/species/wildshape/witch/gain_inherent_skills() + ADD_TRAIT(src, TRAIT_DEATHSIGHT, ADVENTURER_TRAIT) + ADD_TRAIT(src, TRAIT_ALCHEMY_EXPERT, ADVENTURER_TRAIT) + return //Do not let this call into wildshape inherent skill gain, or else they'll get miracles and devotions diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm index 72ba2b127eb..2c54416871f 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -12,6 +12,7 @@ /mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) @@ -28,6 +29,7 @@ real_name = "Bat" faction += "bats" + /datum/species/witch/bat name = "bat" id = "witchshapebat" diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm index 369b503936e..17e77c01c75 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm @@ -9,6 +9,7 @@ wildshape_icon_state = "cabbit" /mob/living/carbon/human/species/wildshape/witch/cabbit/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm index 9f13b6fb598..3158e1446c9 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm @@ -15,6 +15,7 @@ icon_state = "cat" /mob/living/carbon/human/species/wildshape/witch/cat/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm index 6c29c095b5e..18300071b1b 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm @@ -9,6 +9,7 @@ wildshape_icon_state = "srat" /mob/living/carbon/human/species/wildshape/witch/small_rous/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm index c548b46aa7d..d1f74cfd2f8 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm @@ -9,6 +9,7 @@ wildshape_icon_state = "fox" /mob/living/carbon/human/species/wildshape/witch/venard/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm index 6cb9d434c87..e08bd864f4c 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm @@ -9,6 +9,7 @@ wildshape_icon_state = "vv" /mob/living/carbon/human/species/wildshape/witch/volf/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm index 28dd80010ae..a6e2d945adc 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -11,6 +11,7 @@ var/fly_time = 0.5 SECONDS //On par with bats for QoL sake /mob/living/carbon/human/species/wildshape/witch/zad/gain_inherent_skills() + . = ..() if(mind) adjust_skillrank(/datum/skill/combat/wrestling, SKILL_LEVEL_NOVICE, TRUE) adjust_skillrank(/datum/skill/combat/unarmed, SKILL_LEVEL_NOVICE, TRUE) From 2756415b9c76eb114cf4d5ddbd004a5538b451e4 Mon Sep 17 00:00:00 2001 From: Rudy Date: Mon, 23 Mar 2026 21:08:47 -0700 Subject: [PATCH 06/13] tiny comment update --- .../job_types/roguetown/adventurer/types/pilgrim/witch.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 8f86914fe84..17eff7c0382 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -64,7 +64,7 @@ H.adjust_skillrank(/datum/skill/magic/arcane, SKILL_LEVEL_APPRENTICE, TRUE) H.mind?.adjust_spellpoints(3) if("Godsblood") - //miracle witch: capped at t2 miracles. cannot pray to regain devo, but has high innate regen because of it (2 instead of 1 from major) + //miracle witch: capped at t2 miracles. cannot pray to regain devo, but has high innate regen because of it (2 instead of 1 from major). Cannot use miracles when shapeshifted. var/datum/devotion/D = new /datum/devotion/(H, H.patron) H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_APPRENTICE, TRUE) D.grant_miracles(H, cleric_tier = CLERIC_T2, passive_gain = CLERIC_REGEN_WITCH, devotion_limit = CLERIC_REQ_2) @@ -73,7 +73,7 @@ if (H.age == AGE_OLD) H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) if("Mystagogue") - // hybrid arcane/holy witch with t1 arcane and t1 miracles, but less spellpoints, lower max devotion and less regen (0.5). Still can't pray. + // hybrid arcane/holy witch with t1 arcane and t1 miracles, but less spellpoints, lower max devotion and less regen (0.5). Still can't pray. Also can't use miracles when shapeshifted. var/datum/devotion/D = new /datum/devotion/(H, H.patron) H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) D.grant_miracles(H, cleric_tier = CLERIC_T1, passive_gain = CLERIC_REGEN_MINOR, devotion_limit = CLERIC_REQ_1) From 48970db9029fb1d2ac13947f87a1d0e3bac4dab6 Mon Sep 17 00:00:00 2001 From: Rudy Date: Tue, 24 Mar 2026 05:05:36 -0700 Subject: [PATCH 07/13] No Hand Usage --- .../adventurer/types/pilgrim/witch.dm | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 17eff7c0382..6aad979f506 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -188,12 +188,27 @@ //All Witch Mobs lose their arm upon creation. Sorry. /mob/living/carbon/human/species/wildshape/witch/Initialize() . = ..() - var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_L_ARM) - if(O) - O.drop_limb() - qdel(O) + //Place it in any inactive hand slot on transform. + var/obj/item/unusable_hand/H = new(src) + put_in_inactive_hand(H) /mob/living/carbon/human/species/wildshape/witch/gain_inherent_skills() ADD_TRAIT(src, TRAIT_DEATHSIGHT, ADVENTURER_TRAIT) ADD_TRAIT(src, TRAIT_ALCHEMY_EXPERT, ADVENTURER_TRAIT) return //Do not let this call into wildshape inherent skill gain, or else they'll get miracles and devotions + +//Unique witch blocker. +/obj/item/unusable_hand + name = "other hand" + desc = "This is your other hand, however you cannot use it whilst shapeshifted. You CAN use your beak, claws, paws, maws, and back to carry other items however. (You can only use 1 hand when shapeshifted.)" + icon = 'icons/mob/roguehudgrabs.dmi' + icon_state = "grabbing_greyscale" + w_class = WEIGHT_CLASS_BULKY + item_flags = ABSTRACT + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + no_effect = TRUE + experimental_inhand = FALSE + +/obj/item/unusable_hand/New(loc, ...) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) From 2d757208f6cedc5f03b837d160b464178b533ede Mon Sep 17 00:00:00 2001 From: Rudy Date: Tue, 24 Mar 2026 05:08:03 -0700 Subject: [PATCH 08/13] Minor Comment Removal --- .../jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 6aad979f506..09d1943a5cb 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -185,7 +185,6 @@ if(length(possible_shapes)) picked_form = TRUE -//All Witch Mobs lose their arm upon creation. Sorry. /mob/living/carbon/human/species/wildshape/witch/Initialize() . = ..() //Place it in any inactive hand slot on transform. From 5ecb23a63fbfb95feaa7052aa1a9feb9c2c8e2c0 Mon Sep 17 00:00:00 2001 From: Rudy Date: Tue, 24 Mar 2026 05:14:47 -0700 Subject: [PATCH 09/13] Hand Examines --- .../job_types/roguetown/adventurer/types/pilgrim/witch.dm | 4 ++++ .../mob/living/carbon/human/species_types/witchshape/bat.dm | 1 + .../mob/living/carbon/human/species_types/witchshape/zad.dm | 1 + 3 files changed, 6 insertions(+) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 09d1943a5cb..1c52e7df5e5 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -185,11 +185,15 @@ if(length(possible_shapes)) picked_form = TRUE +/mob/living/carbon/human/species/wildshape/witch + var/hand_examine = "other paw" + /mob/living/carbon/human/species/wildshape/witch/Initialize() . = ..() //Place it in any inactive hand slot on transform. var/obj/item/unusable_hand/H = new(src) put_in_inactive_hand(H) + H.name = hand_examine /mob/living/carbon/human/species/wildshape/witch/gain_inherent_skills() ADD_TRAIT(src, TRAIT_DEATHSIGHT, ADVENTURER_TRAIT) diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm index 2c54416871f..cea986f6caf 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -9,6 +9,7 @@ wildshape_icon_state = "bat" movement_type = FLYING var/fly_time = 0.5 SECONDS + hand_examine = "other claws" /mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm index a6e2d945adc..f2e611016a8 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -9,6 +9,7 @@ wildshape_icon_state = "crow_flying" movement_type = FLYING var/fly_time = 0.5 SECONDS //On par with bats for QoL sake + hand_examine = "other talons" /mob/living/carbon/human/species/wildshape/witch/zad/gain_inherent_skills() . = ..() From 2224756c3dd2241a361e5e231d55aff317315dc5 Mon Sep 17 00:00:00 2001 From: Rudy Date: Tue, 24 Mar 2026 05:17:56 -0700 Subject: [PATCH 10/13] A --- .../jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm | 2 +- .../mob/living/carbon/human/species_types/witchshape/bat.dm | 2 +- .../mob/living/carbon/human/species_types/witchshape/zad.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 1c52e7df5e5..4bdbf9e1200 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -186,7 +186,7 @@ picked_form = TRUE /mob/living/carbon/human/species/wildshape/witch - var/hand_examine = "other paw" + var/hand_examine = "paws" /mob/living/carbon/human/species/wildshape/witch/Initialize() . = ..() diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm index cea986f6caf..d4249b83e11 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -9,7 +9,7 @@ wildshape_icon_state = "bat" movement_type = FLYING var/fly_time = 0.5 SECONDS - hand_examine = "other claws" + hand_examine = "claws" /mob/living/carbon/human/species/wildshape/witch/bat/gain_inherent_skills() diff --git a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm index f2e611016a8..f5dafa0a05a 100644 --- a/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -9,7 +9,7 @@ wildshape_icon_state = "crow_flying" movement_type = FLYING var/fly_time = 0.5 SECONDS //On par with bats for QoL sake - hand_examine = "other talons" + hand_examine = "talons" /mob/living/carbon/human/species/wildshape/witch/zad/gain_inherent_skills() . = ..() From 93ef179ba0924e0026b0553244f53266ea8c1cbc Mon Sep 17 00:00:00 2001 From: Rudy Date: Tue, 24 Mar 2026 17:58:10 -0700 Subject: [PATCH 11/13] Necrans get Fog Ward (fixes runtime) --- code/__DEFINES/cleric.dm | 2 +- .../subsystem/rogue/fog_event/fog_ward_effect.dm | 13 ++++++++----- code/controllers/subsystem/rogue/miscprocs.dm | 6 ++++++ .../roguetown/adventurer/types/pilgrim/witch.dm | 10 ++++++---- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/cleric.dm b/code/__DEFINES/cleric.dm index 020b99266a3..b49e42471cf 100644 --- a/code/__DEFINES/cleric.dm +++ b/code/__DEFINES/cleric.dm @@ -16,5 +16,5 @@ #define CLERIC_REGEN_WEAK 0.1 //Would be better to just do away with devotion entirely, but oh well. #define CLERIC_REGEN_MINOR 0.5 #define CLERIC_REGEN_MAJOR 0.8 -#define CLERIC_REGEN_WITCH 0.3 +#define CLERIC_REGEN_WITCH 1.7 //CC edit. Faster witch regen. W/ Devotee it equals 2 devotion/tick. They cannot manually pray. #define CLERIC_REGEN_ABSOLVER 5 diff --git a/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm b/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm index 81a5ecc6105..a8a9554077a 100644 --- a/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm +++ b/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm @@ -16,7 +16,7 @@ /datum/status_effect/buff/fog_ward/on_apply() ADD_TRAIT(owner, TRAIT_FOG_WARDED, TRAIT_MIRACLE) SEND_SIGNAL(owner, COMSIG_WARDED_TRAIT_CHANGE) - owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "outline", "color" = "#ffffffb3", "size" = 1)) + owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "bloom", "color" = "#ffffffb3", "size" = 0.4)) //CC Edit, tweaked size return TRUE /datum/status_effect/buff/fog_ward/process() @@ -68,7 +68,7 @@ /datum/status_effect/buff/fog_ward_caster/on_apply() ADD_TRAIT(owner, TRAIT_FOG_WARDED, TRAIT_MIRACLE) SEND_SIGNAL(owner, COMSIG_WARDED_TRAIT_CHANGE) - owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "outline", "color" = "#ffffff", "size" = 2)) + owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "bloom", "color" = "#ffffff", "size" = 1)) return TRUE /datum/status_effect/buff/fog_ward_caster/on_remove() @@ -108,7 +108,7 @@ /obj/effect/proc_holder/spell/invoked/fog_ward name = "Ward of the Undermaiden" desc = "Call upon Necra to manifest a holy mist that dispels fog phantoms and prevents ambushes. Allies must stay close to you to maintain protection." - invocations = list("Necra, clear the path!", "Be gone, shades of the mist!") + invocations = list("Necra, clear the path!") //CC Edit, tweaked the invocation string devotion_cost = 150 recharge_time = 3 MINUTES chargetime = 2 SECONDS @@ -138,9 +138,12 @@ return TRUE -/obj/effect/proc_holder/spell/invoked/fog_ward/on_gain(mob/living/user) +//CC Edit Begin +// Allow Necrans to have this normally. There is no reason why they should not have this, as this actually creates runtimes due to not actually "existing" on characters. +/* /obj/effect/proc_holder/spell/invoked/fog_ward/on_gain(mob/living/user) // Check the subsystem variable to see if fog is even a possibility this round if(!SSevent_scheduler.fog_scheduled) qdel(src) return FALSE - return ..() + return ..() */ +//CC Edit End diff --git a/code/controllers/subsystem/rogue/miscprocs.dm b/code/controllers/subsystem/rogue/miscprocs.dm index 9099b01d4e4..a894d2d1598 100644 --- a/code/controllers/subsystem/rogue/miscprocs.dm +++ b/code/controllers/subsystem/rogue/miscprocs.dm @@ -173,6 +173,12 @@ if(!devotion) return FALSE + //CC Edit Begin + //Witch's all have a god complex. Their patron still loves them however. + if(HAS_TRAIT(src, TRAIT_WITCH)) + to_chat(src, span_warning("My patron has blessed me enough as is, I can do things on my own.")) + return FALSE + //CC Edit End var/prayersesh = 0 visible_message("[src] kneels their head in prayer to the Gods.", "I kneel my head in prayer to [devotion.patron.name].") diff --git a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm index 4bdbf9e1200..f56c5d4d724 100644 --- a/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -51,7 +51,7 @@ var/classes = list("Old Magick", "Godsblood", "Mystagogue") var/classchoice = input("How do your powers manifest?", "THE OLD WAYS") as anything in classes - //Shapeshifting choices are handled in the shapeshift spell itself. + //Shapeshifting choices are handled in the shapeshift spell itself further down the file. switch (classchoice) if("Old Magick") @@ -64,7 +64,8 @@ H.adjust_skillrank(/datum/skill/magic/arcane, SKILL_LEVEL_APPRENTICE, TRUE) H.mind?.adjust_spellpoints(3) if("Godsblood") - //miracle witch: capped at t2 miracles. cannot pray to regain devo, but has high innate regen because of it (2 instead of 1 from major). Cannot use miracles when shapeshifted. + //miracle witch: capped at t2 miracles. cannot pray to regain devo, but has high innate regen because of it (1.7 instead of 0.8 from major). + //Cannot use miracles or gain devotion when shapeshifted. var/datum/devotion/D = new /datum/devotion/(H, H.patron) H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_APPRENTICE, TRUE) D.grant_miracles(H, cleric_tier = CLERIC_T2, passive_gain = CLERIC_REGEN_WITCH, devotion_limit = CLERIC_REQ_2) @@ -73,7 +74,8 @@ if (H.age == AGE_OLD) H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) if("Mystagogue") - // hybrid arcane/holy witch with t1 arcane and t1 miracles, but less spellpoints, lower max devotion and less regen (0.5). Still can't pray. Also can't use miracles when shapeshifted. + // hybrid arcane/holy witch with t1 arcane and t1 miracles, but less spellpoints, lower max devotion and less regen (0.5). Still can't pray. + //Also cannot use miracles or gain devotion when shapeshifted. var/datum/devotion/D = new /datum/devotion/(H, H.patron) H.adjust_skillrank(/datum/skill/magic/holy, SKILL_LEVEL_NOVICE, TRUE) D.grant_miracles(H, cleric_tier = CLERIC_T1, passive_gain = CLERIC_REGEN_MINOR, devotion_limit = CLERIC_REQ_1) @@ -178,7 +180,7 @@ if("Rat") possible_shapes += list(/mob/living/carbon/human/species/wildshape/witch/small_rous) action_icon_state = "familiar" - desc = "Take on the form of a Venard." + desc = "Take on the form of a Rat." if("Refund My Choice") //Simply refunds the choice. desc = "You: 'Hey! Dendor! Get me an animal form with nothing!' Camera pans to the right: 'Nothiiiiinnnn!?'" return From 37c0e20f2aed1af4150e1277dd943f171c2e7449 Mon Sep 17 00:00:00 2001 From: Rudy Date: Tue, 24 Mar 2026 18:06:31 -0700 Subject: [PATCH 12/13] Tweaks the Ward's Filter Silze for better Clarity --- code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm b/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm index a8a9554077a..4fe6ea06de4 100644 --- a/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm +++ b/code/controllers/subsystem/rogue/fog_event/fog_ward_effect.dm @@ -16,7 +16,7 @@ /datum/status_effect/buff/fog_ward/on_apply() ADD_TRAIT(owner, TRAIT_FOG_WARDED, TRAIT_MIRACLE) SEND_SIGNAL(owner, COMSIG_WARDED_TRAIT_CHANGE) - owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "bloom", "color" = "#ffffffb3", "size" = 0.4)) //CC Edit, tweaked size + owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "outline", "color" = "#ffffffb3", "size" = 0.4)) //CC Edit, tweaked size return TRUE /datum/status_effect/buff/fog_ward/process() @@ -68,7 +68,7 @@ /datum/status_effect/buff/fog_ward_caster/on_apply() ADD_TRAIT(owner, TRAIT_FOG_WARDED, TRAIT_MIRACLE) SEND_SIGNAL(owner, COMSIG_WARDED_TRAIT_CHANGE) - owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "bloom", "color" = "#ffffff", "size" = 1)) + owner.add_filter(FOG_WARD_OUTLINE, 1, list("type" = "outline", "color" = "#ffffff", "size" = 0.85)) //CC Edit, tweaked size return TRUE /datum/status_effect/buff/fog_ward_caster/on_remove() From 46a5f1b42803a657bbcf14dd4303e97098641f94 Mon Sep 17 00:00:00 2001 From: Rudy Date: Wed, 25 Mar 2026 16:20:04 -0700 Subject: [PATCH 13/13] "What is drowned shall rise anew!" ... wait what? --- .../human/species_types/wildshape/wildshape_transformation.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm b/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm index b5992ced9a1..a84a912566c 100644 --- a/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm +++ b/code/modules/mob/living/carbon/human/species_types/wildshape/wildshape_transformation.dm @@ -178,6 +178,10 @@ W.regenerate_icons() to_chat(W, span_userdanger("I return to my old form.")) + //CC Edit Begin makes wildshapers stand up immediately after reforming to make transformation more seamless and snappy. + if(W.resting) + W.set_resting(FALSE, TRUE) + //CC Edit End qdel(src)