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..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" = "outline", "color" = "#ffffffb3", "size" = 1)) + 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" = "outline", "color" = "#ffffff", "size" = 2)) + 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() @@ -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/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..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 @@ -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() @@ -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) 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 new file mode 100644 index 00000000000..f56c5d4d724 --- /dev/null +++ b/modular_causticcove/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/witch.dm @@ -0,0 +1,219 @@ +//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 further down the file. + + 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 (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) + 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. + //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) + 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 = null + 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", "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") //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") + 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 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 + if(length(possible_shapes)) + picked_form = TRUE + +/mob/living/carbon/human/species/wildshape/witch + var/hand_examine = "paws" + +/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) + 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) 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..d4249b83e11 --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/bat.dm @@ -0,0 +1,118 @@ +/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 = 0.5 SECONDS + hand_examine = "claws" + + +/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() + set category = "Winged Form" + set name = "Fly Up" + + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) + return + 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(src, span_notice("I can't fly away while being grabbed!")) + +/mob/living/carbon/human/species/wildshape/witch/bat/proc/fly_down() + set category = "Winged Form" + set name = "Fly Down" + + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) + return + 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(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/cabbit.dm b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm new file mode 100644 index 00000000000..17e77c01c75 --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cabbit.dm @@ -0,0 +1,76 @@ +/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..3158e1446c9 --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/cat.dm @@ -0,0 +1,83 @@ +/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..18300071b1b --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/small_rous.dm @@ -0,0 +1,77 @@ +/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..d1f74cfd2f8 --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/vernard.dm @@ -0,0 +1,76 @@ +/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..e08bd864f4c --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/volf.dm @@ -0,0 +1,76 @@ +/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..f5dafa0a05a --- /dev/null +++ b/modular_causticcove/code/modules/mob/living/carbon/human/species_types/witchshape/zad.dm @@ -0,0 +1,116 @@ +/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 = 0.5 SECONDS //On par with bats for QoL sake + hand_examine = "talons" + +/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() + set category = "Winged Form" + set name = "Fly Up" + + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) + return + 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(src, span_notice("I can't fly away while being grabbed!")) + +/mob/living/carbon/human/species/wildshape/witch/zad/proc/fly_down() + set category = "Winged Form" + set name = "Fly Down" + + if(src.pulledby != null) + to_chat(src, span_notice("I can't fly away while being grabbed!")) + return + 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(src, span_notice("I can't fly away while being grabbed!")) diff --git a/roguetown.dme b/roguetown.dme index 874ac9afabb..cf9382b8bb6 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -1850,7 +1850,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" @@ -3110,6 +3110,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" @@ -3120,6 +3121,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\mob\living\carbon\human\species.dm"