diff --git a/code/datums/components/beauty.dm b/code/datums/components/beauty.dm
index 1be21cf0cb5..8d36cf0294b 100644
--- a/code/datums/components/beauty.dm
+++ b/code/datums/components/beauty.dm
@@ -2,13 +2,13 @@
var/beauty = 0
/datum/component/beauty/Initialize(beautyamount)
- if(!ismovableatom(parent))
+ if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
beauty = beautyamount
RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/enter_area)
RegisterSignal(parent, COMSIG_EXIT_AREA, .proc/exit_area)
var/area/A = get_area(parent)
- if(A)
+ if(A)
enter_area(null, A)
/datum/component/beauty/proc/enter_area(datum/source, area/A)
diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm
index 962e1d2080c..d1dbb305e92 100644
--- a/code/datums/components/explodable.dm
+++ b/code/datums/components/explodable.dm
@@ -5,8 +5,10 @@
var/light_impact_range = 2
var/flash_range = 3
var/equipped_slot //For items, lets us determine where things should be hit.
+ ///wheter we always delete. useful for nukes turned plasma and such, so they don't default delete and can survive
+ var/always_delete
-/datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override)
+/datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override, _always_delete = TRUE)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
@@ -31,6 +33,7 @@
light_impact_range = light_impact_range_override
if(flash_range_override)
flash_range = flash_range_override
+ always_delete = _always_delete
/datum/component/explodable/proc/explodable_insert_item(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE)
check_if_detonate(I)
@@ -105,6 +108,7 @@
if(light_impact_range < 1)
log = FALSE
explosion(A, devastation_range, heavy_impact_range, light_impact_range, flash_range, log) //epic explosion time
- qdel(A)
+ if(always_delete)
+ qdel(A)
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 73f5ced87c0..7dce18edc32 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1172,15 +1172,6 @@
icon_state = "supply"
build_path = /obj/machinery/rnd/production/techfab/department/cargo
-/obj/item/circuitboard/machine/pump
- name = "Portable Liquid Pump (Machine Board)"
- icon_state = "supply"
- build_path = /obj/machinery/power/liquid_pump
- needs_anchored = FALSE
- req_components = list(
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stock_parts/matter_bin = 2)
-
//Misc
diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm
index 350a560c85b..22c32986b01 100644
--- a/code/game/objects/structures/lavaland/geyser.dm
+++ b/code/game/objects/structures/lavaland/geyser.dm
@@ -27,8 +27,8 @@
add_overlay(I)
/obj/structure/geyser/process()
- if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive and should be avoided in continous
- reagents.add_reagent(reagent_id, potency) //processes
+ if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive
+ reagents.add_reagent(reagent_id, potency)
/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced)
if(!_reinforced)
@@ -39,12 +39,12 @@
return
to_chat(user, "You start vigorously plunging [src]!")
- if(do_after(user, 50*P.plunge_mod, target = src) && !activated)
+ if(do_after(user, 50 * P.plunge_mod, target = src) && !activated)
start_chemming()
/obj/structure/geyser/random
erupting_state = null
- var/list/options = list(/datum/reagent/fuel/oil = 2, /datum/reagent/clf3 = 1) //fucking add more
+ var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1)
/obj/structure/geyser/random/Initialize()
. = ..()
@@ -72,3 +72,5 @@
reinforced = TRUE
plunge_mod = 0.8
+
+ custom_premium_price = 1200
diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm
index 2f2c03b530e..599a2359557 100644
--- a/code/game/turfs/open/floor/plating/asteroid.dm
+++ b/code/game/turfs/open/floor/plating/asteroid.dm
@@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
return
if(is_mining_level(z))
SpawnFlora(T) //No space mushrooms, cacti.
- // SpawnTerrain(T)
+ SpawnTerrain(T)
SpawnMonster(T) //Checks for danger area.
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
@@ -305,7 +305,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
new randumb(T)
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T)
- if(prob(2))
+ if(prob(1))
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
return
var/randumb = pickweight(terrain_spawn_list)
diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm
index da10728b674..dd0b709be9e 100644
--- a/code/modules/plumbing/plumbers/pumps.dm
+++ b/code/modules/plumbing/plumbers/pumps.dm
@@ -1,16 +1,17 @@
///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired.
-/obj/machinery/power/liquid_pump
+/obj/machinery/plumbing/liquid_pump
name = "liquid pump"
- desc = "Pump up those sweet liquids from under the surface."
+ desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun
icon = 'icons/obj/plumbing/plumbers.dmi'
icon_state = "pump"
anchored = FALSE
density = TRUE
- circuit = /obj/item/circuitboard/machine/pump
idle_power_usage = 10
active_power_usage = 1000
- ///Are we powered?
- var/powered = FALSE
+
+ rcd_cost = 30
+ rcd_delay = 40
+
///units we pump per process (2 seconds)
var/pump_power = 2
///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try
@@ -20,63 +21,42 @@
///volume of our internal buffer
var/volume = 200
-/obj/machinery/power/liquid_pump/Initialize()
+/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt)
. = ..()
- create_reagents(volume)
- AddComponent(/datum/component/plumbing/simple_supply, TRUE)
+ AddComponent(/datum/component/plumbing/simple_supply, bolt)
-/obj/machinery/power/liquid_pump/attackby(obj/item/W, mob/user, params)
- if(!powered)
- if(!anchored)
- if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]",W))
- return
- if(default_deconstruction_crowbar(W))
- return
- return ..()
-
-/obj/machinery/power/liquid_pump/wrench_act(mob/living/user, obj/item/I)
- ..()
- default_unfasten_wrench(user, I)
- return TRUE
///please note that the component has a hook in the parent call, wich handles activating and deactivating
-/obj/machinery/power/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
geyser = null
update_icon()
- powered = FALSE
geyserless = FALSE //we switched state, so lets just set this back aswell
-/obj/machinery/power/liquid_pump/process()
- if(!anchored || panel_open)
+/obj/machinery/plumbing/liquid_pump/process()
+ if(!anchored || panel_open || geyserless)
return
- if(!geyser && !geyserless)
+
+ if(!geyser)
for(var/obj/structure/geyser/G in loc.contents)
geyser = G
+ update_icon()
if(!geyser) //we didnt find one, abort
- anchored = FALSE
geyserless = TRUE
visible_message("The [name] makes a sad beep!")
playsound(src, 'sound/machines/buzz-sigh.ogg', 50)
return
- if(avail(active_power_usage))
- if(!powered) //we werent powered before this tick so update our sprite
- powered = TRUE
- update_icon()
- add_load(active_power_usage)
- pump()
- else if(powered) //we were powered, but now we arent
- powered = FALSE
- update_icon()
+ pump()
+
///pump up that sweet geyser nectar
-/obj/machinery/power/liquid_pump/proc/pump()
+/obj/machinery/plumbing/liquid_pump/proc/pump()
if(!geyser || !geyser.reagents)
return
geyser.reagents.trans_to(src, pump_power)
-/obj/machinery/power/liquid_pump/update_icon_state()
- if(powered)
+/obj/machinery/plumbing/liquid_pump/update_icon_state()
+ if(geyser)
icon_state = initial(icon_state) + "-on"
else if(panel_open)
icon_state = initial(icon_state) + "-open"
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index b2f142a2071..4a629e36303 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -41,6 +41,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/reagent_weight = 1 //affects how far it travels when sprayed
var/metabolizing = FALSE
var/harmful = FALSE //is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default.
+ //Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New()
+ var/datum/material/material
+
+/datum/reagent/New()
+ . = ..()
+
+ if(material)
+ material = getmaterialref(material)
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index ca70b354c48..d067d2899ec 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -321,12 +321,13 @@
color = "#DCDCDC"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
+ var/healing = 0.5
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-0.5*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- M.adjustBruteLoss(-0.5*REM, 0)
- M.adjustFireLoss(-0.5*REM, 0)
+ M.adjustToxLoss(-healing*REM, 0)
+ M.adjustOxyLoss(-healing*REM, 0)
+ M.adjustBruteLoss(-healing*REM, 0)
+ M.adjustFireLoss(-healing*REM, 0)
..()
. = 1
@@ -338,6 +339,12 @@
..()
. = 1
+/datum/reagent/medicine/omnizine/protozine
+ name = "Protozine"
+ description = "A less environmentally friendly and somewhat weaker variant of omnizine."
+ color = "#d8c7b7"
+ healing = 0.2
+
/datum/reagent/medicine/calomel
name = "Calomel"
description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition."
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 3638ddb4d8c..f1ddc0ce0b6 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -252,6 +252,12 @@
qdel(R)
T.Bless()
+/datum/reagent/water/hollowwater
+ name = "Hollow Water"
+ description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow."
+ color = "#88878777"
+ taste_description = "emptyiness"
+
/datum/reagent/hydrogen_peroxide
name = "Hydrogen peroxide"
description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen and oxygen." //intended intended
@@ -846,6 +852,7 @@
description = "Pure iron is a metal."
reagent_state = SOLID
taste_description = "iron"
+ material = /datum/material/iron
color = "#606060" //pure iron? let's make it violet of course
@@ -866,6 +873,7 @@
reagent_state = SOLID
color = "#F7C430" // rgb: 247, 196, 48
taste_description = "expensive metal"
+ material = /datum/material/gold
/datum/reagent/silver
name = "Silver"
@@ -873,6 +881,7 @@
reagent_state = SOLID
color = "#D0D0D0" // rgb: 208, 208, 208
taste_description = "expensive yet reasonable metal"
+ material = /datum/material/silver
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.has_bane(BANE_SILVER))
@@ -886,6 +895,7 @@
color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother?
taste_description = "the inside of a reactor"
var/irradiation_level = 1
+ material = /datum/material/uranium
/datum/reagent/uranium/on_mob_life(mob/living/carbon/M)
M.apply_effect(irradiation_level/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
@@ -914,6 +924,7 @@
reagent_state = SOLID
color = "#0000CC"
taste_description = "fizzling blue"
+ material = /datum/material/bluespace
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -944,6 +955,7 @@
reagent_state = SOLID
color = "#A8A8A8" // rgb: 168, 168, 168
taste_mult = 0
+ material = /datum/material/glass
/datum/reagent/fuel
name = "Welding fuel"
@@ -2021,6 +2033,67 @@
taste_description = "bananas"
can_synth = TRUE
+/datum/reagent/wittel
+ name = "Wittel"
+ description = "An extremely rare metallic-white substance only found on demon-class planets."
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ taste_mult = 0 // oderless and tasteless
+
+/datum/reagent/metalgen
+ name = "Metalgen"
+ data = list("material"=null)
+ description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches."
+ color = "#b000aa"
+ taste_mult = 0 // oderless and tasteless
+ var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ var/minumum_material_amount = 100
+
+/datum/reagent/metalgen/reaction_obj(obj/O, volume)
+ metal_morph(O)
+ return
+
+/datum/reagent/metalgen/reaction_turf(turf/T, volume)
+ metal_morph(T)
+ return
+
+///turn an object into a special material
+/datum/reagent/metalgen/proc/metal_morph(atom/A)
+ var/metal_ref = data["material"]
+ if(!metal_ref)
+ return
+ var/metal_amount = 0
+
+ for(var/B in A.custom_materials) //list with what they're made of
+ metal_amount += A.custom_materials[B]
+
+ if(!metal_amount)
+ metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist
+
+ var/list/metal_dat = list()
+ metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf
+
+ A.material_flags = applied_material_flags
+ A.set_custom_materials(metal_dat)
+
+/datum/reagent/gravitum
+ name = "Gravitum"
+ description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even
+ color = "#050096" // rgb: 5, 0, 150
+ taste_mult = 0 // oderless and tasteless
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use
+ var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche
+
+/datum/reagent/gravitum/reaction_obj(obj/O, volume)
+ O.AddElement(/datum/element/forced_gravity, 0)
+
+ addtimer(CALLBACK(O, .proc/RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier)
+
+/datum/reagent/gravitum/on_mob_add(mob/living/L)
+ L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless
+
+/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L)
+ L.RemoveElement(/datum/element/forced_gravity, 0)
+
/datum/reagent/cellulose
name = "Cellulose Fibers"
description = "A crystaline polydextrose polymer, plants swear by this stuff."
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 80141a3ec73..11a48cb7ee6 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -61,6 +61,7 @@
taste_mult = 1.5
color = "#8228A0"
toxpwr = 3
+ material = /datum/material/plasma
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 095ba220827..7c3c81eed71 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -131,6 +131,12 @@
results = list(/datum/reagent/medicine/strange_reagent = 3)
required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+/datum/chemical_reaction/strange_reagent/alt
+ name = "Strange Reagent"
+ id = /datum/reagent/medicine/strange_reagent
+ results = list(/datum/reagent/medicine/strange_reagent = 2)
+ required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+
/datum/chemical_reaction/mannitol
name = "Mannitol"
id = /datum/reagent/medicine/mannitol
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 7270eff2ab7..63d0b216e0d 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -720,6 +720,31 @@
var/location = get_turf(holder.my_atom)
new /obj/item/slime_extract/grey(location)
+/datum/chemical_reaction/metalgen
+ name = "metalgen"
+ id = /datum/reagent/metalgen
+ required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1)
+ results = list(/datum/reagent/metalgen = 1)
+
+/datum/chemical_reaction/metalgen_imprint
+ name = "metalgen imprint"
+ id = /datum/reagent/metalgen
+ required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1)
+ results = list(/datum/reagent/metalgen = 1)
+
+/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume)
+ var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen)
+ for(var/datum/reagent/R in holder.reagent_list)
+ if(R.material && R.volume >= 40)
+ MM.data["material"] = R.material
+ holder.remove_reagent(R.type, 40)
+
+/datum/chemical_reaction/gravitum
+ name = "gravitum"
+ id = /datum/reagent/gravitum
+ required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10)
+ results = list(/datum/reagent/gravitum = 10)
+
/datum/chemical_reaction/cellulose_carbonization
name = "Cellulose_Carbonization"
id = /datum/reagent/carbon
@@ -752,3 +777,9 @@
required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/water = 1)
required_temp = 450
+/datum/chemical_reaction/holywater
+ name = "Holy Water"
+ id = /datum/reagent/water/holywater
+ results = list(/datum/reagent/water/holywater = 1)
+ required_reagents = list(/datum/reagent/water/hollowwater = 1)
+ required_catalysts = list(/datum/reagent/water/holywater = 1)
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index 4b76ce03d1b..cf574c2fda6 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -36,7 +36,8 @@
/obj/item/sensor_device = 2,
/obj/item/pinpointer/crew = 2,
/obj/item/storage/firstaid/advanced = 2,
- /obj/item/shears = 1)
+ /obj/item/shears = 1,
+ /obj/item/plunger/reinforced = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical