mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 13:38:41 +01:00
[MANUAL MIRROR] Robotic organ and disease improvements (#22631)
* Robotic organ and disease improvements (#76766) ## About The Pull Request In the code description for the `ORGAN_ROBOTIC` flag, it says that robotic organs are not supposed to decay or regenerate health. I went and fixed this and added some more "robotic" behavior. New changes for robotic organs: - No longer heal damage passively - No longer gain health from revival - No longer heal in the smart organ fridge - No longer heal from pluoxium - Robotic ears no longer heal from ear healing items (earmuffs, etc.) - Robotic eyes are immune to changeling blind stings - Robotic eyes no longer heal from occuline New changes for diseases: - Some diseases now require an organ to work. A robotic organ will give immunity to the disease symptom unless the disease has "Inorganic Biology". - The transmission methods for diseases require organs to work but robotic organs are immune. (except inorganic biology) Airborne disease transmission require lungs. Ingested (drunk or eaten) disease transmission requires a stomach. Blood (inject or patch) disease transmission requires a heart. - Organs removed from a mob that is afflicted with a disease will be infectious while handling or transplanting it. (again, robotic organs are immune unless inorganic biology is present) Certain admin spawned or special diseases are exempt from this transmission method. - A stomach is required for nebula nausea, gastritium, carpellosis, metabolic boost, vomit, weight loss, death sandwich poisoning, - Lungs are required for choking, asphyxiation, cough, cold9, oxygen restoration, sneezing, flu, cold, spanish flu, tuberculosis - A liver is required for tissue hydration, plasma fixation, parasitic infection - Ears are required for deafness, sensory restoration - A heart is required for toxolysis, heart failure - Eyes are required for sensory restoration, hyphema - A tongue is required for voice change, parrot possession, pierrot throat - Wizarditis no longer requires a head (wtf?) to function ## Why It's Good For The Game Robotic organs should behave as intended. Not naturally healing (like organic organs) was supposed to be their downside to counteract their their ability to not decay upon death. ## Changelog 🆑 fix: Fix robotic organs to not gain health passively, from revival, smart organ fridge, pluxium, occuline, and earmuffs. add: Some diseases now require the appropriate internal organ to work. A robotic organ will give immunity to the disease symptom unless the disease has "Inorganic Biology". add: Disease transmission methods now require an internal organ to be successful. Robotic organs give immunity. (except inorganic biology) Airborne disease transmission require lungs. Ingested (drunk or eaten) disease transmission requires a stomach. Blood (inject or patch) disease transmission requires a heart. add: Organs removed from a mob that is afflicted with a disease will be infectious while handling or transplanting it. (again, robotic organs are immune unless inorganic biology is present) Certain admin spawned or special diseases are exempt from this transmission method. add: A stomach is required for nebula nausea, gastritium, carpellosis, metabolic boost, vomit, weight loss, death sandwich poisoning add: Lungs are required for choking, asphyxiation, cough, cold9, oxygen restoration, sneezing, flu, cold, spanish flu, tuberculosis add: A liver is required for tissue hydration, plasma fixation, parasitic infection add: Ears are required for deafness, sensory restoration add: A heart is required for toxolysis, heart failure add: Eyes are required for sensory restoration, hyphema add: A tongue is required for voice change, pierrot throat bal: Remove head requirement for wizarditis disease /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> * Modular parts * Printing time * Hah typos * I cant spell * Golden Shower feedback * Posi-Time * Update modular_skyrat/modules/synths/code/bodyparts/brain.dm --------- Co-authored-by: Tim <timothymtorres@gmail.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
This commit is contained in:
co-authored by
MrMelbert
Tim
GoldenAlpharex
parent
6debbb2ff9
commit
88bf87fa4e
@@ -7,5 +7,22 @@
|
||||
#define DEFAULT_SYNTH_PART_COLOR "#746c6a"
|
||||
#define DEFAULT_SYNTH_SCREEN_COLOR "#b99b3a"
|
||||
|
||||
#define SYNTH_ORGAN_LIGHT_EMP_DAMAGE 20
|
||||
#define SYNTH_ORGAN_HEAVY_EMP_DAMAGE 30
|
||||
// EMP specific Defines
|
||||
#define SYNTH_ORGAN_LIGHT_EMP_DAMAGE 10
|
||||
#define SYNTH_ORGAN_HEAVY_EMP_DAMAGE 20
|
||||
#define SYNTH_HEAVY_EMP_MULTIPLIER 2
|
||||
#define SYNTH_LIGHT_EMP_TEMPERATURE_POWER 30
|
||||
#define SYNTH_HEAVY_EMP_TEMPERATURE_POWER 100
|
||||
#define SYNTH_STOMACH_LIGHT_EMP_CHARGE_LOSS 50
|
||||
#define SYNTH_STOMACH_HEAVY_EMP_CHARGE_LOSS 150
|
||||
#define SYNTH_BRAIN_WAKE_THRESHOLD 50
|
||||
|
||||
// EMP Damage thresholds from EMP - some organs being insta-killed doesnt really add much to the game
|
||||
#define SYNTH_EMP_HEART_DAMAGE_MAXIMUM 100
|
||||
#define SYNTH_EMP_BRAIN_DAMAGE_MAXIMUM 75
|
||||
|
||||
// Universal stat defines
|
||||
#define SYNTH_BAD_EFFECT_DURATION 30 SECONDS
|
||||
#define SYNTH_HEART_DAMAGE_MESSAGE_INTERVAL 20 SECONDS
|
||||
#define SYNTH_BRAIN_DAMAGE_MESSAGE_INTERVAL 20 SECONDS
|
||||
#define SYNTH_DEAF_STACKS 30
|
||||
|
||||
@@ -43,9 +43,19 @@
|
||||
RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat))
|
||||
if(istype(parent, /obj/item/reagent_containers/cup))
|
||||
RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink))
|
||||
if(isorgan(parent))
|
||||
RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion))
|
||||
else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs))
|
||||
RegisterSignal(parent, COMSIG_GIBS_STREAK, PROC_REF(try_infect_streak))
|
||||
|
||||
/datum/component/infective/proc/on_organ_insertion(obj/item/organ/target, mob/living/carbon/receiver)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/datum/disease/disease in diseases)
|
||||
receiver.ForceContractDisease(disease)
|
||||
|
||||
qdel(src) // once organ is implanted delete the infective component
|
||||
|
||||
/datum/component/infective/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
@@ -55,19 +65,27 @@
|
||||
if(is_weak && !prob(weak_infection_chance))
|
||||
return
|
||||
|
||||
for(var/V in diseases)
|
||||
eater.ForceContractDisease(V)
|
||||
for(var/datum/disease/disease in diseases)
|
||||
if(!disease.has_required_infectious_organ(eater, ORGAN_SLOT_STOMACH))
|
||||
continue
|
||||
|
||||
eater.ForceContractDisease(disease)
|
||||
|
||||
try_infect(feeder, BODY_ZONE_L_ARM)
|
||||
|
||||
/datum/component/infective/proc/try_infect_drink(datum/source, mob/living/drinker, mob/living/feeder)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/disease in diseases)
|
||||
drinker.ForceContractDisease(disease)
|
||||
var/appendage_zone = feeder.held_items.Find(source)
|
||||
appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM
|
||||
try_infect(feeder, appendage_zone)
|
||||
|
||||
for(var/datum/disease/disease in diseases)
|
||||
if(!disease.has_required_infectious_organ(drinker, ORGAN_SLOT_STOMACH))
|
||||
continue
|
||||
|
||||
drinker.ForceContractDisease(disease)
|
||||
|
||||
/datum/component/infective/proc/clean(datum/source, clean_types)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
|
||||
@@ -101,11 +101,15 @@
|
||||
if(((disease.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*disease.spreading_modifier) - 1))
|
||||
ForceContractDisease(disease)
|
||||
|
||||
/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread)
|
||||
/mob/living/carbon/AirborneContractDisease(datum/disease/disease, force_spread)
|
||||
if(internal)
|
||||
return
|
||||
if(HAS_TRAIT(src, TRAIT_NOBREATH))
|
||||
return
|
||||
|
||||
if(!disease.has_required_infectious_organ(src, ORGAN_SLOT_LUNGS))
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -122,14 +126,14 @@
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
|
||||
/mob/living/carbon/human/CanContractDisease(datum/disease/disease)
|
||||
if(dna)
|
||||
if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity)
|
||||
if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !disease.bypasses_immunity)
|
||||
return FALSE
|
||||
if(disease.required_organ)
|
||||
if(!disease.has_required_infectious_organ(src, disease.required_organ))
|
||||
return FALSE
|
||||
|
||||
for(var/thing in D.required_organs)
|
||||
if(!((locate(thing) in bodyparts) || (locate(thing) in organs)))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/mob/living/proc/CanSpreadAirborneDisease()
|
||||
|
||||
@@ -30,7 +30,8 @@
|
||||
var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
|
||||
var/spreading_modifier = 1
|
||||
var/severity = DISEASE_SEVERITY_NONTHREAT
|
||||
var/list/required_organs = list()
|
||||
/// If the disease requires an organ for the effects to function, robotic organs are immune to disease unless inorganic biology symptom is present
|
||||
var/required_organ
|
||||
var/needs_all_cures = TRUE
|
||||
var/list/strain_data = list() //dna_spread special bullshit
|
||||
var/infectable_biotypes = MOB_ORGANIC //if the disease can spread on organics, synthetics, or undead
|
||||
@@ -61,11 +62,14 @@
|
||||
var/turf/source_turf = get_turf(infectee)
|
||||
log_virus("[key_name(infectee)] was infected by virus: [src.admin_details()] at [loc_name(source_turf)]")
|
||||
|
||||
|
||||
///Proc to process the disease and decide on whether to advance, cure or make the sympthoms appear. Returns a boolean on whether to continue acting on the symptoms or not.
|
||||
/datum/disease/proc/stage_act(seconds_per_tick, times_fired)
|
||||
var/slowdown = HAS_TRAIT(affected_mob, TRAIT_VIRUS_RESISTANCE) ? 0.5 : 1 // spaceacillin slows stage speed by 50%
|
||||
|
||||
if(required_organ)
|
||||
if(!has_required_infectious_organ(affected_mob, required_organ))
|
||||
return FALSE
|
||||
|
||||
if(has_cure())
|
||||
if(disease_flags & CHRONIC && SPT_PROB(cure_chance, seconds_per_tick))
|
||||
update_stage(1)
|
||||
@@ -149,7 +153,7 @@
|
||||
//note that stage is not copied over - the copy starts over at stage 1
|
||||
var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text",
|
||||
"cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance",
|
||||
"bypasses_immunity", "spreading_modifier", "severity", "required_organs", "needs_all_cures", "strain_data",
|
||||
"required_organ", "bypasses_immunity", "spreading_modifier", "severity", "needs_all_cures", "strain_data",
|
||||
"infectable_biotypes", "process_dead")
|
||||
|
||||
var/datum/disease/D = copy_type ? new copy_type() : new type()
|
||||
@@ -193,6 +197,21 @@
|
||||
|
||||
return FALSE
|
||||
|
||||
/// Checks if the mob has the required organ and it's not robotic or affected by inorganic biology
|
||||
/datum/disease/proc/has_required_infectious_organ(mob/living/carbon/target, required_organ_slot)
|
||||
if(!iscarbon(target))
|
||||
return FALSE
|
||||
|
||||
var/obj/item/organ/target_organ = target.get_organ_slot(required_organ_slot)
|
||||
if(!istype(target_organ))
|
||||
return FALSE
|
||||
|
||||
// robotic organs are immune to disease unless 'inorganic biology' symptom is present
|
||||
if(IS_ROBOTIC_ORGAN(target_organ) && !(infectable_biotypes & MOB_ROBOTIC))
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
//Use this to compare severities
|
||||
/proc/get_disease_severity_value(severity)
|
||||
switch(severity)
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
agent = "Carp Ella"
|
||||
cures = list(/datum/reagent/carpet)
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
required_organs = list(/obj/item/organ/internal/stomach)
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
severity = DISEASE_SEVERITY_MEDIUM
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
max_stages = 5
|
||||
/// The chance of Carp Ella to spawn on cure
|
||||
var/ella_spawn_chance = 10
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
agent = "Atmobacter Polyri"
|
||||
cures = list(/datum/reagent/firefighting_foam)
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
required_organs = list(/obj/item/organ/internal/stomach)
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
severity = DISEASE_SEVERITY_HARMFUL
|
||||
max_stages = 5
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
/// The chance of burped out tritium to be hot during max stage
|
||||
var/tritium_burp_hot_chance = 10
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
agent = "Stars"
|
||||
cures = list(/datum/reagent/bluespace)
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
required_organs = list(/obj/item/organ/internal/stomach)
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
severity = DISEASE_SEVERITY_MEDIUM
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
max_stages = 5
|
||||
|
||||
/datum/disease/advance/nebula_nausea/New()
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
base_message_chance = 15
|
||||
symptom_delay_min = 10
|
||||
symptom_delay_max = 30
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
threshold_descs = list(
|
||||
"Stage Speed 8" = "Causes choking more frequently.",
|
||||
"Stealth 4" = "The symptom remains hidden until active."
|
||||
@@ -35,26 +36,28 @@
|
||||
if(A.totalStealth() >= 4)
|
||||
suppress_warning = TRUE
|
||||
|
||||
/datum/symptom/choking/Activate(datum/disease/advance/A)
|
||||
/datum/symptom/choking/Activate(datum/disease/advance/advanced_disease)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/living/M = A.affected_mob
|
||||
switch(A.stage)
|
||||
|
||||
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
|
||||
|
||||
switch(advanced_disease.stage)
|
||||
if(1, 2)
|
||||
if(prob(base_message_chance) && !suppress_warning)
|
||||
to_chat(M, span_warning("[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]"))
|
||||
to_chat(infected_mob, span_warning("[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]"))
|
||||
if(3, 4)
|
||||
if(!suppress_warning)
|
||||
to_chat(M, span_warning("[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]"))
|
||||
to_chat(infected_mob, span_warning("[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]"))
|
||||
else
|
||||
to_chat(M, span_warning("You feel very [pick("dizzy","woozy","faint")].")) //fake bloodloss messages
|
||||
Choke_stage_3_4(M, A)
|
||||
M.emote("gasp")
|
||||
to_chat(infected_mob, span_warning("You feel very [pick("dizzy","woozy","faint")].")) //fake bloodloss messages
|
||||
Choke_stage_3_4(infected_mob, advanced_disease)
|
||||
infected_mob.emote("gasp")
|
||||
else
|
||||
to_chat(M, span_userdanger("[pick("You're choking!", "You can't breathe!")]"))
|
||||
Choke(M, A)
|
||||
M.emote("gasp")
|
||||
to_chat(infected_mob, span_userdanger("[pick("You're choking!", "You can't breathe!")]"))
|
||||
Choke(infected_mob, advanced_disease)
|
||||
infected_mob.emote("gasp")
|
||||
|
||||
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
|
||||
M.adjustOxyLoss(rand(6,13))
|
||||
@@ -82,7 +85,6 @@ Bonus
|
||||
*/
|
||||
|
||||
/datum/symptom/asphyxiation
|
||||
|
||||
name = "Acute respiratory distress syndrome"
|
||||
desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation. May also lead to heart attacks."
|
||||
illness = "Iron Lungs"
|
||||
@@ -95,11 +97,12 @@ Bonus
|
||||
base_message_chance = 15
|
||||
symptom_delay_min = 14
|
||||
symptom_delay_max = 30
|
||||
var/paralysis = FALSE
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
threshold_descs = list(
|
||||
"Stage Speed 8" = "Additionally synthesizes pancuronium and sodium thiopental inside the host.",
|
||||
"Transmission 8" = "Doubles the damage caused by the symptom."
|
||||
)
|
||||
var/paralysis = FALSE
|
||||
|
||||
|
||||
/datum/symptom/asphyxiation/Start(datum/disease/advance/A)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
base_message_chance = 15
|
||||
symptom_delay_min = 2
|
||||
symptom_delay_max = 15
|
||||
var/spread_range = 1
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
threshold_descs = list(
|
||||
"Resistance 11" = "The host will drop small items when coughing.",
|
||||
"Resistance 15" = "Occasionally causes coughing fits that stun the host. The extra coughs do not spread the virus.",
|
||||
@@ -31,6 +31,7 @@
|
||||
COOLDOWN_DECLARE(cough_cooldown)
|
||||
///if FALSE, there is a percentage chance that the mob will emote coughing while cough_cooldown is on cooldown. If TRUE, won't emote again until after the off cooldown cough occurs.
|
||||
var/off_cooldown_coughed = FALSE
|
||||
var/spread_range = 1
|
||||
|
||||
/datum/symptom/cough/Start(datum/disease/advance/active_disease)
|
||||
. = ..()
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
base_message_chance = 100
|
||||
symptom_delay_min = 25
|
||||
symptom_delay_max = 80
|
||||
required_organ = ORGAN_SLOT_EARS
|
||||
threshold_descs = list(
|
||||
"Resistance 9" = "Causes permanent deafness, instead of intermittent.",
|
||||
"Stealth 4" = "The symptom remains hidden until active.",
|
||||
@@ -38,15 +39,15 @@
|
||||
REMOVE_TRAIT(advanced_disease.affected_mob, TRAIT_DEAF, DISEASE_TRAIT)
|
||||
return ..()
|
||||
|
||||
/datum/symptom/deafness/Activate(datum/disease/advance/A)
|
||||
/datum/symptom/deafness/Activate(datum/disease/advance/advanced_disease)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/living/carbon/infected_mob = A.affected_mob
|
||||
|
||||
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
|
||||
var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
|
||||
if(!ears)
|
||||
return //cutting off your ears to cure the deafness: the ultimate own
|
||||
switch(A.stage)
|
||||
|
||||
switch(advanced_disease.stage)
|
||||
if(3, 4)
|
||||
if(prob(base_message_chance) && !suppress_warning)
|
||||
to_chat(infected_mob, span_warning("[pick("You hear a ringing in your ear.", "Your ears pop.")]"))
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
*/
|
||||
|
||||
/datum/symptom/dizzy // Not the egg
|
||||
|
||||
name = "Dizziness"
|
||||
desc = "The virus causes inflammation of the vestibular system, leading to bouts of dizziness."
|
||||
illness = "Motion Sickness"
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
symptom_delay_max = 1
|
||||
var/passive_message = "" //random message to infected but not actively healing people
|
||||
|
||||
|
||||
/datum/symptom/heal/Activate(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(!.)
|
||||
@@ -181,17 +180,18 @@
|
||||
*/
|
||||
/datum/symptom/heal/chem
|
||||
name = "Toxolysis"
|
||||
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
|
||||
stealth = 0
|
||||
resistance = -2
|
||||
stage_speed = 2
|
||||
transmittable = -2
|
||||
level = 7
|
||||
var/food_conversion = FALSE
|
||||
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
|
||||
required_organ = ORGAN_SLOT_HEART
|
||||
threshold_descs = list(
|
||||
"Resistance 7" = "Increases chem removal speed.",
|
||||
"Stage Speed 6" = "Consumed chemicals nourish the host.",
|
||||
)
|
||||
var/food_conversion = FALSE
|
||||
|
||||
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
@@ -222,19 +222,20 @@
|
||||
*/
|
||||
/datum/symptom/heal/metabolism
|
||||
name = "Metabolic Boost"
|
||||
desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
|
||||
but also causing increased hunger."
|
||||
stealth = -1
|
||||
resistance = -2
|
||||
stage_speed = 2
|
||||
transmittable = 1
|
||||
level = 7
|
||||
var/triple_metabolism = FALSE
|
||||
var/reduced_hunger = FALSE
|
||||
desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
|
||||
but also causing increased hunger."
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
threshold_descs = list(
|
||||
"Stealth 3" = "Reduces hunger rate.",
|
||||
"Stage Speed 10" = "Chemical metabolization is tripled instead of doubled.",
|
||||
)
|
||||
var/triple_metabolism = FALSE
|
||||
var/reduced_hunger = FALSE
|
||||
|
||||
/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
@@ -245,17 +246,16 @@
|
||||
if(A.totalStealth() >= 3)
|
||||
reduced_hunger = TRUE
|
||||
|
||||
/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
|
||||
if(!istype(C))
|
||||
return
|
||||
/datum/symptom/heal/metabolism/Heal(mob/living/carbon/infected_mob, datum/disease/advance/A, actual_power)
|
||||
var/metabolic_boost = triple_metabolism ? 2 : 1
|
||||
C.reagents.metabolize(C, metabolic_boost * SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
|
||||
C.overeatduration = max(C.overeatduration - 4 SECONDS, 0)
|
||||
infected_mob.reagents.metabolize(infected_mob, metabolic_boost * SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
|
||||
infected_mob.overeatduration = max(infected_mob.overeatduration - 4 SECONDS, 0)
|
||||
var/lost_nutrition = 9 - (reduced_hunger * 5)
|
||||
C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed
|
||||
infected_mob.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed
|
||||
if(prob(2))
|
||||
to_chat(C, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal."))
|
||||
return 1
|
||||
to_chat(infected_mob, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal."))
|
||||
return TRUE
|
||||
|
||||
/*Nocturnal Regeneration
|
||||
* Increases stealth
|
||||
* Slightly reduces resistance
|
||||
@@ -312,6 +312,7 @@
|
||||
if(M.getBruteLoss() || M.getFireLoss())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/*Regen Coma
|
||||
* No effect on stealth
|
||||
* Increases resistance
|
||||
@@ -427,11 +428,12 @@
|
||||
transmittable = 1
|
||||
level = 6
|
||||
passive_message = span_notice("Your skin feels oddly dry...")
|
||||
var/absorption_coeff = 1
|
||||
required_organ = ORGAN_SLOT_LIVER
|
||||
threshold_descs = list(
|
||||
"Resistance 5" = "Water is consumed at a much slower rate.",
|
||||
"Stage Speed 7" = "Increases healing speed.",
|
||||
)
|
||||
var/absorption_coeff = 1
|
||||
|
||||
/datum/symptom/heal/water/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
@@ -442,17 +444,18 @@
|
||||
if(A.totalResistance() >= 5)
|
||||
absorption_coeff = 0.25
|
||||
|
||||
/datum/symptom/heal/water/CanHeal(datum/disease/advance/A)
|
||||
/datum/symptom/heal/water/CanHeal(datum/disease/advance/advanced_disease)
|
||||
. = 0
|
||||
var/mob/living/M = A.affected_mob
|
||||
if(M.fire_stacks < 0)
|
||||
M.adjust_fire_stacks(min(absorption_coeff, -M.fire_stacks))
|
||||
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
|
||||
|
||||
if(infected_mob.fire_stacks < 0)
|
||||
infected_mob.adjust_fire_stacks(min(absorption_coeff, -infected_mob.fire_stacks))
|
||||
. += power
|
||||
if(M.reagents.has_reagent(/datum/reagent/water/holywater, needs_metabolizing = FALSE))
|
||||
M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff)
|
||||
if(infected_mob.reagents.has_reagent(/datum/reagent/water/holywater, needs_metabolizing = FALSE))
|
||||
infected_mob.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff)
|
||||
. += power * 0.75
|
||||
else if(M.reagents.has_reagent(/datum/reagent/water, needs_metabolizing = FALSE))
|
||||
M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff)
|
||||
else if(infected_mob.reagents.has_reagent(/datum/reagent/water, needs_metabolizing = FALSE))
|
||||
infected_mob.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff)
|
||||
. += power * 0.5
|
||||
|
||||
/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
|
||||
@@ -472,9 +475,10 @@
|
||||
|
||||
return 1
|
||||
|
||||
/datum/symptom/heal/water/passive_message_condition(mob/living/M)
|
||||
if(M.getBruteLoss() || M.getFireLoss())
|
||||
/datum/symptom/heal/water/passive_message_condition(mob/living/carbon/infected_mob)
|
||||
if(infected_mob.getBruteLoss() || infected_mob.getFireLoss())
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
/// Determines the rate at which Plasma Fixation heals based on the amount of plasma in the air
|
||||
@@ -499,11 +503,12 @@
|
||||
transmittable = -2
|
||||
level = 8
|
||||
passive_message = span_notice("You feel an odd attraction to plasma.")
|
||||
var/temp_rate = 1
|
||||
required_organ = ORGAN_SLOT_LIVER
|
||||
threshold_descs = list(
|
||||
"Transmission 6" = "Increases temperature adjustment rate.",
|
||||
"Stage Speed 7" = "Increases healing speed.",
|
||||
)
|
||||
var/temp_rate = 1
|
||||
|
||||
/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
@@ -535,7 +540,7 @@
|
||||
|
||||
// Check internals breath, environmental plasma, and plasma in bloodstream to determine the heal power
|
||||
/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/advanced_disease)
|
||||
var/mob/living/diseased_mob = advanced_disease.affected_mob
|
||||
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
|
||||
var/datum/gas_mixture/environment
|
||||
var/list/gases
|
||||
|
||||
@@ -545,24 +550,23 @@
|
||||
/// the amount of mols in a breath is significantly lower than in the environment so we are just going to use the tank's
|
||||
/// distribution pressure as an abstraction rather than calculate it using the ideal gas equation.
|
||||
/// balanced around a tank set to 4kpa = about 0.2 healing power. maxes out at 0.75 healing power, or 15kpa.
|
||||
if(iscarbon(diseased_mob))
|
||||
var/mob/living/carbon/breather = diseased_mob
|
||||
var/obj/item/tank/internals/internals_tank = breather.internal
|
||||
if(internals_tank)
|
||||
var/datum/gas_mixture/tank_contents = internals_tank.return_air()
|
||||
if(tank_contents && round(tank_contents.return_pressure())) // make sure the tank is not empty or 0 pressure
|
||||
if(tank_contents.gases[/datum/gas/plasma])
|
||||
// higher tank distribution pressure leads to more healing, but once you get to about 15kpa you reach the max
|
||||
. += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, internals_tank.distribute_pressure * HEALING_PER_BREATH_PRESSURE)
|
||||
// Check environment
|
||||
if(diseased_mob.loc)
|
||||
environment = diseased_mob.loc.return_air()
|
||||
if(environment)
|
||||
gases = environment.gases
|
||||
if(gases[/datum/gas/plasma])
|
||||
. += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, gases[/datum/gas/plasma][MOLES] * HEALING_PER_MOL)
|
||||
var/obj/item/tank/internals/internals_tank = infected_mob.internal
|
||||
if(internals_tank)
|
||||
var/datum/gas_mixture/tank_contents = internals_tank.return_air()
|
||||
if(tank_contents && round(tank_contents.return_pressure())) // make sure the tank is not empty or 0 pressure
|
||||
if(tank_contents.gases[/datum/gas/plasma])
|
||||
// higher tank distribution pressure leads to more healing, but once you get to about 15kpa you reach the max
|
||||
. += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, internals_tank.distribute_pressure * HEALING_PER_BREATH_PRESSURE)
|
||||
else // Check environment
|
||||
if(infected_mob.loc)
|
||||
environment = infected_mob.loc.return_air()
|
||||
if(environment)
|
||||
gases = environment.gases
|
||||
if(gases[/datum/gas/plasma])
|
||||
. += power * min(MAX_HEAL_COEFFICIENT_INTERNALS, gases[/datum/gas/plasma][MOLES] * HEALING_PER_MOL)
|
||||
|
||||
// Check for reagents in bloodstream
|
||||
if(diseased_mob.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE))
|
||||
if(infected_mob.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE))
|
||||
. += power * MAX_HEAL_COEFFICIENT_BLOODSTREAM //Determines how much the symptom heals if injected or ingested
|
||||
|
||||
/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
|
||||
|
||||
@@ -17,10 +17,11 @@
|
||||
base_message_chance = 5
|
||||
symptom_delay_min = 1
|
||||
symptom_delay_max = 1
|
||||
var/regenerate_blood = FALSE
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
threshold_descs = list(
|
||||
"Resistance 8" = "Additionally regenerates lost blood."
|
||||
)
|
||||
var/regenerate_blood = FALSE
|
||||
|
||||
/datum/symptom/oxygen/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
@@ -29,20 +30,21 @@
|
||||
if(A.totalResistance() >= 8) //blood regeneration
|
||||
regenerate_blood = TRUE
|
||||
|
||||
/datum/symptom/oxygen/Activate(datum/disease/advance/A)
|
||||
/datum/symptom/oxygen/Activate(datum/disease/advance/advanced_disease)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/living/carbon/M = A.affected_mob
|
||||
switch(A.stage)
|
||||
|
||||
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
|
||||
switch(advanced_disease.stage)
|
||||
if(4, 5)
|
||||
M.adjustOxyLoss(-7, 0)
|
||||
M.losebreath = max(0, M.losebreath - 4)
|
||||
if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
M.blood_volume += 1
|
||||
infected_mob.adjustOxyLoss(-7, 0)
|
||||
infected_mob.losebreath = max(0, infected_mob.losebreath - 4)
|
||||
if(regenerate_blood && infected_mob.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
infected_mob.blood_volume += 1
|
||||
else
|
||||
if(prob(base_message_chance))
|
||||
to_chat(M, span_notice("[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]"))
|
||||
to_chat(infected_mob, span_notice("[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]"))
|
||||
return
|
||||
|
||||
/datum/symptom/oxygen/on_stage_change(datum/disease/advance/A)
|
||||
|
||||
@@ -87,34 +87,34 @@
|
||||
symptom_delay_min = 1
|
||||
symptom_delay_max = 1
|
||||
|
||||
/datum/symptom/sensory_restoration/Activate(datum/disease/advance/source_disease)
|
||||
/datum/symptom/sensory_restoration/Activate(datum/disease/advance/advanced_disease)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/living/carbon/ill_mob = source_disease.affected_mob
|
||||
switch(source_disease.stage)
|
||||
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
|
||||
switch(advanced_disease.stage)
|
||||
if(4, 5)
|
||||
var/obj/item/organ/internal/ears/ears = ill_mob.get_organ_slot(ORGAN_SLOT_EARS)
|
||||
if(ears)
|
||||
if(advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EARS))
|
||||
var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
|
||||
ears.adjustEarDamage(-4, -4)
|
||||
|
||||
ill_mob.adjust_temp_blindness(-4 SECONDS)
|
||||
ill_mob.adjust_eye_blur(-4 SECONDS)
|
||||
|
||||
var/obj/item/organ/internal/eyes/eyes = ill_mob.get_organ_slot(ORGAN_SLOT_EYES)
|
||||
if(!eyes) // only dealing with eye stuff from here on out
|
||||
if(!advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EYES))
|
||||
return
|
||||
|
||||
var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES)
|
||||
infected_mob.adjust_temp_blindness(-4 SECONDS)
|
||||
infected_mob.adjust_eye_blur(-4 SECONDS)
|
||||
|
||||
eyes.apply_organ_damage(-2)
|
||||
if(prob(20))
|
||||
if(ill_mob.is_blind_from(EYE_DAMAGE))
|
||||
to_chat(ill_mob, span_warning("Your vision slowly returns..."))
|
||||
ill_mob.adjust_eye_blur(20 SECONDS)
|
||||
if(infected_mob.is_blind_from(EYE_DAMAGE))
|
||||
to_chat(infected_mob, span_warning("Your vision slowly returns..."))
|
||||
infected_mob.adjust_eye_blur(20 SECONDS)
|
||||
|
||||
else if(ill_mob.is_nearsighted_from(EYE_DAMAGE))
|
||||
to_chat(ill_mob, span_warning("The blackness in your peripheral vision begins to fade."))
|
||||
ill_mob.adjust_eye_blur(5 SECONDS)
|
||||
else if(infected_mob.is_nearsighted_from(EYE_DAMAGE))
|
||||
to_chat(infected_mob, span_warning("The blackness in your peripheral vision begins to fade."))
|
||||
infected_mob.adjust_eye_blur(5 SECONDS)
|
||||
|
||||
else
|
||||
if(prob(base_message_chance))
|
||||
to_chat(ill_mob, span_notice("[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]"))
|
||||
to_chat(infected_mob, span_notice("[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]"))
|
||||
|
||||
@@ -18,8 +18,7 @@
|
||||
severity = 1
|
||||
symptom_delay_min = 5
|
||||
symptom_delay_max = 35
|
||||
var/spread_range = 4
|
||||
var/cartoon_sneezing = FALSE //ah, ah, AH, AH-CHOO!!
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
threshold_descs = list(
|
||||
"Transmission 9" = "Increases sneezing range, spreading the virus over 6 meter cone instead of over a 4 meter cone.",
|
||||
"Stealth 4" = "The symptom remains hidden until active.",
|
||||
@@ -27,6 +26,8 @@
|
||||
)
|
||||
///Emote cooldowns
|
||||
COOLDOWN_DECLARE(sneeze_cooldown)
|
||||
var/spread_range = 4
|
||||
var/cartoon_sneezing = FALSE //ah, ah, AH, AH-CHOO!!
|
||||
///if FALSE, there is a percentage chance that the mob will emote sneezing while sneeze_cooldown is on cooldown. If TRUE, won't emote again until after the off cooldown sneeze occurs.
|
||||
var/off_cooldown_sneezed = FALSE
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
var/list/thresholds
|
||||
///If this symptom can appear from /datum/disease/advance/GenerateSymptoms()
|
||||
var/naturally_occuring = TRUE
|
||||
///If the symptom requires an organ for the effects to function, robotic organs are immune to disease unless inorganic biology symptom is present
|
||||
var/required_organ
|
||||
|
||||
/datum/symptom/New()
|
||||
var/list/S = SSdisease.list_symptoms
|
||||
@@ -58,9 +60,13 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/symptom/proc/Activate(datum/disease/advance/A)
|
||||
/datum/symptom/proc/Activate(datum/disease/advance/advanced_disease)
|
||||
if(neutered)
|
||||
return FALSE
|
||||
if(required_organ)
|
||||
if(!advanced_disease.has_required_infectious_organ(advanced_disease.affected_mob, required_organ))
|
||||
return FALSE
|
||||
|
||||
if(world.time < next_activation)
|
||||
return FALSE
|
||||
else
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
base_message_chance = 50
|
||||
symptom_delay_min = 25
|
||||
symptom_delay_max = 80
|
||||
required_organ = ORGAN_SLOT_EYES
|
||||
threshold_descs = list(
|
||||
"Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.",
|
||||
"Stealth 4" = "The symptom remains hidden until active.",
|
||||
)
|
||||
|
||||
/// At max stage: If FALSE, cause blindness. If TRUE, cause their eyes to fall out.
|
||||
var/remove_eyes = FALSE
|
||||
|
||||
@@ -40,41 +40,40 @@
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/living/carbon/ill_mob = source_disease.affected_mob
|
||||
var/obj/item/organ/internal/eyes/eyes = ill_mob.get_organ_slot(ORGAN_SLOT_EYES)
|
||||
if(!eyes)
|
||||
return // can't do much
|
||||
|
||||
var/mob/living/carbon/infected_mob = source_disease.affected_mob
|
||||
var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES)
|
||||
|
||||
switch(source_disease.stage)
|
||||
if(1, 2)
|
||||
if(prob(base_message_chance) && !suppress_warning)
|
||||
to_chat(ill_mob, span_warning("Your eyes itch."))
|
||||
to_chat(infected_mob, span_warning("Your eyes itch."))
|
||||
|
||||
if(3, 4)
|
||||
to_chat(ill_mob, span_boldwarning("Your eyes burn!"))
|
||||
ill_mob.set_eye_blur_if_lower(20 SECONDS)
|
||||
to_chat(infected_mob, span_boldwarning("Your eyes burn!"))
|
||||
infected_mob.set_eye_blur_if_lower(20 SECONDS)
|
||||
eyes.apply_organ_damage(1)
|
||||
|
||||
else
|
||||
ill_mob.set_eye_blur_if_lower(40 SECONDS)
|
||||
infected_mob.set_eye_blur_if_lower(40 SECONDS)
|
||||
eyes.apply_organ_damage(5)
|
||||
|
||||
// Applies nearsighted at minimum
|
||||
if(!ill_mob.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold)
|
||||
if(!infected_mob.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold)
|
||||
eyes.set_organ_damage(eyes.low_threshold)
|
||||
|
||||
if(prob(eyes.damage - eyes.low_threshold + 1))
|
||||
if(remove_eyes)
|
||||
ill_mob.visible_message(
|
||||
span_warning("[ill_mob]'s eyes fall out of their sockets!"),
|
||||
infected_mob.visible_message(
|
||||
span_warning("[infected_mob]'s eyes fall out of their sockets!"),
|
||||
span_userdanger("Your eyes fall out of their sockets!"),
|
||||
)
|
||||
eyes.Remove(ill_mob)
|
||||
eyes.forceMove(get_turf(ill_mob))
|
||||
eyes.Remove(infected_mob)
|
||||
eyes.forceMove(get_turf(infected_mob))
|
||||
|
||||
else if(!ill_mob.is_blind_from(EYE_DAMAGE))
|
||||
to_chat(ill_mob, span_userdanger("You go blind!"))
|
||||
else if(!infected_mob.is_blind_from(EYE_DAMAGE))
|
||||
to_chat(infected_mob, span_userdanger("You go blind!"))
|
||||
eyes.apply_organ_damage(eyes.maxHealth)
|
||||
|
||||
else
|
||||
to_chat(ill_mob, span_userdanger("Your eyes burn horrifically!"))
|
||||
to_chat(infected_mob, span_userdanger("Your eyes burn horrifically!"))
|
||||
|
||||
@@ -20,13 +20,14 @@
|
||||
base_message_chance = 100
|
||||
symptom_delay_min = 60
|
||||
symptom_delay_max = 120
|
||||
var/scramble_language = FALSE
|
||||
var/datum/language/current_language
|
||||
required_organ = ORGAN_SLOT_TONGUE
|
||||
threshold_descs = list(
|
||||
"Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.",
|
||||
"Stage Speed 7" = "Changes voice more often.",
|
||||
"Stealth 3" = "The symptom remains hidden until active."
|
||||
)
|
||||
var/scramble_language = FALSE
|
||||
var/datum/language/current_language
|
||||
|
||||
/datum/symptom/voice_change/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
|
||||
@@ -20,14 +20,15 @@ and your disease can spread via people walking on vomit.
|
||||
base_message_chance = 100
|
||||
symptom_delay_min = 25
|
||||
symptom_delay_max = 80
|
||||
var/vomit_nebula = FALSE
|
||||
var/vomit_blood = FALSE
|
||||
var/proj_vomit = 0
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
threshold_descs = list(
|
||||
"Resistance 7" = "Host will vomit blood, causing internal damage.",
|
||||
"Transmission 7" = "Host will projectile vomit, increasing vomiting range.",
|
||||
"Stealth 4" = "The symptom remains hidden until active."
|
||||
)
|
||||
var/vomit_nebula = FALSE
|
||||
var/vomit_blood = FALSE
|
||||
var/proj_vomit = 0
|
||||
|
||||
/datum/symptom/vomit/Start(datum/disease/advance/A)
|
||||
. = ..()
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
base_message_chance = 100
|
||||
symptom_delay_min = 15
|
||||
symptom_delay_max = 45
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
threshold_descs = list(
|
||||
"Stealth 4" = "The symptom is less noticeable."
|
||||
)
|
||||
|
||||
@@ -9,10 +9,9 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
cure_chance = 7.5 //higher chance to cure, since two reagents are required
|
||||
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
|
||||
required_organs = list(/obj/item/organ/internal/brain)
|
||||
required_organ = ORGAN_SLOT_BRAIN
|
||||
severity = DISEASE_SEVERITY_HARMFUL
|
||||
|
||||
|
||||
/datum/disease/brainrot/stage_act(seconds_per_tick, times_fired) //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
|
||||
. = ..()
|
||||
if(!.)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
spreading_modifier = 0.5
|
||||
spread_text = "Airborne"
|
||||
severity = DISEASE_SEVERITY_NONTHREAT
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
|
||||
|
||||
/datum/disease/cold/stage_act(seconds_per_tick, times_fired)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
desc = "If left untreated the subject will slow, as if partly frozen."
|
||||
severity = DISEASE_SEVERITY_HARMFUL
|
||||
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
|
||||
/datum/disease/cold9/stage_act(seconds_per_tick, times_fired)
|
||||
. = ..()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
spread_flags = DISEASE_SPREAD_SPECIAL
|
||||
visibility_flags = HIDDEN_SCANNER
|
||||
bypasses_immunity = TRUE
|
||||
|
||||
required_organ = ORGAN_SLOT_STOMACH
|
||||
|
||||
/datum/disease/death_sandwich_poisoning/stage_act(seconds_per_tick, times_fired)
|
||||
. = ..()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
spreading_modifier = 0.75
|
||||
desc = "If left untreated the subject will feel quite unwell."
|
||||
severity = DISEASE_SEVERITY_MINOR
|
||||
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
|
||||
/datum/disease/flu/stage_act(seconds_per_tick, times_fired)
|
||||
. = ..()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
spreading_modifier = 0.75
|
||||
desc = "If left untreated the subject will burn to death for being a heretic."
|
||||
severity = DISEASE_SEVERITY_DANGEROUS
|
||||
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
|
||||
/datum/disease/fluspanish/stage_act(seconds_per_tick, times_fired)
|
||||
. = ..()
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
spread_text = "Organ failure"
|
||||
visibility_flags = HIDDEN_PANDEMIC
|
||||
required_organs = list(/obj/item/organ/internal/heart)
|
||||
required_organ = ORGAN_SLOT_HEART
|
||||
bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
|
||||
var/sound = FALSE
|
||||
|
||||
|
||||
@@ -11,10 +11,9 @@
|
||||
severity = DISEASE_SEVERITY_HARMFUL
|
||||
disease_flags = CAN_CARRY|CAN_RESIST
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
required_organs = list(/obj/item/organ/internal/liver)
|
||||
required_organ = ORGAN_SLOT_LIVER
|
||||
bypasses_immunity = TRUE
|
||||
|
||||
|
||||
/datum/disease/parasite/stage_act(seconds_per_tick, times_fired)
|
||||
. = ..()
|
||||
if(!.)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
spreading_modifier = 0.75
|
||||
desc = "If left untreated the subject will probably drive others to insanity."
|
||||
severity = DISEASE_SEVERITY_MEDIUM
|
||||
|
||||
required_organ = ORGAN_SLOT_TONGUE
|
||||
|
||||
/datum/disease/pierrot_throat/stage_act(seconds_per_tick, times_fired)
|
||||
. = ..()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
cure_chance = 2.5 //like hell are you getting out of hell
|
||||
desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
|
||||
required_organs = list(/obj/item/organ/internal/lungs)
|
||||
required_organ = ORGAN_SLOT_LUNGS
|
||||
severity = DISEASE_SEVERITY_BIOHAZARD
|
||||
bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition. \
|
||||
A form of magical grounding can help, too, but will not cure it on its own."
|
||||
severity = DISEASE_SEVERITY_HARMFUL
|
||||
required_organs = list(/obj/item/bodypart/head)
|
||||
|
||||
/// List of random non-targeted spells to pick from to cast
|
||||
var/list/datum/action/cooldown/spell/random_spells = list()
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
for(var/i in user_by_item)
|
||||
var/mob/living/carbon/user = user_by_item[i]
|
||||
var/obj/item/organ/internal/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS)
|
||||
if(!ears || !ears.damage || ears.organ_flags & ORGAN_FAILING)
|
||||
if(!ears || !ears.damage || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears))
|
||||
continue
|
||||
ears.deaf = max(ears.deaf - 0.25 * seconds_per_tick, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged
|
||||
ears.apply_organ_damage(-0.025 * seconds_per_tick)
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
/datum/action/changeling/sting/blind
|
||||
name = "Blind Sting"
|
||||
desc = "We temporarily blind our victim. Costs 25 chemicals."
|
||||
helptext = "This sting completely blinds a target for a short time, and leaves them with blurred vision for a long time."
|
||||
helptext = "This sting completely blinds a target for a short time, and leaves them with blurred vision for a long time. Does not work if target has robotic or missing eyes."
|
||||
button_icon_state = "sting_blind"
|
||||
chemical_cost = 25
|
||||
dna_cost = 1
|
||||
@@ -211,6 +211,10 @@
|
||||
user.balloon_alert(user, "no eyes!")
|
||||
return FALSE
|
||||
|
||||
if(IS_ROBOTIC_ORGAN(eyes))
|
||||
user.balloon_alert(user, "robotic eyes!")
|
||||
return FALSE
|
||||
|
||||
log_combat(user, target, "stung", "blind sting")
|
||||
to_chat(target, span_danger("Your eyes burn horrifically!"))
|
||||
eyes.apply_organ_damage(eyes.maxHealth * 0.8)
|
||||
|
||||
@@ -597,8 +597,11 @@
|
||||
repair_rate = max(0, STANDARD_ORGAN_HEALING * (matter_bin.tier - 1) * 0.5)
|
||||
|
||||
/obj/machinery/smartfridge/organ/process(seconds_per_tick)
|
||||
for(var/obj/item/organ/organ in contents)
|
||||
organ.apply_organ_damage(-repair_rate * organ.maxHealth * seconds_per_tick)
|
||||
for(var/obj/item/organ/target_organ in contents)
|
||||
if(!target_organ.damage)
|
||||
continue
|
||||
|
||||
target_organ.apply_organ_damage(-repair_rate * target_organ.maxHealth * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC)
|
||||
|
||||
/obj/machinery/smartfridge/organ/Exited(atom/movable/gone, direction)
|
||||
. = ..()
|
||||
|
||||
@@ -863,8 +863,11 @@
|
||||
if(dna && !HAS_TRAIT(src, TRAIT_NOBLOOD))
|
||||
blood_volume += (excess_healing * 2) //1 excess = 10 blood
|
||||
|
||||
for(var/obj/item/organ/organ as anything in organs)
|
||||
organ.apply_organ_damage(excess_healing * -1) //1 excess = 5 organ damage healed
|
||||
for(var/obj/item/organ/target_organ as anything in organs)
|
||||
if(!target_organ.damage)
|
||||
continue
|
||||
|
||||
target_organ.apply_organ_damage(excess_healing * -1, required_organ_flag = ORGAN_ORGANIC) //1 excess = 5 organ damage healed
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -127,7 +127,10 @@
|
||||
return ..()
|
||||
|
||||
for(var/obj/item/organ/organ_being_healed as anything in breather.organs)
|
||||
organ_being_healed.apply_organ_damage(-0.5 * REM * seconds_per_tick)
|
||||
if(!organ_being_healed.damage)
|
||||
continue
|
||||
|
||||
organ_being_healed.apply_organ_damage(-0.5 * REM * seconds_per_tick, required_organ_flag = ORGAN_ORGANIC)
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -227,17 +227,17 @@
|
||||
|
||||
if(SPT_PROB(2.5, seconds_per_tick) && iscarbon(drinker))
|
||||
var/obj/item/organ/internal/eyes/eyes = drinker.get_organ_slot(ORGAN_SLOT_EYES)
|
||||
if(drinker.is_blind())
|
||||
if(istype(eyes))
|
||||
if(eyes && IS_ORGANIC_ORGAN(eyes)) // doesn't affect robotic eyes
|
||||
if(drinker.is_blind())
|
||||
eyes.Remove(drinker)
|
||||
eyes.forceMove(get_turf(drinker))
|
||||
to_chat(drinker, span_userdanger("You double over in pain as you feel your eyeballs liquify in your head!"))
|
||||
drinker.emote("scream")
|
||||
drinker.adjustBruteLoss(15, required_bodytype = affected_bodytype)
|
||||
else
|
||||
to_chat(drinker, span_userdanger("You scream in terror as you go blind!"))
|
||||
eyes.apply_organ_damage(eyes.maxHealth)
|
||||
drinker.emote("scream")
|
||||
else
|
||||
to_chat(drinker, span_userdanger("You scream in terror as you go blind!"))
|
||||
eyes.apply_organ_damage(eyes.maxHealth)
|
||||
drinker.emote("scream")
|
||||
|
||||
if(SPT_PROB(1.5, seconds_per_tick) && iscarbon(drinker))
|
||||
drinker.visible_message(span_danger("[drinker] starts having a seizure!"), span_userdanger("You have a seizure!"))
|
||||
|
||||
@@ -730,7 +730,7 @@
|
||||
// Healing eye damage will cure nearsightedness and blindness from ... eye damage
|
||||
eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)
|
||||
// If our eyes are seriously damaged, we have a probability of causing eye blur while healing depending on purity
|
||||
if(eyes.damaged && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick))
|
||||
if(eyes.damaged && IS_ORGANIC_ORGAN(eyes) && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick))
|
||||
// While healing, gives some eye blur
|
||||
if(affected_mob.is_blind_from(EYE_DAMAGE))
|
||||
to_chat(affected_mob, span_warning("Your vision slowly returns..."))
|
||||
|
||||
@@ -32,9 +32,22 @@
|
||||
if((strain.spread_flags & DISEASE_SPREAD_SPECIAL) || (strain.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
|
||||
continue
|
||||
|
||||
if(methods & (INJECT|INGEST|PATCH))
|
||||
if(methods & INGEST)
|
||||
if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_STOMACH))
|
||||
continue
|
||||
|
||||
exposed_mob.ForceContractDisease(strain)
|
||||
else if((methods & (TOUCH|VAPOR)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
|
||||
else if(methods & (INJECT|PATCH))
|
||||
if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_HEART))
|
||||
continue
|
||||
|
||||
exposed_mob.ForceContractDisease(strain)
|
||||
else if((methods & VAPOR) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
|
||||
if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_LUNGS))
|
||||
continue
|
||||
|
||||
exposed_mob.ContactContractDisease(strain)
|
||||
else if((methods & TOUCH) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
|
||||
exposed_mob.ContactContractDisease(strain)
|
||||
|
||||
if(iscarbon(exposed_mob))
|
||||
|
||||
@@ -307,6 +307,13 @@
|
||||
|
||||
//SKYRAT EDIT START - RESEARCH DESIGNS
|
||||
"hospital_gown",
|
||||
"synth_eyes",
|
||||
"synth_tongue",
|
||||
"synth_liver",
|
||||
"synth_lungs",
|
||||
"synth_stomach",
|
||||
"synth_ears",
|
||||
"synth_heart",
|
||||
//SKYRAT EDIT END - RESEARCH DESIGNS
|
||||
)
|
||||
|
||||
|
||||
@@ -1332,13 +1332,13 @@
|
||||
owner.visible_message(span_danger("[owner]'s [src.name] seems to malfunction!"))
|
||||
|
||||
var/time_needed = 10 SECONDS
|
||||
var/brute_damage = 5 + 1.5 // Augments reduce brute damage by 5.
|
||||
var/burn_damage = 4 + 2.5 // As above, but for burn it's 4.
|
||||
var/brute_damage = 2.5 // SKYRAT EDIT : Balances direct EMP damage for Brute - SR's synth values are multiplied 3x 2.5 * 1.3 * 1.3
|
||||
var/burn_damage = 2 // SKYRAT EDIT : Balances direct EMP damage for Burn - SR's synth values are multiplied 3x 2 * 1.3 * 1.3
|
||||
|
||||
if(severity == EMP_HEAVY)
|
||||
time_needed *= 2
|
||||
brute_damage *= 2
|
||||
burn_damage *= 2
|
||||
brute_damage *= 1.3 // SKYRAT EDIT : Balance - Lowers total damage from ~125 Brute to ~30
|
||||
burn_damage *= 1.3 // SKYRAT EDIT : Balance - Lowers total damage from ~104 Burn to ~24
|
||||
|
||||
receive_damage(brute_damage, burn_damage)
|
||||
do_sparks(number = 1, cardinal_only = FALSE, source = owner)
|
||||
|
||||
@@ -150,6 +150,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ)
|
||||
/obj/item/organ/proc/on_remove(mob/living/carbon/organ_owner, special)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
if(!iscarbon(organ_owner))
|
||||
stack_trace("Organ removal should not be happening on non carbon mobs: [organ_owner]")
|
||||
|
||||
for(var/trait in organ_traits)
|
||||
REMOVE_TRAIT(organ_owner, trait, REF(src))
|
||||
|
||||
@@ -163,6 +166,24 @@ INITIALIZE_IMMEDIATE(/obj/item/organ)
|
||||
SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner)
|
||||
SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special)
|
||||
|
||||
var/list/diseases = organ_owner.get_static_viruses()
|
||||
if(!LAZYLEN(diseases))
|
||||
return
|
||||
|
||||
var/list/datum/disease/diseases_to_add = list()
|
||||
for(var/datum/disease/disease as anything in diseases)
|
||||
// robotic organs are immune to disease unless 'inorganic biology' symptom is present
|
||||
if(IS_ROBOTIC_ORGAN(src) && !(disease.infectable_biotypes & MOB_ROBOTIC))
|
||||
continue
|
||||
|
||||
// admin or special viruses that should not be reproduced
|
||||
if(disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS))
|
||||
continue
|
||||
|
||||
diseases_to_add += disease
|
||||
if(LAZYLEN(diseases_to_add))
|
||||
AddComponent(/datum/component/infective, diseases_to_add)
|
||||
|
||||
/// Add a Trait to an organ that it will give its owner.
|
||||
/obj/item/organ/proc/add_organ_trait(trait)
|
||||
LAZYADD(organ_traits, trait)
|
||||
|
||||
@@ -64,6 +64,9 @@
|
||||
if(!damage) // No sense healing if you're not even hurt bro
|
||||
return
|
||||
|
||||
if(IS_ROBOTIC_ORGAN(src)) // Robotic organs don't naturally heal
|
||||
return
|
||||
|
||||
///Damage decrements by a percent of its maxhealth
|
||||
var/healing_amount = healing_factor
|
||||
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.9 KiB |
@@ -1,13 +1,9 @@
|
||||
#define SYNTH_EMP_BRAIN_DAMAGE 20
|
||||
#define SYNTH_EMP_BRAIN_DAMAGE_MAXIMUM 75
|
||||
#define SYNTH_BRAIN_WAKE_THRESHOLD 50
|
||||
#define SYNTH_BRAIN_DAMAGE_MESSAGE_INTERVAL 20 SECONDS
|
||||
|
||||
/obj/item/organ/internal/brain/synth
|
||||
name = "compact positronic brain"
|
||||
slot = ORGAN_SLOT_BRAIN
|
||||
zone = BODY_ZONE_CHEST
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
|
||||
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. It has an IPC serial number engraved on the top. It is usually slotted into the chest of synthetic crewmembers."
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "posibrain-ipc"
|
||||
@@ -24,15 +20,22 @@
|
||||
if(HAS_TRAIT(user_human, TRAIT_REVIVES_BY_HEALING) && user_human.health > SYNTH_BRAIN_WAKE_THRESHOLD)
|
||||
user_human.revive(FALSE)
|
||||
|
||||
/obj/item/organ/internal/brain/synth/emp_act(severity)
|
||||
// This value is the protection value!
|
||||
/obj/item/organ/internal/brain/synth/emp_act(severity) // EMP act against the posi, keep the cap far below the organ health
|
||||
. = ..()
|
||||
|
||||
// If EMP protected, or light EMPed, don't emp_act.
|
||||
if(. & EMP_PROTECT_SELF || severity != EMP_HEAVY)
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
apply_organ_damage(SYNTH_EMP_BRAIN_DAMAGE, SYNTH_EMP_BRAIN_DAMAGE_MAXIMUM)
|
||||
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_HEAVY)
|
||||
to_chat(owner, span_warning("01001001 00100111 01101101 00100000 01100110 01110101 01100011 01101011 01100101 01100100 00101110"))
|
||||
apply_organ_damage(SYNTH_ORGAN_HEAVY_EMP_DAMAGE, SYNTH_EMP_BRAIN_DAMAGE_MAXIMUM, required_organ_flag = ORGAN_ROBOTIC)
|
||||
if(EMP_LIGHT)
|
||||
to_chat(owner, span_warning("Alert: Electromagnetic damage taken in central processing unit. Error Code: 401-YT"))
|
||||
apply_organ_damage(SYNTH_ORGAN_LIGHT_EMP_DAMAGE, SYNTH_EMP_BRAIN_DAMAGE_MAXIMUM, required_organ_flag = ORGAN_ROBOTIC)
|
||||
|
||||
/obj/item/organ/internal/brain/synth/apply_organ_damage(damage_amount, maximumm, required_organ_flag)
|
||||
. = ..()
|
||||
@@ -41,11 +44,11 @@
|
||||
last_message_time = world.time
|
||||
|
||||
if(damage > BRAIN_DAMAGE_SEVERE)
|
||||
to_chat(owner, span_warning("Alert: Severe corruption in central processing unit."))
|
||||
to_chat(owner, span_warning("Alre: re oumtnin ilir tocorr:pa ni ne:cnrrpiioruloomatt cessingode: P1_1-H"))
|
||||
return
|
||||
|
||||
if(damage > BRAIN_DAMAGE_MILD)
|
||||
to_chat(owner, span_warning("Alert: Minor corruption in central processing unit."))
|
||||
to_chat(owner, span_warning("Alert: Minor corruption in central processing unit. Error Code: 001-HP"))
|
||||
|
||||
/obj/item/organ/internal/brain/synth/circuit
|
||||
name = "compact AI circuit"
|
||||
@@ -61,8 +64,3 @@
|
||||
desc = "A compact man-machine interface, perfectly dimensioned to fit in the same slot as a synthetic-compatible positronic brain. Unfortunately, the brain seems to be permanently attached to the circuitry, and it seems relatively sensitive to it's environment. It is usually slotted into the chest of synthetic crewmembers."
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "mmi-ipc"
|
||||
|
||||
#undef SYNTH_EMP_BRAIN_DAMAGE
|
||||
#undef SYNTH_EMP_BRAIN_DAMAGE_MAXIMUM
|
||||
#undef SYNTH_BRAIN_WAKE_THRESHOLD
|
||||
#undef SYNTH_BRAIN_DAMAGE_MESSAGE_INTERVAL
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
#define SYNTH_BAD_EFFECT_DURATION 30 SECONDS
|
||||
#define SYNTH_DEAF_STACKS 30
|
||||
#define SYNTH_KNOCKDOWN_POWER 40
|
||||
#define SYNTH_HEAVY_EMP_MULTIPLIER 2
|
||||
|
||||
/obj/item/organ/internal/ears/synth
|
||||
name = "auditory sensors"
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "ears-ipc"
|
||||
desc = "A pair of microphones intended to be installed in an IPC head, that grant the ability to hear."
|
||||
desc = "A pair of microphones intended to be installed in an IPC or Synthetics head, that grant the ability to hear."
|
||||
zone = BODY_ZONE_HEAD
|
||||
slot = ORGAN_SLOT_EARS
|
||||
gender = PLURAL
|
||||
maxHealth = 1 * STANDARD_ORGAN_THRESHOLD
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
|
||||
/obj/item/organ/internal/ears/synth/emp_act(severity)
|
||||
@@ -19,21 +15,34 @@
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_HEAVY)
|
||||
owner.set_jitter_if_lower(SYNTH_BAD_EFFECT_DURATION * SYNTH_HEAVY_EMP_MULTIPLIER)
|
||||
owner.set_dizzy_if_lower(SYNTH_BAD_EFFECT_DURATION * SYNTH_HEAVY_EMP_MULTIPLIER)
|
||||
owner.Knockdown(SYNTH_KNOCKDOWN_POWER * SYNTH_HEAVY_EMP_MULTIPLIER)
|
||||
adjustEarDamage(SYNTH_ORGAN_HEAVY_EMP_DAMAGE, SYNTH_DEAF_STACKS)
|
||||
to_chat(owner, span_warning("Your system reports a complete lack of input from your auditory sensors."))
|
||||
to_chat(owner, span_warning("Alert: Null feedback from auditory sensors detected, seek maintenance immediately. Error Code: AS-105"))
|
||||
|
||||
if(EMP_LIGHT)
|
||||
owner.set_jitter_if_lower(SYNTH_BAD_EFFECT_DURATION)
|
||||
owner.set_dizzy_if_lower(SYNTH_BAD_EFFECT_DURATION)
|
||||
owner.Knockdown(SYNTH_KNOCKDOWN_POWER)
|
||||
to_chat(owner, span_warning("Your system reports anomalous feedback from your auditory sensors."))
|
||||
adjustEarDamage(SYNTH_ORGAN_LIGHT_EMP_DAMAGE, SYNTH_DEAF_STACKS)
|
||||
to_chat(owner, span_warning("Alert: Anomalous feedback from auditory sensors detected. Error Code: AS-50"))
|
||||
|
||||
#undef SYNTH_BAD_EFFECT_DURATION
|
||||
#undef SYNTH_DEAF_STACKS
|
||||
#undef SYNTH_KNOCKDOWN_POWER
|
||||
#undef SYNTH_HEAVY_EMP_MULTIPLIER
|
||||
/datum/design/synth_ears
|
||||
name = "Auditory Sensors"
|
||||
desc = "A pair of microphones intended to be installed in an IPC or Synthetics head, that grant the ability to hear."
|
||||
id = "synth_ears"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/ears/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
name = "optical sensors"
|
||||
icon_state = "cybernetic_eyeballs"
|
||||
desc = "A very basic set of optical sensors with no extra vision modes or functions."
|
||||
zone = BODY_ZONE_HEAD
|
||||
slot = ORGAN_SLOT_EYES
|
||||
maxHealth = 1 * STANDARD_ORGAN_THRESHOLD
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
|
||||
/obj/item/organ/internal/eyes/synth/emp_act(severity)
|
||||
@@ -10,11 +13,26 @@
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
to_chat(owner, span_warning("Electromagnetic interference clouds your optics with static."))
|
||||
owner.flash_act(visual = TRUE)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_LIGHT)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_EYES, SYNTH_ORGAN_LIGHT_EMP_DAMAGE)
|
||||
if(EMP_HEAVY)
|
||||
owner.adjustOrganLoss(ORGAN_SLOT_EYES, SYNTH_ORGAN_HEAVY_EMP_DAMAGE)
|
||||
to_chat(owner, span_warning("Alert:Severe electromagnetic interference clouds your optics with static. Error Code: I-CS6"))
|
||||
apply_organ_damage(SYNTH_ORGAN_HEAVY_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
if(EMP_LIGHT)
|
||||
to_chat(owner, span_warning("Alert: Mild interference clouds your optics with static. Error Code: I-CS0"))
|
||||
apply_organ_damage(SYNTH_ORGAN_LIGHT_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
|
||||
/datum/design/synth_eyes
|
||||
name = "Optical Sensors"
|
||||
desc = "A very basic set of optical sensors with no extra vision modes or functions."
|
||||
id = "synth_eyes"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/eyes/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -5,3 +5,40 @@
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "heart-ipc-on"
|
||||
base_icon_state = "heart-ipc"
|
||||
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD // 1.5x due to synthcode.tm being weird
|
||||
zone = BODY_ZONE_CHEST
|
||||
slot = ORGAN_SLOT_HEART
|
||||
var/last_message_time = 0
|
||||
|
||||
/obj/item/organ/internal/heart/synth/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_HEAVY)
|
||||
to_chat(owner, span_warning("Alert: Main hydraulic pump control has taken severe damage, seek maintenance immediately. Error code: HP300-10."))
|
||||
apply_organ_damage(SYNTH_ORGAN_HEAVY_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
if(EMP_LIGHT)
|
||||
to_chat(owner, span_warning("Alert: Main hydraulic pump control has taken light damage, seek maintenance immediately. Error code: HP300-05."))
|
||||
apply_organ_damage(SYNTH_ORGAN_LIGHT_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
|
||||
/datum/design/synth_heart
|
||||
name = "Hydraulic Pump Engine"
|
||||
desc = "An electronic device that handles the hydraulic pumps, powering one's robotic limbs. Without this, synthetics are unable to move."
|
||||
id = "synth_heart"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/heart/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
should_draw_greyscale = TRUE
|
||||
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
head_flags = HEAD_ALL_FEATURES
|
||||
@@ -19,8 +17,6 @@
|
||||
should_draw_greyscale = TRUE
|
||||
limb_id = SPECIES_SYNTH
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
@@ -29,8 +25,6 @@
|
||||
limb_id = SPECIES_SYNTH
|
||||
should_draw_greyscale = TRUE
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
@@ -39,8 +33,6 @@
|
||||
limb_id = SPECIES_SYNTH
|
||||
should_draw_greyscale = TRUE
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
@@ -50,8 +42,6 @@
|
||||
should_draw_greyscale = TRUE
|
||||
digitigrade_type = /obj/item/bodypart/leg/left/robot/digitigrade
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
@@ -61,8 +51,6 @@
|
||||
limb_id = SPECIES_SYNTH
|
||||
digitigrade_type = /obj/item/bodypart/leg/right/robot/digitigrade
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
@@ -73,8 +61,6 @@
|
||||
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE
|
||||
base_limb_id = BODYPART_ID_DIGITIGRADE
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
@@ -89,8 +75,6 @@
|
||||
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE
|
||||
base_limb_id = BODYPART_ID_DIGITIGRADE
|
||||
change_exempt_flags = NONE
|
||||
brute_modifier = 1
|
||||
burn_modifier = 1
|
||||
brute_modifier = SYNTH_BRUTE_MODIFIER
|
||||
burn_modifier = SYNTH_BURN_MODIFIER
|
||||
|
||||
|
||||
@@ -1,7 +1,44 @@
|
||||
/obj/item/organ/internal/liver/synth
|
||||
name = "reagent processing unit"
|
||||
desc = "An electronic device that processes the beneficial chemicals for the synthetic user."
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "liver-ipc"
|
||||
filterToxins = FALSE //We dont filter them, we're immune to them
|
||||
zone = BODY_ZONE_CHEST
|
||||
slot = ORGAN_SLOT_LIVER
|
||||
maxHealth = 1 * STANDARD_ORGAN_THRESHOLD
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
|
||||
/obj/item/organ/internal/lungs/synth/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_HEAVY)
|
||||
to_chat(owner, span_warning("Alert: Critical! Reagent processing unit failure, seek maintenance immediately. Error Code: DR-1k"))
|
||||
apply_organ_damage(SYNTH_ORGAN_HEAVY_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
|
||||
if(EMP_LIGHT)
|
||||
to_chat(owner, span_warning("Alert: Reagent processing unit failure, seek maintenance for diagnostic. Error Code: DR-0k"))
|
||||
apply_organ_damage(SYNTH_ORGAN_LIGHT_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
|
||||
/datum/design/synth_liver
|
||||
name = "Reagent Processing Unit"
|
||||
desc = "An electronic device that processes the beneficial chemicals for the synthetic user."
|
||||
id = "synth_liver"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/liver/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
#define SYNTH_LIGHT_EMP_TEMPERATURE_POWER 30
|
||||
#define SYNTH_HEAVY_EMP_TEMPERATURE_POWER 100
|
||||
|
||||
/obj/item/organ/internal/lungs/synth
|
||||
name = "heat sink"
|
||||
name = "heatsink"
|
||||
desc = "A device that transfers generated heat to a fluid medium to cool it down. Required to keep your synthetics cool-headed. It's shape resembles lungs." //Purposefully left the 'fluid medium' ambigious for interpretation of the character, whether it be air or fluid cooling
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "lungs-ipc"
|
||||
@@ -12,21 +9,41 @@
|
||||
safe_plasma_max = 0
|
||||
safe_oxygen_min = 0 //What are you doing man, dont breathe with those!
|
||||
safe_oxygen_max = 0
|
||||
zone = BODY_ZONE_CHEST
|
||||
slot = ORGAN_SLOT_LUNGS
|
||||
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
|
||||
/obj/item/organ/internal/lungs/synth/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_HEAVY)
|
||||
to_chat(owner, span_warning("Alert: Critical cooling system failure!"))
|
||||
to_chat(owner, span_warning("Alert: Critical cooling system failure! Seek maintenance immediately. Error Code: 5H-17"))
|
||||
owner.adjust_bodytemperature(SYNTH_HEAVY_EMP_TEMPERATURE_POWER * TEMPERATURE_DAMAGE_COEFFICIENT)
|
||||
|
||||
if(EMP_LIGHT)
|
||||
to_chat(owner, span_warning("Alert: Major cooling system failure!"))
|
||||
owner.adjust_bodytemperature(SYNTH_LIGHT_EMP_TEMPERATURE_POWER * TEMPERATURE_DAMAGE_COEFFICIENT)
|
||||
|
||||
#undef SYNTH_LIGHT_EMP_TEMPERATURE_POWER
|
||||
#undef SYNTH_HEAVY_EMP_TEMPERATURE_POWER
|
||||
/datum/design/synth_heatsink
|
||||
name = "Heatsink"
|
||||
desc = "A device that transfers generated heat to a fluid medium to cool it down. Required to keep your synthetics cool-headed. It's shape resembles lungs."
|
||||
id = "synth_lungs"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/lungs/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#define SYNTH_STOMACH_LIGHT_EMP_CHARGE_LOSS 50
|
||||
#define SYNTH_STOMACH_HEAVY_EMP_CHARGE_LOSS 150
|
||||
|
||||
/obj/item/organ/internal/stomach/synth
|
||||
name = "synth power cell"
|
||||
name = "synthetic bio-reactor"
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "stomach-ipc"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
zone = BODY_ZONE_CHEST
|
||||
slot = ORGAN_SLOT_STOMACH
|
||||
maxHealth = 1 * STANDARD_ORGAN_THRESHOLD
|
||||
zone = "chest"
|
||||
slot = "stomach"
|
||||
desc = "A specialised cell, for synthetic use only. Has a low-power mode. Without this, synthetics are unable to stay powered."
|
||||
desc = "A specialised mini reactor, for synthetic use only. Has a low-power mode to ensure baseline functions. Without this, synthetics are unable to stay powered."
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
|
||||
/obj/item/organ/internal/stomach/synth/emp_act(severity)
|
||||
@@ -17,14 +17,32 @@
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
return
|
||||
|
||||
if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people.
|
||||
COOLDOWN_START(src, severe_cooldown, 10 SECONDS)
|
||||
|
||||
switch(severity)
|
||||
if(EMP_HEAVY)
|
||||
owner.nutrition = max(0, owner.nutrition - SYNTH_STOMACH_HEAVY_EMP_CHARGE_LOSS)
|
||||
apply_organ_damage(SYNTH_ORGAN_HEAVY_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
to_chat(owner, span_warning("Alert: Severe battery discharge!"))
|
||||
|
||||
if(EMP_LIGHT)
|
||||
owner.nutrition = max(0, owner.nutrition - SYNTH_STOMACH_LIGHT_EMP_CHARGE_LOSS)
|
||||
apply_organ_damage(SYNTH_ORGAN_LIGHT_EMP_DAMAGE, maxHealth, required_organ_flag = ORGAN_ROBOTIC)
|
||||
to_chat(owner, span_warning("Alert: Minor battery discharge!"))
|
||||
|
||||
#undef SYNTH_STOMACH_LIGHT_EMP_CHARGE_LOSS
|
||||
#undef SYNTH_STOMACH_HEAVY_EMP_CHARGE_LOSS
|
||||
/datum/design/synth_stomach
|
||||
name = "Synthetic Bio-Reactor"
|
||||
desc = "A specialised mini reactor, for synthetic use only. Has a low-power mode to ensure baseline functions. Without this, synthetics are unable to stay powered."
|
||||
id = "synth_stomach"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/stomach/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -1,13 +1,36 @@
|
||||
/obj/item/organ/internal/tongue/synth
|
||||
name = "synthetic voicebox"
|
||||
desc = "A voice synthesizer that allows synths to communicate with lifeforms. Tuned to sound less agressive than robotic voiceboxes."
|
||||
icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
|
||||
icon_state = "tongue-ipc"
|
||||
desc = "A fully-functional synthetic tongue, encased in soft silicone. Features include high-resolution vocals and taste receptors."
|
||||
icon = 'modular_skyrat/modules/organs/icons/cyber_tongue.dmi'
|
||||
icon_state = "cybertongue"
|
||||
say_mod = "beeps"
|
||||
attack_verb_continuous = list("beeps", "boops")
|
||||
attack_verb_simple = list("beep", "boop")
|
||||
modifies_speech = TRUE
|
||||
taste_sensitivity = 25 // not as good as an organic tongue
|
||||
maxHealth = 100 //RoboTongue!
|
||||
zone = BODY_ZONE_HEAD
|
||||
slot = ORGAN_SLOT_TONGUE
|
||||
organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES
|
||||
|
||||
/obj/item/organ/internal/tongue/synth/can_speak_language(language)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/internal/tongue/synth/handle_speech(datum/source, list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
|
||||
|
||||
/datum/design/synth_tongue
|
||||
name = "Synthetic Tongue"
|
||||
desc = "A fully-functional synthetic tongue, encased in soft silicone. Features include high-resolution vocals and taste receptors."
|
||||
id = "synth_tongue"
|
||||
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||
construction_time = 4 SECONDS
|
||||
materials = list(
|
||||
/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5,
|
||||
/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5,
|
||||
)
|
||||
build_path = /obj/item/organ/internal/tongue/synth
|
||||
category = list(
|
||||
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
|
||||
)
|
||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
TRAIT_CAN_USE_FLIGHT_POTION,
|
||||
TRAIT_ADVANCEDTOOLUSER,
|
||||
TRAIT_RADIMMUNE,
|
||||
TRAIT_VIRUSIMMUNE,
|
||||
TRAIT_NOBREATH,
|
||||
TRAIT_TOXIMMUNE,
|
||||
TRAIT_NOCLONELOSS,
|
||||
|
||||
@@ -196,6 +196,7 @@ As the Quartermaster, be sure to check the manifests on crates you receive to ma
|
||||
As the Quartermaster, you can construct an express supply console that instantly delivers crates by drop pod. The impact will cause a small explosion as well.
|
||||
As the Research Director, you can lock down cyborgs instead of blowing them up. Then you can have their laws reset or if that doesn't work, safely dismantled.
|
||||
As the Research Director, you can take AIs out of their cores by loading them into an intelliCard, which lets you see their laws, even ion/syndicate ones. It can then be placed into an AI system integrity restorer computer to revive and/or repair them.
|
||||
As the Virologist, robotic organs can give immunity to disease effects and transmissibility. Make use of the inorganic biology symptom to bypass the protection.
|
||||
As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently.
|
||||
As the Virologist, your viruses can range from healing powers so great that you can heal out of critical status, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment!
|
||||
As the Warden, if a prisoner's crimes are heinous enough you can put them in permabrig or the gulag. Make sure to check on them once in a while!
|
||||
|
||||
Reference in New Issue
Block a user