Adds Zombies (Admin-spawn) (#25381)

* fuck it good enough

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Contrabang <91113370+Contrabang@users.noreply.github.com>

* TRIPLE-REVIEW

* this should do it

* wow

* bruh

* FIX

* fix

* yeah

* sirryan review

* aaaaa

* Apply suggestions from code review

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Contrabang <91113370+Contrabang@users.noreply.github.com>

---------

Signed-off-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
This commit is contained in:
Contrabang
2024-05-30 22:17:31 -04:00
committed by GitHub
parent 247e24ba9f
commit bc0c8344cf
62 changed files with 1326 additions and 148 deletions
+3
View File
@@ -153,3 +153,6 @@
#define COMPLEMENTARY_COLOR_CRYOGENIC_LIQUID "#a8b7df"
#define COMPLEMENTARY_COLOR_SORIUM "#a2a256"
#define COMPLEMENTARY_COLOR_TESLIUM_PASTE "#412968"
/// Color for dead external organs/zombies
#define COLORTONE_DEAD_EXT_ORGAN "#0A3200"
+1
View File
@@ -54,6 +54,7 @@
#define SPECIAL_ROLE_XENOMORPH_DRONE "Xenomorph Drone"
#define SPECIAL_ROLE_XENOMORPH_SENTINEL "Xenomorph Sentinel"
#define SPECIAL_ROLE_XENOMORPH_LARVA "Xenomorph Larva"
#define SPECIAL_ROLE_ZOMBIE "Zombie"
#define SPECIAL_ROLE_EVENTMISC "Event Role"
// Constants used by code which checks the status of nuclear blasts during a
+1
View File
@@ -56,6 +56,7 @@
#define DATA_HUD_ABDUCTOR 19
#define ANTAG_HUD_EVENTMISC 20
#define ANTAG_HUD_BLOB 21
#define ANTAG_HUD_ZOMBIE 22
// Notification action types
#define NOTIFY_JUMP "jump"
+4 -2
View File
@@ -26,11 +26,13 @@
#define ORGAN_ORGANIC_OPEN 1
/// An organ that's encased, probably with bone, where that casing has been cut through.
#define ORGAN_ORGANIC_ENCASED_OPEN 2
/// An organ that has been violently opened, likely via damage.
#define ORGAN_ORGANIC_VIOLENT_OPEN 3
/// Synthetic organ that's been unscrewed.
#define ORGAN_SYNTHETIC_LOOSENED 3
#define ORGAN_SYNTHETIC_LOOSENED 4
/// Synthetic organ that's had its panel opened.
#define ORGAN_SYNTHETIC_OPEN 4
#define ORGAN_SYNTHETIC_OPEN 5
// Return defines for surgery steps
+8 -2
View File
@@ -150,8 +150,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_PACIFISM "pacifism"
#define TRAIT_IGNORESLOWDOWN "ignoreslow"
#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown"
#define TRAIT_GOTTAGOFAST "gottagofast"
#define TRAIT_GOTTAGONOTSOFAST "gottagonotsofast"
#define TRAIT_GOTTAGOFAST "gottagofast" // -1 slowdown. Trait given by meth and similar substances for running fast.
#define TRAIT_GOTTAGONOTSOFAST "gottagonotsofast" // -0.5 slowdown. Trait given by nuka cola and umbrae shade, for a slight speed/
#define TRAIT_GOTTAGOSLOW "gottagoslow" // +1 slowdown. Trait given by being a zombie.
#define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination
#define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy.
#define TRAIT_SHOCKIMMUNE "shock_immunity"
@@ -227,6 +228,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_MEPHEDRONE_ADAPTED "mephedrone_adapted" // Trait that changes the ending effects of twitch leaving your system
#define TRAIT_NOKNOCKDOWNSLOWDOWN "noknockdownslowdown" //If this person has this trait, they are not slowed via knockdown, but they can be hit by bullets like a self knockdown
#define TRAIT_CAN_STRIP "can_strip" // This mob can strip other mobs.
#define TRAIT_I_WANT_BRAINS "mob_zombie" // A general trait for tracking if the mob is a zombie.
#define TRAIT_ABSTRACT_HANDS "abstract_hands" // Mobs with this trait can only pick up abstract items.
#define TRAIT_SLOW_GRABBER "slow_grabber" // Adds a 1.5 * CLICK_CD_MELEE delay to upgrading into a aggressive grab.
#define TRAIT_LANGUAGE_LOCKED "language_locked" // cant add/remove languages until removed (excludes babel because fuck everything i guess)
//***** MIND TRAITS *****/
#define TRAIT_HOLY "is_holy" // The mob is holy in regards to religion
@@ -299,6 +304,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define CULT_TRAIT "cult"
#define INNATE_TRAIT "innate"
#define VAMPIRE_TRAIT "vampire"
#define ZOMBIE_TRAIT "zombie"
#define CHANGELING_TRAIT "changeling"
#define LYING_DOWN_TRAIT "lying_down"
#define SLIME_TRAIT "slime"
+6 -1
View File
@@ -20,6 +20,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN,
"TRAIT_GOTTAGOFAST" = TRAIT_GOTTAGOFAST,
"TRAIT_GOTTAGONOTSOFAST" = TRAIT_GOTTAGONOTSOFAST,
"TRAIT_GOTTAGOSLOW" = TRAIT_GOTTAGOSLOW,
"TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH,
"TRAIT_XENO_HOST" = TRAIT_XENO_HOST,
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
@@ -90,7 +91,11 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SCOPED" = TRAIT_SCOPED,
"TRAIT_MEPHEDRONE_ADAPTED" = TRAIT_MEPHEDRONE_ADAPTED,
"TRAIT_NOKNOCKDOWNSLOWDOWN" = TRAIT_NOKNOCKDOWNSLOWDOWN,
"TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP
"TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP,
"TRAIT_I_WANT_BRAINS" = TRAIT_I_WANT_BRAINS,
"TRAIT_ABSTRACT_HANDS" = TRAIT_ABSTRACT_HANDS,
"TRAIT_SLOW_GRABBER" = TRAIT_SLOW_GRABBER,
"TRAIT_LANGUAGE_LOCKED" = TRAIT_LANGUAGE_LOCKED,
),
/datum/mind = list(
+1 -1
View File
@@ -51,7 +51,7 @@
if(QDELETED(A))
return
if(client.click_intercept)
if(client?.click_intercept)
client.click_intercept.InterceptClickOn(src, params, A)
return
+2 -1
View File
@@ -23,7 +23,8 @@ GLOBAL_LIST_INIT(huds, list(
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),
ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_BLOB = new/datum/atom_hud/antag/hidden()
ANTAG_HUD_BLOB = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_ZOMBIE = new/datum/atom_hud/antag()
))
/datum/atom_hud
+155
View File
@@ -0,0 +1,155 @@
/datum/component/zombie_regen/Initialize()
if(!ishuman(parent))
return COMPONENT_INCOMPATIBLE
START_PROCESSING(SSprocessing, src)
/datum/component/zombie_regen/Destroy(force, silent)
STOP_PROCESSING(SSprocessing, src)
return ..()
/datum/component/zombie_regen/process()
if(!ishuman(parent))
return
var/mob/living/carbon/human/zomboid = parent
if(zomboid.suiciding)
return
var/turf/current_turf = get_turf(zomboid)
var/healing_factor = max(1, 6 * (1 - current_turf.get_lumcount()))
if(zomboid.reagents.has_reagent("zombiecure3"))
healing_factor /= 3
if(zomboid.stat == DEAD)
healing_factor *= 2
zomboid.heal_overall_damage(healing_factor, healing_factor)
zomboid.adjustBrainLoss(-healing_factor)
if(zomboid.stat == DEAD && zomboid.getBruteLoss() <= 1 && zomboid.getFireLoss() <= 1 && (zomboid.timeofdeath + 15 SECONDS <= world.time))
var/datum/reagent/the_cure = zomboid.reagents.has_reagent("zombiecure4")
if(the_cure) // dead bodies dont process chemicals, so we gotta do it manually.
zomboid.reagents.remove_reagent("zombiecure4", the_cure.metabolization_rate * zomboid.metabolism_efficiency)
return
zombie_rejuv()
to_chat(zomboid, "<span class='zombielarge'>We... Awaken...</span>")
// If no client, but they were a player thats not SSD (debrained, revived but hasn't returned to body, etc)
if(zomboid.stat != CONSCIOUS || HAS_TRAIT(zomboid, TRAIT_HANDS_BLOCKED))
return
if(zomboid.client || isLivingSSD(zomboid))
return
if(zomboid.last_known_ckey && !zomboid.key) // make sure they were player inhabited and not admin ghosted
mindless_hunger()
/datum/component/zombie_regen/proc/zombie_rejuv()
var/mob/living/carbon/human/zomboid = parent
zomboid.setToxLoss(0)
zomboid.setOxyLoss(0)
zomboid.setCloneLoss(0)
zomboid.setBrainLoss(0)
zomboid.setStaminaLoss(0)
zomboid.SetSleeping(0)
zomboid.SetParalysis(0, TRUE)
zomboid.SetStunned(0, TRUE)
zomboid.SetWeakened(0, TRUE)
zomboid.SetSlowed(0)
zomboid.SetImmobilized(0)
zomboid.SetKnockDown(0)
zomboid.SetLoseBreath(0)
zomboid.SetDizzy(0)
zomboid.SetJitter(0)
zomboid.SetStuttering(0)
zomboid.SetConfused(0)
zomboid.SetDrowsy(0)
zomboid.radiation = 0
zomboid.SetDruggy(0)
zomboid.SetHallucinate(0)
zomboid.bodytemperature = 310
zomboid.cure_blind()
zomboid.cure_nearsighted()
zomboid.CureMute()
zomboid.CureDeaf()
zomboid.CureTourettes()
zomboid.CureEpilepsy()
zomboid.CureCoughing()
zomboid.CureNervous()
zomboid.SetEyeBlind(0)
zomboid.SetEyeBlurry(0)
zomboid.SetDeaf(0)
zomboid.heal_overall_damage(1000, 1000)
zomboid.ExtinguishMob()
SEND_SIGNAL(zomboid, COMSIG_LIVING_CLEAR_STUNS)
zomboid.fire_stacks = 0
zomboid.on_fire = 0
zomboid.suiciding = 0
zomboid.set_nutrition(max(zomboid.nutrition, NUTRITION_LEVEL_HUNGRY))
if(zomboid.buckled) //Unbuckle the mob and clear the alerts.
zomboid.buckled.unbuckle_mob(src, force = TRUE)
var/datum/organ/heart/heart = zomboid.get_int_organ_datum(ORGAN_DATUM_HEART)
var/heart_type = zomboid.dna?.species?.has_organ["heart"]
if(!heart && heart_type)
var/obj/item/organ/internal/new_heart = new heart_type()
new_heart.insert(zomboid)
var/datum/organ/lungs/lungs = zomboid.get_int_organ_datum(ORGAN_DATUM_LUNGS)
var/lung_type = zomboid.dna?.species?.has_organ["lungs"]
if(!lungs && lung_type)
var/obj/item/organ/internal/new_lungs = new lung_type()
new_lungs.insert(zomboid)
zomboid.set_heartattack(FALSE)
zomboid.restore_blood()
zomboid.decaylevel = 0
zomboid.remove_all_embedded_objects()
zomboid.restore_all_organs()
if(zomboid.stat == DEAD)
zomboid.update_revive()
else if(zomboid.stat == UNCONSCIOUS)
zomboid.WakeUp()
zomboid.update_fire()
zomboid.regenerate_icons()
zomboid.restore_blood()
zomboid.update_eyes()
for(var/datum/disease/critical/crit in zomboid.viruses) // cure all crit conditions
crit.cure()
/datum/component/zombie_regen/proc/mindless_hunger()
var/mob/living/carbon/human/zomboid = parent
var/list/targets = list()
for(var/mob/living/carbon/human/target in view(6, zomboid))
if(target.stat == CONSCIOUS && !HAS_TRAIT(target, TRAIT_I_WANT_BRAINS))
targets |= target
if(zomboid.Adjacent(target))
break // we're just gonna hit em
var/target
if(length(targets))
target = pick(targets)
if(zomboid.Adjacent(target) && safe_active_hand(zomboid))
zomboid.a_intent = INTENT_HARM
zomboid.ClickOn(target)
return
if(!target && prob(90)) // a small chance to wander
return
var/targetted_direction = pick(GLOB.cardinal)
if(target)
targetted_direction = get_dir(zomboid, target)
var/delay = zomboid.movement_delay()
if(IS_DIR_DIAGONAL(targetted_direction))
delay *= SQRT_2
zomboid.glide_for(delay)
step(zomboid, targetted_direction)
/datum/component/zombie_regen/proc/safe_active_hand(mob/living/carbon/human/zomboid)
if(zomboid.get_organ("[zomboid.hand ? "l" : "r" ]_hand"))
return TRUE
zomboid.swap_hand()
if(zomboid.get_organ("[zomboid.hand ? "l" : "r" ]_hand"))
return TRUE
return FALSE
+2 -2
View File
@@ -1045,7 +1045,7 @@
to_chat(usr, "Mob doesn't exist anymore")
return
if(H.add_language(new_language))
if(H.add_language(new_language, TRUE))
to_chat(usr, "Added [new_language] to [H].")
message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the language [new_language]")
log_admin("[key_name(usr)] has given [key_name(H)] the language [new_language]")
@@ -1073,7 +1073,7 @@
to_chat(usr, "Mob doesn't exist anymore")
return
if(H.remove_language(rem_language.name))
if(H.remove_language(rem_language.name, TRUE))
to_chat(usr, "Removed [rem_language] from [H].")
message_admins("[key_name_admin(usr)] has removed language [rem_language] from [key_name_admin(H)]")
log_admin("[key_name(usr)] has removed language [rem_language] from [key_name(H)]")
+3 -1
View File
@@ -8,7 +8,7 @@
/mob/proc/CanContractDisease(datum/disease/D)
if(stat == DEAD)
if(stat == DEAD && !D.allow_dead)
return FALSE
if(D.GetDiseaseID() in resistances)
@@ -30,6 +30,7 @@
if(!CanContractDisease(D))
return 0
AddDisease(D)
return TRUE
/mob/proc/AddDisease(datum/disease/D, respect_carrier = FALSE)
@@ -127,6 +128,7 @@
if(passed)
AddDisease(D)
return passed
/**
+14 -11
View File
@@ -71,6 +71,8 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list() //dna_spread special bullshit
/// Allow the virus to infect and process while the affected_mob is dead
var/allow_dead = FALSE
/datum/disease/Destroy()
affected_mob = null
@@ -87,23 +89,24 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
stage = min(stage, max_stages)
if(!cure)
if(prob(stage_prob))
stage = min(stage + 1,max_stages)
if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress
discovered = TRUE
affected_mob.med_hud_set_status()
else
if(prob(cure_chance))
stage = max(stage - 1, 1)
if(!cure && prob(stage_prob))
stage = min(stage + 1, max_stages)
if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress
discovered = TRUE
affected_mob.med_hud_set_status()
return handle_cure_testing(cure)
/datum/disease/proc/handle_cure_testing(has_cure = FALSE)
if(has_cure && prob(cure_chance))
stage = max(stage - 1, 1)
if(disease_flags & CURABLE)
if(cure && prob(cure_chance))
if(has_cure && prob(cure_chance))
cure()
return FALSE
return TRUE
/datum/disease/proc/has_cure()
if(!(disease_flags & CURABLE))
return 0
+141
View File
@@ -0,0 +1,141 @@
/datum/disease/zombie
name = "Necrotizing Plague"
medical_name = "Advanced Resurrection Syndrome"
desc = "This virus infects humanoids and drives them insane with a hunger for flesh, along with possessing regenerative abilities."
max_stages = 7
spread_text = "Blood and Saliva"
spread_flags = BLOOD
cure_text = "Anti-plague viral solutions"
cures = list()
agent = ""
viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
allow_dead = TRUE
disease_flags = CAN_CARRY
virus_heal_resistant = TRUE
stage_prob = 1
cure_chance = 20
/// How far this particular virus is in being cured (0-4)
var/cure_stage = 0
/datum/disease/zombie/stage_act()
if(stage == 8)
// adminbus for immediate zombie
var/mob/living/carbon/human/H = affected_mob
if(!istype(H))
return FALSE
for(var/obj/item/organ/limb as anything in H.bodyparts)
if(!(limb.status & ORGAN_DEAD) && !limb.is_robotic())
limb.necrotize(TRUE, TRUE)
if(!..())
return FALSE
if(HAS_TRAIT(affected_mob, TRAIT_I_WANT_BRAINS) || affected_mob.mind?.has_antag_datum(/datum/antagonist/zombie))
handle_rot(TRUE)
stage = 7
return FALSE
switch(stage)
if(1) // cured by lvl 1 cure
if(prob(4))
to_chat(affected_mob, "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flakey.")]</span>")
else if(prob(5))
to_chat(affected_mob, "<span class='warning'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>")
if(2)
if(prob(2))
to_chat(affected_mob, "<span class='danger'>Mucous runs down the back of your throat.</span>")
else if(prob(5))
to_chat(affected_mob, "<span class='warning'>[pick("You feel hungry.", "You crave for something to eat.")]</span>")
if(3) // cured by lvl 2 cure
if(prob(2))
affected_mob.emote("sneeze")
else if(prob(2))
affected_mob.emote("cough")
else if(prob(5))
to_chat(affected_mob, "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>")
if(prob(5))
affected_mob.adjustToxLoss(1)
if(4) // shows up on medhuds
if(prob(2))
affected_mob.emote("stare")
else if(prob(2))
affected_mob.emote("drool")
else if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel a cold sweat form.</span>")
if(prob(25))
affected_mob.adjustToxLoss(1)
if(5, 6) // 5 is cured by lvl 3 cure. 6+ needs lvl 4 cure
var/turf/T = get_turf(affected_mob)
if(T.get_lumcount() >= 0.5)
if(prob(5))
to_chat(affected_mob, "<span class='danger'>Those lights seem bright. It stings.</span>")
if(prob(25))
affected_mob.adjustFireLoss(2)
if(prob(2))
affected_mob.emote("drool")
if(stage == 6 && !affected_mob.reagents.has_reagent("zombiecure3")) // cure 3 can delay it, but not cure it
if(prob(10))
to_chat(affected_mob, "<span class='danger zombie'>You feel your flesh rotting.</span>")
handle_rot()
if(7)
if(!handle_rot(TRUE))
stage = 6
return
/datum/disease/zombie/proc/handle_rot(forced = FALSE)
if(!prob(20) && !forced && affected_mob.stat != DEAD)
return FALSE
var/mob/living/carbon/human/H = affected_mob
if(!istype(H))
return FALSE
for(var/obj/item/organ/limb as anything in H.bodyparts)
if(!(limb.status & ORGAN_DEAD) && !limb.vital && !limb.is_robotic())
limb.necrotize()
return FALSE
for(var/obj/item/organ/limb as anything in H.bodyparts)
if(!(limb.status & ORGAN_DEAD) && !limb.is_robotic())
limb.necrotize(FALSE, TRUE)
return FALSE
if(!HAS_TRAIT(affected_mob, TRAIT_I_WANT_BRAINS))
affected_mob.AddComponent(/datum/component/zombie_regen)
ADD_TRAIT(affected_mob, TRAIT_I_WANT_BRAINS, ZOMBIE_TRAIT)
affected_mob.med_hud_set_health()
affected_mob.med_hud_set_status()
affected_mob.update_hands_hud()
H.update_body()
if(affected_mob.mind && !affected_mob.mind.has_antag_datum(/datum/antagonist/zombie))
affected_mob.mind.add_antag_datum(/datum/antagonist/zombie)
return TRUE
/datum/disease/zombie/handle_cure_testing(has_cure = FALSE)
if(has_cure && prob(cure_chance))
stage = max(stage - 1, 0)
if(stage <= 0 && has_cure)
cure()
return FALSE
return TRUE
/datum/disease/zombie/proc/update_cure_stage()
for(var/datum/reagent/zombie_cure/reag in affected_mob.reagents?.reagent_list)
cure_stage = max(cure_stage, reag.cure_level)
if(cure_stage)
var/stages = list("Stabilized", "Weakened", "Faltering", "Suppressed")
name = "[stages[cure_stage]] [initial(name)]"
/datum/disease/zombie/has_cure()
update_cure_stage()
var/required_reagent = (stage + 1) / 2 // stage 1 can be cured by cure 1, stage 3 with 2, stage 5 with 3, stage 7 with 4
return cure_stage >= required_reagent
/datum/disease/zombie/cure()
affected_mob.mind?.remove_antag_datum(/datum/antagonist/zombie)
REMOVE_TRAIT(affected_mob, TRAIT_I_WANT_BRAINS, ZOMBIE_TRAIT)
qdel(affected_mob.GetComponent(/datum/component/zombie_regen))
affected_mob.med_hud_set_health()
affected_mob.med_hud_set_status()
return ..()
+7 -2
View File
@@ -273,9 +273,14 @@
if(age_based && ishuman(user))
var/mob/living/carbon/human/H = user
// Vary needs to be true as otherwise frequency changes get ignored deep within playsound_local :(
playsound(user.loc, sound_path, sound_volume, TRUE, frequency = H.get_age_pitch(H.dna.species.max_age))
playsound(user.loc, sound_path, sound_volume, TRUE, frequency = H.get_age_pitch(H.dna.species.max_age) * alter_emote_pitch(user))
else
playsound(user.loc, sound_path, sound_volume, vary)
playsound(user.loc, sound_path, sound_volume, TRUE, frequency = alter_emote_pitch(user))
/datum/emote/proc/alter_emote_pitch(mob/user)
if(HAS_TRAIT(user, TRAIT_I_WANT_BRAINS))
return 0.7
return 1
/**
* Send an emote to runechat for all (listening) users in the vicinity.
+51
View File
@@ -417,6 +417,16 @@
. += _memory_edit_role_enabled(ROLE_ABDUCTOR)
/datum/mind/proc/memory_edit_zombie(mob/living/H)
. = _memory_edit_header("zombie", list())
if(has_antag_datum(/datum/antagonist/zombie))
. += "<a href='byond://?src=[UID()];zombie=clear'>no</a>|<b><font color='red'>ZOMBIE</font></b>"
return
if(current.HasDisease(/datum/disease/zombie))
. += "<b>NO</b>|<a href='byond://?src=[UID()];zombie=zombie'>zombie</a>|<a href='byond://?src=[UID()];zombie=zombievirusno'><font color='red'>dis-infect</font></a>"
else
. += "<b>NO</b>|<a href='byond://?src=[UID()];zombie=zombie'>zombie</a>|<a href='byond://?src=[UID()];zombie=zombievirus'>infect</a>"
/datum/mind/proc/memory_edit_eventmisc(mob/living/H)
. = _memory_edit_header("event", list())
if(src in SSticker.mode.eventmiscs)
@@ -546,6 +556,8 @@
sections["nuclear"] = memory_edit_nuclear(H)
/** Abductors **/
sections["abductor"] = memory_edit_abductor(H)
/** Zombies **/
sections["zombie"] = memory_edit_zombie(H)
sections["eventmisc"] = memory_edit_eventmisc(H)
/** TRAITOR ***/
sections["traitor"] = memory_edit_traitor()
@@ -1170,6 +1182,45 @@
log_admin("[key_name(usr)] has eventantag'ed [current].")
current.create_log(MISC_LOG, "[current] was made into an event antagonist by [key_name_admin(usr)]")
else if(href_list["zombie"])
switch(href_list["zombie"])
if("clear")
if(!has_antag_datum(/datum/antagonist/zombie))
return
remove_antag_datum(/datum/antagonist/zombie)
for(var/datum/disease/zombie/D in current.viruses)
D.cure()
if(ishuman(current))
var/mob/living/carbon/human/human_current = current
for(var/obj/item/organ/limb as anything in human_current.bodyparts)
if(limb.status & ORGAN_DEAD && !limb.is_robotic())
limb.status &= ~ORGAN_DEAD
human_current.update_body()
message_admins("[key_name_admin(usr)] has de-zombied'ed [key_name(current)].")
log_admin("[key_name(usr)] has de-zombied'ed [key_name(current)].")
if("zombie")
if(has_antag_datum(/datum/antagonist/zombie))
return
add_antag_datum(/datum/antagonist/zombie)
message_admins("[key_name_admin(usr)] has zombie'ed [key_name(current)].")
log_admin("[key_name(usr)] has zombie'ed [key_name(current)].")
current.create_log(MISC_LOG, "[key_name(current)] was made into an zombie by [key_name_admin(usr)]")
if("zombievirus")
if(has_antag_datum(/datum/antagonist/zombie) || !ishuman(current))
return
current.AddDisease(new /datum/disease/zombie)
message_admins("[key_name_admin(usr)] has given a zombie virus to [key_name(current)].")
log_admin("[key_name(usr)] has given a zombie virus to [key_name(current)].")
current.create_log(MISC_LOG, "[key_name(current)] was admin-infected with a zombie virus by [key_name_admin(usr)]")
if("zombievirusno")
if(has_antag_datum(/datum/antagonist/zombie))
return
for(var/datum/disease/zombie/D in current.viruses)
D.cure()
message_admins("[key_name_admin(usr)] has removed the zombie virus from [key_name(current)].")
log_admin("[key_name(usr)] has removed the zombie virus from [key_name(current)].")
current.create_log(MISC_LOG, "[key_name(current)] had their zombie virus admin-removed by [key_name_admin(usr)]")
else if(href_list["traitor"])
switch(href_list["traitor"])
if("clear")
+5 -1
View File
@@ -102,7 +102,7 @@
//helper for getting the appropriate health status
/proc/RoundHealth(mob/living/M)
if(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_FAKEDEATH)))
if(M.stat == DEAD || HAS_TRAIT(M, TRAIT_FAKEDEATH) || HAS_TRAIT(M, TRAIT_I_WANT_BRAINS))
return "health-100-dead" //what's our health? it doesn't matter, we're dead, or faking
var/maxi_health = M.maxHealth
@@ -187,6 +187,10 @@
if(ismachineperson(src))
holder = hud_list[DIAG_STAT_HUD]
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
holder.icon_state = "hudflatline"
return
// To the right of health bar
if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH))
var/revivable_state = "dead"
+5
View File
@@ -815,3 +815,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Wreak havoc upon the station as much you can. Send those wandless Nanotrasen scum a message!"
needs_target = FALSE
completed = TRUE
/datum/objective/zombie
explanation_text = "Hunger grows within us, we need to feast on the brains of the uninfected. Scratch, bite, and spread the plague."
needs_target = FALSE
completed = TRUE
+1 -1
View File
@@ -305,7 +305,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.unEquip(src, silent = TRUE))
if(HAS_TRAIT(user, TRAIT_I_WANT_BRAINS) || !user.unEquip(src, silent = TRUE))
return 0
if(flags & ABSTRACT)
@@ -156,7 +156,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_selected)
for(var/obj/item/organ/external/E in H.bodyparts)
if(E.open == ORGAN_ORGANIC_OPEN)
if(E.open >= ORGAN_ORGANIC_OPEN)
to_chat(user, "<span class='warning'>[E] is cut open, you'll need more than a bandage!</span>")
return
affecting.germ_level = 0
+156
View File
@@ -423,6 +423,162 @@
</html>
"})
/obj/item/book/manual/zombie_manual
name = "Plague and You: Curing the Apocalypse"
desc = "A guide covering the basics of curing zombies."
icon_state = "bookCloning"
author = "Cleanses-The-Plague"
title = "Plague and You: Curing the Apocalypse"
pages = list({"<html><meta charset='utf-8'>
<head>
<style>
</style>
</head>
<body>
For years, we've seen "zombies" on the news and in movies, but have you ever thought how would would be cured?
Each strain of the "Advanced Resurection Virus" or simply "Necrotizing Plague" has its own unique bio-signature.
Therefore, each strain has a unique step of anti-virals, that each have progressively stronger effects on the plague.
<ol>
<li><a href='#1'>Preparation</a></li>
<li><a href='#2'>Containing a test subject</a></li>
<li><a href='#3'>Creating Cures</a></li>
<li><a href='#4'>Cure Effects</a></li>
<li><a href='#5'>Known Recipes</a></li>
</ol>
<a name='1' /><h4>Step 1: Preparation</h4>
First step is knowledge. The necrotizing plague can only be spread through direct fluid contact with an infected individual. \
Therefore, you should do your best to stay away from the claws and or teeth of zombies. Their claws are covered in a slimy fluid \
that has a chance of transmitting the disease. Their bites are much more dangerous however, guaranteeing an infection of the plague. \
Biohazard suits, riot gear, or other thick material are well suited for blocking these infectious attacks, but do not guaratee \
complete immunity. <br>
To begin, we will need to gather a blood sample from a zombifed individual. To do this, first make sure the \
zombie is dead and severely damaged. Damaged zombies will slowly heal, and re-awaken once they are healed. \
Then use a syringe to extract a blood sample, and return to your virology lab. <br>
<a name='2' /><h4>Step 2: Containing a test subject</h4>
With your new blood sample of the plague, place a monkey in a solitary pen, and infect it with the virus. This test subject \
will provide us with a steady source of plague blood to experiment with. Lower-sapience creatures are normally not advanced enough to \
actively seek out the flesh of living creatures, and are safe in captivity. Containing an active zombie is much harder and will require \
a cell of pure walls or doors. Otherwise, the zombie will be able to break out of it's cell using its claws.
<a name='3' /><h4>Step 3: Creating Cures</h4>
Now that a steady source of infected blood is available, we can begin making cures. There are 4 tiers of "cures" for the plague, \
these are referred to as "Anti-Plague Sequences". By combining chemicals with the plague and viral symptoms, more advanced sequences \
can be created. These sequences are M-RNA that alters protein synthesis of plague-infected individuals and alter B-lymphocytes to induce\
specific anti-bodies, countering the effects of the virus. \
There sequences are classified into 4 categories: Alpha, Beta, Gamma, and Omega. Alpha is the simplest, but weakest. \
Omega is the most difficult to make as it requires all previous sequences and advanced chemicals. <br>
Since each of zombie strains are unique, there is no known recipe for these, and will require experimentation. \
However, several researchers have compiled chemicals that are commonly found in these cures in the "Known Recipes" section below.
<a name='4' /><h4>Step 5: Cure Effects</h4>
Anti-Plague Sequence Alpha is the simplest anti-viral, but it still is the first step against the plague. \
This cure prevents infection from scratches while in system of the user, and can cure stage 1 infections. <br>
Anti-Plague Sequence Beta is the second anti-viral, and is more complex to make. This sequence has been shown to cure \
infections that are stage 3 or below. This sequence is sometimes able to cure bites from infected individuals. <br>
Anti-Plague Sequence Gamma is the third anti-viral. This sequence is difficult to manufacture, but is rewarding. \
It cures all infections that are stage 5 and below, and stops the effects of stage 6 infections, but will not cure \
stage 6 infections. This helps prevent the rotting of living people into the rotting and shambling corpses of zombies. <br>
Anti-Plague Sequence Omega is the full cure for the zombie plague. This advanced mix of viral symptoms and chemicals is \
the final cure for any Advanced Resurection Virus. This cure prevents zombies from reviving when in their system, and will \
slowly return their body to normal, non-infected state. <br>
<a name='5' /><h4>Step 6: Known Recipes</h4>
<b>Anti-Plague Sequence Alpha</b>
<ul>
<li>1 unit of blood containing any zombie plague</li>
<li>1 unit of Diphenhydramine</a></li>
</ul>
<b>Anti-Plague Sequence Beta</b>
<ul>
<li>1 unit of blood containing zombie plague cured by Anti-Plague Sequence Alpha</li>
<li>2 random chemicals from the list below, 1 unit of each (Unknown Random Recipe)
<ul>
<li>Yellow Vomit</li>
<li>Space fungus</li>
<li>Jenkem</li>
<li>Charcoal</li>
<li>Egg</li>
<li>Saline-Glucose Solution</li>
<li>Toxin</li>
<li>Atropine</li>
<li>Lye</li>
<li>Sulphuric acid</li>
<li>Fluorosulfuric Acid</li>
<li>Soda Water</li>
<li>Surge</li>
<li>Ultra-Lube</li>
<li>Happiness</li>
<li>Morphine</li>
</ul>
</li>
</ul>
<b>Anti-Plague Sequence Gamma</b>
<ul>
<li>1 unit of blood containing zombie plague cured by Anti-Plague Sequence Beta</li>
<li>1 unit of blood containing an advanced virus with the <b>"Necrotizing Fasciitis"</b> symptom</li>
<li>3 random chemicals from the list below, 1 unit of each (Unknown Random Recipe)
<ul>
<li>Colorful Reagent</li>
<li>Bacchus' Blessing</li>
<li>Pentetic Acid</li>
<li>Teporone</li>
<li>Glyphosate</li>
<li>Lazarus Reagent</li>
<li>Omnizine</li>
<li>Sarin</li>
<li>Mitocholide</li>
<li>Fliptonium</li>
<li>Ants</li>
<li>Chlorine Trifluoride</li>
<li>Sorium</li>
<li>"????" Reagent</li>
<li>A ranesp</li>
</ul>
</li>
</ul>
<b>Anti-Plague Sequence Omega</b>
<ul>
<li>1 unit of blood containing zombie plague cured by Anti-Plague Sequence Gamma</li>
<li>1 unit of blood containing an advanced virus with the <b>"Anti-Bodies Metabolism"</b> symptom</li>
<li>2 of the chemicals from the list below, 1 unit of each (Unknown Random Recipe)
<ul>
<li>Entropic Polypnium</li>
<li>Tinea Luxor</li>
<li>earthsblood</li>
<li>Bath Salts</li>
<li>Rezadone</li>
<li>Rotatium</li>
<li>Krokodil</li>
<li>Fliptonium</li>
</ul>
</li>
</ul>
<b>Anti-Plague Sequence Duplication</b>
<ul>
<li>1 unit of any Anti-Plague Sequence</li>
<li>1 unit of Sulfonal</li>
<li>1 unit of Sugar</li>
</ul>
<p>Congratulations! You are now qualitifed in creating Anti-Plague Sequences for combatting Class-C resurrecting un-dead beings. \
Please direct any further questions you have to your Chief Medical Officer.</p>
</body>
</html>"})
/obj/item/book/manual/ripley_build_and_repair
name = "APLU \"Ripley\" Construction and Operation Manual"
desc = "A guide from a little-known corporation on how to operate a heavy lifter mech. It's filled with disclaimers and pre-signed waivers."
@@ -424,23 +424,19 @@
else
. += "ledb"
/obj/item/storage/lockbox/vials/AltClick(mob/user)
if(!Adjacent(user))
return
if(broken)
to_chat(user, "<span class='warning'>It appears to be broken.</span>")
return
if(allowed(user))
locked = !locked
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] [src].</span>")
update_icon()
else
to_chat(user, "<span class='warning'>Access denied.</span>")
/obj/item/storage/lockbox/vials/attackby(obj/item/I, mob/user, params)
..()
update_icon()
/obj/item/storage/lockbox/vials/zombie_cure
name = "secure vial storage box - 'Anti-Plague Sequences'"
/obj/item/storage/lockbox/vials/zombie_cure/populate_contents()
for(var/count in 1 to 4)
var/obj/item/reagent_containers/glass/bottle/cure = new /obj/item/reagent_containers/glass/bottle(src)
cure.reagents.add_reagent("zombiecure[count]", 50)
var/datum/reagent/temp = GLOB.chemical_reagents_list["zombiecure[count]"]
cure.name = "[lowertext(temp.name)] bottle"
///Aquatic Starter Kit
@@ -22,16 +22,14 @@
if(check_access(W))
locked = !locked
if(locked)
icon_state = icon_locked
to_chat(user, "<span class='warning'>You lock \the [src]!</span>")
if(user.s_active)
user.s_active.close(user)
return
else
icon_state = icon_closed
to_chat(user, "<span class='warning'>You unlock \the [src]!</span>")
origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
return
update_icon()
return
else
to_chat(user, "<span class='warning'>Access denied.</span>")
return
@@ -50,13 +48,25 @@
if(broken)
to_chat(user, "<span class='warning'>It appears to be broken.</span>")
return
if(!locked && user.s_active != src)
return ..()
if(allowed(user))
locked = !locked
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] [src].</span>")
icon_state = "[locked ? icon_locked : icon_closed]"
update_icon()
if(user.s_active == src)
close(user)
else
to_chat(user, "<span class='warning'>Access denied.</span>")
/obj/item/storage/lockbox/update_icon_state()
if(broken)
icon_state = icon_broken
else if(locked)
icon_state = icon_locked
else
icon_state = icon_closed // good variable name bro
/obj/item/storage/lockbox/show_to(mob/user as mob)
if(locked)
to_chat(user, "<span class='warning'>It's locked!</span>")
@@ -76,9 +86,9 @@
broken = TRUE
locked = FALSE
desc = "It appears to be broken."
icon_state = icon_broken
to_chat(user, "<span class='notice'>You unlock \the [src].</span>")
origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
update_icon()
return
/obj/item/storage/lockbox/hear_talk(mob/living/M as mob, list/message_pieces)
+1 -1
View File
@@ -61,7 +61,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/datum/unarmed_attack/attack = H.dna.species.unarmed
var/datum/unarmed_attack/attack = H.get_unarmed_attack()
if(istype(attack, /datum/unarmed_attack/claws))
var/datum/unarmed_attack/claws/C = attack
if(!C.has_been_sharpened)
@@ -68,6 +68,14 @@
SEND_SIGNAL(U, COMSIG_LIVING_CLEAR_STUNS)
to_chat(user, "<span class='notice'>You instill your body with clean blood and remove any incapacitating effects.</span>")
var/datum/antagonist/vampire/V = U.mind.has_antag_datum(/datum/antagonist/vampire)
for(var/datum/disease/zombie/zombie_infection in U.viruses)
zombie_infection.stage = min(zombie_infection.stage, round(7 - (V.bloodtotal/100))) // 700 max usable blood can cleanse any zombie infection
if(zombie_infection.stage <= 0)
zombie_infection.cure()
to_chat(user, "<span class='notice'>You cleanse the plague from your system.</span>")
else
to_chat(user, "<span class='warning'>You weaken the plague in your system, but you don't have enough blood to completely remove it.</span>")
var/rejuv_bonus = V.get_rejuv_bonus()
if(rejuv_bonus)
INVOKE_ASYNC(src, PROC_REF(heal), U, rejuv_bonus)
@@ -0,0 +1,87 @@
RESTRICT_TYPE(/datum/antagonist/zombie)
/datum/antagonist/zombie
name = "Zombie"
antag_hud_name = "hudzombie"
antag_hud_type = ANTAG_HUD_ZOMBIE
special_role = SPECIAL_ROLE_ZOMBIE
clown_gain_text = "B-Braaaaaains... Honk..."
clown_removal_text = "You feel funnier again."
var/list/old_languages = list() // someone make this better to prevent langs changing if species changes while zombie somehow
var/static/list/zombie_traits = list(TRAIT_LANGUAGE_LOCKED, TRAIT_GOTTAGOSLOW, TRAIT_ABSTRACT_HANDS, TRAIT_SLOW_GRABBER)
var/datum/unarmed_attack/claws/claw_attack
// possibly upgrades for the zombies after eating brains? Better vision (/datum/action/changeling/augmented_eyesight), better weapons (armblade), better infection, more inhereint armor (physiology)
// ability to find nearby brains to eat (like cling/vamp ability to track people around them)
/datum/antagonist/zombie/on_gain()
. = ..()
owner.AddSpell(new /datum/spell/zombie_claws)
claw_attack = new /datum/unarmed_attack/claws()
/datum/antagonist/zombie/Destroy(force, ...)
QDEL_NULL(claw_attack)
return ..()
/datum/antagonist/zombie/detach_from_owner()
owner.RemoveSpell(/datum/spell/zombie_claws)
return ..()
/datum/antagonist/zombie/greet()
var/list/messages = list()
. = messages
if(owner && owner.current)
messages.Add("<span class='userdanger zombie'>We are a [special_role]!</span>")
messages.Add("<span class='zombie'>You can feel your heart stopping, but something isn't right... life has not abandoned your broken form. You can only feel a deep and immutable hunger that not even death can stop.</span>")
/datum/antagonist/zombie/finalize_antag()
var/list/messages = list()
. = messages
if(owner && owner.current)
messages.Add("<br><span class='notice'>You can use your claws to break down doors, and to crack open damaged skulls. Once their head is open, use an empty hand to eat their brains. Alternatively, grab someone aggressively and them harm them to bite and infect them. You heal slowly but you heal faster in the dark, after death you will slowly revive and reawaken.</span>")
/datum/antagonist/zombie/apply_innate_effects(mob/living/mob_override)
var/mob/living/L = ..()
old_languages = L.languages.Copy()
for(var/datum/language/lang as anything in L.languages)
L.remove_language(lang.name)
L.add_language("Zombie")
L.default_language = GLOB.all_languages["Zombie"]
L.extinguish_light() // zombies prefer darkness
for(var/trait in zombie_traits)
ADD_TRAIT(L, trait, ZOMBIE_TRAIT)
if(!L.HasDisease(/datum/disease/zombie))
var/datum/disease/zombie/zomb = new /datum/disease/zombie()
zomb.stage = 7
L.AddDisease(zomb)
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.physiology.stamina_mod *= 0.5
/datum/antagonist/zombie/remove_innate_effects(mob/living/mob_override)
var/mob/living/L = ..()
if(!ishuman(L))
STOP_PROCESSING(SSobj, src) // This is to handle when they transfer into a headslug (simple animal). We shouldn't process in that case.
for(var/trait in zombie_traits)
REMOVE_TRAIT(L, trait, ZOMBIE_TRAIT)
L.remove_language("Zombie")
for(var/datum/language/lang as anything in old_languages)
L.add_language(lang.name)
L.default_language = null
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.physiology.stamina_mod /= 0.5
/datum/antagonist/zombie/on_body_transfer(mob/living/old_body, mob/living/new_body)
if(!new_body.HasDisease(/datum/disease/zombie))
owner.remove_antag_datum(/datum/antagonist/zombie)
return
return ..()
/datum/antagonist/zombie/give_objectives()
add_antag_objective(/datum/objective/zombie)
@@ -0,0 +1,150 @@
/datum/spell/zombie_claws
name = "Zombie Claws"
desc = "Toggle your claws, allowing you to slash and infect other people."
action_icon_state = "vampire_claws"
action_background_icon_state = "bg_vampire"
human_req = TRUE
clothes_req = FALSE
base_cooldown = 0 SECONDS
var/list/our_claws = list()
var/infection_stage = 1 // mostly for adminbus and testing
/datum/spell/zombie_claws/Destroy()
QDEL_LIST_CONTENTS(our_claws)
return ..()
/datum/spell/zombie_claws/cast(mob/user)
if(dispel())
return
var/obj/item/zombie_claw/claws = new /obj/item/zombie_claw(user.loc, src)
claws.infection_stage = infection_stage
if(user.put_in_hands(claws))
our_claws += claws
else
qdel(claws)
to_chat(user, "<span class='warning zombie'>We have no claws...</span>")
/datum/spell/zombie_claws/proc/dispel()
var/mob/living/carbon/human/user = action.owner
var/obj/item/zombie_claw/claw = user.get_active_hand()
if(istype(claw, /obj/item/zombie_claw))
qdel(claw)
return TRUE
/datum/spell/zombie_claws/can_cast(mob/user, charge_check, show_message)
var/mob/living/L = user
if(!L.get_active_hand() || istype(L.get_active_hand(), /obj/item/zombie_claw))
return ..()
/datum/spell/zombie_claws/create_new_targeting()
return new /datum/spell_targeting/self
/obj/item/zombie_claw
name = "claws"
desc = "Claws extending from your rotting hands, perfect for ripping open brain_holders for brains."
icon = 'icons/effects/vampire_effects.dmi'
icon_state = "vamp_claws"
lefthand_file = 'icons/mob/inhands/weapons_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
flags = ABSTRACT | NODROP | DROPDEL
gender = PLURAL
force = 21 // allows them to break down doors aka NOT FUCKING AROUND
armour_penetration_percentage = -20
attack_effect_override = ATTACK_EFFECT_CLAW
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("slashed", "sliced", "torn", "ripped", "mauled", "cut", "savaged", "clawed")
sprite_sheets_inhand = list("Vox" = 'icons/mob/clothing/species/vox/held.dmi', "Drask" = 'icons/mob/clothing/species/drask/held.dmi')
var/datum/spell/zombie_claws/parent_spell
var/force_weak = 10
var/infection_stage = 1
/obj/item/zombie_claw/Initialize(mapload, new_parent_spell)
. = ..()
parent_spell = new_parent_spell
RegisterSignal(parent_spell.action.owner, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(dispel))
/obj/item/zombie_claw/proc/dispel(mob/user)
if(user && user.get_active_hand() == src)
qdel(src)
/obj/item/zombie_claw/Destroy()
UnregisterSignal(parent_spell.action.owner, COMSIG_MOB_WILLINGLY_DROP)
if(parent_spell)
parent_spell.our_claws -= src
parent_spell = null
return ..()
/obj/item/zombie_claw/customised_abstract_text(mob/living/carbon/owner)
return "<span class='warning'>[owner.p_they(TRUE)] [owner.p_have(FALSE)] dull claws extending from [owner.p_their(FALSE)] [owner.l_hand == src ? "left hand" : "right hand"].</span>"
/obj/item/zombie_claw/pre_attack(atom/A, mob/living/user, params)
. = ..()
if(user.reagents.has_reagent("zombiecure2"))
force = force_weak
else
force = initial(force)
/obj/item/zombie_claw/afterattack(atom/atom_target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity_flag)
return
if(!ishuman(atom_target) || ismachineperson(atom_target))
return
var/mob/living/carbon/human/target = atom_target
try_infect(target, user)
var/obj/item/organ/internal/brain/eat_brain = target.get_organ_slot("brain")
if(!eat_brain)
return
var/obj/item/organ/external/brain_holder = target.get_limb_by_name(eat_brain.parent_organ)
if(!brain_holder || brain_holder.open || brain_holder.limb_name != user.zone_selected)
return
// Max damage - 5
if(brain_holder.brute_dam + brain_holder.burn_dam <= brain_holder.max_damage - 5) // Deal more damage
return
if(target.getarmor(brain_holder, MELEE) > 0) // dont count negative armor
to_chat(user, "<span class='warning zombie'>[target]'s brains are blocked.</span>")
return // Armor blocks zombies trying to eat your brains!
to_chat(target, "<span class='userdanger'[user]'s claws dig into your [brain_holder.encased]!</span>")
user.visible_message("<span class='danger'>[user] digs their claws into [target]'s [brain_holder.name]!</span>", "<span class='danger zombie'>We dig into [target]'s [brain_holder.encased ? brain_holder.encased : brain_holder]...</span>")
playsound(user, 'sound/weapons/armblade.ogg', 50, TRUE)
if(!do_mob(user, target, 3 SECONDS))
return FALSE
playsound(user.loc, 'sound/misc/moist_impact.ogg', 50, TRUE)
brain_holder.fracture()
brain_holder.broken_description = "split open"
brain_holder.open = ORGAN_ORGANIC_VIOLENT_OPEN
to_chat(target, "<span class='userdanger'>Your [brain_holder.name] is violently cracked open!</span>")
user.visible_message("<span class='danger'>[user] violently splits apart [target]'s [brain_holder.name]!</span>", "<span class='danger zombie'>We crack apart [target]'s [brain_holder.name]!</span>")
return TRUE
/obj/item/zombie_claw/proc/try_infect(mob/living/carbon/human/target, mob/living/user)
if(!ishuman(target))
return
if(!(user.zone_selected in list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)))
to_chat(user, "<span class='warning zombie'>Our infection cannot spread without their head or chest.</span>")
return
if(HAS_TRAIT(target, TRAIT_PIERCEIMMUNE))
return FALSE
if(target.reagents.has_reagent("zombiecure1") || target.reagents.has_reagent("spaceacillin"))
return
if(prob(3 * target.getarmor(user.zone_selected, MELEE)) || prob(50)) // more than 33.34 melee armor will always protect you! Or just get lucky B)
return // Armor blocks zombies trying to eat your brains!
// already have the disease, or have contracted it. Good for feedback when being attacked while wearing a biosuit
if(target.HasDisease(/datum/disease/zombie) || target.ContractDisease(new /datum/disease/zombie))
playsound(user.loc, 'sound/misc/moist_impact.ogg', 50, TRUE)
target.bleed_rate = max(5, target.bleed_rate + 1) // it transfers via blood, you know. It had to get in somehow.
for(var/datum/disease/zombie/zomb in target.viruses)
zomb.stage = max(zomb.stage, infection_stage)
/obj/item/zombie_claw/attack_self(mob/user)
. = ..()
qdel(src)
+1 -1
View File
@@ -118,7 +118,7 @@
/datum/martial_art/proc/basic_hit(mob/living/carbon/human/A, mob/living/carbon/human/D)
var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
var/datum/unarmed_attack/attack = A.dna.species.unarmed
var/datum/unarmed_attack/attack = A.get_unarmed_attack()
var/atk_verb = "[pick(attack.attack_verb)]"
if(IS_HORIZONTAL(D))
+2
View File
@@ -94,6 +94,8 @@
/mob/proc/put_in_hand_check(obj/item/W, skip_blocked_hands_check)
if(!istype(W) || QDELETED(W))
return FALSE
if(HAS_TRAIT(src, TRAIT_ABSTRACT_HANDS) && !(W.flags & ABSTRACT))
return FALSE
return TRUE
/mob/living/put_in_hand_check(obj/item/W, skip_blocked_hands_check)
+35 -3
View File
@@ -667,25 +667,32 @@
syllables = list ("beep", "boop")
// Language handling.
/mob/proc/add_language(language)
/mob/proc/add_language(language, force)
var/datum/language/new_language = GLOB.all_languages[language]
if(!istype(new_language) || (new_language in languages))
return FALSE
if(HAS_TRAIT(src, TRAIT_LANGUAGE_LOCKED) && !force)
return FALSE
languages |= new_language
return TRUE
/mob/proc/remove_language(rem_language)
/mob/proc/remove_language(rem_language, force)
if(HAS_TRAIT(src, TRAIT_LANGUAGE_LOCKED) && !force)
return FALSE
var/datum/language/L = GLOB.all_languages[rem_language]
. = (L in languages)
languages.Remove(L)
/mob/living/remove_language(rem_language)
. = ..()
if(!.)
return
var/datum/language/L = GLOB.all_languages[rem_language]
if(default_language == L)
default_language = null
return ..()
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak_language(datum/language/speaking)
@@ -768,4 +775,29 @@
continue
languages |= new_language
/datum/language/zombie
name = "Zombie"
desc = "Flesh... Brains... We hunger..."
speech_verb = "groans"
ask_verb = "groans"
exclaim_verbs = list("yells")
colour = "zombie"
key = "zz" //doesn't matter, this is their default and only language
flags = RESTRICTED | NOLIBRARIAN
syllables = list("Brains", "Brainssss", "Flesh", "Grrr", "Hnng", "Braaaains", "Braaiiiins")
english_names = TRUE
/datum/language/zombie/scramble(input)
var/terminator = "..."
if(!length(input))
return "[pick(syllables)][terminator]"
var/last_letter = copytext(input, length(input))
if(last_letter in list("?", "!"))
terminator = last_letter
if(prob(90) || !length(input))
return "[pick(syllables)][terminator]"
return "[copytext_char(input, 1, min(7, length(input)))][terminator]"
#undef SCRAMBLE_CACHE_LEN
@@ -115,6 +115,7 @@
var/obj/item/organ/external/chest = owner.get_organ(BODY_ZONE_CHEST)
chest.fracture()
chest.droplimb()
chest.open = ORGAN_ORGANIC_VIOLENT_OPEN
else //If we are discovered mid-surgery
owner.adjustBruteLoss(40)
SSblackbox.record_feedback("tally", "alien_growth", 1, "hatched_eggs")
@@ -209,7 +209,7 @@
if(prob(D.infectivity))
D.spread()
if(stat != DEAD)
if(stat != DEAD || D.allow_dead)
D.stage_act()
//remember to remove the "proc" of the child procs of these.
@@ -115,6 +115,8 @@
skipeyes |= wear_mask.flags_inv & HIDEEYES
var/msg = "<span class='info'>This is "
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
msg = "<span class='info'>This is the <span class='warning'>shambling corpse</span> of "
msg += "<em>[name]</em>"
@@ -58,7 +58,7 @@
if(sponge)
return min(sponge.damage,maxHealth*2)
else
if(IS_CHANGELING(src))
if(IS_CHANGELING(src) || HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
// if a changeling has no brain, they have no brain damage.
return 0
@@ -641,7 +641,8 @@ emp_act
if(check_shields(user, 15, "the [hulk_verb]ing"))
return
..(user, TRUE)
playsound(loc, user.dna.species.unarmed.attack_sound, 25, 1, -1)
var/datum/unarmed_attack/unarmed = user.get_unarmed_attack()
playsound(loc, unarmed.attack_sound, 25, TRUE, -1)
var/message = "[user] has [hulk_verb]ed [src]!"
visible_message("<span class='danger'>[message]</span>", "<span class='userdanger'>[message]</span>")
adjustBruteLoss(15)
@@ -185,6 +185,8 @@
var/mob/living/carbon/human/human = user
if(human.mind?.miming || !istype(human))
return
if(HAS_TRAIT(human, TRAIT_I_WANT_BRAINS))
return 'sound/voice/zombie_scream.ogg'
if(human.gender == FEMALE)
return human.dna.species.female_scream_sound
else
@@ -234,7 +236,7 @@
volume_decrease = 95
sound_volume -= volume_decrease
// special handling here: we don't want monkeys' gasps to sound through walls so you can actually walk past xenobio
playsound(user.loc, sound_path, sound_volume, TRUE, -10, frequency = H.get_age_pitch(H.dna.species.max_age), ignore_walls = !isnull(user.mind))
playsound(user.loc, sound_path, sound_volume, TRUE, -10, frequency = H.get_age_pitch(H.dna.species.max_age) * alter_emote_pitch(user), ignore_walls = !isnull(user.mind))
/datum/emote/living/carbon/human/shake
key = "shake"
@@ -137,7 +137,7 @@
if(E.is_robotic())
msg += "<b>The maintenance hatch on [p_their()] [ignore_limb_branding(E.limb_name)] is open!</b>\n"
else
msg += "<b>[p_their(TRUE)] [ignore_limb_branding(E.limb_name)] has an open incision!</b>\n"
msg += "<b>[p_their(TRUE)] [ignore_limb_branding(E.limb_name)] [E.open != ORGAN_ORGANIC_VIOLENT_OPEN ? "has an open incision" : "has been violently split open"]!</b>\n"
for(var/obj/item/I in E.embedded_objects)
// we cant just use \a here, as we want it to appear before the bicon
@@ -1270,6 +1270,9 @@
if(default_language)
return default_language
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS)) // you're not allowed to speak common
return GLOB.all_languages["Zombie"]
if(!dna.species)
return null
return dna.species.default_language ? GLOB.all_languages[dna.species.default_language] : null
@@ -2036,3 +2039,10 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
message += "\tI could make [result.gender == PLURAL ? "some" : "a"] [bicon(result)] <b>[result.name]</b> by using \a [possible_recipes[recipe]] with [english_list(ingredient_list)][length(required_reagents) ? ", along with [english_list(required_reagents)]" : ""]."
qdel(recipe)
to_chat(src, chat_box_examine(message.Join("<br>")))
/mob/living/carbon/human/proc/get_unarmed_attack()
var/datum/antagonist/zombie/zombie = mind?.has_antag_datum(/datum/antagonist/zombie)
if(!istype(zombie))
return dna.species.unarmed
return zombie.claw_attack
@@ -48,6 +48,8 @@
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = bodyparts_by_name[limb_tag]
if(!E || (E.status & ORGAN_DEAD) || E.is_malfunctioning() || !E.properly_attached)
if(E?.status & ORGAN_DEAD && HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
continue
if(E && !E.properly_attached && life_tick % 24 == 0)
to_chat(src, "<span class='danger'>Your [E] is hanging on by a thread! You need someone to surgically attach it for you!</span>")
// let it fail even if just foot&leg. Also malfunctioning happens sporadically so it should impact more when it procs.
@@ -338,6 +338,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
if(head_accessory_style.do_colouration)
head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD)
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
head_accessory_s.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
head_accessory_s.SetIntensity(0.7)
head_accessory_standing = head_accessory_s //head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY)
//Having it this way preserves animations. Useful for animated antennae.
@@ -368,11 +371,17 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
var/datum/sprite_accessory/hair/hair = GLOB.hair_styles_full_list[O.h_style]
if(hair?.species_allowed && ((O.dna.species.name in hair.species_allowed) || (O.dna.species.bodyflags & ALL_RPARTS)))
// Base hair
var/mutable_appearance/img_hair = mutable_appearance(hair.icon, "[hair.icon_state]_s")
if(istype(O.dna.species, /datum/species/slime))
img_hair.color = COLOR_MATRIX_OVERLAY("[skin_colour]A0")
else if(hair.do_colouration)
img_hair.color = COLOR_MATRIX_ADD(O.hair_colour)
var/icon/hair_icon = new /icon(hair.icon, "[hair.icon_state]_s")
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
hair_icon.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
hair_icon.SetIntensity(0.7)
var/mutable_appearance/img_hair = mutable_appearance(hair_icon)
// Zombie skrells and slimes do not have colored hair
if(!(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS) && (istype(O.dna.species, /datum/species/slime) || istype(O.dna.species, /datum/species/skrell))))
if(istype(O.dna.species, /datum/species/slime))
img_hair.color = COLOR_MATRIX_OVERLAY("[skin_colour]A0")
else if(hair.do_colouration)
img_hair.color = COLOR_MATRIX_ADD(O.hair_colour)
MA.overlays += img_hair
// Gradient
@@ -1204,13 +1213,21 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
if(!body_accessory.try_restrictions(src))
return
var/mutable_appearance/wings = mutable_appearance(body_accessory.icon, body_accessory.icon_state, layer = -WING_LAYER)
var/icon/wings_icon = new /icon(body_accessory.icon, body_accessory.icon_state)
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
wings_icon.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
wings_icon.SetIntensity(0.7)
var/mutable_appearance/wings = mutable_appearance(wings_icon, layer = -WING_LAYER)
wings.pixel_x = body_accessory.pixel_x_offset
wings.pixel_y = body_accessory.pixel_y_offset
overlays_standing[WING_LAYER] = wings
if(body_accessory.has_behind)
var/mutable_appearance/under_wing = mutable_appearance(body_accessory.icon, "[body_accessory.icon_state]_BEHIND", layer = -WING_UNDERLIMBS_LAYER)
var/icon/under_wing_icon = new /icon(body_accessory.icon, "[body_accessory.icon_state]_BEHIND")
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
under_wing_icon.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
under_wing_icon.SetIntensity(0.7)
var/mutable_appearance/under_wing = mutable_appearance(under_wing_icon, layer = -WING_UNDERLIMBS_LAYER)
under_wing.pixel_x = body_accessory.pixel_x_offset
under_wing.pixel_y = body_accessory.pixel_y_offset
overlays_standing[WING_UNDERLIMBS_LAYER] = under_wing
@@ -1236,10 +1253,14 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
if(dna.species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
accessory_s.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
accessory_s.SetIntensity(0.7)
else
if(dna.species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
@@ -1270,10 +1291,14 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
else if(tail && dna.species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s")
if(dna.species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(skin_colour, ICON_ADD)
if(tail_marking_icon && !tail_marking_style.tails_allowed)
tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS))
tail_s.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
tail_s.SetIntensity(0.7)
else
if(dna.species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(skin_colour, ICON_ADD)
if(tail_marking_icon && !tail_marking_style.tails_allowed)
tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
@@ -319,6 +319,10 @@
if(ignoreslow)
return // Only malusses after here
if(!IS_HORIZONTAL(H) || (HAS_TRAIT(H, TRAIT_NOKNOCKDOWNSLOWDOWN) && !H.resting))
if(HAS_TRAIT(H, TRAIT_GOTTAGOSLOW))
. += 1
if(H.dna.species.spec_movement_delay()) //Species overrides for slowdown due to feet/legs
. += 2 * H.stance_damage //damaged/missing feet or legs is slow
@@ -512,23 +516,8 @@
if(HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "<span class='warning'>You don't want to harm [target]!</span>")
return FALSE
//Vampire code
var/datum/antagonist/vampire/V = user?.mind?.has_antag_datum(/datum/antagonist/vampire)
if(V && !V.draining && user.zone_selected == "head" && target != user)
if((NO_BLOOD in target.dna.species.species_traits) || !target.blood_volume)
to_chat(user, "<span class='warning'>They have no blood!</span>")
return
if(target.mind && (target.mind.has_antag_datum(/datum/antagonist/vampire) || target.mind.has_antag_datum(/datum/antagonist/mindslave/thrall)))
to_chat(user, "<span class='warning'>Your fangs fail to pierce [target.name]'s cold flesh</span>")
return
if(HAS_TRAIT(target, TRAIT_SKELETONIZED))
to_chat(user, "<span class='warning'>There is no blood in a skeleton!</span>")
return
//we're good to suck the blood, blaah
V.handle_bloodsucking(target)
add_attack_logs(user, target, "vampirebit")
return
//end vampire codes
if(target != user && handle_harm_antag(user, target))
return FALSE
if(target.check_block())
target.visible_message("<span class='warning'>[target] blocks [user]'s attack!</span>")
return FALSE
@@ -536,45 +525,45 @@
return FALSE
if(attacker_style && attacker_style.harm_act(user, target) == MARTIAL_ARTS_ACT_SUCCESS)
return TRUE
else
var/datum/unarmed_attack/attack = user.dna.species.unarmed
user.do_attack_animation(target, attack.animation_type)
if(attack.harmless)
playsound(target.loc, attack.attack_sound, 25, 1, -1)
target.visible_message("<span class='danger'>[user] [pick(attack.attack_verb)]ed [target]!</span>")
return FALSE
add_attack_logs(user, target, "Melee attacked with fists", target.ckey ? null : ATKLOG_ALL)
if(!iscarbon(user))
target.LAssailant = null
else
target.LAssailant = user
target.lastattacker = user.real_name
target.lastattackerckey = user.ckey
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
damage += attack.damage
damage += user.physiology.melee_bonus
if(!damage)
playsound(target.loc, attack.miss_sound, 25, 1, -1)
target.visible_message("<span class='danger'>[user] tried to [pick(attack.attack_verb)] [target]!</span>")
return FALSE
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_selected))
var/armor_block = target.run_armor_check(affecting, MELEE)
playsound(target.loc, attack.attack_sound, 25, 1, -1)
var/datum/unarmed_attack/attack = user.get_unarmed_attack()
user.do_attack_animation(target, attack.animation_type)
if(attack.harmless)
playsound(target.loc, attack.attack_sound, 25, TRUE, -1)
target.visible_message("<span class='danger'>[user] [pick(attack.attack_verb)]ed [target]!</span>")
target.apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp)
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
target.visible_message("<span class='danger'>[user] has knocked down [target]!</span>", \
"<span class='userdanger'>[user] has knocked down [target]!</span>")
target.KnockDown(4 SECONDS)
SEND_SIGNAL(target, COMSIG_PARENT_ATTACKBY)
return FALSE
add_attack_logs(user, target, "Melee attacked with fists", target.ckey ? null : ATKLOG_ALL)
if(!iscarbon(user))
target.LAssailant = null
else
target.LAssailant = user
target.lastattacker = user.real_name
target.lastattackerckey = user.ckey
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
damage += attack.damage
damage += user.physiology.melee_bonus
if(!damage)
playsound(target.loc, attack.miss_sound, 25, TRUE, -1)
target.visible_message("<span class='danger'>[user] tried to [pick(attack.attack_verb)] [target]!</span>")
return FALSE
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_selected))
var/armor_block = target.run_armor_check(affecting, MELEE)
playsound(target.loc, attack.attack_sound, 25, TRUE, -1)
target.visible_message("<span class='danger'>[user] [pick(attack.attack_verb)]ed [target]!</span>")
target.apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp)
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
target.visible_message("<span class='danger'>[user] has knocked down [target]!</span>", \
"<span class='userdanger'>[user] has knocked down [target]!</span>")
target.KnockDown(4 SECONDS)
SEND_SIGNAL(target, COMSIG_PARENT_ATTACKBY)
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user == target)
@@ -1077,3 +1066,105 @@ It'll return null if the organ doesn't correspond, so include null checks when u
else
var/obj/item/organ/external/head/HD = H.get_organ("head")
return HD?.hair_colour
/datum/species/proc/handle_harm_antag(mob/living/carbon/human/user, mob/living/carbon/human/target)
if(!istype(target))
return
if(HAS_TRAIT(user, TRAIT_I_WANT_BRAINS))
var/obj/item/grab/grabby = user.get_inactive_hand()
if(istype(grabby))
if(ismachineperson(target))
to_chat(user, "<span class='warning zombie'>We can't smell any brains in [target].</span>")
return FALSE
if(grabby.state < GRAB_AGGRESSIVE)
to_chat(user, "<span class='warning zombie'>We need a better grip on [target] to bite them!</span>")
return TRUE
if(HAS_TRAIT(target, TRAIT_PIERCEIMMUNE))
to_chat(user, "<span class='warning zombie'>Our bite fails to pierce [target]!</span>")
return FALSE
user.visible_message("<span class='danger'>[user] violently bites [target]!</span>")
playsound(user.loc, 'sound/weapons/bite.ogg', 20, TRUE)
playsound(user.loc, 'sound/misc/moist_impact.ogg', 50, TRUE)
user.do_attack_animation(target, ATTACK_EFFECT_BITE)
target.apply_damage(20, BRUTE, user.zone_selected)
if(!target.HasDisease(/datum/disease/zombie))
var/datum/disease/zombie/zomb = new /datum/disease/zombie
if(target.CanContractDisease(zomb)) // biosuit aint going to protect you buddy
target.ForceContractDisease(zomb)
target.Dizzy(10 SECONDS)
target.Confused(10 SECONDS)
else
qdel(zomb)
for(var/datum/disease/zombie/zomb in target.viruses)
zomb.stage = max(rand(3, 4), zomb.stage)
qdel(grabby)
return TRUE
if(HAS_TRAIT(target, TRAIT_I_WANT_BRAINS))
to_chat(user, "<span class='warning zombie'>We can't smell any fresh brains in [target].</span>")
return
var/obj/item/organ/internal/brain/eat_brain = target.get_organ_slot("brain")
if(!eat_brain || ismachineperson(target))
to_chat(user, "<span class='warning zombie'>We can't smell any brains in [target].</span>")
return FALSE
var/obj/item/organ/external/brain_house = target.get_limb_by_name(eat_brain.parent_organ)
if(!brain_house)
to_chat(user, "<span class='warning zombie'>We can't smell any brains in [target].</span>")
return FALSE
if(brain_house.limb_name != user.zone_selected || !brain_house.open)
return FALSE
if(target.getarmor(brain_house, MELEE) > 0) // dont count negative armor
to_chat(user, "<span class='warning zombie'>[target]'s brains are blocked.</span>")
return FALSE // Armor blocks zombies trying to eat your brains!
if(target.getBrainLoss() >= 120)
to_chat(user, "<span class='warning zombie'>No more brains left...</span>")
return TRUE
eat_brain.custom_pain("OH GOD!!! THEY'RE EATING MY [uppertext(eat_brain.name)]!!") // gnarly
user.visible_message("<span class='danger'>[user] digs their claws into [target]'s [brain_house.name], eating their [eat_brain]!</span>", "<span class='danger zombie'>We feast on [target]'s brains.</span>")
if(!target.HasDisease(/datum/disease/zombie))
var/datum/disease/zombie/zomb = new /datum/disease/zombie
target.ContractDisease(zomb)
for(var/datum/disease/zombie/zomb in target.viruses)
zomb.stage = max(5, zomb.stage)
if(!do_mob(user, target, 1 SECONDS))
return
playsound(user.loc, 'sound/items/eatfood.ogg', 20, TRUE)
playsound(user.loc, 'sound/misc/moist_impact.ogg', 50, TRUE)
user.do_attack_animation(target, ATTACK_EFFECT_BITE)
target.adjustBrainLoss(5)
if(target.stat == CONSCIOUS && prob(33))
// Ouch, eaten alive.
target.emote("scream")
if(user.nutrition < NUTRITION_LEVEL_FULL - 10) // no fat zombies
user.set_nutrition(user.nutrition + 10)
user.heal_overall_damage(2, 2)
return TRUE
//Vampire code
var/datum/antagonist/vampire/V = user?.mind?.has_antag_datum(/datum/antagonist/vampire)
if(V && !V.draining && user.zone_selected == BODY_ZONE_HEAD)
if((NO_BLOOD in target.dna.species.species_traits) || !target.blood_volume)
to_chat(user, "<span class='warning'>They have no blood!</span>")
return TRUE
if(target.mind && (target.mind.has_antag_datum(/datum/antagonist/vampire) || target.mind.has_antag_datum(/datum/antagonist/mindslave/thrall)))
to_chat(user, "<span class='warning'>Your fangs fail to pierce [target.name]'s cold flesh!</span>")
return TRUE
if(HAS_TRAIT(target, TRAIT_SKELETONIZED))
to_chat(user, "<span class='warning'>There is no blood in a skeleton!</span>")
return TRUE
//we're good to suck the blood, blaah
V.handle_bloodsucking(target)
add_attack_logs(user, target, "vampirebit")
return TRUE
//end vampire codes
+1 -1
View File
@@ -119,7 +119,7 @@
if(!istype(H))
return ..()
// special handling here: we don't want monkeys' gasps to sound through walls so you can actually walk past xenobio
playsound(user.loc, sound_path, sound_volume, TRUE, -8, frequency = H.get_age_pitch(H.dna.species.max_age), ignore_walls = !isnull(user.mind))
playsound(user.loc, sound_path, sound_volume, TRUE, -8, frequency = H.get_age_pitch(H.dna.species.max_age) * alter_emote_pitch(user), ignore_walls = !isnull(user.mind))
/datum/emote/living/drool
key = "drool"
+3
View File
@@ -64,6 +64,9 @@
clean_grabbed_by(assailant, affecting)
adjust_position()
if(HAS_TRAIT(assailant, TRAIT_SLOW_GRABBER))
assailant.changeNext_move(1.5 * CLICK_CD_MELEE)
/obj/item/grab/Destroy()
if(affecting)
UnregisterSignal(affecting, COMSIG_MOVABLE_MOVED)
+44
View File
@@ -722,6 +722,50 @@
name = "paper - 'Delivery Note'"
info = "<i>Hey sweetie! The boss wants you to have some friends. I couldn't get you a real suit, but I found this in a cosplay shop! The bees surely won't see through your IMPECCABLE disguise!<br><br>xoxo,<br>george ♥</i><br><br>- What the fuck. I'm airlocking him tomorrow."
/obj/item/paper/zombie_cure
name = "paper - 'Research on Zombies'"
/obj/item/paper/zombie_cure/Initialize(mapload)
. = ..()
return INITIALIZE_HINT_LATELOAD // Make sure reagents appear before this paper
/obj/item/paper/zombie_cure/LateInitialize()
. = ..()
var/list/zombie_cure_reactions = list()
for(var/id in GLOB.chemical_reactions_list)
for(var/datum/chemical_reaction/zombie/reaction in GLOB.chemical_reactions_list[id])
zombie_cure_reactions["[reaction.cure_level]"] = reaction // we use string keys here so we can measure how many cures there are
if(length(zombie_cure_reactions) != 4)
stack_trace("GLOB.chemical_reactions_list only had [length(zombie_cure_reactions)] zombie cure reactions, when it should have had 4")
var/list/info_builder = list(
"I've done my best to cure them but... I'm out of time. I'd rather die than be bitten and turn into one of them. Below is a compilation of my research of the virus... Good luck.<br>"
)
for(var/counter in list("1", "2", "3", "4"))
var/datum/chemical_reaction/zombie/level = zombie_cure_reactions[counter]
if(!level)
continue
info_builder += "<b><font size='4'>[level.name]</font></b><br>"
if(counter == "4")
var/datum/reagent/reagent_type
for(var/reagent in level.required_reagents)
if(reagent == "blood")
continue
reagent_type = GLOB.chemical_reagents_list[reagent]
break
info_builder += "I wasn't able to finalize this final Omega sequence. But I know it must contain [reagent_type.name]."
break
info_builder += "<ul>"
for(var/reagent in level.required_reagents)
if(reagent == "blood")
continue
var/datum/reagent/reagent_type = GLOB.chemical_reagents_list[reagent]
info_builder += "<li>[reagent_type.name]"
info_builder += "</ul><br>"
info = info_builder.Join("")
/obj/item/paper/evilfax
name = "Centcomm Reply"
info = ""
@@ -137,6 +137,11 @@
icon_state = "peashooter_bullet"
damage = 25
/obj/item/projectile/bullet/midbullet3/overgrown/prehit(atom/target)
if(HAS_TRAIT(target, TRAIT_I_WANT_BRAINS))
damage += 10
return ..()
/obj/item/projectile/bullet/heavybullet
damage = 35
@@ -33,6 +33,8 @@
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume)
return
/datum/chemical_reaction/proc/last_can_react_check(datum/reagents/holder)
return TRUE
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_class = HOSTILE_SPAWN, mob_faction = "chemicalsummon", random = TRUE, gold_core_spawn = FALSE)
if(holder && holder.my_atom)
@@ -12,8 +12,7 @@
var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN
/datum/reagent/consumable/on_mob_life(mob/living/M)
var/is_vamp = M.mind?.has_antag_datum(/datum/antagonist/vampire)
if(ishuman(M) && !is_vamp)
if(ishuman(M) && !M.mind?.has_antag_datum(/datum/antagonist/vampire) && !HAS_TRAIT(M, TRAIT_I_WANT_BRAINS))
var/mob/living/carbon/human/H = M
if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
H.adjust_nutrition(nutriment_factor) // For hunger and fatness
@@ -32,8 +31,7 @@
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
var/is_vamp = M.mind?.has_antag_datum(/datum/antagonist/vampire)
if(ishuman(M) && !is_vamp)
if(ishuman(M) && !M.mind?.has_antag_datum(/datum/antagonist/vampire) && !HAS_TRAIT(M, TRAIT_I_WANT_BRAINS))
var/mob/living/carbon/human/H = M
if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
if(prob(50))
@@ -1570,6 +1570,8 @@
H.blood_volume += 10
for(var/datum/disease/critical/heart_failure/HF in H.viruses)
HF.cure() //Won't fix a stopped heart, but it will sure fix a critical one. Shock is not fixed as healing will fix it
for(var/datum/disease/zombie/zomb in H.viruses)
zomb.cure() // experimental B). Won't save you from the dead organs.
for(var/obj/item/organ/O as anything in (H.internal_organs + H.bodyparts))
O.germ_level = 0
if(M.health < 40)
@@ -1605,3 +1607,48 @@
update_flags |= M.adjustFireLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
// First level, prevents scratches from infecting you and stops the advance of low-level zombie infections.
/datum/reagent/zombie_cure
name = "Anti-Plague Sequence Alpha"
id = "zombiecure1"
description = "The first step towards a cure for zombies. Prevents simple infections from scratches."
reagent_state = LIQUID
metabolization_rate = 0.1
color = "#003602"
var/cure_level = 1
// Cures low-level infections. Weakens zombies when in their system.
/datum/reagent/zombie_cure/second
name = "Anti-Plague Sequence Beta"
id = "zombiecure2"
description = "Cures low-level infections. Weakens zombies when in their system."
color = "#006238"
cure_level = 2
// Prevents zombies from reviving, but not from healing. Removes all zombie viruses except for the rotting stage.
/datum/reagent/zombie_cure/third
name = "Anti-Plague Sequence Gamma"
id = "zombiecure3"
description = "Prevents zombies from reviving, but not from healing. Removes moderate infections."
color = "#029779"
cure_level = 3
// Final cure, completely cures being a zombie. Revives all rotten limbs.
/datum/reagent/zombie_cure/fourth
name = "Anti-Plague Sequence Omega"
id = "zombiecure4"
description = "Cures all cases of the Necrotizing Plague. Stops zombies from reviving."
color = "#001d4d"
cure_level = 4
/datum/reagent/zombie_cure/fourth/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
var/mob/living/carbon/human/H = M
if(istype(H) && prob(20))
for(var/obj/item/organ/limb as anything in H.bodyparts)
if(limb.status & ORGAN_DEAD && !limb.is_robotic())
limb.status &= ~ORGAN_DEAD
H.update_body()
break
return ..() | update_flags
@@ -496,6 +496,8 @@
min_temp = chem_temp
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp)
if(!C.last_can_react_check(src))
continue
var/multiplier = min(multipliers)
var/preserved_data = null
for(var/B in C.required_reagents)
@@ -492,3 +492,98 @@
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
if(D)
D.Devolve()
// Someday, maybe add some version of doing science on patient zero to discover the recipees.
/datum/chemical_reaction/zombie
name = "Anti-Plague Sequence Alpha"
id = "zombiecure1"
result = "zombiecure1"
result_amount = 1
required_reagents = list("blood" = 1, "diphenhydramine" = 1)
mix_message = "The mixture into a dark green paste."
/// The cure level of the reagent, level 4 cure requires level 3 cure, which requires level 2 cure, etc
var/cure_level = 1
/// The amount of reagents to pick from get_possible_cures()
var/amt_req_cures = 1
/// A virus symptom required to complete this chemical reaction
var/datum/symptom/required_symptom
/datum/chemical_reaction/zombie/New()
. = ..()
var/possible_cures = get_possible_cures()
if(!length(possible_cures))
return
required_reagents = list()
required_reagents["blood"] = 1
for(var/i in 1 to amt_req_cures)
if(!length(possible_cures))
return
var/next_cure = pick_n_take(possible_cures)
required_reagents[next_cure] = 1
/datum/chemical_reaction/zombie/last_can_react_check(datum/reagents/holder)
var/datum/reagent/blood/blood = locate(/datum/reagent/blood) in holder.reagent_list
if(!blood || !blood.data)
return FALSE
var/datum/disease/zombie/zomb = locate(/datum/disease/zombie) in blood.data["viruses"]
if(!zomb)
return FALSE
if(zomb.cure_stage + 1 > cure_level) // Virus has already been cured to this level
return FALSE
if(!required_symptom)
return TRUE
for(var/datum/disease/advance/advanced in blood.data["viruses"])
for(var/datum/symptom/symptom as anything in advanced.symptoms)
if(istype(symptom, required_symptom))
return TRUE
return FALSE
/datum/chemical_reaction/zombie/proc/get_possible_cures()
return list()
/datum/chemical_reaction/zombie/second
name = "Anti-Plague Sequence Beta"
id = "zombiecure2"
result = "zombiecure2"
cure_level = 2
amt_req_cures = 2
/datum/chemical_reaction/zombie/second/get_possible_cures()
return list("vomit", "fungus", "jenkem", "charcoal", "egg", "salglu_solution", "toxin", "atropine", "lye", "sacid", "facid", "sodawater", "surge", "ultralube", "happiness", "morphine")
/datum/chemical_reaction/zombie/third
name = "Anti-Plague Sequence Gamma"
id = "zombiecure3"
result = "zombiecure3"
cure_level = 3
amt_req_cures = 3
required_symptom = /datum/symptom/flesh_eating
/datum/chemical_reaction/zombie/third/get_possible_cures()
return list("colorful_reagent", "bacchus_blessing", "pen_acid", "teporone", "glyphosate", "lazarus_reagent", "omnizine", "sarin", "mitocholide", "ants", "clf3", "sorium", "????", "aranesp")
/datum/chemical_reaction/zombie/four
name = "Anti-Plague Sequence Omega"
id = "zombiecure4"
result = "zombiecure4"
cure_level = 4
amt_req_cures = 2
required_symptom = /datum/symptom/heal/metabolism
/datum/chemical_reaction/zombie/four/get_possible_cures()
return list("entpoly", "tinlux", "earthsblood", "bath_salts", "rezadone", "rotatium", "krokodil", "fliptonium")
/datum/chemical_reaction/dupe_zomb_cure
name = "Duplicate Zombie Cure"
id = "dupe_zomb_cure"
required_reagents = list("sulfonal" = 1, "sugar" = 1)
result_amount = 1
/datum/chemical_reaction/dupe_zomb_cure/last_can_react_check(datum/reagents/holder)
for(var/possible in list("zombiecure4", "zombiecure3", "zombiecure2", "zombiecure1"))
if(holder.has_reagent(possible))
result = possible // real time bullshit
return TRUE
return FALSE
+1 -1
View File
@@ -120,7 +120,7 @@
if(owner)
owner.adjustBrainLoss(amount)
/obj/item/organ/internal/brain/necrotize(update_sprite = TRUE) //Brain also has special handling for when it necrotizes
/obj/item/organ/internal/brain/necrotize(update_sprite = TRUE, ignore_vital_death = FALSE) //Brain also has special handling for when it necrotizes
damage = max_damage
status |= ORGAN_DEAD
STOP_PROCESSING(SSobj, src)
+1 -1
View File
@@ -89,7 +89,7 @@
blood_DNA = list()
blood_DNA[dna.unique_enzymes] = dna.blood_type
/obj/item/organ/proc/necrotize(update_sprite = TRUE)
/obj/item/organ/proc/necrotize(update_sprite = TRUE, ignore_vital_death = FALSE)
damage = max_damage
status |= ORGAN_DEAD
STOP_PROCESSING(SSobj, src)
+10 -4
View File
@@ -63,7 +63,7 @@
var/splinted_count = 0 //Time when this organ was last splinted
/obj/item/organ/external/necrotize(update_sprite=TRUE)
/obj/item/organ/external/necrotize(update_sprite=TRUE, ignore_vital_death = FALSE)
if(status & (ORGAN_ROBOT|ORGAN_DEAD))
return
status |= ORGAN_DEAD
@@ -72,7 +72,7 @@
if(owner)
to_chat(owner, "<span class='notice'>You can't feel your [name] anymore...</span>")
owner.update_body()
if(vital)
if(vital && !ignore_vital_death)
owner.death()
/obj/item/organ/external/Destroy()
@@ -384,13 +384,16 @@ This function completely restores a damaged organ to perfect condition.
surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else if(HAS_TRAIT(owner, TRAIT_I_WANT_BRAINS))
status = ORGAN_DEAD
else
status = 0
germ_level = 0
perma_injury = 0
brute_dam = 0
burn_dam = 0
open = ORGAN_CLOSED //Closing all wounds.
if(!HAS_TRAIT(owner, TRAIT_I_WANT_BRAINS)) // zombies's wounds don't close. Because thats cool.
open = ORGAN_CLOSED //Closing all wounds.
// handle internal organs
for(var/obj/item/organ/internal/current_organ in internal_organs)
@@ -666,9 +669,10 @@ Note that amputating the affected organ does in fact remove the infection from t
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
user.visible_message("<span class='warning'>[user] begins to cut open [src].</span>",\
"<span class='notice'>You begin to cut open [src]...</span>")
if(do_after(user, 54, target = src))
if(do_after(user, 5.4 SECONDS, target = src))
drop_organs(user)
drop_embedded_objects()
open = ORGAN_ORGANIC_VIOLENT_OPEN
else
return ..()
@@ -817,6 +821,8 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/is_usable()
if((is_robotic() && get_damage() >= max_damage) && !tough) //robot limbs just become inoperable at max damage
return
if(owner && HAS_TRAIT(owner, TRAIT_I_WANT_BRAINS))
return TRUE
return !(status & (ORGAN_MUTATED|ORGAN_DEAD))
/obj/item/organ/external/proc/is_malfunctioning()
+2 -2
View File
@@ -73,10 +73,10 @@
mob_icon = new /icon(icon_file, new_icon_state)
if(!skeletal && !is_robotic())
if(status & ORGAN_DEAD)
mob_icon.ColorTone(rgb(10,50,0))
mob_icon.ColorTone(COLORTONE_DEAD_EXT_ORGAN)
mob_icon.SetIntensity(0.7)
if(!isnull(s_tone))
else if(!isnull(s_tone)) // we use an else here because it fucks with shit. It would be nice to fix this someday so that colors affect dead limbs
if(s_tone >= 0)
mob_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
@@ -142,7 +142,7 @@
/obj/item/organ/internal/replaced(mob/living/carbon/human/target)
insert(target)
/obj/item/organ/internal/necrotize(update_sprite)
/obj/item/organ/internal/necrotize(update_sprite, ignore_vital_death = FALSE)
for(var/organ_tag in organ_datums) // let the organ datums handle first
var/datum/organ/dead_organ = organ_datums[organ_tag]
dead_organ.on_necrotize()
@@ -187,7 +187,7 @@
. = ..()
/obj/item/organ/external/hand/necrotize(update_sprite)
/obj/item/organ/external/hand/necrotize(update_sprite, ignore_vital_death = FALSE)
. = ..()
update_hand_missing()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

