diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index ab4d42c5..541b3d56 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -383,7 +383,7 @@
for (var/i in GLOB.ai_list)
var/mob/living/silicon/ai/aiPlayer = i
if(aiPlayer.mind)
- parts += "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was deactivated"] were:"
+ parts += "[aiPlayer.name]'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was deactivated"] were:"
parts += aiPlayer.laws.get_law_list(include_zeroth=TRUE)
parts += "Total law changes: [aiPlayer.law_change_counter]"
@@ -394,14 +394,14 @@
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
borg_num--
if(robo.mind)
- robolist += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]
"
+ robolist += "[robo.name] [robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]
"
parts += "[robolist]"
if(!borg_spacer)
borg_spacer = TRUE
for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs)
if (!robo.connected_ai && robo.mind)
- parts += "[borg_spacer?"
":""][robo.name] (Played by: [robo.mind.key]) [(robo.stat != DEAD)? "survived as an AI-less borg!" : "was unable to survive the rigors of being a cyborg without an AI."] Its laws were:"
+ parts += "[borg_spacer?"
":""][robo.name] [(robo.stat != DEAD)? "survived as an AI-less borg!" : "was unable to survive the rigors of being a cyborg without an AI."] Its laws were:"
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
parts += robo.laws.get_law_list(include_zeroth=TRUE)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 9f3a5904..1ef3fc0a 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -256,6 +256,20 @@
return
return ..()
+/obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
+ if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS))
+ return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
+ return FALSE
+
+/obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
+ switch(passed_mode)
+ if(RCD_UPGRADE_SIMPLE_CIRCUITS)
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt a fire alarm circuit and slot it into the assembly.")
+ buildstage = 1
+ update_icon()
+ return TRUE
+ return FALSE
/obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 296112a4..3be5e846 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -438,6 +438,13 @@
else
return INITIALIZE_HINT_QDEL
+/obj/effect/temp_visual/slugboom
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "slugboom"
+ randomdir = FALSE
+ duration = 30
+ pixel_x = -24
+
/obj/effect/constructing_effect
icon = 'icons/effects/effects_rcd.dmi'
icon_state = ""
@@ -477,4 +484,4 @@
addtimer(CALLBACK(src, .proc/end), 15)
/obj/effect/constructing_effect/proc/end()
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index e3c1953e..3ec976cb 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -47,9 +47,9 @@ RLD
/obj/item/construction/examine(mob/user)
. = ..()
- . += "\A [src]. It currently holds [matter]/[max_matter] matter-units."
+ . += "It currently holds [matter]/[max_matter] matter-units."
if(upgrade & RCD_UPGRADE_FRAMES)
- . += "It contains the design for machine frames, computer frames and deconstruction."
+ . += "It contains the design for machine frames, computer frames and deconstruction."
if(upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)
. += "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 413f049c..ee0b4fc9 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -472,17 +472,18 @@ GENE SCANNER
msg += "Subject is not addicted to any reagents.\n"
var/datum/reagent/impure/fermiTox/F = M.reagents.has_reagent(/datum/reagent/impure/fermiTox)
- switch(F?.volume)
- if(5 to 10)
- msg += "Subject contains a low amount of toxic isomers.\n"
- if(10 to 25)
- msg += "Subject contains toxic isomers.\n"
- if(25 to 50)
- msg += "Subject contains a substantial amount of toxic isomers.\n"
- if(50 to 95)
- msg += "Subject contains a high amount of toxic isomers.\n"
- if(95 to INFINITY)
- msg += "Subject contains a extremely dangerous amount of toxic isomers.\n"
+ if(istype(F,/datum/reagent/impure/fermiTox))
+ switch(F.volume)
+ if(5 to 10)
+ msg += "Subject contains a low amount of toxic isomers.\n"
+ if(10 to 25)
+ msg += "Subject contains toxic isomers.\n"
+ if(25 to 50)
+ msg += "Subject contains a substantial amount of toxic isomers.\n"
+ if(50 to 95)
+ msg += "Subject contains a high amount of toxic isomers.\n"
+ if(95 to INFINITY)
+ msg += "Subject contains a extremely dangerous amount of toxic isomers.\n"
msg += "*---------*"
to_chat(user, msg)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index f5f0dfb0..61fd3cf1 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -92,8 +92,15 @@
/obj/machinery/chem_dispenser/Initialize()
. = ..()
- for(var/list/L in list(dispensable_reagents, emagged_reagents, upgrade_reagents, upgrade_reagents2, upgrade_reagents3))
- L = sortList(L, /proc/cmp_reagents_asc)
+ if(emagged_reagents)
+ emagged_reagents = sortList(emagged_reagents, /proc/cmp_reagents_asc)
+ if(upgrade_reagents)
+ upgrade_reagents = sortList(upgrade_reagents, /proc/cmp_reagents_asc)
+ if(upgrade_reagents2)
+ upgrade_reagents2 = sortList(upgrade_reagents2, /proc/cmp_reagents_asc)
+ if(upgrade_reagents3)
+ upgrade_reagents3 = sortList(upgrade_reagents3, /proc/cmp_reagents_asc)
+ dispensable_reagents = sortList(dispensable_reagents, /proc/cmp_reagents_asc)
update_icon()
/obj/machinery/chem_dispenser/Destroy()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 1262d4e7..33cf85c4 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -60,7 +60,7 @@
B = new(T)
if(data["blood_DNA"])
B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
- if(!B.reagents)
+ if(B.reagents)
B.reagents.add_reagent(type, reac_volume)
B.update_icon()
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 31c80248..6d93a5e1 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -1,221 +1,221 @@
-#define PH_WEAK (1 << 0)
-#define TEMP_WEAK (1 << 1)
-
-/obj/item/reagent_containers
- name = "Container"
- desc = "..."
- icon = 'icons/obj/chemical.dmi'
- icon_state = null
- w_class = WEIGHT_CLASS_TINY
- var/amount_per_transfer_from_this = 5
- var/list/possible_transfer_amounts = list(5,10,15,20,25,30)
- var/volume = 30
- var/reagent_flags
- var/list/list_reagents = null
- var/spawned_disease = null
- var/disease_amount = 20
- var/spillable = FALSE
- var/beaker_weakness_bitflag = NONE//Bitflag!
- var/container_HP = 2
- var/cached_icon
- var/splashable = FALSE
-
-/obj/item/reagent_containers/Initialize(mapload, vol)
- . = ..()
- if(isnum(vol) && vol > 0)
- volume = vol
- create_reagents(volume, reagent_flags)
- if(spawned_disease)
- var/datum/disease/F = new spawned_disease()
- var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F))
- reagents.add_reagent(/datum/reagent/blood, disease_amount, data)
- add_initial_reagents()
-
-/obj/item/reagent_containers/proc/add_initial_reagents()
- if(list_reagents)
- reagents.add_reagent_list(list_reagents)
-
-/obj/item/reagent_containers/attack_self(mob/user)
- if(possible_transfer_amounts.len)
- var/i=0
- for(var/A in possible_transfer_amounts)
- i++
- if(A == amount_per_transfer_from_this)
- if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.")
- return
-
-/obj/item/reagent_containers/attack(mob/M, mob/user, def_zone)
- if(user.a_intent == INTENT_HARM)
- return ..()
-
-/obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user)
- if(!iscarbon(eater))
- return 0
- var/mob/living/carbon/C = eater
- var/covered = ""
- if(C.is_mouth_covered(head_only = 1))
- covered = "headgear"
- else if(C.is_mouth_covered(mask_only = 1))
- covered = "mask"
- if(covered)
- var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]"
- to_chat(user, "You have to remove [who] [covered] first!")
- return 0
- return 1
-
-/obj/item/reagent_containers/ex_act()
- if(reagents)
- for(var/datum/reagent/R in reagents.reagent_list)
- R.on_ex_act()
- if(!QDELETED(src))
- ..()
-
-/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume)
- reagents.expose_temperature(exposed_temperature)
- ..()
-
-/obj/item/reagent_containers/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- . = ..()
- SplashReagents(hit_atom, TRUE)
-
-/obj/item/reagent_containers/proc/bartender_check(atom/target)
- . = FALSE
- var/turf/T = get_turf(src)
- if(!T || !thrownby || !thrownby.actions)
- return
- for(var/datum/action/innate/D in thrownby.actions)
- if(D.active && istype(D, /datum/action/innate/drink_fling))
- return TRUE
-
-
-/obj/item/reagent_containers/proc/ForceResetRotation()
- transform = initial(transform)
-
-/obj/item/reagent_containers/proc/SplashReagents(atom/target, thrown = FALSE)
- if(!reagents || !reagents.total_volume || !(splashable ? splashable : spillable))
- return
-
- if(ismob(target) && target.reagents)
- if(thrown)
- reagents.total_volume *= rand(5,10) * 0.1 //Not all of it makes contact with the target
- var/mob/M = target
- var/R
- target.visible_message("[M] has been splashed with something!", \
- "[M] has been splashed with something!")
- for(var/datum/reagent/A in reagents.reagent_list)
- R += "[A.type] ([num2text(A.volume)]), "
-
- if(thrownby)
- log_combat(thrownby, M, "splashed", R)
- reagents.reaction(target, TOUCH)
-
- else if(bartender_check(target) && thrown)
- if(!istype(src, /obj/item/reagent_containers/food/drinks)) //drinks smash against solid objects
- visible_message("[src] lands upright without spilling a single drop!")
- transform = initial(transform)
- return
-
- else
- if(isturf(target) && reagents.reagent_list.len && thrownby)
- log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]")
- log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].")
- message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].")
- visible_message("[src] spills its contents all over [target].")
- reagents.reaction(target, TOUCH)
- if(QDELETED(src))
- return
-
- reagents.clear_reagents()
-
-//melts plastic beakers
-/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M)
- reagents.expose_temperature(1000)
- if(beaker_weakness_bitflag & TEMP_WEAK)
- var/list/seen = viewers(5, get_turf(src))
- var/iconhtml = icon2html(src, seen)
- for(var/mob/H in seen)
- to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!")
- playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1)
- qdel(src)
- ..()
-
-//melts plastic beakers
-/obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- reagents.expose_temperature(exposed_temperature)
- temp_check()
-
-/obj/item/reagent_containers/proc/temp_check()
- if(beaker_weakness_bitflag & TEMP_WEAK)
- if(reagents.chem_temp >= 444)//assuming polypropylene
- START_PROCESSING(SSobj, src)
-
-//melts glass beakers
-/obj/item/reagent_containers/proc/pH_check()
- if(beaker_weakness_bitflag & PH_WEAK)
- if((reagents.pH < 1.5) || (reagents.pH > 12.5))
- START_PROCESSING(SSobj, src)
-
-
-/obj/item/reagent_containers/process()
- if(!cached_icon)
- cached_icon = icon_state
- var/damage
- var/cause
- if(beaker_weakness_bitflag & PH_WEAK)
- if(reagents.pH < 2)
- damage = (2 - reagents.pH)/20
- cause = "from the extreme pH"
- playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1)
-
- if(reagents.pH > 12)
- damage = (reagents.pH - 12)/20
- cause = "from the extreme pH"
- playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1)
-
- if(beaker_weakness_bitflag & TEMP_WEAK)
- if(reagents.chem_temp >= 444)
- if(damage)
- damage += (reagents.chem_temp/444)/5
- else
- damage = (reagents.chem_temp/444)/5
- if(cause)
- cause += " and "
- cause += "from the high temperature"
- playsound(get_turf(src), 'sound/FermiChem/heatdam.ogg', 50, 1)
-
- if(!damage || damage <= 0)
- STOP_PROCESSING(SSobj, src)
-
- container_HP -= damage
-
- var/list/seen = viewers(5, get_turf(src))
- var/iconhtml = icon2html(src, seen)
-
- var/damage_percent = ((container_HP / initial(container_HP)*100))
- switch(damage_percent)
- if(-INFINITY to 0)
- for(var/mob/M in seen)
- to_chat(M, "[iconhtml] \The [src]'s melts [cause]!")
- playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1)
- SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted")
- STOP_PROCESSING(SSobj, src)
- qdel(src)
- return
- if(0 to 35)
- icon_state = "[cached_icon]_m3"
- desc = "[initial(desc)] It is severely deformed."
- if(35 to 70)
- icon_state = "[cached_icon]_m2"
- desc = "[initial(desc)] It is deformed."
- if(70 to 85)
- desc = "[initial(desc)] It is mildly deformed."
- icon_state = "[cached_icon]_m1"
-
- update_icon()
- if(prob(25))
- for(var/mob/M in seen)
- to_chat(M, "[iconhtml] \The [src]'s is damaged by [cause] and begins to deform!")
+#define PH_WEAK (1 << 0)
+#define TEMP_WEAK (1 << 1)
+
+/obj/item/reagent_containers
+ name = "Container"
+ desc = "..."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = null
+ w_class = WEIGHT_CLASS_TINY
+ var/amount_per_transfer_from_this = 5
+ var/list/possible_transfer_amounts = list(5,10,15,20,25,30)
+ var/volume = 30
+ var/reagent_flags
+ var/list/list_reagents = null
+ var/spawned_disease = null
+ var/disease_amount = 20
+ var/spillable = FALSE
+ var/beaker_weakness_bitflag = NONE//Bitflag!
+ var/container_HP = 2
+ var/cached_icon
+ var/splashable = FALSE
+
+/obj/item/reagent_containers/Initialize(mapload, vol)
+ . = ..()
+ if(isnum(vol) && vol > 0)
+ volume = vol
+ create_reagents(volume, reagent_flags)
+ if(spawned_disease)
+ var/datum/disease/F = new spawned_disease()
+ var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F))
+ reagents.add_reagent(/datum/reagent/blood, disease_amount, data)
+ add_initial_reagents()
+
+/obj/item/reagent_containers/proc/add_initial_reagents()
+ if(list_reagents)
+ reagents.add_reagent_list(list_reagents)
+
+/obj/item/reagent_containers/attack_self(mob/user)
+ if(possible_transfer_amounts.len)
+ var/i=0
+ for(var/A in possible_transfer_amounts)
+ i++
+ if(A == amount_per_transfer_from_this)
+ if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.")
+ return
+
+/obj/item/reagent_containers/attack(mob/M, mob/user, def_zone)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+
+/obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user)
+ if(!iscarbon(eater))
+ return 0
+ var/mob/living/carbon/C = eater
+ var/covered = ""
+ if(C.is_mouth_covered(head_only = 1))
+ covered = "headgear"
+ else if(C.is_mouth_covered(mask_only = 1))
+ covered = "mask"
+ if(covered)
+ var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]"
+ to_chat(user, "You have to remove [who] [covered] first!")
+ return 0
+ return 1
+
+/obj/item/reagent_containers/ex_act()
+ if(reagents)
+ for(var/datum/reagent/R in reagents.reagent_list)
+ R.on_ex_act()
+ if(!QDELETED(src))
+ ..()
+
+/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume)
+ reagents.expose_temperature(exposed_temperature)
+ ..()
+
+/obj/item/reagent_containers/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ SplashReagents(hit_atom, TRUE)
+
+/obj/item/reagent_containers/proc/bartender_check(atom/target)
+ . = FALSE
+ var/turf/T = get_turf(src)
+ if(!T || !thrownby || !thrownby.actions)
+ return
+ for(var/datum/action/innate/D in thrownby.actions)
+ if(D.active && istype(D, /datum/action/innate/drink_fling))
+ return TRUE
+
+
+/obj/item/reagent_containers/proc/ForceResetRotation()
+ transform = initial(transform)
+
+/obj/item/reagent_containers/proc/SplashReagents(atom/target, thrown = FALSE)
+ if(!reagents || !reagents.total_volume || !(splashable ? splashable : spillable))
+ return
+
+ if(ismob(target) && target.reagents)
+ if(thrown)
+ reagents.total_volume *= rand(5,10) * 0.1 //Not all of it makes contact with the target
+ var/mob/M = target
+ var/R
+ target.visible_message("[M] has been splashed with something!", \
+ "[M] has been splashed with something!")
+ for(var/datum/reagent/A in reagents.reagent_list)
+ R += "[A.type] ([A.volume]),"
+
+ if(thrownby)
+ log_combat(thrownby, M, "splashed", R)
+ reagents.reaction(target, TOUCH)
+
+ else if(bartender_check(target) && thrown)
+ if(!istype(src, /obj/item/reagent_containers/food/drinks)) //drinks smash against solid objects
+ visible_message("[src] lands upright without spilling a single drop!")
+ transform = initial(transform)
+ return
+
+ else
+ if(isturf(target) && reagents.reagent_list.len && thrownby)
+ log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]")
+ log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].")
+ message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].")
+ visible_message("[src] spills its contents all over [target].")
+ reagents.reaction(target, TOUCH)
+ if(QDELETED(src))
+ return
+
+ reagents.clear_reagents()
+
+//melts plastic beakers
+/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M)
+ reagents.expose_temperature(1000)
+ if(beaker_weakness_bitflag & TEMP_WEAK)
+ var/list/seen = viewers(5, get_turf(src))
+ var/iconhtml = icon2html(src, seen)
+ for(var/mob/H in seen)
+ to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!")
+ playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1)
+ qdel(src)
+ ..()
+
+//melts plastic beakers
+/obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ reagents.expose_temperature(exposed_temperature)
+ temp_check()
+
+/obj/item/reagent_containers/proc/temp_check()
+ if(beaker_weakness_bitflag & TEMP_WEAK)
+ if(reagents.chem_temp >= 444)//assuming polypropylene
+ START_PROCESSING(SSobj, src)
+
+//melts glass beakers
+/obj/item/reagent_containers/proc/pH_check()
+ if(beaker_weakness_bitflag & PH_WEAK)
+ if((reagents.pH < 1.5) || (reagents.pH > 12.5))
+ START_PROCESSING(SSobj, src)
+
+
+/obj/item/reagent_containers/process()
+ if(!cached_icon)
+ cached_icon = icon_state
+ var/damage
+ var/cause
+ if(beaker_weakness_bitflag & PH_WEAK)
+ if(reagents.pH < 2)
+ damage = (2 - reagents.pH)/20
+ cause = "from the extreme pH"
+ playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1)
+
+ if(reagents.pH > 12)
+ damage = (reagents.pH - 12)/20
+ cause = "from the extreme pH"
+ playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1)
+
+ if(beaker_weakness_bitflag & TEMP_WEAK)
+ if(reagents.chem_temp >= 444)
+ if(damage)
+ damage += (reagents.chem_temp/444)/5
+ else
+ damage = (reagents.chem_temp/444)/5
+ if(cause)
+ cause += " and "
+ cause += "from the high temperature"
+ playsound(get_turf(src), 'sound/FermiChem/heatdam.ogg', 50, 1)
+
+ if(!damage || damage <= 0)
+ STOP_PROCESSING(SSobj, src)
+
+ container_HP -= damage
+
+ var/list/seen = viewers(5, get_turf(src))
+ var/iconhtml = icon2html(src, seen)
+
+ var/damage_percent = ((container_HP / initial(container_HP)*100))
+ switch(damage_percent)
+ if(-INFINITY to 0)
+ for(var/mob/M in seen)
+ to_chat(M, "[iconhtml] \The [src]'s melts [cause]!")
+ playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1)
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted")
+ STOP_PROCESSING(SSobj, src)
+ qdel(src)
+ return
+ if(0 to 35)
+ icon_state = "[cached_icon]_m3"
+ desc = "[initial(desc)] It is severely deformed."
+ if(35 to 70)
+ icon_state = "[cached_icon]_m2"
+ desc = "[initial(desc)] It is deformed."
+ if(70 to 85)
+ desc = "[initial(desc)] It is mildly deformed."
+ icon_state = "[cached_icon]_m1"
+
+ update_icon()
+ if(prob(25))
+ for(var/mob/M in seen)
+ to_chat(M, "[iconhtml] \The [src]'s is damaged by [cause] and begins to deform!")
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 51937448..0178bf49 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -31,6 +31,7 @@ Borg Hypospray
var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed.
var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values.
//Used as list for input() in shakers.
+ var/list/reagent_names = list()
/obj/item/reagent_containers/borghypo/Initialize()
@@ -57,7 +58,7 @@ Borg Hypospray
return 1
// Use this to add more chemicals for the borghypo to produce.
-/obj/item/reagent_containers/borghypo/proc/add_reagent(reagent)
+/obj/item/reagent_containers/borghypo/proc/add_reagent(datum/reagent/reagent)
reagent_ids |= reagent
var/datum/reagents/RG = new(30)
RG.my_atom = src
@@ -67,9 +68,11 @@ Borg Hypospray
R.add_reagent(reagent, 30)
modes[reagent] = modes.len + 1
+ reagent_names[initial(reagent.name)] = reagent
-/obj/item/reagent_containers/borghypo/proc/del_reagent(reagent)
+/obj/item/reagent_containers/borghypo/proc/del_reagent(datum/reagent/reagent)
reagent_ids -= reagent
+ reagent_names -= initial(reagent.name)
var/datum/reagents/RG
var/datum/reagents/TRG
for(var/i in 1 to reagent_ids.len)
@@ -115,7 +118,7 @@ Borg Hypospray
log_combat(user, M, "injected", src, "(CHEMICALS: [english_list(injected)])")
/obj/item/reagent_containers/borghypo/attack_self(mob/user)
- var/chosen_reagent = modes[input(user, "What reagent do you want to dispense?") as null|anything in reagent_ids]
+ var/chosen_reagent = modes[reagent_names[input(user, "What reagent do you want to dispense?") as null|anything in reagent_names]]
if(!chosen_reagent)
return
mode = chosen_reagent
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 8ac4b354..2e7269c7 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -184,7 +184,7 @@
icon_state = "virus_food"
anchored = TRUE
density = FALSE
- reagent_id = /datum/reagent/toxin/mutagen/mutagenvirusfood
+ reagent_id = /datum/reagent/consumable/virus_food
/obj/structure/reagent_dispensers/cooking_oil
name = "vat of cooking oil"
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 706d209d..959d0ed5 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -488,15 +488,15 @@
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly."
id = "rcd_loaded"
build_type = PROTOLATHE
- materials = list(MAT_METAL=48000, MAT_GLASS=32000) // costs more than what it did in the autolathe, this one comes loaded.
+ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) // costs more than what it did in the autolathe, this one comes loaded.
build_path = /obj/item/construction/rcd/loaded
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-/datum/design/pipe_dispenser
+/datum/design/rpd
name = "Rapid Pipe Dispenser (RPD)"
desc = "A tool that can construct and deconstruct pipes on the fly."
- id = "pipe_dispenser"
+ id = "rpd"
build_type = PROTOLATHE
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
build_path = /obj/item/pipe_dispenser
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 17b30565..a13739e3 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -201,7 +201,7 @@
display_name = "Advanced Engineering"
description = "Pushing the boundaries of physics, one chainsaw-fist at a time."
prereq_ids = list("engineering", "emp_basic")
- design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "double_emergency_oxygen","rcd_loaded", "pipe_dispenser","rcd_upgrade_frames", "rcd_upgrade_simple_circuits")
+ design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription","rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "double_emergency_oxygen")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
export_price = 5000