diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index cfd2cebbd0..640079e9b8 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -74,7 +74,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid)) #define isethereal(A) (is_species(A, /datum/species/ethereal)) #define isvampire(A) (is_species(A,/datum/species/vampire)) -#define isdullahan(A) (is_species(A, /datum/species/dullahan)) #define ismush(A) (is_species(A, /datum/species/mush)) #define isshadow(A) (is_species(A, /datum/species/shadow)) diff --git a/code/datums/components/dullahan.dm b/code/datums/components/dullahan.dm index a3e1335e6b..5e0658be39 100644 --- a/code/datums/components/dullahan.dm +++ b/code/datums/components/dullahan.dm @@ -47,8 +47,14 @@ H.flags_1 &= ~(HEAR_1) + RegisterSignal(dullahan_head, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner) + dullahan_head.update_appearance() +/datum/component/dullahan/proc/include_owner(datum/source, list/processing_list, list/hearers) + if(!QDELETED(parent)) + hearers += parent + /datum/component/dullahan/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs) excluded_limbs |= BODY_ZONE_HEAD // So we don't gib when regenerating limbs. diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index aebe6ec7fa..8f7043c715 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -186,3 +186,12 @@ value = 0 medical_record_text = "Patient should not come into contact with sodium." mob_trait = TRAIT_SALT_SENSITIVE + +/datum/quirk/dullahan + name = "Dullahan" + desc = "Your head is detached from your body." + value = 0 + medical_record_text = "Patient seems to have some kind of spatial link with their decapitated head." + +/datum/quirk/dullahan/post_add() + quirk_holder.AddComponent(/datum/component/dullahan) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 249dbba45f..b4a8952675 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 55 +#define SAVEFILE_VERSION_MAX 56 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -358,6 +358,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(length(old_flavor_text) && !length(features["feature_flavor_text"])) features["feature_flavor_text"] = old_flavor_text + // hey what happened to 55 + + // dullahans as a species cease to exist + if(current_version < 56) + var/species_id = S["species"] + if(species_id = SPECIES_DULLAHAN) + S["species"] = SPECIES_HUMAN + if(islist(S["all_quirks"]) + S["all_quirks"] += "Dullahan" + else + S["all_quirks"] = list("Dullahan") + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm deleted file mode 100644 index ed06d2be5a..0000000000 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ /dev/null @@ -1,136 +0,0 @@ -/datum/species/dullahan - name = "Dullahan" - id = SPECIES_DULLAHAN - default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE) - inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) - mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "deco_wings" = "None") - use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM - mutant_brain = /obj/item/organ/brain/dullahan - mutanteyes = /obj/item/organ/eyes/dullahan - mutanttongue = /obj/item/organ/tongue/dullahan - mutantears = /obj/item/organ/ears/dullahan - blacklisted = TRUE - limbs_id = SPECIES_HUMAN - skinned_type = /obj/item/stack/sheet/animalhide/human - has_field_of_vision = FALSE //Too much of a trouble, their vision is already bound to their severed head. - species_category = SPECIES_CATEGORY_UNDEAD - var/pumpkin = FALSE - wings_icons = SPECIES_WINGS_SKELETAL //seems suitable for an undead. - - var/obj/item/dullahan_relay/myhead - -/datum/species/dullahan/pumpkin - name = "Pumpkin Head Dullahan" - id = "pumpkindullahan" - pumpkin = TRUE - -/datum/species/dullahan/check_roundstart_eligible() - if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) - return TRUE - return ..() - -/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) - . = ..() - H.flags_1 &= ~(HEAR_1) - var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD) - if(head) - if(pumpkin)//Pumpkinhead! - head.animal_origin = 100 - head.icon = 'icons/obj/clothing/hats.dmi' - head.icon_state = "hardhat1_pumpkin_j" - head.custom_head = TRUE - head.drop_limb() - if(!QDELETED(head)) //drop_limb() deletes the limb if it's no drop location and dummy humans used for rendering icons are located in nullspace. Do the math. - head.throwforce = 25 - myhead = new /obj/item/dullahan_relay (head, H) - H.put_in_hands(head) - var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) - for(var/datum/action/item_action/organ_action/OA in E.actions) - OA.Trigger() - -/datum/species/dullahan/on_species_loss(mob/living/carbon/human/H) - H.flags_1 |= HEAR_1 - H.reset_perspective(H) - if(myhead) - var/obj/item/dullahan_relay/DR = myhead - myhead = null - DR.owner = null - qdel(DR) - H.regenerate_limb(BODY_ZONE_HEAD,FALSE) - ..() - -/datum/species/dullahan/spec_life(mob/living/carbon/human/H) - if(QDELETED(myhead)) - myhead = null - H.gib() - var/obj/item/bodypart/head/head2 = H.get_bodypart(BODY_ZONE_HEAD) - if(head2) - myhead = null - H.gib() - -/datum/species/dullahan/proc/update_vision_perspective(mob/living/carbon/human/H) - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - if(eyes) - H.update_tint() - if(eyes.tint) - H.reset_perspective(H) - else - H.reset_perspective(myhead) - -/obj/item/organ/brain/dullahan - decoy_override = TRUE - organ_flags = ORGAN_NO_SPOIL//Do not decay - -/obj/item/organ/ears/dullahan - zone = "abstract" - -/obj/item/dullahan_relay - name = "dullahan relay" - var/mob/living/owner - flags_1 = HEAR_1 - -/obj/item/dullahan_relay/Initialize(mapload, mob/living/carbon/human/new_owner) - . = ..() - if(!new_owner) - return INITIALIZE_HINT_QDEL - owner = new_owner - START_PROCESSING(SSobj, src) - RegisterSignal(owner, COMSIG_MOB_CLICKED_SHIFT_ON, .proc/examinate_check) - RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner) - RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head) - RegisterSignal(owner, COMSIG_LIVING_REVIVE, .proc/retrieve_head) - -/obj/item/dullahan_relay/proc/examinate_check(mob/source, atom/target) - if(source.client.eye == src) - return COMPONENT_ALLOW_EXAMINATE - -/obj/item/dullahan_relay/proc/include_owner(datum/source, list/processing_list, list/hearers) - if(!QDELETED(owner)) - hearers += owner - -/obj/item/dullahan_relay/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs) - excluded_limbs |= BODY_ZONE_HEAD // So we don't gib when regenerating limbs. - -//Retrieving the owner's head for better ahealing. -/obj/item/dullahan_relay/proc/retrieve_head(datum/source, full_heal, admin_revive) - if(admin_revive) - var/obj/item/bodypart/head/H = loc - var/turf/T = get_turf(owner) - if(H && istype(H) && T && !(H in owner.GetAllContents())) - H.forceMove(T) - -/obj/item/dullahan_relay/process() - if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner)) - . = PROCESS_KILL - qdel(src) - -/obj/item/dullahan_relay/Destroy() - if(!QDELETED(owner)) - var/mob/living/carbon/human/H = owner - if(isdullahan(H)) - var/datum/species/dullahan/D = H.dna.species - D.myhead = null - owner.gib() - owner = null - ..()