mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 01:49:19 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -184,7 +184,7 @@
|
||||
|
||||
////organ defines
|
||||
#define STANDARD_ORGAN_THRESHOLD 100
|
||||
#define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS)))
|
||||
#define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS))) / 3 //Base organ healing can be amped by a factor of up to x5 via satiety. This assumes it to be somewhat in the upper center of positive satiety as base.
|
||||
#define STANDARD_ORGAN_DECAY (1/(15 MINUTES / (2 SECONDS))) //designed to fail organs when left to decay for ~15 minutes. 2 SECOND is SSmobs tickrate.
|
||||
|
||||
|
||||
|
||||
@@ -63,6 +63,9 @@
|
||||
|
||||
#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone
|
||||
|
||||
#define SYNTHTISSUE_BORROW_CAP 250 //The cap for synthtissue's borrowed health value when used on someone dead or already having borrowed health.
|
||||
#define SYNTHTISSUE_DAMAGE_FLIP_CYCLES 45 //After how many cycles the damage will be pure toxdamage as opposed to clonedamage like initially. Gradually changes during its cycles.
|
||||
|
||||
//reagent bitflags, used for altering how they works
|
||||
#define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body
|
||||
#define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing
|
||||
|
||||
2
code/__DEFINES/sandcode/chat.dm
Normal file
2
code/__DEFINES/sandcode/chat.dm
Normal file
@@ -0,0 +1,2 @@
|
||||
/// Adds a generic box around whatever message you're sending in chat. Really makes things stand out.
|
||||
#define examine_block(str) ("<div class='examine_block'>" + str + "</div>")
|
||||
@@ -396,12 +396,15 @@ SUBSYSTEM_DEF(air)
|
||||
*/
|
||||
|
||||
/datum/controller/subsystem/air/proc/run_delay_heuristics()
|
||||
if(!equalize_enabled)
|
||||
cost_equalize = 0
|
||||
if(should_do_equalization)
|
||||
eq_cooldown--
|
||||
if(eq_cooldown <= 0)
|
||||
equalize_enabled = TRUE
|
||||
if(should_do_equalization)
|
||||
if(!equalize_enabled)
|
||||
cost_equalize = 0
|
||||
if(should_do_equalization)
|
||||
eq_cooldown--
|
||||
if(eq_cooldown <= 0)
|
||||
equalize_enabled = TRUE
|
||||
else
|
||||
equalize_enabled = FALSE
|
||||
var/total_thread_time = cost_turfs + cost_equalize + cost_groups + cost_post_process
|
||||
if(total_thread_time)
|
||||
var/wait_ms = wait * 100
|
||||
|
||||
@@ -453,7 +453,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
m = pick(memetips)
|
||||
|
||||
if(m)
|
||||
to_chat(world, "<span class='purple'><b>Tip of the round: </b>[html_encode(m)]</span>")
|
||||
to_chat(world, examine_block("<span class='purple'><b>Tip of the round: </b>[html_encode(m)]</span>"))
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/check_queue()
|
||||
var/hpc = CONFIG_GET(number/hard_popcap)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/datum/component/mood/proc/print_mood(mob/user)
|
||||
var/msg = "<div class='infobox'><span class='info'><EM>Your current mood</EM></span>\n"
|
||||
var/msg = "<span class='info'><EM>Your current mood</EM></span>\n"
|
||||
msg += "<span class='notice'>My mental status: </span>" //Long term
|
||||
switch(sanity)
|
||||
if(SANITY_GREAT to INFINITY)
|
||||
@@ -94,8 +94,7 @@
|
||||
msg += event.description
|
||||
else
|
||||
msg += "<span class='nicegreen'>I don't have much of a reaction to anything right now.<span>\n"
|
||||
msg += "</div>"
|
||||
to_chat(user || parent, msg)
|
||||
to_chat(user || parent, examine_block(msg))
|
||||
|
||||
///Called after moodevent/s have been added/removed.
|
||||
/datum/component/mood/proc/update_mood()
|
||||
|
||||
@@ -578,8 +578,12 @@
|
||||
/datum/status_effect/regenerative_core/on_apply()
|
||||
. = ..()
|
||||
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core")
|
||||
|
||||
if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, but only get 1/5th of the healing. They can use this to get past the damage threshhold however, and then regularely heal from there.
|
||||
var/turf/T = get_turf(owner)
|
||||
if(T && is_mining_level(T.z))
|
||||
if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, though they ""only"" heal 20 brute + burn damage each instead of 25
|
||||
heal_amount *= 0.8
|
||||
else
|
||||
duration = 10 SECONDS
|
||||
heal_amount *= 0.2
|
||||
owner.adjustBruteLoss(-heal_amount, only_organic = FALSE)
|
||||
if(!AmBloodsucker(owner)) //use your coffin you lazy bastard
|
||||
|
||||
@@ -494,18 +494,20 @@
|
||||
//end changes (yeah the whole proc was modified)
|
||||
|
||||
/atom/proc/examine(mob/user)
|
||||
. = list("[get_examine_string(user, TRUE)].")
|
||||
. = list("[get_examine_string(user, TRUE)].[desc ? "<hr>" : null]")
|
||||
|
||||
if(desc)
|
||||
. += desc
|
||||
|
||||
if(custom_materials)
|
||||
. += "<hr>"
|
||||
var/list/materials_list = list()
|
||||
for(var/i in custom_materials)
|
||||
var/datum/material/M = i
|
||||
materials_list += "[M.name]"
|
||||
. += "<u>It is made out of [english_list(materials_list)]</u>."
|
||||
if(reagents)
|
||||
. += "<hr>"
|
||||
if(reagents.reagents_holder_flags & TRANSPARENT)
|
||||
. += "It contains:"
|
||||
if(length(reagents.reagent_list))
|
||||
|
||||
@@ -423,7 +423,7 @@
|
||||
if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost))
|
||||
H.notify_ghost_cloning("Your heart is being defibrillated!")
|
||||
H.grab_ghost() // Shove them back in their body.
|
||||
else if(H.can_defib())
|
||||
else if(H.can_revive())
|
||||
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
|
||||
|
||||
do_help(H, user)
|
||||
|
||||
@@ -145,7 +145,7 @@ GENETICS SCANNER
|
||||
mob_status = "<span class='alert'><b>Deceased</b></span>"
|
||||
oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss
|
||||
|
||||
var/msg = "<div class='infobox'><span class='info'>Analyzing results for [M]:\n\tOverall status: [mob_status]</span>"
|
||||
var/msg = "<span class='info'>Analyzing results for [M]:\n\tOverall status: [mob_status]</span>"
|
||||
|
||||
// Damage descriptions
|
||||
if(brute_loss > 10)
|
||||
@@ -450,14 +450,13 @@ GENETICS SCANNER
|
||||
if(cyberimp_detect)
|
||||
msg += "<span class='notice'>Detected cybernetic modifications:</span>\n"
|
||||
msg += "<span class='notice'>[cyberimp_detect]</span>\n"
|
||||
msg += "</div>"
|
||||
to_chat(user, msg)
|
||||
to_chat(user, examine_block(msg))
|
||||
SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE)
|
||||
|
||||
/proc/chemscan(mob/living/user, mob/living/M)
|
||||
if(istype(M))
|
||||
if(M.reagents)
|
||||
var/msg = "<div class='infobox'><span class='info'>"
|
||||
var/msg = "<span class='info'>"
|
||||
if(M.reagents.reagent_list.len)
|
||||
var/list/datum/reagent/reagents = list()
|
||||
for(var/datum/reagent/R in M.reagents.reagent_list)
|
||||
@@ -496,8 +495,8 @@ GENETICS SCANNER
|
||||
if(95 to INFINITY)
|
||||
msg += "<span class='danger'>Subject contains a extremely dangerous amount of toxic isomers.</span>\n"
|
||||
|
||||
msg += "</span></div>"
|
||||
to_chat(user, msg)
|
||||
msg += "</span>"
|
||||
to_chat(user, examine_block(msg))
|
||||
|
||||
/obj/item/healthanalyzer/verb/toggle_mode()
|
||||
set name = "Switch Verbosity"
|
||||
@@ -691,12 +690,12 @@ GENETICS SCANNER
|
||||
var/icon = target
|
||||
if(visible)
|
||||
user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "<span class='notice'>You use the analyzer on [icon2html(icon, user)] [target].</span>")
|
||||
to_chat(user, "<span class='boldnotice'>Results of analysis of [icon2html(icon, user)] [target].</span>")
|
||||
var/results = "<span class='boldnotice'>Results of analysis of [icon2html(icon, user)] [target].</span>"
|
||||
|
||||
var/list/airs = islist(mixture) ? mixture : list(mixture)
|
||||
for(var/g in airs)
|
||||
if(airs.len > 1) //not a unary gas mixture
|
||||
to_chat(user, "<span class='boldnotice'>Node [airs.Find(g)]</span>")
|
||||
results += "\n<span class='boldnotice'>Node [airs.Find(g)]</span>"
|
||||
var/datum/gas_mixture/air_contents = g
|
||||
|
||||
var/total_moles = air_contents.total_moles()
|
||||
@@ -706,27 +705,29 @@ GENETICS SCANNER
|
||||
var/cached_scan_results = air_contents.analyzer_results
|
||||
|
||||
if(total_moles > 0)
|
||||
to_chat(user, "<span class='notice'>Moles: [round(total_moles, 0.01)] mol</span>")
|
||||
to_chat(user, "<span class='notice'>Volume: [volume] L</span>")
|
||||
to_chat(user, "<span class='notice'>Pressure: [round(pressure,0.01)] kPa</span>")
|
||||
results += "\n<span class='notice'>Moles: [round(total_moles, 0.01)] mol</span>"
|
||||
results += "\n<span class='notice'>Volume: [volume] L</span>"
|
||||
results += "\n<span class='notice'>Pressure: [round(pressure,0.01)] kPa</span>"
|
||||
|
||||
for(var/id in air_contents.get_gases())
|
||||
if(air_contents.get_moles(id) >= 0.005)
|
||||
var/gas_concentration = air_contents.get_moles(id)/total_moles
|
||||
to_chat(user, "<span class='notice'>[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='notice'>Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)</span>")
|
||||
results += "\n<span class='notice'>[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)</span>"
|
||||
results += "\n<span class='notice'>Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)</span>"
|
||||
|
||||
else
|
||||
if(airs.len > 1)
|
||||
to_chat(user, "<span class='notice'>This node is empty!</span>")
|
||||
results += "\n<span class='notice'>This node is empty!</span>"
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[target] is empty!</span>")
|
||||
results += "\n<span class='notice'>[target] is empty!</span>"
|
||||
|
||||
if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
|
||||
var/instability = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = instability2text(instability)
|
||||
to_chat(user, "<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier]</span>")
|
||||
results += "\n<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>"
|
||||
results += "\n<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier]</span>"
|
||||
|
||||
to_chat(user, examine_block(results))
|
||||
return
|
||||
|
||||
/obj/item/analyzer/proc/scan_turf(mob/user, turf/location)
|
||||
@@ -737,11 +738,11 @@ GENETICS SCANNER
|
||||
var/total_moles = environment.total_moles()
|
||||
var/cached_scan_results = environment.analyzer_results
|
||||
|
||||
to_chat(user, "<span class='info'><B>Results:</B></span>")
|
||||
var/results = "<span class='info'><B>Results:</B></span>"
|
||||
if(abs(pressure - ONE_ATMOSPHERE) < 10)
|
||||
to_chat(user, "<span class='info'>Pressure: [round(pressure, 0.01)] kPa</span>")
|
||||
results += "\n<span class='info'>Pressure: [round(pressure, 0.01)] kPa</span>"
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Pressure: [round(pressure, 0.01)] kPa</span>")
|
||||
results += "\n<span class='alert'>Pressure: [round(pressure, 0.01)] kPa</span>"
|
||||
if(total_moles)
|
||||
|
||||
var/o2_concentration = environment.get_moles(GAS_O2)/total_moles
|
||||
@@ -750,37 +751,39 @@ GENETICS SCANNER
|
||||
var/plasma_concentration = environment.get_moles(GAS_PLASMA)/total_moles
|
||||
|
||||
if(abs(n2_concentration - N2STANDARD) < 20)
|
||||
to_chat(user, "<span class='info'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)</span>")
|
||||
results += "\n<span class='info'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)</span>"
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)</span>")
|
||||
results += "\n<span class='alert'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)</span>"
|
||||
|
||||
if(abs(o2_concentration - O2STANDARD) < 2)
|
||||
to_chat(user, "<span class='info'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)</span>")
|
||||
results += "\n<span class='info'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)</span>"
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)</span>")
|
||||
results += "\n<span class='alert'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)</span>"
|
||||
|
||||
if(co2_concentration > 0.01)
|
||||
to_chat(user, "<span class='alert'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)</span>")
|
||||
results += "\n<span class='alert'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)</span>"
|
||||
else
|
||||
to_chat(user, "<span class='info'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)</span>")
|
||||
results += "\n<span class='info'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)</span>"
|
||||
|
||||
if(plasma_concentration > 0.005)
|
||||
to_chat(user, "<span class='alert'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)</span>")
|
||||
results += "\n<span class='alert'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)</span>"
|
||||
else
|
||||
to_chat(user, "<span class='info'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)</span>")
|
||||
results += "\n<span class='info'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)</span>"
|
||||
|
||||
for(var/id in environment.get_gases())
|
||||
if(id in GLOB.hardcoded_gases)
|
||||
continue
|
||||
var/gas_concentration = environment.get_moles(id)/total_moles
|
||||
to_chat(user, "<span class='alert'>[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='info'>Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)</span>")
|
||||
results += "\n<span class='alert'>[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)</span>"
|
||||
results += "\n<span class='info'>Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)</span>"
|
||||
|
||||
if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
|
||||
var/instability = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = instability2text(instability)
|
||||
to_chat(user, "<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier].</span>")
|
||||
results += "\n<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>"
|
||||
results += "\n<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier].</span>"
|
||||
|
||||
to_chat(user, examine_block(results))
|
||||
|
||||
/obj/item/analyzer/ranged
|
||||
desc = "A hand-held scanner which uses advanced spectroscopy and infrared readings to analyze gases as a distance. Alt-Click to use the built in barometer function."
|
||||
@@ -823,7 +826,7 @@ GENETICS SCANNER
|
||||
slime_scan(T, user)
|
||||
|
||||
/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user)
|
||||
var/output = "<div class='infobox'><b>Slime scan results:</b>"
|
||||
var/output = "<b>Slime scan results:</b>"
|
||||
output += "\n<span class='notice'>[T.colour] [T.is_adult ? "adult" : "baby"] slime</span>"
|
||||
output += "\nNutrition: [T.nutrition]/[T.get_max_nutrition()]"
|
||||
if (T.nutrition < T.get_starve_nutrition())
|
||||
@@ -852,7 +855,7 @@ GENETICS SCANNER
|
||||
output += "\n<span class='notice'>Core mutation in progress: [T.effectmod]</span>"
|
||||
output += "\n<span class = 'notice'>Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]</span>"
|
||||
|
||||
to_chat(user, "[output]</div>")
|
||||
to_chat(user, examine_block(span_info(output)))
|
||||
|
||||
|
||||
/obj/item/nanite_scanner
|
||||
@@ -935,10 +938,14 @@ GENETICS SCANNER
|
||||
if(!iscarbon(C) || !C.has_dna())
|
||||
return
|
||||
buffer = C.dna.mutation_index
|
||||
to_chat(user, "<span class='notice'>Subject [C.name]'s DNA sequence has been saved to buffer.</span>")
|
||||
var/text = "<span class='notice'>Subject [C.name]'s DNA sequence has been saved to buffer.</span>"
|
||||
if(LAZYLEN(buffer))
|
||||
text += "<hr>"
|
||||
for(var/A in buffer)
|
||||
to_chat(user, "<span class='notice'>[get_display_name(A)]</span>")
|
||||
text += "<span class='notice'>[get_display_name(A)]</span>"
|
||||
if(A != buffer[length(A)])
|
||||
text += "\n"
|
||||
to_chat(user, examine_block(text))
|
||||
|
||||
|
||||
/obj/item/sequence_scanner/proc/display_sequence(mob/living/user)
|
||||
|
||||
@@ -43,10 +43,11 @@
|
||||
/mob/living/simple_animal/hostile/clockwork/examine(mob/user)
|
||||
var/t_He = p_they(TRUE)
|
||||
var/t_s = p_s()
|
||||
var/msg = "<div class='infobox'><span class='brass'>This is [icon2html(src, user)] \a <b>[src]</b>!\n"
|
||||
msg += "[desc]\n"
|
||||
var/msg = "<span class='brass'>This is [icon2html(src, user)] \a <b>[src]</b>!\n"
|
||||
if(desc)
|
||||
msg += "<hr>[desc]\n"
|
||||
if(health < maxHealth)
|
||||
msg += "<span class='warning'>"
|
||||
msg += "<hr><span class='warning'>"
|
||||
if(health >= maxHealth/2)
|
||||
msg += "[t_He] look[t_s] slightly dented.\n"
|
||||
else
|
||||
@@ -54,8 +55,8 @@
|
||||
msg += "</span>"
|
||||
var/addendum = examine_info()
|
||||
if(addendum)
|
||||
msg += "[addendum]\n"
|
||||
msg += "</span></div>"
|
||||
msg += "<hr>[addendum]\n"
|
||||
msg += "</span>"
|
||||
|
||||
return list(msg)
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/examine(mob/user)
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src, user)] <b>[src]</b>!")
|
||||
. = list("<span class='info'>This is [icon2html(src, user)] <b>[src]</b>!")
|
||||
|
||||
//Left hand items
|
||||
for(var/obj/item/I in held_items)
|
||||
@@ -81,7 +81,10 @@
|
||||
. += "<span class='warning'>You can see hellfire inside its gaping wounds.</span>"
|
||||
else if(health < (maxHealth/2))
|
||||
. += "<span class='warning'>You can see hellfire inside its wounds.</span>"
|
||||
. += "</span></div>"
|
||||
|
||||
if(length(.) > 1)
|
||||
.[1] += "<hr>"
|
||||
. += "</span>"
|
||||
|
||||
/mob/living/carbon/true_devil/IsAdvancedToolUser()
|
||||
return 1
|
||||
|
||||
@@ -66,20 +66,23 @@
|
||||
/obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params)
|
||||
..()
|
||||
if (istype(O, /obj/item/plant_analyzer))
|
||||
var/msg = "<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <span class='name'>[src]</span>.\n"
|
||||
var/msg = "<span class='info'>This is [icon2html(src, user)] \a <span class='name'>[src]</span>.\n"
|
||||
if(seed)
|
||||
msg += seed.get_analyzer_text()
|
||||
msg += "<hr>[seed.get_analyzer_text()]"
|
||||
var/reag_txt = ""
|
||||
if(seed)
|
||||
for(var/reagent_id in seed.reagents_add)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_id]
|
||||
var/amt = reagents.get_reagent_amount(reagent_id)
|
||||
reag_txt += "\n<span class='info'>- [R.name]: [amt]</span>"
|
||||
reag_txt += "\n\t- [R.name]: [amt]"
|
||||
|
||||
if(reag_txt)
|
||||
msg += reag_txt
|
||||
msg += "</span></div>"
|
||||
to_chat(user, msg)
|
||||
if(seed)
|
||||
msg += "\n"
|
||||
msg += "<span class='notice'>- Plant Reagents -</span>"
|
||||
msg += "[span_info(reag_txt)]"
|
||||
msg += "</span>"
|
||||
to_chat(user, examine_block(msg))
|
||||
else
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
|
||||
@@ -36,11 +36,10 @@
|
||||
/obj/item/grown/attackby(obj/item/O, mob/user, params)
|
||||
..()
|
||||
if (istype(O, /obj/item/plant_analyzer))
|
||||
var/msg = "<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <span class='name'>[src]</span>\n"
|
||||
var/msg = "This is [icon2html(src, user)] \a <span class='name'>[src]</span>\n"
|
||||
if(seed)
|
||||
msg += seed.get_analyzer_text()
|
||||
msg += "</span></div>"
|
||||
to_chat(usr, msg)
|
||||
to_chat(usr, examine_block(span_info(msg)))
|
||||
return
|
||||
|
||||
/obj/item/grown/proc/add_juice()
|
||||
|
||||
@@ -545,29 +545,28 @@
|
||||
|
||||
else if(istype(O, /obj/item/plant_analyzer))
|
||||
var/obj/item/plant_analyzer/P_analyzer = O
|
||||
var/msg = "<div class='infobox'>"
|
||||
var/msg = ""
|
||||
if(myseed)
|
||||
if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS)
|
||||
msg += "*** <B>[myseed.plantname]</B> ***"
|
||||
msg += "\n- Plant Age: <span class='notice'>[age]</span>"
|
||||
msg += "<center><B>[myseed.plantname]</B></center>"
|
||||
msg += "<hr>"
|
||||
msg += "- Plant Age: <span class='notice'>[age]</span>"
|
||||
var/list/text_string = myseed.get_analyzer_text()
|
||||
if(text_string)
|
||||
msg += "\n[text_string]"
|
||||
if(myseed.reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS)
|
||||
msg += "\n- <B>Plant Reagents</B> -"
|
||||
msg += "\n*---------*"
|
||||
for(var/datum/plant_gene/reagent/G in myseed.genes)
|
||||
msg += "\n<span class='notice'>- [G.get_name()] -</span>"
|
||||
msg += "\n*---------*"
|
||||
else
|
||||
msg += "<B>No plant found.</B>"
|
||||
msg += "<hr>"
|
||||
msg += "\n- Weed level: <span class='notice'>[weedlevel] / 10</span>"
|
||||
msg += "\n- Pest level: <span class='notice'>[pestlevel] / 10</span>"
|
||||
msg += "\n- Toxicity level: <span class='notice'>[toxic] / 100</span>"
|
||||
msg += "\n- Water level: <span class='notice'>[waterlevel] / [maxwater]</span>"
|
||||
msg += "\n- Nutrition level: <span class='notice'>[reagents.total_volume] / [maxnutri]</span>"
|
||||
msg += "</div>"
|
||||
to_chat(user, msg)
|
||||
to_chat(user, examine_block(msg))
|
||||
return
|
||||
|
||||
else if(istype(O, /obj/item/cultivator))
|
||||
|
||||
@@ -416,8 +416,8 @@
|
||||
for(var/datum/plant_gene/trait/traits in genes)
|
||||
if(istype(traits, /datum/plant_gene/trait/plant_type))
|
||||
continue
|
||||
all_traits += " [traits.get_name()]"
|
||||
text += "- Plant Traits:[all_traits ? all_traits : " None"]"
|
||||
all_traits += "\n\t- [traits.get_name()]"
|
||||
text += "<span class='notice'>- Plant Traits:[all_traits ? all_traits : " None"]</span>"
|
||||
return text
|
||||
|
||||
/obj/item/seeds/proc/on_chem_reaction(datum/reagents/S) //in case seeds have some special interaction with special chems
|
||||
@@ -425,21 +425,20 @@
|
||||
|
||||
/obj/item/seeds/attackby(obj/item/O, mob/user, params)
|
||||
if (istype(O, /obj/item/plant_analyzer))
|
||||
var/msg = "<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <span class='name'>[src]</span>.</span>"
|
||||
var/msg = "<span class='info'>This is [icon2html(src, user)] \a <span class='name'>[src]</span>.</span>"
|
||||
var/text
|
||||
var/obj/item/plant_analyzer/P_analyzer = O
|
||||
if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS)
|
||||
text = get_analyzer_text()
|
||||
if(text)
|
||||
msg += "\n<span class='notice'>[text]</span>"
|
||||
msg += "<hr>"
|
||||
msg += "<span class='notice'>[text]</span>"
|
||||
if(reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS)
|
||||
msg += "\n<span class='notice'>- Plant Reagents -</span>"
|
||||
msg += "\n<span class='notice'>*---------*</span>"
|
||||
msg += "<hr>"
|
||||
msg += "<span class='notice'>- Plant Reagents -</span>"
|
||||
for(var/datum/plant_gene/reagent/G in genes)
|
||||
msg += "\n<span class='notice'>- [G.get_name()] -</span>"
|
||||
msg += "\n<span class='notice'>*---------*</span>"
|
||||
msg += "</div>"
|
||||
to_chat(user, msg)
|
||||
msg += "\n\t<span class='notice'>- [G.get_name()]</span>"
|
||||
to_chat(user, examine_block(msg))
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/pen))
|
||||
|
||||
@@ -847,16 +847,16 @@
|
||||
update_inv_handcuffed()
|
||||
update_hud_handcuffed()
|
||||
|
||||
/mob/living/carbon/proc/can_defib()
|
||||
/mob/living/carbon/proc/can_revive(ignore_timelimit = FALSE, maximum_brute_dam = MAX_REVIVE_BRUTE_DAMAGE, maximum_fire_dam = MAX_REVIVE_FIRE_DAMAGE, ignore_heart = FALSE)
|
||||
var/tlimit = DEFIB_TIME_LIMIT * 10
|
||||
var/obj/item/organ/heart = getorgan(/obj/item/organ/heart)
|
||||
if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker(src))
|
||||
return
|
||||
if((world.time - timeofdeath) > tlimit)
|
||||
if(!ignore_timelimit && (world.time - timeofdeath) > tlimit)
|
||||
return
|
||||
if((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE))
|
||||
if((getBruteLoss() >= maximum_brute_dam) || (getFireLoss() >= maximum_fire_dam))
|
||||
return
|
||||
if(!heart || (heart.organ_flags & ORGAN_FAILING))
|
||||
if(!ignore_heart && (!heart || (heart.organ_flags & ORGAN_FAILING)))
|
||||
return
|
||||
var/obj/item/organ/brain/BR = getorgan(/obj/item/organ/brain)
|
||||
if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || suiciding)
|
||||
|
||||
@@ -380,15 +380,14 @@
|
||||
embeds = TRUE
|
||||
// this way, we only visibly try to examine ourselves if we have something embedded, otherwise we'll still hug ourselves :)
|
||||
visible_message("<span class='notice'>[src] examines [p_them()]self.</span>", "")
|
||||
output += "<span class='notice'>You check yourself for shrapnel.</span>"
|
||||
output = "<span class='notice'>You check yourself for shrapnel.</span><hr>"
|
||||
if(I.isEmbedHarmless())
|
||||
output += "\n\t <a href='?src=[REF(src)];embedded_object=[REF(I)];embedded_limb=[REF(LB)]' class='warning'>There is \a [I] stuck to your [LB.name]!</a>"
|
||||
else
|
||||
output += "\n\t <a href='?src=[REF(src)];embedded_object=[REF(I)];embedded_limb=[REF(LB)]' class='warning'>There is \a [I] embedded in your [LB.name]!</a>"
|
||||
|
||||
if(output)
|
||||
output += "</div>"
|
||||
to_chat(src, output)
|
||||
to_chat(src, examine_block(output))
|
||||
|
||||
return embeds
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/t_has = p_have()
|
||||
var/t_is = p_are()
|
||||
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>!")
|
||||
. = list("<span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>!")
|
||||
|
||||
if (handcuffed)
|
||||
. += "<span class='warning'>[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!</span>"
|
||||
@@ -158,7 +158,9 @@
|
||||
. += "<span class='love'>[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"].</span>"
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
|
||||
. += "</div>"
|
||||
|
||||
if(length(.) > 1)
|
||||
.[1] += "<hr>"
|
||||
|
||||
/mob/living/carbon/examine_more(mob/user)
|
||||
if(!all_scars)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA))
|
||||
obscure_name = TRUE
|
||||
|
||||
. = list("<div class='infobox'><span class='info'>This is <EM>[!obscure_name ? name : "Unknown"]</EM>!")
|
||||
. = list("<span class='info'>This is <EM>[!obscure_name ? name : "Unknown"]</EM>!")
|
||||
|
||||
var/vampDesc = ReturnVampExamine(user) // Vamps recognize the names of other vamps.
|
||||
var/vassDesc = ReturnVassalExamine(user) // Vassals recognize each other's marks.
|
||||
@@ -504,7 +504,8 @@
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
|
||||
|
||||
. += "</div>"
|
||||
if(length(.) > 1)
|
||||
.[1] += "<hr>"
|
||||
|
||||
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
|
||||
var/list/dat = list()
|
||||
|
||||
@@ -592,7 +592,7 @@
|
||||
to_chat(src, "<span class='notice'>You succesfuly remove the durathread strand.</span>")
|
||||
remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
|
||||
return
|
||||
var/to_send = "<div class='infobox'>"
|
||||
var/to_send = "<div class='info'>"
|
||||
visible_message("[src] examines [p_them()]self.", "")
|
||||
to_send += "<span class='notice'>You check yourself for injuries.</span>\n"
|
||||
|
||||
@@ -779,8 +779,7 @@
|
||||
if(roundstart_quirks.len)
|
||||
to_send += "<span class='notice'>You have these quirks: [get_trait_string()].</span>\n"
|
||||
|
||||
to_send += "</div>"
|
||||
to_chat(src, to_send)
|
||||
to_chat(src, examine_block(to_send))
|
||||
else
|
||||
if(wear_suit)
|
||||
wear_suit.add_fingerprint(M)
|
||||
@@ -794,7 +793,7 @@
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>[src] examines [p_them()]self.</span>", "")
|
||||
var/output = "<div class='infobox'><span class='notice'>You check yourself for injuries.</span>"
|
||||
var/output = "<span class='notice'>You check yourself for injuries.</span><hr>"
|
||||
|
||||
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
|
||||
@@ -871,8 +870,7 @@
|
||||
output += "\n\t <a href='?src=[REF(src)];embedded_object=[REF(I)];embedded_limb=[REF(LB)]' class='warning'>There is \a [I] stuck to your [LB.name]!</a>"
|
||||
else
|
||||
output += "\n\t <a href='?src=[REF(src)];embedded_object=[REF(I)];embedded_limb=[REF(LB)]' class='warning'>There is \a [I] embedded in your [LB.name]!</a>"
|
||||
output += "</div>"
|
||||
to_chat(src, output)
|
||||
to_chat(src, examine_block(output))
|
||||
|
||||
/mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone)
|
||||
if(damage_type != BRUTE && damage_type != BURN)
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
return
|
||||
|
||||
var/list/print_msg = list()
|
||||
print_msg += "<div class='infobox'><span class='userdanger'>As you snap back to consciousness, you recall people messing with your stuff...</span>"
|
||||
print_msg += "<span class='userdanger'>As you snap back to consciousness, you recall people messing with your stuff...</span>"
|
||||
print_msg += "<hr>"
|
||||
|
||||
afk_thefts = reverseRange(afk_thefts)
|
||||
|
||||
@@ -27,7 +28,6 @@
|
||||
|
||||
if(LAZYLEN(afk_thefts) >= AFK_THEFT_MAX_MESSAGES)
|
||||
print_msg += "<span class='warning'>There may have been more, but that's all you can remember...</span>"
|
||||
print_msg += "</div>"
|
||||
|
||||
to_chat(src, print_msg.Join("\n"))
|
||||
to_chat(src, examine_block(print_msg.Join("\n")))
|
||||
LAZYNULL(afk_thefts)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/silicon/ai/examine(mob/user)
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src, user)] <EM>[src]</EM>!")
|
||||
. = list("<span class='info'>This is [icon2html(src, user)] <EM>[src]</EM>!")
|
||||
if (stat == DEAD)
|
||||
. += "<span class='deadsay'>It appears to be powered-down.</span>"
|
||||
else
|
||||
@@ -17,6 +17,9 @@
|
||||
. += "The wireless networking light is blinking."
|
||||
else if (!shunted && !client)
|
||||
. += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..."
|
||||
. += "</span></div>"
|
||||
if(length(.) > 1)
|
||||
.[1] += "\n<br>"
|
||||
|
||||
. += "</span>"
|
||||
|
||||
. += ..()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/silicon/robot/examine(mob/user)
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>, a [src.module.name] unit!")
|
||||
. = list("<span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>, a [src.module.name] unit!")
|
||||
if(desc)
|
||||
. += "[desc]"
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .)
|
||||
|
||||
. += "</span></div>"
|
||||
if(length(.) > 1)
|
||||
.[1] += "\n<br>"
|
||||
|
||||
. += "</span>"
|
||||
|
||||
. += ..()
|
||||
|
||||
@@ -83,13 +83,18 @@
|
||||
/mob/living/simple_animal/hostile/construct/examine(mob/user)
|
||||
var/t_He = p_they(TRUE)
|
||||
var/t_s = p_s()
|
||||
. = list("<div class='infobox'><span class='cult'>This is [icon2html(src, user)] \a <b>[src]</b>!\n[desc]")
|
||||
. = list("<span class='cult'>This is [icon2html(src, user)] \a <b>[src]</b>!")
|
||||
if(desc)
|
||||
. += desc
|
||||
if(health < maxHealth)
|
||||
if(health >= maxHealth/2)
|
||||
. += "<span class='warning'>[t_He] look[t_s] slightly dented.</span>"
|
||||
else
|
||||
. += "<span class='warning'><b>[t_He] look[t_s] severely dented!</b></span>"
|
||||
. += "</span></div>"
|
||||
|
||||
if(length(.))
|
||||
.[1] += "<hr>"
|
||||
. += "</span>"
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M)
|
||||
if(isconstruct(M)) //is it a construct?
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/examine(mob/user)
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <b>[src]</b>!")
|
||||
. = list("<span class='info'>This is [icon2html(src, user)] \a <b>[src]</b>!")
|
||||
|
||||
//Hands
|
||||
for(var/obj/item/I in held_items)
|
||||
@@ -208,7 +208,11 @@
|
||||
. += "<span class='deadsay'>A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\".</span>"
|
||||
else
|
||||
. += "<span class='deadsay'>A message repeatedly flashes on its display: \"ERROR -- OFFLINE\".</span>"
|
||||
. += "</span></div>"
|
||||
|
||||
if(length(.) > 1)
|
||||
.[1] += "<hr>"
|
||||
|
||||
. += "</span>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones.
|
||||
|
||||
@@ -18,14 +18,20 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user)
|
||||
if(dextrous)
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src)] \a <b>[src]</b>!\n[desc]")
|
||||
. = list("<span class='info'>This is [icon2html(src)] \a <b>[src]</b>!")
|
||||
if(desc)
|
||||
. += desc
|
||||
|
||||
for(var/obj/item/I in held_items)
|
||||
if(!(I.item_flags & ABSTRACT))
|
||||
. += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
|
||||
if(internal_storage && !(internal_storage.item_flags & ABSTRACT))
|
||||
. += "It is holding [internal_storage.get_examine_string(user)] in its internal storage."
|
||||
. += "</span></div>"
|
||||
|
||||
if(length(.) > 1)
|
||||
.[1] += "<hr>"
|
||||
|
||||
. += "</span>"
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -421,7 +421,7 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/slime/examine(mob/user)
|
||||
. = list("<div class='infobox'><span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>!")
|
||||
. = list("<span class='info'>This is [icon2html(src, user)] \a <EM>[src]</EM>!")
|
||||
if (src.stat == DEAD)
|
||||
. += "<span class='deadsay'>It is limp and unresponsive.</span>"
|
||||
else
|
||||
@@ -446,7 +446,10 @@
|
||||
if(10)
|
||||
. += "<span class='warning'><B>It is radiating with massive levels of electrical activity!</B></span>"
|
||||
|
||||
. += "</span></div>"
|
||||
if(length(.) > 1)
|
||||
.[1] += "<hr>"
|
||||
|
||||
. += "</span>"
|
||||
|
||||
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
|
||||
if(stat)
|
||||
|
||||
@@ -345,7 +345,14 @@
|
||||
else
|
||||
result = A.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist?
|
||||
|
||||
to_chat(src, result.Join("\n"))
|
||||
if(result.len)
|
||||
for(var/i = 1, i <= result.len, i++)
|
||||
if(!findtext(result[i], "<hr>"))
|
||||
result[i] += "\n"
|
||||
else
|
||||
result = list("You examine \the [A], seems like noone really cares about it.")
|
||||
|
||||
to_chat(src, examine_block("<span class='infoplain'>[result.Join()]</span>"))
|
||||
SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A)
|
||||
|
||||
/mob/proc/clear_from_recent_examines(atom/A)
|
||||
|
||||
@@ -79,7 +79,6 @@
|
||||
if(id_card?.registered_account)
|
||||
if((ACCESS_HEADS in id_card.access) || (ACCESS_QM in id_card.access))
|
||||
requestonly = FALSE
|
||||
buyer = SSeconomy.get_dep_account(id_card.registered_account.account_job.paycheck_department)
|
||||
can_approve_requests = TRUE
|
||||
else
|
||||
requestonly = TRUE
|
||||
@@ -236,8 +235,7 @@
|
||||
return
|
||||
|
||||
if(!self_paid && ishuman(usr) && !account)
|
||||
var/obj/item/card/id/id_card = card_slot?.GetID()
|
||||
account = SSeconomy.get_dep_account(id_card?.registered_account?.account_job.paycheck_department)
|
||||
account = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
|
||||
@@ -263,9 +261,7 @@
|
||||
var/id = text2num(params["id"])
|
||||
for(var/datum/supply_order/SO in SSshuttle.requestlist)
|
||||
if(SO.id == id)
|
||||
var/obj/item/card/id/id_card = card_slot?.GetID()
|
||||
if(id_card && id_card?.registered_account)
|
||||
SO.paying_account = SSeconomy.get_dep_account(id_card?.registered_account?.account_job.paycheck_department)
|
||||
SO.paying_account = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
SSshuttle.requestlist -= SO
|
||||
SSshuttle.shoppinglist += SO
|
||||
. = TRUE
|
||||
|
||||
@@ -234,6 +234,7 @@
|
||||
var/transfer_amount = T.volume * part
|
||||
if(preserve_data)
|
||||
trans_data = copy_data(T)
|
||||
post_copy_data(T)
|
||||
transferred += "[T] - [transfer_amount]"
|
||||
|
||||
R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE, ignore_pH = TRUE) //we only handle reaction after every reagent has been transfered.
|
||||
@@ -274,7 +275,8 @@
|
||||
var/datum/reagent/T = reagent
|
||||
var/copy_amount = T.volume * part
|
||||
if(preserve_data)
|
||||
trans_data = T.data
|
||||
trans_data = copy_data(T)
|
||||
post_copy_data(T)
|
||||
R.add_reagent(T.type, copy_amount * multiplier, trans_data)
|
||||
|
||||
src.update_total()
|
||||
@@ -301,7 +303,8 @@
|
||||
var/datum/reagent/current_reagent = CR
|
||||
if(current_reagent.type == reagent)
|
||||
if(preserve_data)
|
||||
trans_data = current_reagent.data
|
||||
trans_data = copy_data(current_reagent)
|
||||
post_copy_data(current_reagent)
|
||||
R.add_reagent(current_reagent.type, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE)
|
||||
remove_reagent(current_reagent.type, amount, 1)
|
||||
if(log && amount > 0)
|
||||
@@ -1152,6 +1155,11 @@
|
||||
|
||||
return trans_data
|
||||
|
||||
///
|
||||
// Should be ran after using copy_data. Calls the reagent's post_copy_data, which usually does nothing.
|
||||
/datum/reagents/proc/post_copy_data(datum/reagent/current_reagent)
|
||||
return current_reagent.post_copy_data()
|
||||
|
||||
/datum/reagents/proc/get_reagent(type)
|
||||
var/list/cached_reagents = reagent_list
|
||||
. = locate(type) in cached_reagents
|
||||
|
||||
@@ -199,6 +199,10 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity)
|
||||
log_reagent("MOB ADD: on_merge() (mixed purity): merged [volume - impureVol] of [type] and [volume] of [impure_chem]")
|
||||
|
||||
//Ran by a reagent holder on a specific reagent after copying its data.
|
||||
/datum/reagent/proc/post_copy_data()
|
||||
return
|
||||
|
||||
/datum/reagent/proc/on_update(atom/A)
|
||||
return
|
||||
|
||||
|
||||
@@ -1000,11 +1000,11 @@
|
||||
if(M.stat == DEAD)
|
||||
if(M.suiciding || M.hellbound) //they are never coming back
|
||||
M.visible_message("<span class='warning'>[M]'s body does not react...</span>")
|
||||
return
|
||||
return ..()
|
||||
if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK)) //body is too damaged to be revived
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit, and then falls still once more.</span>")
|
||||
M.do_jitter_animation(10)
|
||||
return
|
||||
return ..()
|
||||
else
|
||||
M.visible_message("<span class='warning'>[M]'s body starts convulsing!</span>")
|
||||
M.notify_ghost_cloning(source = M)
|
||||
@@ -1016,27 +1016,31 @@
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!(C.dna && C.dna.species && (NOBLOOD in C.dna.species.species_traits)))
|
||||
C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_NORMAL*C.blood_ratio) //so you don't instantly re-die from a lack of blood
|
||||
for(var/organ in C.internal_organs)
|
||||
var/obj/item/organ/O = organ
|
||||
if(O.damage > O.maxHealth/2)
|
||||
O.setOrganDamage(O.maxHealth/2) //so you don't instantly die from organ damage when being revived
|
||||
C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_BAD*C.blood_ratio) //so you don't instantly re-die from a lack of blood. You'll still need help if you had none though.
|
||||
var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART)
|
||||
if(H && H.organ_flags & ORGAN_FAILING)
|
||||
H.applyOrganDamage(-15)
|
||||
for(var/obj/item/organ/O as anything in C.internal_organs)
|
||||
if(O.organ_flags & ORGAN_FAILING)
|
||||
O.applyOrganDamage(-5)
|
||||
|
||||
M.adjustOxyLoss(-20, 0)
|
||||
M.adjustToxLoss(-20, 0)
|
||||
M.updatehealth()
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.can_revive(ignore_timelimit = TRUE, maximum_brute_dam = 100, maximum_fire_dam = 100, ignore_heart = TRUE))
|
||||
return
|
||||
var/tplus = world.time - M.timeofdeath
|
||||
if(M.revive())
|
||||
M.grab_ghost()
|
||||
M.emote("gasp")
|
||||
log_combat(M, M, "revived", src)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
|
||||
var/late = timelimit && (tplus > timelimit)
|
||||
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
|
||||
var/policy = policies[POLICYCONFIG_ON_DEFIB_LATE] //Always causes memory loss due to the nature of strange reagent.
|
||||
if(policy)
|
||||
to_chat(M, policy)
|
||||
M.log_message("revived using strange reagent, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME)
|
||||
M.log_message("revived using strange reagent, [tplus] deciseconds from time of death, considered late revival due to usage of strange reagent.", LOG_GAME)
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -491,7 +491,7 @@
|
||||
return
|
||||
|
||||
var/fp_verb = mode == HYPO_SPRAY ? "spray" : "inject"
|
||||
var/method = mode == HYPO_SPRAY ? TOUCH : INJECT
|
||||
var/method = mode == HYPO_SPRAY ? PATCH : INJECT //Medsprays use patch when spraying, feels like an inconsistancy here.
|
||||
|
||||
if(L != user)
|
||||
L.visible_message("<span class='danger'>[user] is trying to [fp_verb] [L] with [src]!</span>", \
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(C.get_ghost())
|
||||
return FALSE
|
||||
return C.can_defib()
|
||||
return C.can_revive()
|
||||
|
||||
/datum/nanite_program/defib/proc/zap()
|
||||
var/mob/living/carbon/C = host_mob
|
||||
|
||||
@@ -156,12 +156,14 @@
|
||||
return FALSE
|
||||
if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing.
|
||||
applyOrganDamage(maxHealth * decay_factor)
|
||||
return
|
||||
return FALSE
|
||||
if(organ_flags & ORGAN_SYNTHETIC)
|
||||
return TRUE
|
||||
if(!is_cold() && damage)
|
||||
///Damage decrements by a percent of its maxhealth
|
||||
var/healing_amount = -(maxHealth * healing_factor)
|
||||
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's satiety
|
||||
healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0
|
||||
healing_amount -= owner.satiety > 0 ? 4 * (maxHealth * healing_factor) * (owner.satiety / MAX_SATIETY) : 0
|
||||
if(healing_amount)
|
||||
applyOrganDamage(healing_amount) //to FERMI_TWEAK
|
||||
return TRUE
|
||||
|
||||
@@ -132,6 +132,13 @@
|
||||
name = "ipc cell"
|
||||
icon_state = "stomach-ipc"
|
||||
|
||||
/obj/item/organ/stomach/ipc/on_life()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM) && owner.nutrition >= NUTRITION_LEVEL_FED)
|
||||
owner.satiety += 5 //We don't need to cap the value as it's already automatically capped during nutrition level handling. Also effectively only +4 as you lose 1 per life tick. 300 seconds of sufficient charge to reach full satiety.
|
||||
|
||||
/obj/item/organ/stomach/ipc/emp_act(severity)
|
||||
. = ..()
|
||||
if(!owner || . & EMP_PROTECT_SELF)
|
||||
|
||||
4
html/changelogs/AutoChangeLog-pr-15550.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-15550.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "atmos equalization config now works properly"
|
||||
@@ -201,13 +201,6 @@ h1.alert, h2.alert {color: #000000;}
|
||||
}
|
||||
|
||||
.icon {height: 1em; width: auto;}
|
||||
.infobox {
|
||||
border: 1px ridge #383243;
|
||||
background: rgba(40, 40, 60, 0.5);
|
||||
margin: 2px 8px;
|
||||
padding: 8px 12px;
|
||||
max-width: 550px;
|
||||
}
|
||||
|
||||
.memo {color: #638500; text-align: center;}
|
||||
.memoedit {text-align: center; font-size: 2;}
|
||||
|
||||
@@ -98,8 +98,8 @@
|
||||
description = "Synthetic tissue used for grafting onto damaged organs during surgery, or for treating limb damage. Has a very tight growth window between 305-320, any higher and the temperature will cause the cells to die. Additionally, growth time is considerably long, so chemists are encouraged to leave beakers with said reaction ongoing, while they tend to their other duties."
|
||||
pH = 7.6
|
||||
metabolization_rate = 0.05 //Give them time to graft
|
||||
data = list("grown_volume" = 0, "injected_vol" = 0)
|
||||
var/borrowed_health
|
||||
data = list("grown_volume" = 0, "injected_vol" = 0, "borrowed_health" = 0)
|
||||
var/borrowed_health = 0
|
||||
color = "#FFDADA"
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
@@ -107,31 +107,51 @@
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/healing_factor = (((data["grown_volume"] / 100) + 1)*reac_volume)
|
||||
if(method in list(PATCH, TOUCH))
|
||||
if (M.stat == DEAD)
|
||||
M.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attemping to repair the damage as quickly as possible.")
|
||||
borrowed_health += healing_factor
|
||||
M.adjustBruteLoss(-healing_factor*2)
|
||||
M.adjustFireLoss(-healing_factor*2)
|
||||
M.adjustToxLoss(-healing_factor)
|
||||
M.adjustCloneLoss(-healing_factor)
|
||||
M.updatehealth()
|
||||
if(method == PATCH) //Needs to actually be applied via patch / hypo / medspray and not just beakersplashed.
|
||||
if (C.stat == DEAD)
|
||||
C.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attempting to repair the damage as quickly as possible.")
|
||||
var/preheal_brute = C.getBruteLoss()
|
||||
var/preheal_burn = C.getFireLoss()
|
||||
var/preheal_tox = C.getToxLoss()
|
||||
var/preheal_oxy = C.getOxyLoss()
|
||||
C.adjustBruteLoss(-healing_factor*2)
|
||||
C.adjustFireLoss(-healing_factor*2)
|
||||
C.adjustToxLoss(-healing_factor)
|
||||
C.adjustCloneLoss(-healing_factor)
|
||||
borrowed_health += (preheal_brute - C.getBruteLoss()) + (preheal_burn - C.getFireLoss()) + (preheal_tox - C.getToxLoss()) + ((preheal_oxy - C.getOxyLoss()) / 2) //Ironically this means that while slimes get damaged by the toxheal, it will reduce borrowed health and longterm effects. Funky!
|
||||
C.updatehealth()
|
||||
if(data["grown_volume"] > 135 && ((C.health + C.oxyloss)>=80))
|
||||
if(M.revive())
|
||||
M.emote("gasp")
|
||||
var/tplus = world.time - M.timeofdeath
|
||||
if(C.can_revive(ignore_timelimit = TRUE, maximum_brute_dam = MAX_REVIVE_BRUTE_DAMAGE / 2, maximum_fire_dam = MAX_REVIVE_FIRE_DAMAGE / 2, ignore_heart = TRUE) && C.revive())
|
||||
C.grab_ghost()
|
||||
C.emote("gasp")
|
||||
borrowed_health *= 2
|
||||
if(borrowed_health < 100)
|
||||
borrowed_health = 100
|
||||
log_combat(M, M, "revived", src)
|
||||
log_combat(C, C, "revived", src)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_ON_DEFIB_LATE] //Always causes memory loss due to the nature of synthtissue
|
||||
if(policy)
|
||||
to_chat(C, policy)
|
||||
C.log_message("revived using synthtissue, [tplus] deciseconds from time of death, considered late revival due to usage of synthtissue.", LOG_GAME)
|
||||
else
|
||||
var/preheal_brute = C.getBruteLoss()
|
||||
var/preheal_burn = C.getFireLoss()
|
||||
M.adjustBruteLoss(-healing_factor)
|
||||
M.adjustFireLoss(-healing_factor)
|
||||
to_chat(M, "<span class='danger'>You feel your flesh merge with the synthetic tissue! It stings like hell!</span>")
|
||||
var/datum/reagent/synthtissue/active_tissue = M.reagents.has_reagent(/datum/reagent/synthtissue)
|
||||
var/imperfect = FALSE //Merging with synthtissue that has borrowed health
|
||||
if(active_tissue && active_tissue.borrowed_health)
|
||||
borrowed_health += (preheal_brute - C.getBruteLoss()) + (preheal_burn - C.getFireLoss())
|
||||
imperfect = TRUE
|
||||
to_chat(M, "<span class='danger'>You feel your flesh [imperfect ? "partially and painfully" : ""] merge with the synthetic tissue! It stings like hell[imperfect ? " and is making you feel terribly sick" : ""]!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
|
||||
data["borrowed_health"] += borrowed_health //Preserve health offset
|
||||
borrowed_health = 0 //We are applying this to someone else, so this info will be transferred via data.
|
||||
if(method==INJECT)
|
||||
data["injected_vol"] = reac_volume
|
||||
var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART)
|
||||
if(data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING)
|
||||
if(H && data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING)
|
||||
H.applyOrganDamage(-20)
|
||||
..()
|
||||
|
||||
@@ -145,16 +165,19 @@
|
||||
C.reagents.remove_reagent(type, 15)
|
||||
to_chat(C, "<span class='notice'>You feel something reform inside of you!</span>")
|
||||
|
||||
data["injected_vol"] -= metabolization_rate
|
||||
data["injected_vol"] = max(0, data["injected_vol"] - metabolization_rate * C.metabolism_efficiency) //No negatives.
|
||||
if(borrowed_health)
|
||||
C.adjustToxLoss(1)
|
||||
C.adjustCloneLoss(1)
|
||||
borrowed_health -= 1
|
||||
var/ratio = (current_cycle > SYNTHTISSUE_DAMAGE_FLIP_CYCLES) ? 0 : (1 - (current_cycle / SYNTHTISSUE_DAMAGE_FLIP_CYCLES))
|
||||
var/payback = 2 * C.metabolism_efficiency //How much borrowed health we are paying back. Starts as cloneloss, slowly flips over to toxloss.
|
||||
C.adjustToxLoss((1 - ratio) * payback * REAGENTS_EFFECT_MULTIPLIER, forced = TRUE, toxins_type = TOX_OMNI)
|
||||
C.adjustCloneLoss(ratio * payback * REAGENTS_EFFECT_MULTIPLIER)
|
||||
borrowed_health = max(borrowed_health - payback, 0)
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_merge(passed_data)
|
||||
if(!passed_data)
|
||||
return ..()
|
||||
borrowed_health += max(0, passed_data["borrowed_health"])
|
||||
if(passed_data["grown_volume"] > data["grown_volume"])
|
||||
data["grown_volume"] = passed_data["grown_volume"]
|
||||
if(iscarbon(holder.my_atom))
|
||||
@@ -166,11 +189,16 @@
|
||||
/datum/reagent/synthtissue/on_new(passed_data)
|
||||
if(!passed_data)
|
||||
return ..()
|
||||
borrowed_health = min(passed_data["borrowed_health"] + borrowed_health, SYNTHTISSUE_BORROW_CAP)
|
||||
if(passed_data["grown_volume"] > data["grown_volume"])
|
||||
data["grown_volume"] = passed_data["grown_volume"]
|
||||
update_name()
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/post_copy_data()
|
||||
data["borrowed_health"] = 0 //We passed this along to something that needed it, set it back to 0 so we don't do it twice.
|
||||
return ..()
|
||||
|
||||
/datum/reagent/synthtissue/proc/update_name() //They are but babes on creation and have to grow unto godhood
|
||||
switch(data["grown_volume"])
|
||||
if(-INFINITY to 50)
|
||||
@@ -193,9 +221,9 @@
|
||||
C.adjustCloneLoss(borrowed_health*1.25)
|
||||
C.adjustAllOrganLoss(borrowed_health*0.25)
|
||||
M.updatehealth()
|
||||
if(borrowed_health && C.health < -20)
|
||||
M.stat = DEAD
|
||||
if(C.stat != DEAD && borrowed_health && C.health < -20)
|
||||
M.visible_message("The synthetic tissue degrades off [M]'s wounds as they collapse to the floor.")
|
||||
M.death()
|
||||
//NEEDS ON_MOB_DEAD()
|
||||
|
||||
/datum/reagent/fermi/zeolites
|
||||
|
||||
@@ -162,6 +162,7 @@
|
||||
#include "code\__DEFINES\research\stock_parts.dm"
|
||||
#include "code\__DEFINES\sandcode\cit_defines.dm"
|
||||
#include "code\__DEFINES\sandcode\genital_defines.dm"
|
||||
#include "code\__DEFINES\sandcode\chat.dm"
|
||||
#include "code\__DEFINES\sandcode\language.dm"
|
||||
#include "code\__DEFINES\sandcode\loadout.dm"
|
||||
#include "code\__DEFINES\sandcode\medical_defines.dm"
|
||||
|
||||
@@ -65,7 +65,7 @@ export const MESSAGE_TYPES = [
|
||||
type: MESSAGE_TYPE_INFO,
|
||||
name: 'Info',
|
||||
description: 'Non-urgent messages from the game and items',
|
||||
selector: '.notice:not(.pm), .adminnotice, .infobox, .info, .sinister, .cult, .infoplain, .announce, .hear, .smallnotice, .holoparasite',
|
||||
selector: '.notice:not(.pm), .adminnotice, .info, .sinister, .cult, .infoplain, .announce, .hear, .smallnotice, .holoparasite',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_WARNING,
|
||||
|
||||
@@ -1016,14 +1016,6 @@ em {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
.infobox {
|
||||
border: 1px ridge #383243;
|
||||
background: rgba(40, 40, 60, 0.5);
|
||||
margin: 2px 8px;
|
||||
padding: 8px 12px;
|
||||
max-width: 550px;
|
||||
}
|
||||
|
||||
.memo {
|
||||
color: #638500;
|
||||
text-align: center;
|
||||
@@ -1116,3 +1108,18 @@ em {
|
||||
.ml-3 {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
.examine_block {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(55, 55, 55, 0.33);
|
||||
margin: 7px 4px;
|
||||
padding: 8px 12px;
|
||||
max-width: 550px;
|
||||
}
|
||||
|
||||
.examine_block hr {
|
||||
border: none;
|
||||
background: #222;
|
||||
height: 1px;
|
||||
margin: 8px 16px 8px 16px;
|
||||
}
|
||||
|
||||
@@ -1053,14 +1053,6 @@ h1.alert, h2.alert {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
.infobox {
|
||||
border: 1px ridge #383243;
|
||||
background: rgba(40, 40, 60, 0.5);
|
||||
margin: 2px 8px;
|
||||
padding: 8px 12px;
|
||||
max-width: 550px;
|
||||
}
|
||||
|
||||
.memo {
|
||||
color: #638500;
|
||||
text-align: center;
|
||||
@@ -1154,3 +1146,18 @@ h1.alert, h2.alert {
|
||||
.ml-3 {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
.examine_block {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
border: 1px solid #111a27;
|
||||
margin: 2px 8px;
|
||||
padding: 8px 12px;
|
||||
max-width: 550px;
|
||||
}
|
||||
|
||||
.examine_block hr {
|
||||
border: none;
|
||||
background: #333;
|
||||
height: 1px;
|
||||
margin: 8px 16px 8px 16px;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user