Overdose changes + General chem mods

This commit is contained in:
Atermonera
2020-08-05 17:52:26 -07:00
committed by VirgoBot
parent e6904301c7
commit 012a4a290c
9 changed files with 723 additions and 20 deletions

View File

@@ -610,4 +610,342 @@
return return
if(scanner) if(scanner)
return scanner.tgui_interact(user) <<<<<<< HEAD
return scanner.tgui_interact(user)
=======
return ui_interact(user)
/obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
data["connected"] = scanner ? 1 : 0
if(scanner)
data["occupied"] = scanner.occupant ? 1 : 0
var/occupantData[0]
if(scanner.occupant && ishuman(scanner.occupant))
var/mob/living/carbon/human/H = scanner.occupant
occupantData["name"] = H.name
occupantData["stat"] = H.stat
occupantData["health"] = H.health
occupantData["maxHealth"] = H.getMaxHealth()
occupantData["hasVirus"] = H.virus2.len
occupantData["bruteLoss"] = H.getBruteLoss()
occupantData["oxyLoss"] = H.getOxyLoss()
occupantData["toxLoss"] = H.getToxLoss()
occupantData["fireLoss"] = H.getFireLoss()
occupantData["radLoss"] = H.radiation
occupantData["cloneLoss"] = H.getCloneLoss()
occupantData["brainLoss"] = H.getBrainLoss()
occupantData["paralysis"] = H.paralysis
occupantData["paralysisSeconds"] = round(H.paralysis / 4)
occupantData["bodyTempC"] = H.bodytemperature-T0C
occupantData["bodyTempF"] = (((H.bodytemperature-T0C) * 1.8) + 32)
occupantData["hasBorer"] = H.has_brain_worms()
var/bloodData[0]
if(H.vessel)
var/blood_volume = round(H.vessel.get_reagent_amount("blood"))
var/blood_max = H.species.blood_volume
bloodData["volume"] = blood_volume
bloodData["percent"] = round(((blood_volume / blood_max)*100))
occupantData["blood"] = bloodData
var/reagentData[0]
if(H.reagents.reagent_list.len >= 1)
for(var/datum/reagent/R in H.reagents.reagent_list)
reagentData[++reagentData.len] = list("name" = R.name, "amount" = R.volume, "overdose" = ((R.overdose && R.volume > R.overdose) ? "Overdose" : ""))
else
reagentData = null
occupantData["reagents"] = reagentData
var/ingestedData[0]
if(H.ingested.reagent_list.len >= 1)
for(var/datum/reagent/R in H.ingested.reagent_list)
ingestedData[++ingestedData.len] = list("name" = R.name, "amount" = R.volume, "overdose" = ((R.overdose && R.volume > R.overdose) ? "Overdose" : ""))
else
ingestedData = null
occupantData["ingested"] = ingestedData
var/extOrganData[0]
for(var/obj/item/organ/external/E in H.organs)
var/organData[0]
organData["name"] = E.name
organData["open"] = E.open
organData["germ_level"] = E.germ_level
organData["bruteLoss"] = E.brute_dam
organData["fireLoss"] = E.burn_dam
var/implantData[0]
for(var/obj/I in E.implants)
var/implantSubData[0]
implantSubData["name"] = I.name
if(is_type_in_list(I, known_implants))
implantSubData["known"] = 1
implantData.Add(list(implantSubData))
organData["implants"] = implantData
organData["implants_len"] = implantData.len
var/organStatus[0]
if(E.status & ORGAN_DESTROYED)
organStatus["destroyed"] = 1
if(E.status & ORGAN_BROKEN)
organStatus["broken"] = E.broken_description
if(E.robotic >= ORGAN_ROBOT)
organStatus["robotic"] = 1
if(E.splinted)
organStatus["splinted"] = 1
if(E.status & ORGAN_BLEEDING)
organStatus["bleeding"] = 1
if(E.status & ORGAN_DEAD)
organStatus["dead"] = 1
for(var/datum/wound/W in E.wounds)
if(W.internal)
organStatus["internalBleeding"] = 1
break
organData["status"] = organStatus
if(istype(E, /obj/item/organ/external/chest) && H.is_lung_ruptured())
organData["lungRuptured"] = 1
extOrganData.Add(list(organData))
occupantData["extOrgan"] = extOrganData
var/intOrganData[0]
for(var/obj/item/organ/I in H.internal_organs)
var/organData[0]
organData["name"] = I.name
if(I.status & ORGAN_ASSISTED)
organData["desc"] = "Assisted"
else if(I.robotic >= ORGAN_ROBOT)
organData["desc"] = "Mechanical"
else
organData["desc"] = null
organData["germ_level"] = I.germ_level
organData["damage"] = I.damage
intOrganData.Add(list(organData))
occupantData["intOrgan"] = intOrganData
occupantData["blind"] = (H.sdisabilities & BLIND)
occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED)
data["occupant"] = occupantData
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 800)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/body_scanconsole/Topic(href, href_list)
if(..())
return 1
if (href_list["print_p"])
generate_printing_text()
if (!(printing) && printing_text)
printing = 1
visible_message("<span class='notice'>\The [src] rattles and prints out a sheet of paper.</span>")
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
P.info = "<CENTER><B>Body Scan - [href_list["name"]]</B></CENTER><BR>"
P.info += "<b>Time of scan:</b> [worldtime2stationtime(world.time)]<br><br>"
P.info += "[printing_text]"
P.info += "<br><br><b>Notes:</b><br>"
P.name = "Body Scan - [href_list["name"]] ([worldtime2stationtime(world.time)])"
printing = null
printing_text = null
/obj/machinery/body_scanconsole/proc/generate_printing_text()
var/dat = ""
if(scanner)
var/mob/living/carbon/human/occupant = scanner.occupant
dat = "<font color='blue'><b>Occupant Statistics:</b></font><br>" //Blah obvious
if(istype(occupant)) //is there REALLY someone in there?
var/t1
switch(occupant.stat) // obvious, see what their status is
if(0)
t1 = "Conscious"
if(1)
t1 = "Unconscious"
else
t1 = "*dead*"
dat += "<font color=[occupant.health > (occupant.getMaxHealth() / 2) ? "blue" : "red"]>\tHealth %: [(occupant.health / occupant.getMaxHealth())*100], ([t1])</font><br>"
if(occupant.virus2.len)
dat += "<font color='red'>Viral pathogen detected in blood stream.</font><BR>"
var/extra_font = null
extra_font = "<font color=[occupant.getBruteLoss() < 60 ? "blue" : "red"]>"
dat += "[extra_font]\t-Brute Damage %: [occupant.getBruteLoss()]</font><br>"
extra_font = "<font color=[occupant.getOxyLoss() < 60 ? "blue" : "red"]>"
dat += "[extra_font]\t-Respiratory Damage %: [occupant.getOxyLoss()]</font><br>"
extra_font = "<font color=[occupant.getToxLoss() < 60 ? "blue" : "red"]>"
dat += "[extra_font]\t-Toxin Content %: [occupant.getToxLoss()]</font><br>"
extra_font = "<font color=[occupant.getFireLoss() < 60 ? "blue" : "red"]>"
dat += "[extra_font]\t-Burn Severity %: [occupant.getFireLoss()]</font><br>"
extra_font = "<font color=[occupant.radiation < 10 ? "blue" : "red"]>"
dat += "[extra_font]\tRadiation Level %: [occupant.radiation]</font><br>"
extra_font = "<font color=[occupant.getCloneLoss() < 1 ? "blue" : "red"]>"
dat += "[extra_font]\tGenetic Tissue Damage %: [occupant.getCloneLoss()]</font><br>"
extra_font = "<font color=[occupant.getBrainLoss() < 1 ? "blue" : "red"]>"
dat += "[extra_font]\tApprox. Brain Damage %: [occupant.getBrainLoss()]</font><br>"
dat += "Paralysis Summary %: [occupant.paralysis] ([round(occupant.paralysis / 4)] seconds left!)<br>"
dat += "Body Temperature: [occupant.bodytemperature-T0C]&deg;C ([occupant.bodytemperature*1.8-459.67]&deg;F)<br>"
dat += "<hr>"
if(occupant.has_brain_worms())
dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.<br>"
if(occupant.vessel)
var/blood_volume = round(occupant.vessel.get_reagent_amount("blood"))
var/blood_max = occupant.species.blood_volume
var/blood_percent = blood_volume / blood_max
blood_percent *= 100
extra_font = "<font color=[blood_volume > 448 ? "blue" : "red"]>"
dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)</font><br>"
if(occupant.reagents)
for(var/datum/reagent/R in occupant.reagents.reagent_list)
dat += "Reagent: [R.name], Amount: [R.volume]<br>"
if(occupant.ingested)
for(var/datum/reagent/R in occupant.ingested.reagent_list)
dat += "Stomach: [R.name], Amount: [R.volume]<br>"
dat += "<hr><table border='1'>"
dat += "<tr>"
dat += "<th>Organ</th>"
dat += "<th>Burn Damage</th>"
dat += "<th>Brute Damage</th>"
dat += "<th>Other Wounds</th>"
dat += "</tr>"
for(var/obj/item/organ/external/e in occupant.organs)
dat += "<tr>"
var/AN = ""
var/open = ""
var/infected = ""
var/robot = ""
var/imp = ""
var/bled = ""
var/splint = ""
var/internal_bleeding = ""
var/lung_ruptured = ""
var/o_dead = ""
for(var/datum/wound/W in e.wounds) if(W.internal)
internal_bleeding = "<br>Internal bleeding"
break
if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured())
lung_ruptured = "Lung ruptured:"
if(e.splinted)
splint = "Splinted:"
if(e.status & ORGAN_BLEEDING)
bled = "Bleeding:"
if(e.status & ORGAN_BROKEN)
AN = "[e.broken_description]:"
if(e.robotic >= ORGAN_ROBOT)
robot = "Prosthetic:"
if(e.status & ORGAN_DEAD)
o_dead = "Necrotic:"
if(e.open)
open = "Open:"
switch (e.germ_level)
if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200)
infected = "Mild Infection:"
if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
infected = "Mild Infection+:"
if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
infected = "Mild Infection++:"
if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
infected = "Acute Infection:"
if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
infected = "Acute Infection+:"
if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_THREE - 50)
infected = "Acute Infection++:"
if (INFECTION_LEVEL_THREE -49 to INFINITY)
infected = "Gangrene Detected:"
var/unknown_body = 0
for(var/I in e.implants)
if(is_type_in_list(I,known_implants))
imp += "[I] implanted:"
else
unknown_body++
if(unknown_body)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
if(!(e.status & ORGAN_DESTROYED))
dat += "<td>[e.name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured][o_dead]</td>"
else
dat += "<td>[e.name]</td><td>-</td><td>-</td><td>Not Found</td>"
dat += "</tr>"
for(var/obj/item/organ/i in occupant.internal_organs)
var/mech = ""
var/i_dead = ""
if(i.status & ORGAN_ASSISTED)
mech = "Assisted:"
if(i.robotic >= ORGAN_ROBOT)
mech = "Mechanical:"
if(i.status & ORGAN_DEAD)
i_dead = "Necrotic:"
var/infection = "None"
switch (i.germ_level)
if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200)
infection = "Mild Infection:"
if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
infection = "Mild Infection+:"
if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
infection = "Mild Infection++:"
if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
infection = "Acute Infection:"
if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
infection = "Acute Infection+:"
if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_THREE - 50)
infection = "Acute Infection++:"
if (INFECTION_LEVEL_THREE -49 to INFINITY)
infection = "Necrosis Detected:"
dat += "<tr>"
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech][i_dead]</td><td></td>"
dat += "</tr>"
dat += "</table>"
if(occupant.sdisabilities & BLIND)
dat += "<font color='red'>Cataracts detected.</font><BR>"
if(occupant.disabilities & NEARSIGHTED)
dat += "<font color='red'>Retinal misalignment detected.</font><BR>"
else
dat += "\The [src] is empty."
else
dat = "<font color='red'> Error: No Body Scanner connected.</font>"
printing_text = dat
>>>>>>> c820021... Merge pull request #7361 from ExabyteDiscord/Upstream-Dog-ChemistryThing

