mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
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:
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(QDELETED(A))
|
||||
return
|
||||
|
||||
if(client.click_intercept)
|
||||
if(client?.click_intercept)
|
||||
client.click_intercept.InterceptClickOn(src, params, A)
|
||||
return
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)]")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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.
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user