mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
FBP Internal Components
This commit is contained in:
@@ -214,6 +214,13 @@
|
||||
#define O_AUG_SPINE "spinal augment"
|
||||
#define O_AUG_PELVIC "pelvic augment"
|
||||
|
||||
// FBP components.
|
||||
|
||||
#define O_PUMP "hydraulic hub"
|
||||
#define O_CYCLER "reagent cycler"
|
||||
#define O_HEATSINK "thermal regulator"
|
||||
#define O_DIAGNOSTIC "diagnostic controller"
|
||||
|
||||
// Non-Standard organs
|
||||
#define O_MOUTH "mouth"
|
||||
#define O_CELL "cell"
|
||||
|
||||
@@ -53,7 +53,11 @@ var/global/list/image/splatter_cache=list()
|
||||
/obj/effect/decal/cleanable/blood/update_icon()
|
||||
if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]"
|
||||
color = basecolor
|
||||
if(synthblood)
|
||||
|
||||
if(basecolor == SYNTH_BLOOD_COLOUR)
|
||||
name = "oil"
|
||||
desc = "It's quite oily."
|
||||
else if(synthblood)
|
||||
name = "synthetic blood"
|
||||
desc = "It's quite greasy."
|
||||
else
|
||||
|
||||
@@ -209,32 +209,45 @@
|
||||
if(stat == DEAD) return
|
||||
|
||||
to_chat(src, "<span class='notice'>Performing self-diagnostic, please wait...</span>")
|
||||
sleep(50)
|
||||
var/output = "<span class='notice'>Self-Diagnostic Results:\n</span>"
|
||||
|
||||
output += "Internal Temperature: [convert_k2c(bodytemperature)] Degrees Celsius\n"
|
||||
spawn(50)
|
||||
var/output = "<span class='notice'>Self-Diagnostic Results:\n</span>"
|
||||
|
||||
output += "Current Battery Charge: [nutrition]\n"
|
||||
output += "Internal Temperature: [convert_k2c(bodytemperature)] Degrees Celsius\n"
|
||||
|
||||
var/toxDam = getToxLoss()
|
||||
if(toxDam)
|
||||
output += "System Instability: <span class='warning'>[toxDam > 25 ? "Severe" : "Moderate"]</span>. Seek charging station for cleanup.\n"
|
||||
else
|
||||
output += "System Instability: <span style='color:green;'>OK</span>\n"
|
||||
if(isSynthetic())
|
||||
output += "Current Battery Charge: [nutrition]\n"
|
||||
|
||||
<<<<<<< HEAD
|
||||
for(var/obj/item/organ/external/EO in organs)
|
||||
if(EO.brute_dam || EO.burn_dam)
|
||||
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > EO.min_broken_damage ? "Heavy Damage" : "Light Damage"]</span>\n" //VOREStation Edit - Makes robotic limb damage scalable
|
||||
else
|
||||
output += "[EO.name] - <span style='color:green;'>OK</span>\n"
|
||||
=======
|
||||
if(isSynthetic())
|
||||
var/toxDam = getToxLoss()
|
||||
if(toxDam)
|
||||
output += "System Instability: <span class='warning'>[toxDam > 25 ? "Severe" : "Moderate"]</span>. Seek charging station for cleanup.\n"
|
||||
else
|
||||
output += "System Instability: <span style='color:green;'>OK</span>\n"
|
||||
>>>>>>> 85d1338... FBP Internal Components (#7445)
|
||||
|
||||
for(var/obj/item/organ/IO in internal_organs)
|
||||
if(IO.damage)
|
||||
output += "[IO.name] - <span class='warning'>[IO.damage > 10 ? "Heavy Damage" : "Light Damage"]</span>\n"
|
||||
else
|
||||
output += "[IO.name] - <span style='color:green;'>OK</span>\n"
|
||||
for(var/obj/item/organ/external/EO in organs)
|
||||
if(EO.robotic >= ORGAN_ASSISTED)
|
||||
if(EO.brute_dam || EO.burn_dam)
|
||||
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > ROBOLIMB_REPAIR_CAP ? "Heavy Damage" : "Light Damage"]</span>\n"
|
||||
else
|
||||
output += "[EO.name] - <span style='color:green;'>OK</span>\n"
|
||||
|
||||
to_chat(src,output)
|
||||
for(var/obj/item/organ/IO in internal_organs)
|
||||
if(IO.robotic >= ORGAN_ASSISTED)
|
||||
if(IO.damage)
|
||||
output += "[IO.name] - <span class='warning'>[IO.damage > 10 ? "Heavy Damage" : "Light Damage"]</span>\n"
|
||||
else
|
||||
output += "[IO.name] - <span style='color:green;'>OK</span>\n"
|
||||
|
||||
to_chat(src,output)
|
||||
|
||||
/mob/living/carbon/human
|
||||
var/next_sonar_ping = 0
|
||||
|
||||
@@ -784,10 +784,19 @@
|
||||
if (species.body_temperature == null)
|
||||
return //this species doesn't have metabolic thermoregulation
|
||||
|
||||
<<<<<<< HEAD
|
||||
// FBPs will overheat, prosthetic limbs are fine.
|
||||
if(robobody_count)
|
||||
if(!nif || !nif.flag_check(NIF_O_HEATSINKS,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF heatsinks
|
||||
bodytemperature += round(robobody_count*1.75)
|
||||
=======
|
||||
// FBPs will overheat when alive, prosthetic limbs are fine.
|
||||
if(stat != DEAD && robobody_count)
|
||||
bodytemperature += round(robobody_count*1.15)
|
||||
var/obj/item/organ/internal/robotic/heatsink/HS = internal_organs_by_name[O_HEATSINK]
|
||||
if(!HS || HS.is_broken())
|
||||
bodytemperature += round(robobody_count*0.5)
|
||||
>>>>>>> 85d1338... FBP Internal Components (#7445)
|
||||
|
||||
var/body_temperature_difference = species.body_temperature - bodytemperature
|
||||
|
||||
@@ -906,14 +915,14 @@
|
||||
if(reagents)
|
||||
chem_effects.Cut()
|
||||
|
||||
if(!isSynthetic())
|
||||
if(touching)
|
||||
touching.metabolize()
|
||||
if(ingested)
|
||||
ingested.metabolize()
|
||||
if(bloodstr)
|
||||
bloodstr.metabolize()
|
||||
|
||||
if(touching)
|
||||
touching.metabolize()
|
||||
if(ingested)
|
||||
ingested.metabolize()
|
||||
if(bloodstr)
|
||||
bloodstr.metabolize()
|
||||
if(!isSynthetic())
|
||||
|
||||
var/total_phoronloss = 0
|
||||
for(var/obj/item/I in src)
|
||||
@@ -1454,7 +1463,7 @@
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='danger'>You lose directional control!</span>")
|
||||
Confuse(10)
|
||||
if (getToxLoss() >= 45)
|
||||
if (getToxLoss() >= 45 && !isSynthetic())
|
||||
spawn vomit()
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
var/show_ssd = "fast asleep"
|
||||
var/virus_immune
|
||||
var/short_sighted // Permanent weldervision.
|
||||
var/blood_name = "blood" // Name for the species' blood.
|
||||
var/blood_volume = 560 // Initial blood volume.
|
||||
var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
|
||||
var/blood_level_safe = 0.85 //"Safe" blood level; above this, you're OK
|
||||
|
||||
@@ -63,6 +63,14 @@
|
||||
else
|
||||
return blood_color
|
||||
|
||||
/datum/species/proc/get_blood_name(var/mob/living/carbon/human/H)
|
||||
if(H)
|
||||
var/datum/robolimb/company = H.isSynthetic()
|
||||
if(company)
|
||||
return company.blood_name
|
||||
else
|
||||
return blood_name
|
||||
|
||||
/datum/species/proc/get_virus_immune(var/mob/living/carbon/human/H)
|
||||
return ((H && H.isSynthetic()) ? 1 : virus_immune)
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
secondary_langs = list(LANGUAGE_PROMETHEAN, LANGUAGE_SOL_COMMON) // For some reason, having this as their species language does not allow it to be chosen.
|
||||
assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) // Prometheans are weird, let's just assume they can use basically any language.
|
||||
|
||||
blood_name = "gelatinous ooze"
|
||||
|
||||
breath_type = null
|
||||
poison_type = null
|
||||
|
||||
|
||||
@@ -36,8 +36,13 @@ var/const/CE_STABLE_THRESHOLD = 0.5
|
||||
for(var/datum/reagent/blood/B in vessel.reagent_list)
|
||||
if(B.id == "blood")
|
||||
B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.get_blood_colour(src),"blood_type"=dna.b_type, \
|
||||
"resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = list())
|
||||
"resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = list(), "blood_name" = species.get_blood_name(src))
|
||||
|
||||
if(isSynthetic())
|
||||
B.data["species"] = "synthetic"
|
||||
|
||||
B.color = B.data["blood_colour"]
|
||||
B.name = B.data["blood_name"]
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/handle_blood()
|
||||
@@ -369,6 +374,9 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
|
||||
B.synthblood = synth
|
||||
B.update_icon()
|
||||
|
||||
if(source.data["blood_name"])
|
||||
B.name = source.data["blood_name"]
|
||||
|
||||
// Update blood information.
|
||||
if(source.data["blood_DNA"])
|
||||
B.blood_DNA = list()
|
||||
|
||||
@@ -37,3 +37,19 @@
|
||||
if(ishuman(owner))
|
||||
H = owner
|
||||
color = H.species.blood_color
|
||||
|
||||
/obj/item/organ/internal/heart/machine
|
||||
name = "hydraulic hub"
|
||||
icon_state = "pump-on"
|
||||
organ_tag = O_PUMP
|
||||
dead_icon = "pump-off"
|
||||
robotic = ORGAN_ROBOT
|
||||
|
||||
standard_pulse_level = PULSE_NONE
|
||||
|
||||
/obj/item/organ/internal/stomach/machine/handle_organ_proc_special()
|
||||
..()
|
||||
if(owner && owner.stat != DEAD)
|
||||
owner.bodytemperature += round(owner.robobody_count * 0.25, 0.1)
|
||||
|
||||
return
|
||||
|
||||
14
code/modules/organs/internal/robotic/diagnostic.dm
Normal file
14
code/modules/organs/internal/robotic/diagnostic.dm
Normal file
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Controls the ability to do a scan for internal damage / temperature.
|
||||
*/
|
||||
|
||||
/obj/item/organ/internal/robotic/diagnostic
|
||||
name = "diagnostic processor"
|
||||
|
||||
icon_state = "diagnostic"
|
||||
|
||||
organ_tag = O_DIAGNOSTIC
|
||||
|
||||
organ_verbs = list(
|
||||
/mob/living/carbon/human/proc/self_diagnostics
|
||||
)
|
||||
58
code/modules/organs/internal/robotic/heatsink.dm
Normal file
58
code/modules/organs/internal/robotic/heatsink.dm
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
/obj/item/organ/internal/robotic/heatsink
|
||||
name = "heatsink"
|
||||
icon_state = "heatsink"
|
||||
|
||||
organ_tag = O_HEATSINK
|
||||
|
||||
/obj/item/organ/internal/robotic/heatsink/handle_organ_proc_special()
|
||||
if(owner && owner.stat != DEAD)
|
||||
owner.bodytemperature += round(owner.robobody_count * 0.75, 0.1)
|
||||
|
||||
var/thermostat = owner.species.body_temperature
|
||||
var/turf/T = get_turf(src)
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
var/efficiency = max(0,(1 - owner.get_pressure_weakness(environment.return_pressure())) * (1 - damage / max_damage))
|
||||
var/temp_adj = 0
|
||||
var/env_temp = get_environment_temperature()
|
||||
var/thermal_protection = owner.get_heat_protection(env_temp)
|
||||
|
||||
if(thermal_protection < 1)
|
||||
temp_adj = min(owner.bodytemperature - max(thermostat, env_temp), owner.robobody_count * 2)
|
||||
else
|
||||
temp_adj = min(owner.bodytemperature - thermostat, owner.robobody_count * 2)
|
||||
|
||||
if(temp_adj < 0)
|
||||
return
|
||||
|
||||
owner.bodytemperature -= temp_adj*efficiency
|
||||
|
||||
if(owner.bodytemperature > owner.species.heat_level_2) // If you're already overheating to the point of melting, the heatsink starts causing problems.
|
||||
owner.adjustToxLoss(2 * damage / max_damage)
|
||||
take_damage(max(0.5,round(damage / max_damage, 0.1)))
|
||||
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/robotic/heatsink/proc/get_environment_temperature()
|
||||
if(istype(owner.loc, /obj/mecha))
|
||||
var/obj/mecha/M = owner.loc
|
||||
return M.return_temperature()
|
||||
else if(istype(owner.loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||
return owner.loc:air_contents.temperature
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
|
||||
var/efficiency = 1
|
||||
|
||||
if(environment)
|
||||
efficiency = (1 - owner.get_pressure_weakness(environment.return_pressure())) * (1 - damage / max_damage)
|
||||
|
||||
if(istype(T, /turf/space))
|
||||
return owner.species.heat_level_2 * efficiency
|
||||
|
||||
if(!environment)
|
||||
return owner.species.heat_level_2 * efficiency
|
||||
|
||||
return environment.temperature
|
||||
11
code/modules/organs/internal/robotic/robotic.dm
Normal file
11
code/modules/organs/internal/robotic/robotic.dm
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
/obj/item/organ/internal/robotic
|
||||
name = "FBP component"
|
||||
desc = "A complex piece of a much more complex machine."
|
||||
|
||||
icon_state = "eyes-prosthetic"
|
||||
|
||||
can_reject = FALSE // It's a robotic part. Why would it reject.
|
||||
decays = FALSE // Ditto. Rust takes a while.
|
||||
|
||||
robotic = ORGAN_ROBOT
|
||||
@@ -48,3 +48,20 @@
|
||||
|
||||
/obj/item/organ/internal/stomach/xeno
|
||||
color = "#555555"
|
||||
acidtype = "pacid"
|
||||
|
||||
/obj/item/organ/internal/stomach/machine
|
||||
name = "reagent cycler"
|
||||
icon_state = "cycler"
|
||||
organ_tag = O_CYCLER
|
||||
|
||||
robotic = ORGAN_ROBOT
|
||||
|
||||
acidtype = "sacid"
|
||||
|
||||
/obj/item/organ/internal/stomach/machine/handle_organ_proc_special()
|
||||
..()
|
||||
if(owner && owner.stat != DEAD)
|
||||
owner.bodytemperature += round(owner.robobody_count * 0.25, 0.1)
|
||||
|
||||
return
|
||||
|
||||
@@ -51,7 +51,12 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
||||
var/skin_tone // If set, applies skin tone rather than part color Overrides color.
|
||||
var/skin_color // If set, applies skin color rather than part color.
|
||||
var/blood_color = "#030303"
|
||||
<<<<<<< HEAD
|
||||
var/list/species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_XENOCHIMERA) //VOREStation Edit
|
||||
=======
|
||||
var/blood_name = "oil"
|
||||
var/list/species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA)
|
||||
>>>>>>> 85d1338... FBP Internal Components (#7445)
|
||||
var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") //"Species Name" = "Robolimb Company" , List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites.
|
||||
var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors.
|
||||
var/parts = BP_ALL //Defines what parts said brand can replace on a body.
|
||||
@@ -171,6 +176,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
||||
desc = "This limb looks to be more like a strange.. puppet, than a prosthetic."
|
||||
icon = 'icons/mob/human_races/cyberlimbs/veymed/dionaea/skrellian.dmi'
|
||||
blood_color = "#63b521"
|
||||
blood_name = "synthetic ichor"
|
||||
speech_bubble_appearance = "machine"
|
||||
unavailable_to_build = 1
|
||||
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_TAJ, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT)
|
||||
@@ -307,6 +313,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
||||
skin_tone = 1
|
||||
species_alternates = list(SPECIES_SKRELL = "Vey-Med - Skrell")
|
||||
blood_color = "#CCCCCC"
|
||||
blood_name = "coolant"
|
||||
speech_bubble_appearance = "normal"
|
||||
//robo_brute_mod = 1.1 //VOREStation Edit
|
||||
//robo_burn_mod = 1.1 //VOREStation Edit
|
||||
@@ -320,6 +327,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
||||
skin_color = TRUE
|
||||
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_TAJ, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_DIONA, SPECIES_ZADDAT)
|
||||
blood_color = "#4451cf"
|
||||
blood_name = "coolant"
|
||||
speech_bubble_appearance = "normal"
|
||||
robo_brute_mod = 1.05
|
||||
robo_burn_mod = 1.05
|
||||
|
||||
@@ -22,6 +22,13 @@
|
||||
..()
|
||||
owner.adjust_nutrition(-rand(10 / severity, 50 / severity))
|
||||
|
||||
/obj/item/organ/internal/cell/machine/handle_organ_proc_special()
|
||||
..()
|
||||
if(owner && owner.stat != DEAD)
|
||||
owner.bodytemperature += round(owner.robobody_count * 0.5, 0.1)
|
||||
|
||||
return
|
||||
|
||||
// Used for an MMI or posibrain being installed into a human.
|
||||
/obj/item/organ/internal/mmi_holder
|
||||
name = "brain interface"
|
||||
@@ -51,6 +58,11 @@
|
||||
/obj/item/organ/internal/mmi_holder/proc/tick_defib_timer()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/mmi_holder/proc/get_control_efficiency()
|
||||
. = max(0, 1 - round(damage / max_damage, 0.1))
|
||||
|
||||
return .
|
||||
|
||||
/obj/item/organ/internal/mmi_holder/proc/update_from_mmi()
|
||||
|
||||
if(!stored_mmi.brainmob)
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
// Give them fancy new organs.
|
||||
owner.internal_organs_by_name[O_CELL] = new /obj/item/organ/internal/cell(owner,1)
|
||||
owner.internal_organs_by_name[O_VOICE] = new /obj/item/organ/internal/voicebox/robot(owner, 1)
|
||||
owner.internal_organs_by_name[O_PUMP] = new /obj/item/organ/internal/heart/machine(owner,1)
|
||||
owner.internal_organs_by_name[O_CYCLER] = new /obj/item/organ/internal/stomach/machine(owner,1)
|
||||
owner.internal_organs_by_name[O_HEATSINK] = new /obj/item/organ/internal/robotic/heatsink(owner,1)
|
||||
owner.internal_organs_by_name[O_DIAGNOSTIC] = new /obj/item/organ/internal/robotic/diagnostic(owner,1)
|
||||
|
||||
/obj/item/organ/external/chest/handle_germ_effects()
|
||||
. = ..() //Should return an infection level
|
||||
|
||||
@@ -114,6 +114,10 @@
|
||||
|
||||
for(var/datum/reagent/current in reagent_list)
|
||||
if(current.id == id)
|
||||
if(current.id == "blood")
|
||||
if(!isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container.
|
||||
continue
|
||||
|
||||
current.volume += amount
|
||||
if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful
|
||||
current.mix_data(data, amount)
|
||||
|
||||
@@ -22,7 +22,10 @@
|
||||
var/overdose_mod = 1 //Modifier to overdose damage
|
||||
var/can_overdose_touch = FALSE // Can the chemical OD when processing on touch?
|
||||
var/scannable = 0 // Shows up on health analyzers.
|
||||
var/affects_dead = 0
|
||||
|
||||
var/affects_dead = 0 // Does this chem process inside a corpse?
|
||||
var/affects_robots = 0 // Does this chem process inside a Synth?
|
||||
|
||||
var/cup_icon_state = null
|
||||
var/cup_name = null
|
||||
var/cup_desc = null
|
||||
@@ -55,6 +58,8 @@
|
||||
return
|
||||
if(!affects_dead && M.stat == DEAD)
|
||||
return
|
||||
if(!affects_robots && M.isSynthetic())
|
||||
return
|
||||
if(!istype(location))
|
||||
return
|
||||
|
||||
@@ -79,28 +84,55 @@
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.has_organ[O_HEART] && (active_metab.metabolism_class == CHEM_BLOOD))
|
||||
var/obj/item/organ/internal/heart/Pump = H.internal_organs_by_name[O_HEART]
|
||||
if(!Pump)
|
||||
removed *= 0.1
|
||||
else if(Pump.standard_pulse_level == PULSE_NONE) // No pulse normally means chemicals process a little bit slower than normal.
|
||||
removed *= 0.8
|
||||
else // Otherwise, chemicals process as per percentage of your current pulse, or, if you have no pulse but are alive, by a miniscule amount.
|
||||
removed *= max(0.1, H.pulse / Pump.standard_pulse_level)
|
||||
if(!H.isSynthetic())
|
||||
if(H.species.has_organ[O_HEART] && (active_metab.metabolism_class == CHEM_BLOOD))
|
||||
var/obj/item/organ/internal/heart/Pump = H.internal_organs_by_name[O_HEART]
|
||||
if(!Pump)
|
||||
removed *= 0.1
|
||||
else if(Pump.standard_pulse_level == PULSE_NONE) // No pulse normally means chemicals process a little bit slower than normal.
|
||||
removed *= 0.8
|
||||
else // Otherwise, chemicals process as per percentage of your current pulse, or, if you have no pulse but are alive, by a miniscule amount.
|
||||
removed *= max(0.1, H.pulse / Pump.standard_pulse_level)
|
||||
|
||||
if(H.species.has_organ[O_STOMACH] && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
var/obj/item/organ/internal/stomach/Chamber = H.internal_organs_by_name[O_STOMACH]
|
||||
if(Chamber)
|
||||
ingest_rem_mult *= max(0.1, 1 - (Chamber.damage / Chamber.max_damage))
|
||||
else
|
||||
ingest_rem_mult = 0.1
|
||||
if(H.species.has_organ[O_STOMACH] && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
var/obj/item/organ/internal/stomach/Chamber = H.internal_organs_by_name[O_STOMACH]
|
||||
if(Chamber)
|
||||
ingest_rem_mult *= max(0.1, 1 - (Chamber.damage / Chamber.max_damage))
|
||||
else
|
||||
ingest_rem_mult = 0.1
|
||||
|
||||
if(H.species.has_organ[O_INTESTINE] && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
var/obj/item/organ/internal/intestine/Tube = H.internal_organs_by_name[O_INTESTINE]
|
||||
if(Tube)
|
||||
ingest_abs_mult *= max(0.1, 1 - (Tube.damage / Tube.max_damage))
|
||||
else
|
||||
ingest_abs_mult = 0.1
|
||||
if(H.species.has_organ[O_INTESTINE] && (active_metab.metabolism_class == CHEM_INGEST))
|
||||
var/obj/item/organ/internal/intestine/Tube = H.internal_organs_by_name[O_INTESTINE]
|
||||
if(Tube)
|
||||
ingest_abs_mult *= max(0.1, 1 - (Tube.damage / Tube.max_damage))
|
||||
else
|
||||
ingest_abs_mult = 0.1
|
||||
|
||||
else
|
||||
var/obj/item/organ/internal/heart/machine/Pump = H.internal_organs_by_name[O_PUMP]
|
||||
var/obj/item/organ/internal/stomach/machine/Cycler = H.internal_organs_by_name[O_CYCLER]
|
||||
|
||||
if(active_metab.metabolism_class == CHEM_BLOOD)
|
||||
if(Pump)
|
||||
removed *= 1.1 - Pump.damage / Pump.max_damage
|
||||
else
|
||||
removed *= 0.1
|
||||
|
||||
else if(active_metab.metabolism_class == CHEM_INGEST) // If the pump is damaged, we waste chems from the tank.
|
||||
if(Pump)
|
||||
ingest_abs_mult *= max(0.25, 1 - Pump.damage / Pump.max_damage)
|
||||
|
||||
else
|
||||
ingest_abs_mult *= 0.2
|
||||
|
||||
if(Cycler) // If we're damaged, we empty our tank slower.
|
||||
ingest_rem_mult = max(0.1, 1 - (Cycler.damage / Cycler.max_damage))
|
||||
|
||||
else
|
||||
ingest_rem_mult = 0.1
|
||||
|
||||
else if(active_metab.metabolism_class == CHEM_TOUCH) // Machines don't exactly absorb chemicals.
|
||||
removed *= 0.5
|
||||
|
||||
if(filtered_organs && filtered_organs.len)
|
||||
for(var/organ_tag in filtered_organs)
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
..()
|
||||
if(data && data["blood_colour"])
|
||||
color = data["blood_colour"]
|
||||
|
||||
return
|
||||
|
||||
/datum/reagent/blood/get_data() // Just in case you have a reagent that handles data differently.
|
||||
@@ -49,6 +50,11 @@
|
||||
H.adjust_nutrition(removed)
|
||||
is_vampire = 1 //VOREStation Edit END
|
||||
if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent.
|
||||
if(data["species"] == M.species.name) // Unless it's Promethean goo, then refill this one's goo.
|
||||
M.inject_blood(src, volume * volume_mod)
|
||||
remove_self(volume)
|
||||
return
|
||||
|
||||
M.heal_organ_damage(0.2 * removed * volume_mod, 0) // More 'effective' blood means more usable material.
|
||||
M.adjust_nutrition(20 * removed * volume_mod)
|
||||
M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed)
|
||||
@@ -91,6 +97,23 @@
|
||||
if(alien == IS_SLIME) //They don't have blood, so it seems weird that they would instantly 'process' the chemical like another species does.
|
||||
affect_ingest(M, alien, removed)
|
||||
return
|
||||
|
||||
if(M.isSynthetic())
|
||||
return
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
var/datum/reagent/blood/recipient = H.get_blood(H.vessel)
|
||||
|
||||
if(recipient && blood_incompatible(data["blood_type"], recipient.data["blood_type"], data["species"], recipient.data["species"]))
|
||||
H.inject_blood(src, removed * volume_mod)
|
||||
|
||||
if(!H.isSynthetic() && data["species"] == "synthetic") // Remember not to inject oil into your veins, it's bad for you.
|
||||
H.reagents.add_reagent("toxin", removed * 1.5)
|
||||
|
||||
return
|
||||
|
||||
M.inject_blood(src, volume * volume_mod)
|
||||
remove_self(volume)
|
||||
|
||||
|
||||
@@ -1481,6 +1481,7 @@
|
||||
color = "#555555"
|
||||
metabolism = REM * 4 // Nanomachines gotta go fast.
|
||||
scannable = 1
|
||||
affects_robots = TRUE
|
||||
|
||||
/datum/reagent/healing_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.heal_organ_damage(2 * removed, 2 * removed)
|
||||
|
||||
@@ -487,6 +487,24 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
|
||||
affects_robots = TRUE
|
||||
|
||||
/datum/reagent/coolant/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(M.isSynthetic() && ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
var/datum/reagent/blood/coolant = H.get_blood(H.vessel)
|
||||
|
||||
if(coolant)
|
||||
H.vessel.add_reagent("blood", removed, coolant.data)
|
||||
|
||||
else
|
||||
H.vessel.add_reagent("blood", removed)
|
||||
H.fixblood()
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
/datum/reagent/ultraglue
|
||||
name = "Ultra Glue"
|
||||
id = "glue"
|
||||
|
||||
@@ -1013,6 +1013,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re
|
||||
reagent_state = SOLID
|
||||
color = "#555555"
|
||||
metabolism = REM * 4 // Nanomachines. Fast.
|
||||
affects_robots = TRUE
|
||||
|
||||
/datum/reagent/shredding_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.adjustBruteLoss(4 * removed)
|
||||
@@ -1026,6 +1027,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re
|
||||
reagent_state = SOLID
|
||||
color = "#555555"
|
||||
metabolism = REM * 4
|
||||
affects_robots = TRUE
|
||||
|
||||
/datum/reagent/irradiated_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
SSradiation.radiate(get_turf(M), 20) // Irradiate people around you.
|
||||
@@ -1040,6 +1042,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re
|
||||
color = "#555555"
|
||||
metabolism = REM * 4
|
||||
filtered_organs = list(O_SPLEEN)
|
||||
affects_robots = TRUE
|
||||
|
||||
/datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time.
|
||||
|
||||
@@ -193,6 +193,34 @@
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 5625)
|
||||
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/hydraulic
|
||||
name = "Hydraulic Hub"
|
||||
id = "pros_hydraulic"
|
||||
build_path = /obj/item/organ/internal/heart/machine
|
||||
time = 15
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7500, MAT_PLASTIC = 3000)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/reagcycler
|
||||
name = "Reagent Cycler"
|
||||
id = "pros_reagcycler"
|
||||
build_path = /obj/item/organ/internal/stomach/machine
|
||||
time = 15
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7500, MAT_PLASTIC = 3000)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/heatsink
|
||||
name = "Heatsink"
|
||||
id = "pros_heatsink"
|
||||
build_path = /obj/item/organ/internal/robotic/heatsink
|
||||
time = 15
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7500, MAT_PLASTIC = 3000)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/diagnostic
|
||||
name = "Diagnostic Controller"
|
||||
id = "pros_diagnostic"
|
||||
build_path = /obj/item/organ/internal/robotic/diagnostic
|
||||
time = 15
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7500, MAT_PLASTIC = 3000)
|
||||
|
||||
/datum/design/item/prosfab/pros/internal/heart
|
||||
name = "Prosthetic Heart"
|
||||
id = "pros_heart"
|
||||
|
||||
@@ -2985,6 +2985,9 @@
|
||||
#include "code\modules\organs\internal\voicebox.dm"
|
||||
#include "code\modules\organs\internal\augment\armmounted.dm"
|
||||
#include "code\modules\organs\internal\augment\bio.dm"
|
||||
#include "code\modules\organs\internal\robotic\diagnostic.dm"
|
||||
#include "code\modules\organs\internal\robotic\heatsink.dm"
|
||||
#include "code\modules\organs\internal\robotic\robotic.dm"
|
||||
#include "code\modules\organs\subtypes\diona.dm"
|
||||
#include "code\modules\organs\subtypes\indestructible.dm"
|
||||
#include "code\modules\organs\subtypes\machine.dm"
|
||||
|
||||
Reference in New Issue
Block a user