View File

@@ -136,10 +136,10 @@ HALOGEN COUNTER - Radcount on mobs
for(var/A in C.reagents.reagent_list) for(var/A in C.reagents.reagent_list)
var/datum/reagent/R = A var/datum/reagent/R = A
if(R.scannable) if(R.scannable)
reagentdata["[R.id]"] = "<span class='notice'>\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]</span><br>" reagentdata["[R.id]"] = "<span class='notice'>\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - <span class='danger'>Overdose</span>" : ""]</span><br>"
else else
unknown++ unknown++
unknownreagents["[R.id]"] = "<span class='notice'>\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]</span><br>" unknownreagents["[R.id]"] = "<span class='notice'>\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - <span class='danger'>Overdose</span>" : ""]</span><br>"
if(reagentdata.len) if(reagentdata.len)
dat += "<span class='notice'>Beneficial reagents detected in subject's blood:</span><br>" dat += "<span class='notice'>Beneficial reagents detected in subject's blood:</span><br>"
for(var/d in reagentdata) for(var/d in reagentdata)
@@ -156,14 +156,14 @@ HALOGEN COUNTER - Radcount on mobs
var/stomachreagentdata[0] var/stomachreagentdata[0]
var/stomachunknownreagents[0] var/stomachunknownreagents[0]
for(var/B in C.ingested.reagent_list) for(var/B in C.ingested.reagent_list)
var/datum/reagent/T = B var/datum/reagent/R = B
if(T.scannable) if(R.scannable)
stomachreagentdata["[T.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span><br>" stomachreagentdata["[R.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - <span class='danger'>Overdose</span>" : ""]</span><br>"
if (advscan == 0 || showadvscan == 0) if (advscan == 0 || showadvscan == 0)
dat += "<span class='notice'>[T.name] found in subject's stomach.</span><br>" dat += "<span class='notice'>[R.name] found in subject's stomach.</span><br>"
else else
++unknown ++unknown
stomachunknownreagents["[T.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span><br>" stomachunknownreagents["[R.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - <span class='danger'>Overdose</span>" : ""]</span><br>"
if(advscan >= 1 && showadvscan == 1) if(advscan >= 1 && showadvscan == 1)
dat += "<span class='notice'>Beneficial reagents detected in subject's stomach:</span><br>" dat += "<span class='notice'>Beneficial reagents detected in subject's stomach:</span><br>"
for(var/d in stomachreagentdata) for(var/d in stomachreagentdata)
@@ -180,14 +180,14 @@ HALOGEN COUNTER - Radcount on mobs
var/touchreagentdata[0] var/touchreagentdata[0]
var/touchunknownreagents[0] var/touchunknownreagents[0]
for(var/B in C.touching.reagent_list) for(var/B in C.touching.reagent_list)
var/datum/reagent/T = B var/datum/reagent/R = B
if(T.scannable) if(R.scannable)
touchreagentdata["[T.id]"] = "<span class='notice'>\t[round(C.touching.get_reagent_amount(T.id), 1)]u [T.name]</span><br>" touchreagentdata["[R.id]"] = "<span class='notice'>\t[round(C.touching.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.can_overdose_touch && R.volume > R.overdose) ? " - <span class='danger'>Overdose</span>" : ""]</span><br>"
if (advscan == 0 || showadvscan == 0) if (advscan == 0 || showadvscan == 0)
dat += "<span class='notice'>[T.name] found in subject's dermis.</span><br>" dat += "<span class='notice'>[R.name] found in subject's dermis.</span><br>"
else else
++unknown ++unknown
touchunknownreagents["[T.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span><br>" touchunknownreagents["[R.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.can_overdose_touch && R.volume > R.overdose) ? " - <span class='danger'>Overdose</span>" : ""]</span><br>"
if(advscan >= 1 && showadvscan == 1) if(advscan >= 1 && showadvscan == 1)
dat += "<span class='notice'>Beneficial reagents detected in subject's dermis:</span><br>" dat += "<span class='notice'>Beneficial reagents detected in subject's dermis:</span><br>"
for(var/d in touchreagentdata) for(var/d in touchreagentdata)

View File

@@ -19,7 +19,7 @@
var/dose = 0 var/dose = 0
var/max_dose = 0 var/max_dose = 0
var/overdose = 0 //Amount at which overdose starts var/overdose = 0 //Amount at which overdose starts
var/overdose_mod = 2 //Modifier to overdose damage var/overdose_mod = 1 //Modifier to overdose damage
var/can_overdose_touch = FALSE // Can the chemical OD when processing on touch? var/can_overdose_touch = FALSE // Can the chemical OD when processing on touch?
var/scannable = 0 // Shows up on health analyzers. var/scannable = 0 // Shows up on health analyzers.
var/affects_dead = 0 var/affects_dead = 0
@@ -146,7 +146,10 @@
if(ishuman(M)) if(ishuman(M))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
overdose_mod *= H.species.chemOD_mod overdose_mod *= H.species.chemOD_mod
M.adjustToxLoss(removed * overdose_mod) // 6 damage per unit at minimum, scales with excessive reagents. Rounding should help keep damage consistent between ingest / inject, but isn't perfect.
// Hardcapped at 3.6 damage per tick, or 18 damage per unit at 0.2 metabolic rate so that you can't instakill people with overdoses by feeding them infinite periadaxon.
// Overall, max damage is slightly less effective than hydrophoron, and 1/5 as effective as cyanide.
M.adjustToxLoss(min(removed * overdose_mod * round(3 + 3 * volume / overdose), 3.6))
/datum/reagent/proc/initialize_data(var/newdata) // Called when the reagent is created. /datum/reagent/proc/initialize_data(var/newdata) // Called when the reagent is created.
if(!isnull(newdata)) if(!isnull(newdata))

View File

@@ -180,7 +180,21 @@
L.ExtinguishMob() L.ExtinguishMob()
L.water_act(amount / 25) // Div by 25, as water_act multiplies it by 5 in order to calculate firestack modification. L.water_act(amount / 25) // Div by 25, as water_act multiplies it by 5 in order to calculate firestack modification.
remove_self(needed) remove_self(needed)
<<<<<<< HEAD
/* //VOREStation Edit Start. Stops slimes from dying from water. Fixes fuel affect_ingest, too. /* //VOREStation Edit Start. Stops slimes from dying from water. Fixes fuel affect_ingest, too.
=======
// Put out cigarettes if splashed.
if(istype(L, /mob/living/carbon/human))
var/mob/living/carbon/human/H = L
if(H.wear_mask)
if(istype(H.wear_mask, /obj/item/clothing/mask/smokable))
var/obj/item/clothing/mask/smokable/S = H.wear_mask
if(S.lit)
S.quench()
H.visible_message("<span class='notice'>[H]\'s [S.name] is put out.</span>")
>>>>>>> c820021... Merge pull request #7361 from ExabyteDiscord/Upstream-Dog-ChemistryThing
/datum/reagent/water/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/water/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_SLIME) if(alien == IS_SLIME)
M.adjustToxLoss(6 * removed) M.adjustToxLoss(6 * removed)

View File

@@ -260,7 +260,7 @@
step(M, pick(cardinal)) step(M, pick(cardinal))
if(prob(5)) if(prob(5))
M.emote(pick("twitch", "drool", "moan")) M.emote(pick("twitch", "drool", "moan"))
M.adjustBrainLoss(0.1) M.adjustBrainLoss(0.5 * removed)
/datum/reagent/nitrogen /datum/reagent/nitrogen
name = "Nitrogen" name = "Nitrogen"

View File

@@ -48,6 +48,7 @@
reagent_state = LIQUID reagent_state = LIQUID
color = "#BF0000" color = "#BF0000"
overdose = REAGENTS_OVERDOSE overdose = REAGENTS_OVERDOSE
overdose_mod = 0.25
scannable = 1 scannable = 1
/datum/reagent/bicaridine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/bicaridine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -214,6 +215,8 @@
reagent_state = LIQUID reagent_state = LIQUID
color = "#225722" color = "#225722"
scannable = 1 scannable = 1
overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 0 // Not used, but it shouldn't deal toxin damage anyways. Carth heals toxins!
/datum/reagent/carthatoline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/carthatoline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA) if(alien == IS_DIONA)
@@ -234,6 +237,11 @@
if(alien == IS_SLIME) if(alien == IS_SLIME)
H.druggy = max(M.druggy, 5) H.druggy = max(M.druggy, 5)
/datum/reagent/carthatoline/overdose(var/mob/living/carbon/M, var/alien, var/removed)
M.adjustHalLoss(2)
var/mob/living/carbon/human/H = M
H.internal_organs_by_name[O_STOMACH].take_damage(removed * 2) // Causes stomach contractions, makes sense for an overdose to make it much worse.
/datum/reagent/dexalin /datum/reagent/dexalin
name = "Dexalin" name = "Dexalin"
id = "dexalin" id = "dexalin"
@@ -267,6 +275,7 @@
reagent_state = LIQUID reagent_state = LIQUID
color = "#0040FF" color = "#0040FF"
overdose = REAGENTS_OVERDOSE * 0.5 overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 1.25
scannable = 1 scannable = 1
/datum/reagent/dexalinp/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/dexalinp/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -434,7 +443,8 @@
taste_description = "bitterness" taste_description = "bitterness"
reagent_state = LIQUID reagent_state = LIQUID
color = "#C8A5DC" color = "#C8A5DC"
overdose = 60 overdose = REAGENTS_OVERDOSE * 2
overdose_mod = 0.75
scannable = 1 scannable = 1
metabolism = 0.02 metabolism = 0.02
mrate_static = TRUE mrate_static = TRUE
@@ -458,7 +468,8 @@
taste_description = "sourness" taste_description = "sourness"
reagent_state = LIQUID reagent_state = LIQUID
color = "#CB68FC" color = "#CB68FC"
overdose = 30 overdose = REAGENTS_OVERDOSE
overdose_mod = 0.75
scannable = 1 scannable = 1
metabolism = 0.02 metabolism = 0.02
mrate_static = TRUE mrate_static = TRUE
@@ -482,6 +493,7 @@
reagent_state = LIQUID reagent_state = LIQUID
color = "#800080" color = "#800080"
overdose = 20 overdose = 20
overdose_mod = 0.75
scannable = 1 scannable = 1
metabolism = 0.02 metabolism = 0.02
mrate_static = TRUE mrate_static = TRUE
@@ -529,7 +541,7 @@
M.AdjustWeakened(-1) M.AdjustWeakened(-1)
holder.remove_reagent("mindbreaker", 5) holder.remove_reagent("mindbreaker", 5)
M.hallucination = max(0, M.hallucination - 10) M.hallucination = max(0, M.hallucination - 10)
M.adjustToxLoss(5 * removed * chem_effective) // It used to be incredibly deadly due to an oversight. Not anymore! M.adjustToxLoss(10 * removed * chem_effective) // It used to be incredibly deadly due to an oversight. Not anymore!
M.add_chemical_effect(CE_PAINKILLER, 20 * chem_effective * M.species.chem_strength_pain) M.add_chemical_effect(CE_PAINKILLER, 20 * chem_effective * M.species.chem_strength_pain)
/datum/reagent/hyperzine /datum/reagent/hyperzine
@@ -540,6 +552,7 @@
reagent_state = LIQUID reagent_state = LIQUID
color = "#FF3300" color = "#FF3300"
overdose = REAGENTS_OVERDOSE * 0.5 overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 0.25
/datum/reagent/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_TAJARA) if(alien == IS_TAJARA)
@@ -553,6 +566,13 @@
M.emote(pick("twitch", "blink_r", "shiver")) M.emote(pick("twitch", "blink_r", "shiver"))
M.add_chemical_effect(CE_SPEEDBOOST, 1) M.add_chemical_effect(CE_SPEEDBOOST, 1)
/datum/reagent/hyperzine/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(prob(5)) // 1 in 20
var/mob/living/carbon/human/H = M
H.internal_organs_by_name[O_HEART].take_damage(1)
to_chat(M, "<span class='warning'>Huh... Is this what a heart attack feels like?</span>")
/datum/reagent/alkysine /datum/reagent/alkysine
name = "Alkysine" name = "Alkysine"
id = "alkysine" id = "alkysine"
@@ -609,6 +629,7 @@
reagent_state = LIQUID reagent_state = LIQUID
color = "#561EC3" color = "#561EC3"
overdose = 10 overdose = 10
overdose_mod = 1.5
scannable = 1 scannable = 1
/datum/reagent/peridaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/peridaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -628,6 +649,11 @@
if(prob(33)) if(prob(33))
H.Confuse(10) H.Confuse(10)
/datum/reagent/peridaxon/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.adjustHalLoss(5)
M.hallucination = max(M.hallucination, 10)
/datum/reagent/osteodaxon /datum/reagent/osteodaxon
name = "Osteodaxon" name = "Osteodaxon"
id = "osteodaxon" id = "osteodaxon"
@@ -636,6 +662,7 @@
color = "#C9BCE3" color = "#C9BCE3"
metabolism = REM * 0.5 metabolism = REM * 0.5
overdose = REAGENTS_OVERDOSE * 0.5 overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 1.5
scannable = 1 scannable = 1
/datum/reagent/osteodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/osteodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -658,6 +685,7 @@
color = "#4246C7" color = "#4246C7"
metabolism = REM * 0.5 metabolism = REM * 0.5
overdose = REAGENTS_OVERDOSE * 0.5 overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 1.5
scannable = 1 scannable = 1
var/repair_strength = 3 var/repair_strength = 3
@@ -679,6 +707,23 @@
if(W.damage <= 0) if(W.damage <= 0)
O.wounds -= W O.wounds -= W
/datum/reagent/myelamine/overdose(var/mob/living/carbon/M, var/alien, var/removed)
// Copypaste of affect_blood with slight adjustment. Heals slightly faster at the cost of high toxins
..()
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/wound_heal = removed * repair_strength / 2
for(var/obj/item/organ/external/O in H.bad_external_organs)
for(var/datum/wound/W in O.wounds)
if(W.bleeding())
W.damage = max(W.damage - wound_heal, 0)
if(W.damage <= 0)
O.wounds -= W
if(W.internal)
W.damage = max(W.damage - wound_heal, 0)
if(W.damage <= 0)
O.wounds -= W
/datum/reagent/respirodaxon /datum/reagent/respirodaxon
name = "Respirodaxon" name = "Respirodaxon"
id = "respirodaxon" id = "respirodaxon"
@@ -688,6 +733,7 @@
color = "#4444FF" color = "#4444FF"
metabolism = REM * 1.5 metabolism = REM * 1.5
overdose = 10 overdose = 10
overdose_mod = 1.75
scannable = 1 scannable = 1
/datum/reagent/respirodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/respirodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -719,6 +765,7 @@
color = "#8B4513" color = "#8B4513"
metabolism = REM * 1.5 metabolism = REM * 1.5
overdose = 10 overdose = 10
overdose_mod = 1.75
scannable = 1 scannable = 1
/datum/reagent/gastirodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/gastirodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -750,6 +797,7 @@
color = "#D2691E" color = "#D2691E"
metabolism = REM * 1.5 metabolism = REM * 1.5
overdose = 10 overdose = 10
overdose_mod = 1.75
scannable = 1 scannable = 1
/datum/reagent/hepanephrodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/hepanephrodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -783,6 +831,7 @@
color = "#FF4444" color = "#FF4444"
metabolism = REM * 1.5 metabolism = REM * 1.5
overdose = 10 overdose = 10
overdose_mod = 1.75
scannable = 1 scannable = 1
/datum/reagent/cordradaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/cordradaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -810,6 +859,7 @@
reagent_state = SOLID reagent_state = SOLID
color = "#7B4D4F" color = "#7B4D4F"
overdose = 20 overdose = 20
overdose_mod = 1.5
scannable = 1 scannable = 1
/datum/reagent/immunosuprizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/immunosuprizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -867,6 +917,7 @@
color = "#84B2B0" color = "#84B2B0"
metabolism = REM * 0.75 metabolism = REM * 0.75
overdose = 20 overdose = 20
overdose_mod = 1.5
scannable = 1 scannable = 1
/datum/reagent/skrellimmuno/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/skrellimmuno/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -1008,6 +1059,7 @@
color = "#008000" color = "#008000"
metabolism = REM * 0.25 metabolism = REM * 0.25
overdose = REAGENTS_OVERDOSE overdose = REAGENTS_OVERDOSE
overdose_mod = 1.25
scannable = 1 scannable = 1
/datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -1056,6 +1108,7 @@
color = "#FFB0B0" color = "#FFB0B0"
mrate_static = TRUE mrate_static = TRUE
overdose = 10 overdose = 10
overdose_mod = 1.5
scannable = 1 scannable = 1
data = 0 data = 0
@@ -1237,6 +1290,7 @@
reagent_state = SOLID reagent_state = SOLID
color = "#669900" color = "#669900"
overdose = REAGENTS_OVERDOSE overdose = REAGENTS_OVERDOSE
overdose_mod = 2
scannable = 1 scannable = 1
/datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)

View File

@@ -423,6 +423,16 @@
if(prob(5)) if(prob(5))
M.vomit() M.vomit()
/datum/reagent/space_cleaner/touch_mob(var/mob/living/L, var/amount)
if(istype(L, /mob/living/carbon/human))
var/mob/living/carbon/human/H = L
if(H.wear_mask)
if(istype(H.wear_mask, /obj/item/clothing/mask/smokable))
var/obj/item/clothing/mask/smokable/S = H.wear_mask
if(S.lit)
S.quench() // No smoking in my medbay!
H.visible_message("<span class='notice'>[H]\'s [S.name] is put out.</span>")
/datum/reagent/lube // TODO: spraying on borgs speeds them up /datum/reagent/lube // TODO: spraying on borgs speeds them up
name = "Space Lube" name = "Space Lube"
id = "lube" id = "lube"

View File

@@ -46,6 +46,11 @@
color = "#792300" color = "#792300"
strength = 10 strength = 10
/datum/reagent/toxin/amatoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
// Trojan horse. Waits until most of the toxin has gone through the body before dealing the bulk of it in one big strike.
if(volume < max_dose * 0.2)
M.adjustToxLoss(max_dose * strength * removed / (max_dose * 0.2))
/datum/reagent/toxin/carpotoxin /datum/reagent/toxin/carpotoxin
name = "Carpotoxin" name = "Carpotoxin"
id = "carpotoxin" id = "carpotoxin"
@@ -55,6 +60,10 @@
color = "#003333" color = "#003333"
strength = 10 strength = 10
/datum/reagent/toxin/carpotoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.adjustBrainLoss(strength / 4 * removed)
/datum/reagent/toxin/neurotoxic_protein /datum/reagent/toxin/neurotoxic_protein
name = "toxic protein" name = "toxic protein"
id = "neurotoxic_protein" id = "neurotoxic_protein"
@@ -212,6 +221,7 @@
color = "#d0583a" color = "#d0583a"
metabolism = REM * 3 metabolism = REM * 3
overdose = 10 overdose = 10
overdose_mod = 0.5
strength = 3 strength = 3
/datum/reagent/toxin/stimm/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/toxin/stimm/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -225,6 +235,13 @@
M.take_organ_damage(6 * removed, 0) M.take_organ_damage(6 * removed, 0)
M.add_chemical_effect(CE_SPEEDBOOST, 1) M.add_chemical_effect(CE_SPEEDBOOST, 1)
/datum/reagent/toxin/stimm/overdose(var/mob/living/carbon/M, var/alient, var/removed)
..()
if(prob(10)) // 1 in 10. This thing's made with welder fuel and fertilizer, what do you expect?
var/mob/living/carbon/human/H = M
H.internal_organs_by_name[O_HEART].take_damage(1)
to_chat(M, "<span class='warning'>Huh... Is this what a heart attack feels like?</span>")
/datum/reagent/toxin/potassium_chloride /datum/reagent/toxin/potassium_chloride
name = "Potassium Chloride" name = "Potassium Chloride"
id = "potassium_chloride" id = "potassium_chloride"
@@ -658,7 +675,7 @@
metabolism = REM * 0.5 metabolism = REM * 0.5
ingest_met = REM * 1.5 ingest_met = REM * 1.5
overdose = REAGENTS_OVERDOSE * 0.5 overdose = REAGENTS_OVERDOSE * 0.5
overdose_mod = 5 //For that good, lethal feeling overdose_mod = 2 //For that good, lethal feeling // Reduced with overdose changes. Slightly stronger than before
/datum/reagent/chloralhydrate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) /datum/reagent/chloralhydrate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA) if(alien == IS_DIONA)

267
nano/templates/adv_med.tmpl Normal file
View File

@@ -0,0 +1,267 @@
<!--
Title: Body Scanner UI
Used In File(s): \code\game\machinery\adv_med.dm
-->
{{if !data.occupied}}
<h3>No occupant detected.</h3>
{{else}}
<h4><b>Occupant Data:</b></h4>
<div class="item">
<div class="itemLabelNarrow">
Name:
</div>
<div class="itemContent">
{{:data.occupant.name}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
Health:
</div>
{{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 25) ? 'average' : 'bad')}}
<div class="itemContent" style="width: 60px">
{{:helper.round(data.occupant.health / data.occupant.maxHealth)*100}}%
</div>
<div class="item">
<div class="itemLabelNarrow">
Status:
</div>
<div class="itemContent">
{{if data.occupant.stat==0}}
Stable
{{else data.occupant.stat==1}}
Non-Responsive
{{else}}
Dead
{{/if}}
</div>
</div>
{{:helper.link('Print', 'document', {'print_p' : 1, 'name' : data.occupant.name})}}
<h4><b>Damage:</b></h4>
<table class='item'>
<tr>
<td class='itemLabel' style='width: 10%;'>Brute:</td>
<td class='itemContent brute' style='width: 10%;'>{{:data.occupant.bruteLoss}}</td>
<td class='itemLabel' style='width: 15%;'>Brain:</td>
<td class='itemContent' style='width: 15%;'>{{:data.occupant.brainLoss}}</td>
</tr>
<tr>
<td class='itemLabel' style='width: 10%;'>Burn:</td>
<td class='itemContent burn' style='width: 10%;'>{{:data.occupant.fireLoss}}</td>
<td class='itemLabel' style='width: 15%;'>Radiation:</td>
<td class='itemContent' style='width: 15%;'>{{:data.occupant.radLoss}}</td>
</tr>
<tr>
<td class='itemLabel' style='width: 10%;'>Oxygen:</td>
<td class='itemContent oxyloss' style='width: 10%;'>{{:data.occupant.oxyLoss}}</td>
<td class='itemLabel' style='width: 15%;'>Genetic:</td>
<td class='itemContent' style='width: 15%;'>{{:data.occupant.cloneLoss}}</td>
</tr>
<tr>
<td class='itemLabel' style='width: 10%;'>Toxins:</td>
<td class='itemContent toxin' style='width: 10%;'>{{:data.occupant.toxLoss}}</td>
<td class='itemLabel' style='width: 15%;'>Paralysis:</td>
<td class='itemContent' style='width: 20%;'>{{:data.occupant.paralysis}}% ({{:data.occupant.paralysisSeconds}} seconds left!)</td>
</tr>
<tr>
<td class='itemLabelNarrow'>Body Temperature:</td>
<td class="itemContentMedium">{{:helper.round(data.occupant.bodyTempC*10)/10}}&deg;C, {{:helper.round(data.occupant.bodyTempF*10)/10}}&deg;F</td>
</tr>
</table>
</div>
{{if data.occupant.hasVirus}}
<div class="notice">
Viral pathogen detected in blood stream.
</div>
{{/if}}
{{if data.occupant.hasBorer}}
<div class="notice">
Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
</div>
{{/if}}
{{if data.occupant.blind}}
<div class="item bad">Pupils unresponsive.</div>
{{/if}}
{{if data.occupant.nearsighted}}
<div class="item bad">Retinal Misalignment Detected</div>
{{/if}}
<h4><b>Blood</b></h4>
<table class="item">
<tr>
<td class='itemLabel' style='width: 10%;'>Volume:</td>
<td class='itemContent' style='width: 10%;'>{{:data.occupant.blood.volume}}</td>
<td class='itemLabel' style='width: 10%;'>Percent:</td>
<td class='itemContent' style='width: 10%;'>{{:data.occupant.blood.percent}}%</td>
</tr>
</table>
<h4>Blood Reagents</h4>
{{if data.occupant.reagents}}
<table class='item'>
{{for data.occupant.reagents}}
<tr>
<td class='itemLabel' style='width: 20%;'>{{:value.name}}:</td>
<td class='itemContent' style='width: 10%;'>{{:value.amount}}</td>
<td class='itemContent brute' style='width: 10%;'>{{:value.overdose}}</td>
</tr>
{{/for}}
</table>
{{else}}
<div class='item'>No blood reagents detected.</div>
{{/if}}
<h4>Stomach Reagents</h4>
{{if data.occupant.ingested}}
<table class='item'>
{{for data.occupant.ingested}}
<tr>
<td class='itemLabel' style='width: 20%;'>{{:value.name}}:</td>
<td class='itemContent' style='width: 10%;'>{{:value.amount}}</td>
<td class='itemContent brute' style='width: 10%;'>{{:value.overdose}}</td>
</tr>
{{/for}}
</table>
{{else}}
<div class='item'>No stomach reagents detected.</div>
{{/if}}
<h4><b>External Organs</b></h4>
<div class="itemGroup">
{{for data.occupant.extOrgan}}
<div class="item">
{{if value.status.destroyed}}
<div class="itemLabelWide">
<b>{{:value.name}}</b><span class="bad"> - DESTROYED</span>
</div>
{{else}}
<div class="item">
<div class="itemLabel">
<b>{{:value.name}}</b>
</div>
</div>
<div class="itemContentNarrow">
{{if value.status.broken}}
{{:value.status.broken}}
{{else value.status.splinted}}
Splinted
{{else value.status.robotic}}
Robotic
{{/if}}
</div>
<div class="itemLabelWide">
&nbsp;Brute/Burn
</div>
<div class="itemContentNarrow">
{{:value.bruteLoss}}/{{:value.fireLoss}}
</div>
<div class="itemLabelWide">
&nbsp;Injuries
</div>
<div class="itemContentNarrow">
{{if !value.status.bleeding}}
{{if !value.status.internalBleeding}}
No Injuries Detected
{{else}}
<span class="bad">Internal Bleeding Detected</span>
{{/if}}
{{else}}
{{if value.status.internalBleeding}}
<div class='notice'>Internal Bleeding Detected. External Bleeding Detected.</div>
{{else}}
<span class="average">External Bleeding Detected</span>
{{/if}}
{{/if}}
</div>
{{if value.germ_level > 100}}
<div class="itemLabelWide">
&nbsp;Infection
</div>
<div class="itemContentNarrow">
{{if value.germ_level < 300}}
Mild Infection
{{else value.germ_level < 400}}
Mild Infection+
{{else value.germ_level < 500}}
Mild Infection++
{{else value.germ_level < 700}}
Acute Infection
{{else value.germ_level < 800}}
Acute Infection+
{{else value.germ_level < 950}}
Acute Infection++
{{else value.germ_level >= 950}}
Gangrene Detected
{{/if}}
</div>
{{/if}}
{{if value.status.dead}}
<div class="itemLabelWide">
&nbsp;Necrosis
</div>
<div class="itemContentNarrow">
Necrotic Tissue Present
</div>
{{/if}}
{{if value.open}}
<div class="itemLabelWider">
&nbsp;Operation Status
</div>
<div class="itemContentNarrow">
Open Incision
</div>
{{/if}}
{{if value.implants_len}}
<div class="itemLabelWide">
&nbsp;Implants
</div>
{{for value.implants :impValue:impindex}}
<div class="itemContentNarrow">
&nbsp;&nbsp;{{:impValue.known ? impValue.name : "Unknown"}}
</div>
{{/for}}
{{/if}}
{{/if}}
</div>
{{/for}}
</div>
<h4><b>Internal Organs</b></h4>
<div class="itemGroup">
{{for data.occupant.intOrgan}}
<div class="item">
<div class="itemLabelWide">
<b>{{:value.name}}</b>
</div>
<div class='itemContentNarrow'>
{{:value.desc != null ? value.desc : ""}}
</div>
</div>
<div class="item">
{{if value.germ_level > 100}}
<div class="itemLabel">
&nbsp;Infection
</div>
<div class="itemContentNarrow">
{{if value.germ_level < 300}}
Mild Infection
{{else value.germ_level < 400}}
Mild Infection+
{{else value.germ_level < 500}}
Mild Infection++
{{else value.germ_level < 700}}
Acute Infection
{{else value.germ_level < 800}}
Acute Infection+
{{else value.germ_level < 950}}
Acute Infection++
{{else value.germ_level >= 950}}
Necrosis Detected
{{/if}}
</div>
{{/if}}
<div class="itemLabelWide">
&nbsp;Damage
</div>
<div class="itemContentNarrow">
{{:value.damage}}
</div>
</div>
{{/for}}
</div>
{{/if}}