#define DEVIL_HANDS_LAYER 1 #define DEVIL_HEAD_LAYER 2 #define DEVIL_TOTAL_LAYERS 2 /mob/living/carbon/true_devil name = "True Devil" desc = "A pile of infernal energy, taking a vaguely humanoid form." icon = 'icons/mob/32x64.dmi' icon_state = "true_devil" gender = NEUTER health = 350 maxHealth = 350 ventcrawler = VENTCRAWLER_NONE density = TRUE pass_flags = 0 var/ascended = FALSE sight = (SEE_TURFS | SEE_OBJS) status_flags = CANPUSH mob_size = MOB_SIZE_LARGE var/mob/living/oldform var/list/devil_overlays[DEVIL_TOTAL_LAYERS] bodyparts = list(/obj/item/bodypart/chest/devil, /obj/item/bodypart/head/devil, /obj/item/bodypart/l_arm/devil, /obj/item/bodypart/r_arm/devil, /obj/item/bodypart/r_leg/devil, /obj/item/bodypart/l_leg/devil) /mob/living/carbon/true_devil/Initialize() create_bodyparts() //initialize bodyparts create_internal_organs() grant_all_languages(omnitongue=TRUE) ..() /mob/living/carbon/true_devil/create_internal_organs() internal_organs += new /obj/item/organ/brain internal_organs += new /obj/item/organ/tongue internal_organs += new /obj/item/organ/eyes internal_organs += new /obj/item/organ/ears/invincible //Prevents hearing loss from poorly aimed fireballs. ..() /mob/living/carbon/true_devil/proc/convert_to_archdevil() maxHealth = 500 // not an IMPOSSIBLE amount, but still near impossible. ascended = TRUE health = maxHealth icon_state = "arch_devil" /mob/living/carbon/true_devil/proc/set_name() var/datum/antagonist/devil/devilinfo = mind.has_antag_datum(ANTAG_DATUM_DEVIL) name = devilinfo.truename real_name = name /mob/living/carbon/true_devil/Login() ..() var/datum/antagonist/devil/devilinfo = mind.has_antag_datum(ANTAG_DATUM_DEVIL) devilinfo.greet() mind.announce_objectives() /mob/living/carbon/true_devil/death(gibbed) stat = DEAD ..(gibbed) drop_all_held_items() INVOKE_ASYNC(mind.has_antag_datum(ANTAG_DATUM_DEVIL), /datum/antagonist/devil/proc/beginResurrectionCheck, src) /mob/living/carbon/true_devil/examine(mob/user) var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" //Left hand items for(var/obj/item/I in held_items) if(!(I.flags_1 & ABSTRACT_1)) if(I.blood_DNA) msg += "It is holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else msg += "It is holding [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Braindead if(!client && stat != DEAD) msg += "The devil seems to be in deep contemplation.\n" //Damaged if(stat == DEAD) msg += "The hellfire seems to have been extinguished, for now at least.\n" else if(health < (maxHealth/10)) msg += "You can see hellfire inside its gaping wounds.\n" else if(health < (maxHealth/2)) msg += "You can see hellfire inside its wounds.\n" msg += "*---------*" to_chat(user, msg) /mob/living/carbon/true_devil/IsAdvancedToolUser() return 1 /mob/living/carbon/true_devil/resist_buckle() if(buckled) buckled.user_unbuckle_mob(src,src) visible_message("[src] easily breaks out of their handcuffs!", \ "With just a thought your handcuffs fall off.") /mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close = 0) if(incapacitated()) return 0 if(be_close && !in_range(M, src)) return 0 return 1 /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 /mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0) if(mind && has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return ..() //flashes don't stop devils UNLESS it's their bane. /mob/living/carbon/true_devil/soundbang_act() return 0 /mob/living/carbon/true_devil/get_ear_protection() return 2 /mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone) var/weakness = check_weakness(I, user) apply_damage(I.force * weakness, I.damtype, def_zone) var/message_verb = "" if(I.attack_verb && I.attack_verb.len) message_verb = "[pick(I.attack_verb)]" else if(I.force) message_verb = "attacked" var/attack_message = "[src] has been [message_verb] with [I]." if(user) user.do_attack_animation(src) if(user in viewers(src, null)) attack_message = "[user] has [message_verb] [src] with [I]!" if(message_verb) visible_message("[attack_message]", "[attack_message]", null, COMBAT_MESSAGE_RANGE) return TRUE /mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0) return 1 /mob/living/carbon/true_devil/singularity_act() if(ascended) return 0 return ..() /mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob) if(ascended || user.mind.soulOwner == src.mind) var/mob/living/simple_animal/imp/S = new(get_turf(loc)) S.key = user.key S.mind.assigned_role = "Imp" S.mind.special_role = "Imp" var/datum/objective/newobjective = new newobjective.explanation_text = "Try to get a promotion to a higher devilic rank." S.mind.objectives += newobjective to_chat(S, S.playstyle_string) to_chat(S, "Objective #[1]: [newobjective.explanation_text]") else return ..() /mob/living/carbon/true_devil/can_be_revived() return 1 /mob/living/carbon/true_devil/resist_fire() //They're immune to fire. /mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M) if(..()) switch(M.a_intent) if ("harm") var/damage = rand(1, 5) playsound(loc, "punch", 25, 1, -1) visible_message("[M] has punched [src]!", \ "[M] has punched [src]!") adjustBruteLoss(damage) add_logs(M, src, "attacked") updatehealth() if ("disarm") if (!lying && !ascended) //No stealing the arch devil's pitchfork. if (prob(5)) Unconscious(40) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) add_logs(M, src, "pushed") visible_message("[M] has pushed down [src]!", \ "[M] has pushed down [src]!") else if (prob(25)) drop_item() playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) visible_message("[M] has disarmed [src]!", \ "[M] has disarmed [src]!") else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to disarm [src]!") /mob/living/carbon/true_devil/handle_breathing() // devils do not need to breathe /mob/living/carbon/true_devil/is_literate() return 1 /mob/living/carbon/true_devil/ex_act(severity, ex_target) if(!ascended) var/b_loss switch (severity) if (1) b_loss = 500 if (2) b_loss = 150 if(3) b_loss = 30 if(has_bane(BANE_LIGHT)) b_loss *=2 adjustBruteLoss(b_loss) return ..() /mob/living/carbon/true_devil/update_body() //we don't use the bodyparts layer for devils. return /mob/living/carbon/true_devil/update_body_parts() return /mob/living/carbon/true_devil/update_damage_overlays() //devils don't have damage overlays. return