+1 -1
View File
@@ -185,7 +185,7 @@ window "paramapwindow"
is-default = true
saved-params = "icon-size;zoom-mode"
zoom-mode = "distort"
style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .clown { color: #FF69Bf;} .tajaran {color: #803B56;} .skrell {color: #00CED1;} .solcom {color: #22228B;} .com_srus {color: #7c4848;} .zombie\t{color: #ff0000;} .soghun {color: #228B22;} .vox {color: #AA00AA;} .diona {color: #804000; font-weight: bold;} .trinary {color: #727272;} .kidan {color: #664205;} .slime {color: #0077AA;} .drask {color: #a3d4eb;} .vulpkanin {color: #B97A57;} .abductor {color: #800080;} .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; }"
style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .clown { color: #FF69Bf;} .tajaran {color: #803B56;} .skrell {color: #00CED1;} .solcom {color: #22228B;} .com_srus {color: #7c4848;} .zombie\t{color: #7c4848;} .soghun {color: #228B22;} .vox {color: #AA00AA;} .diona {color: #804000; font-weight: bold;} .trinary {color: #727272;} .kidan {color: #664205;} .slime {color: #0077AA;} .drask {color: #a3d4eb;} .vulpkanin {color: #B97A57;} .abductor {color: #800080;} .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; }"
on-show = ".winset \"menu.statusbar.is-checked=true?paramapwindow.status_bar.is-visible=true:paramapwindow.status_bar.is-visible=false\""
elem "status_bar"
type = LABEL
+4
View File
@@ -434,6 +434,7 @@
#include "code\datums\components\swarming.dm"
#include "code\datums\components\tilted.dm"
#include "code\datums\components\two_handed.dm"
#include "code\datums\components\zombie_regen.dm"
#include "code\datums\discord\discord_manager.dm"
#include "code\datums\discord\discord_webhook.dm"
#include "code\datums\diseases\_disease.dm"
@@ -461,6 +462,7 @@
#include "code\datums\diseases\transformation.dm"
#include "code\datums\diseases\tuberculosis.dm"
#include "code\datums\diseases\wizarditis.dm"
#include "code\datums\diseases\zombie_virus.dm"
#include "code\datums\diseases\advance\advance.dm"
#include "code\datums\diseases\advance\disease_presets.dm"
#include "code\datums\diseases\advance\symptoms\beard.dm"
@@ -1493,6 +1495,8 @@
#include "code\modules\antagonists\wizard\datum_apprentice.dm"
#include "code\modules\antagonists\wizard\datum_wiz_construct.dm"
#include "code\modules\antagonists\wizard\datum_wizard.dm"
#include "code\modules\antagonists\zombie\datum_zombie.dm"
#include "code\modules\antagonists\zombie\zombie_spells.dm"
#include "code\modules\arcade\arcade_base.dm"
#include "code\modules\arcade\arcade_prize.dm"
#include "code\modules\arcade\claw_game.dm"
Binary file not shown.
@@ -655,10 +655,6 @@ h2.alert {
color: #7c4848;
}
.zombie {
color: #ff0000;
}
.soghun {
color: #228b22;
}
@@ -760,6 +756,16 @@ h2.alert {
font-size: 200%;
}
.zombie {
color: #7c4848;
}
.zombielarge {
color: #7c4848;
font-weight: bold;
font-size: 120%;
}
.interface {
color: #9031c4;
}
@@ -664,10 +664,6 @@ h2.alert {
color: #7c4848;
}
.zombie {
color: #ff0000;
}
.soghun {
color: #228b22;
}
@@ -769,6 +765,16 @@ h2.alert {
font-size: 200%;
}
.zombie {
color: #7c4848;
}
.zombielarge {
color: #7c4848;
font-weight: bold;
font-size: 120%;
}
.interface {
color: #330033;
}
File diff suppressed because one or more lines are too long