* Dullahans

* Vision toggle

* The worst part of the code right here

* No wings

* to_chat

* Hearing relay that works, vision toggle that works

* Fixes hair not appearing on severed heads

* Halloween event

* Moves dullahans to their own file

* Forgot to commit a file

* Fixes deafness and backpack issues

* Don't need to breath because you dont have a head

* Breaking the dullahan rules

* Encourage dullahans to lose their heads

* Cyberboss doing his job to head off any bad code trying to enter the repo

* Committing while compiling again

* Can't eat

* Halloween!

* qdeleted

* Get rid of the head var entirely, just track the easily deletable relay

* Moves the stuff out of process to destroy
This commit is contained in:
KorPhaeron
2017-10-24 14:35:19 -05:00
committed by CitadelStationBot
parent 14ed0d84e8
commit be8c5ac631
3 changed files with 160 additions and 17 deletions
@@ -0,0 +1,144 @@
/datum/species/dullahan
name = "dullahan"
id = "dullahan"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = TRUE
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 = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
var/obj/item/dullahan_relay/myhead
/datum/species/dullahan/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
return FALSE
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
var/obj/item/bodypart/head/head = H.get_bodypart("head")
if(head)
head.drop_limb()
head.flags_1 = HEAR_1
head.throwforce = 25
myhead = new /obj/item/dullahan_relay (head, H)
/datum/species/dullahan/on_species_loss(mob/living/carbon/human/H)
if(myhead)
var/obj/item/dullahan_relay/DR = myhead
myhead = null
DR.owner = null
qdel(DR)
..()
/datum/species/dullahan/spec_life(mob/living/carbon/human/H)
if(!QDELETED(myhead))
update_vision_perspective(H)
var/turf/Me = get_turf(H)
var/turf/Head = get_turf(myhead)
if(Me == Head || (Head in oview(7, Me)))
H.disabilities &= ~DEAF
else
H.disabilities |= DEAF
else
myhead = null
H.gib()
var/obj/item/bodypart/head/head2 = H.get_bodypart("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
vital = FALSE
/obj/item/organ/tongue/dullahan
zone = "abstract"
/obj/item/organ/tongue/dullahan/TongueSpeech(var/message)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.dna.species.id == "dullahan")
var/datum/species/dullahan/D = H.dna.species
if(isobj(D.myhead.loc))
var/obj/O = D.myhead.loc
O.say(message)
message = ""
return message
/obj/item/organ/ears/dullahan
zone = "abstract"
/obj/item/organ/eyes/dullahan
name = "head vision"
desc = "An abstraction."
actions_types = list(/datum/action/item_action/organ_action/dullahan)
zone = "abstract"
/datum/action/item_action/organ_action/dullahan/Trigger()
. = ..()
var/obj/item/organ/eyes/dullahan/DE = target
if(DE.tint)
DE.tint = 0
else
DE.tint = INFINITY
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.dna.species.id == "dullahan")
var/datum/species/dullahan/D = H.dna.species
D.update_vision_perspective(H)
/obj/item/dullahan_relay
var/mob/living/owner
flags_1 = HEAR_1
/obj/item/dullahan_relay/Initialize(mapload,new_owner)
. = ..()
owner = new_owner
START_PROCESSING(SSobj, src)
/obj/item/dullahan_relay/process()
if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner))
. = PROCESS_KILL
qdel(src)
/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
if(!QDELETED(owner))
var/turf/T = get_turf(speaker)
var/turf/owner_turf = get_turf(owner)
if(T == owner_turf || (T in oview(7, owner_turf))) //Do not relay things we can already hear
return
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(owner,message)
else
qdel(src)
/obj/item/dullahan_relay/Destroy()
if(!QDELETED(owner))
var/mob/living/carbon/human/H = owner
if(H.dna.species.id == "dullahan")
var/datum/species/dullahan/D = H.dna.species
D.myhead = null
owner.gib()
owner = null
..()
+15 -17
View File
@@ -124,39 +124,37 @@
cut_overlays()
. = ..()
if(dropped) //certain overlays only appear when the limb is being detached from its owner.
var/datum/sprite_accessory/S
if(status != BODYPART_ROBOTIC) //having a robotic head hides certain features.
//facial hair
if(facial_hair_style)
S = GLOB.facial_hair_styles_list[facial_hair_style]
var/datum/sprite_accessory/S = GLOB.facial_hair_styles_list[facial_hair_style]
if(S)
var/image/facial_overlay = image(S.icon, "[S.icon_state]", -HAIR_LAYER, SOUTH)
facial_overlay.color = "#" + facial_hair_color
facial_overlay.alpha = hair_alpha
. += facial_overlay
var/image/hair_overlay = image(layer = -HAIR_LAYER, dir = SOUTH)
. += hair_overlay
//Applies the debrained overlay if there is no brain
if(!brain)
var/image/debrain_overlay = image(layer = -HAIR_LAYER, dir = SOUTH)
if(animal_origin == ALIEN_BODYPART)
hair_overlay.icon = 'icons/mob/animal_parts.dmi'
hair_overlay.icon_state = "debrained_alien"
debrain_overlay.icon = 'icons/mob/animal_parts.dmi'
debrain_overlay.icon_state = "debrained_alien"
else if(animal_origin == LARVA_BODYPART)
hair_overlay.icon = 'icons/mob/animal_parts.dmi'
hair_overlay.icon_state = "debrained_larva"
debrain_overlay.icon = 'icons/mob/animal_parts.dmi'
debrain_overlay.icon_state = "debrained_larva"
else if(!(NOBLOOD in species_flags_list))
hair_overlay.icon = 'icons/mob/human_face.dmi'
hair_overlay.icon_state = "debrained"
debrain_overlay.icon = 'icons/mob/human_face.dmi'
debrain_overlay.icon_state = "debrained"
. += debrain_overlay
else
if(hair_style)
S = GLOB.hair_styles_list[hair_style]
if(S)
hair_overlay.icon = icon
hair_overlay.icon_state = "[S.icon_state]"
hair_overlay.color = "#" + hair_color
hair_overlay.alpha = hair_alpha
var/datum/sprite_accessory/S2 = GLOB.hair_styles_list[hair_style]
if(S2)
var/image/hair_overlay = image(S2.icon, "[S2.icon_state]", -HAIR_LAYER, SOUTH)
hair_overlay.color = "#" + hair_color
hair_overlay.alpha = hair_alpha
. += hair_overlay
// lipstick
+1
View File
@@ -1720,6 +1720,7 @@
#include "code\modules\mob\living\carbon\human\species_types\android.dm"
#include "code\modules\mob\living\carbon\human\species_types\angel.dm"
#include "code\modules\mob\living\carbon\human\species_types\corporate.dm"
#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm"
#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\golems.dm"