diff --git a/code/ATMOSPHERICS/components/components_base.dm b/code/ATMOSPHERICS/components/components_base.dm
index dd264480a9d..977f102e2e6 100644
--- a/code/ATMOSPHERICS/components/components_base.dm
+++ b/code/ATMOSPHERICS/components/components_base.dm
@@ -20,7 +20,7 @@ On top of that, now people can add component-speciic procs/vars if they want!
#define NODE3 "n3"
/obj/machinery/atmospherics/components/
- var/welded = 0 //Used on pumps and scrubbers
+ var/welded //Used on pumps and scrubbers
var/showpipe = 0
var/device_type = 0//used for initialization stuff
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 3f74b8c7de5..808ba4416c2 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -11,6 +11,8 @@
can_unwrench = 1
+ welded = 0
+
var/area/initial_loc
level = 1
var/area_uid
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 7659963b27e..3c245666193 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -12,6 +12,8 @@
can_unwrench = 1
+ welded = 0
+
var/area/initial_loc
var/id_tag = null
var/frequency = 1439
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 2a223184ccf..57527a2aa61 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -514,7 +514,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
// returns the turf located at the map edge in the specified direction relative to A
// used for mass driver
/proc/get_edge_target_turf(atom/A, direction)
-
var/turf/target = locate(A.x, A.y, A.z)
if(!A || !target)
return 0
@@ -530,7 +529,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
target = locate(world.maxx, target.y, target.z)
if(direction & WEST)
target = locate(1, target.y, target.z)
-
return target
// returns turf relative to A in given direction at set range
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 7480302230e..478092cc075 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -94,16 +94,13 @@
return
/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes)
- if(src.throwing)
- src.throw_impact(A)
- src.throwing = 0
-
+ if(throwing)
+ throw_impact(A)
+ throwing = 0
if ((A && yes))
A.last_bumped = world.time
A.Bumped(src)
- return
- ..()
- return
+
/atom/movable/proc/forceMove(atom/destination)
if(destination)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 895774a2dc3..eeada126134 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -94,16 +94,16 @@
var/turf/location = get_turf(src)
// Create the reagents to put into the air
- create_reagents(25)
+ create_reagents(5)
if(overmind && overmind.blob_reagent_datum)
- reagents.add_reagent(overmind.blob_reagent_datum.id, 25)
+ reagents.add_reagent(overmind.blob_reagent_datum.id, 5)
else
- reagents.add_reagent("spore", 25)
+ reagents.add_reagent("spore", 5)
// Attach the smoke spreader and setup/start it.
S.attach(location)
- S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
+ S.set_up(reagents, 1, 1, location, 15, 1) // only 1 smoke cloud
S.start()
ghostize()
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index bc6f9d22868..bb68ce45f04 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -7,7 +7,7 @@
opacity = 0
anchored = 1
density = 0
- layer = TURF_LAYER + 0.1
+ layer = OBJ_LAYER + 0.05 //above table, below windoor/airlock/foamed metal.
mouse_opacity = 0
var/amount = 3
animate_movement = 0
@@ -15,7 +15,7 @@
var/lifetime = 6
-/obj/effect/effect/foam/metal/aluminium
+/obj/effect/effect/foam/metal
name = "aluminium foam"
metal = 1
icon_state = "mfoam"
@@ -153,7 +153,7 @@
location = get_turf(loca)
amount = round(sqrt(amt / 2), 1)
- carry.copy_to(chemholder, carry.total_volume)
+ carry.copy_to(chemholder, 4*carry.total_volume) //The foam holds 4 times the total reagents volume for balance purposes.
/datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, datum/reagents/carry = null, metaltype)
..()
@@ -166,7 +166,7 @@
else
var/obj/effect/effect/foam/F = PoolOrNew(foamtype, location)
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
- chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount) //how much reagents each foam cell holds
+ chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount)
F.color = foamcolor
F.amount = amount
F.metal = metal
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 91c619344a5..b2fcf48b72c 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -149,11 +149,10 @@
icon = 'icons/effects/chemsmoke.dmi'
icon_state = ""
lifetime = 10
- var/max_lifetime = 10
/obj/effect/effect/smoke/chem/process()
if(..())
- var/fraction = 1/max_lifetime
+ var/fraction = 1/initial(lifetime)
for(var/obj/O in range(1,src))
if(O.type == src.type)
continue
@@ -173,7 +172,7 @@
return 0
if(!istype(M))
return 0
- var/fraction = 1/max_lifetime
+ var/fraction = 1/initial(lifetime)
reagents.reaction(M, TOUCH, fraction)
lifetime--
return 1
@@ -207,7 +206,7 @@
location = get_turf(loca)
if(direct)
direction = direct
- carry.copy_to(chemholder, carry.total_volume)
+ carry.copy_to(chemholder, 4*carry.total_volume) //The smoke holds 4 times the total reagents volume for balance purposes.
if(!silent)
var/contained = ""
@@ -256,8 +255,6 @@
else
S.steps = pick(0,1,1,1,2,2,2,3)
- S.max_lifetime = S.lifetime
-
if(chemholder.reagents.total_volume > 1) // can't split 1 very well
chemholder.reagents.copy_to(S, chemholder.reagents.total_volume/number) // copy reagents to each smoke, divide evenly
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index c82e2b81f47..a1e69bfb83e 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -355,11 +355,11 @@
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("condensedcapsaicin", 70)
- B1.reagents.add_reagent("potassium", 30)
- B2.reagents.add_reagent("phosphorus", 30)
- B2.reagents.add_reagent("sugar", 30)
- B1.reagents.add_reagent("condensedcapsaicin", 40)
+ B1.reagents.add_reagent("condensedcapsaicin", 60)
+ B1.reagents.add_reagent("potassium", 40)
+ B2.reagents.add_reagent("phosphorus", 40)
+ B2.reagents.add_reagent("sugar", 40)
+ B1.reagents.add_reagent("condensedcapsaicin", 20)
beakers += B1
beakers += B2
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index ca1368d1157..16245572192 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -191,6 +191,10 @@
item_state = "waterbackpackatmos"
volume = 200
+/obj/item/weapon/watertank/atmos/New()
+ ..()
+ reagents.add_reagent("water", 200)
+
/obj/item/weapon/watertank/atmos/make_noz()
return new /obj/item/weapon/extinguisher/mini/nozzle(src)
@@ -294,8 +298,7 @@
F.amount = 0
metal_synthesis_cooldown++
spawn(100)
- if(src)
- metal_synthesis_cooldown--
+ metal_synthesis_cooldown--
else
user << "Metal foam mix is still being synthesized..."
return
@@ -333,7 +336,7 @@
var/turf/simulated/T = A
if(T.air)
var/datum/gas_mixture/G = T.air
- if(get_dist(T, src) < 2) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air
+ if(get_dist(T, location) < 2) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air
G.temperature = 2
T.air_update_turf()
for(var/obj/effect/hotspot/H in T)
@@ -341,10 +344,11 @@
if(G.toxins)
G.nitrogen += (G.toxins)
G.toxins = 0
- for(var/obj/machinery/atmospherics/components/unary/vent_pump/V in T)
- V.welded = 1
- V.update_icon()
- V.visible_message("[V] was frozen shut!")
+ for(var/obj/machinery/atmospherics/components/unary/U in T)
+ if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
+ U.welded = 1
+ U.update_icon()
+ U.visible_message("[U] was frozen shut!")
for(var/mob/living/L in T)
L.ExtinguishMob()
for(var/obj/item/Item in T)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 3924cb78e68..16d75fc08a4 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -71,7 +71,7 @@
if(!has_smoke_protection())
for(var/obj/effect/effect/smoke/chem/S in range(1, src))
if(S.reagents.total_volume && S.lifetime)
- var/fraction = 1/S.max_lifetime
+ var/fraction = 1/initial(S.lifetime)
S.reagents.reaction(src,INGEST, fraction)
var/amount = round(S.reagents.total_volume*fraction,0.1)
S.reagents.copy_to(src, amount)
diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
index d181130314c..5470a6f5db1 100644
--- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
@@ -173,16 +173,33 @@
/datum/reagent/blob/proc/reagent_vortex(mob/living/M, setting_type)
var/turf/pull = get_turf(M)
- for(var/atom/movable/X in range(4,pull))
- if(istype(X, /atom/movable))
- if((X) && !X.anchored)
- if(setting_type)
- step_away(X,pull)
- step_away(X,pull)
- step_away(X,pull)
- step_away(X,pull)
+ var/range_power = Clamp(round(volume/5, 1), 1, 5)
+ for(var/atom/movable/X in range(range_power,pull))
+ if(istype(X, /obj/effect))
+ continue
+ if(!X.anchored)
+ var/distance = get_dist(X, pull)
+ var/moving_power = max(range_power - distance, 1)
+ spawn(0)
+ if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
+ if(setting_type)
+ var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
+ var/throw_range = 5 - distance
+ X.throw_at(throw_target, throw_range, 1)
+ else
+ X.throw_at(pull, distance, 1)
else
- X.throw_at(pull)
+ if(setting_type)
+ for(var/i = 0, i < moving_power, i++)
+ sleep(2)
+ if(!step_away(X, pull))
+ break
+ else
+ for(var/i = 0, i < moving_power, i++)
+ sleep(2)
+ if(!step_towards(X, pull))
+ break
+
/datum/reagent/blob/proc/send_message(mob/living/M)
var/totalmessage = message
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 6a238b39c41..26955d0284d 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -78,15 +78,28 @@
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
-/datum/chemical_reaction/proc/goonchem_vortex(turf/simulated/T, setting_type, range, pull_times)
+/datum/chemical_reaction/proc/goonchem_vortex(turf/simulated/T, setting_type, range)
for(var/atom/movable/X in orange(range, T))
if(istype(X, /obj/effect))
- continue //stop pulling smoke and hotspots please
- if(istype(X, /atom/movable))
- if((X) && !X.anchored)
- if(setting_type)
- for(var/i = 0, i < pull_times, i++)
- step_away(X,T)
+ continue
+ if(!X.anchored)
+ var/distance = get_dist(X, T)
+ var/moving_power = max(range - distance, 1)
+ spawn(0) //so everything moves at the same time.
+ if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
+ if(setting_type)
+ var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, T)))
+ X.throw_at(throw_target, moving_power, 1)
+ else
+ X.throw_at(T, moving_power, 1)
else
- for(var/i = 0, i < pull_times, i++)
- step_towards(X,T)
\ No newline at end of file
+ if(setting_type)
+ for(var/i = 0, i < moving_power, i++)
+ sleep(2)
+ if(!step_away(X, T))
+ break
+ else
+ for(var/i = 0, i < moving_power, i++)
+ sleep(2)
+ if(!step_towards(X, T))
+ break
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
index d0344d28fb4..544bbd8e4e6 100644
--- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
@@ -124,18 +124,21 @@
return
holder.remove_reagent("sorium", created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 1, 5, 6)
+ var/range = Clamp(sqrt(created_volume), 1, 6)
+ goonchem_vortex(T, 1, range)
/datum/chemical_reaction/sorium_vortex
name = "sorium_vortex"
id = "sorium_vortex"
result = null
+ result_amount = 1
required_reagents = list("sorium" = 1)
required_temp = 474
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 1, 5, 6)
+ var/range = Clamp(sqrt(created_volume), 1, 6)
+ goonchem_vortex(T, 1, range)
/datum/chemical_reaction/liquid_dark_matter
@@ -150,18 +153,21 @@
return
holder.remove_reagent("liquid_dark_matter", created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 0, 5, 6)
+ var/range = Clamp(sqrt(created_volume), 1, 6)
+ goonchem_vortex(T, 0, range)
/datum/chemical_reaction/ldm_vortex
name = "LDM Vortex"
id = "ldm_vortex"
result = null
+ result_amount = 1
required_reagents = list("liquid_dark_matter" = 1)
required_temp = 474
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 0, 5, 6)
+ var/range = Clamp(sqrt(created_volume/2), 1, 6)
+ goonchem_vortex(T, 0, range)
/datum/chemical_reaction/flash_powder
name = "Flash powder"
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 4a53376ceb6..fc503fac901 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -49,6 +49,10 @@
if (N)
amount_per_transfer_from_this = N
+/obj/structure/reagent_dispensers/examine(mob/user)
+ ..()
+ user << "It contains [reagents.total_volume] units."
+
//Dispensers
/obj/structure/reagent_dispensers/watertank
name = "watertank"
@@ -56,9 +60,10 @@
icon = 'icons/obj/objects.dmi'
icon_state = "watertank"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("water",1000)
+
+/obj/structure/reagent_dispensers/watertank/New()
+ ..()
+ reagents.add_reagent("water",1000)
/obj/structure/reagent_dispensers/watertank/ex_act(severity, target)
switch(severity)
@@ -89,9 +94,10 @@
icon = 'icons/obj/objects.dmi'
icon_state = "weldtank"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("welding_fuel",1000)
+
+/obj/structure/reagent_dispensers/fueltank/New()
+ ..()
+ reagents.add_reagent("welding_fuel",1000)
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj)
@@ -127,9 +133,10 @@
anchored = 1
density = 0
amount_per_transfer_from_this = 45
- New()
- ..()
- reagents.add_reagent("condensedcapsaicin",1000)
+
+/obj/structure/reagent_dispensers/peppertank/New()
+ ..()
+ reagents.add_reagent("condensedcapsaicin",1000)
/obj/structure/reagent_dispensers/water_cooler
@@ -141,9 +148,10 @@
possible_transfer_amounts = null
anchored = 1
var/cups = 50
- New()
- ..()
- reagents.add_reagent("water",500)
+
+/obj/structure/reagent_dispensers/water_cooler/New()
+ ..()
+ reagents.add_reagent("water",500)
/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/carbon/human/user)
if((!istype(user)) || (user.stat))
@@ -170,9 +178,10 @@
icon = 'icons/obj/objects.dmi'
icon_state = "beertankTEMP"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("beer",1000)
+
+/obj/structure/reagent_dispensers/beerkeg/New()
+ ..()
+ reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/blob_act()
explosion(src.loc,0,3,5,7,10)
@@ -186,6 +195,6 @@
amount_per_transfer_from_this = 10
anchored = 1
- New()
- ..()
- reagents.add_reagent("virusfood", 1000)
\ No newline at end of file
+/obj/structure/reagent_dispensers/virusfood/New()
+ ..()
+ reagents.add_reagent("virusfood", 1000)
diff --git a/html/changelogs/phil235-SmokeFoamBuff.yml b/html/changelogs/phil235-SmokeFoamBuff.yml
new file mode 100644
index 00000000000..63cd5d14ac3
--- /dev/null
+++ b/html/changelogs/phil235-SmokeFoamBuff.yml
@@ -0,0 +1,14 @@
+
+author: phil
+
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Smoke and foam touch reactions gets buffed."
+ - rscadd: "Reagent dispensers (watertank, fueltank) tells you how much reagents they have left when examined."
+ - tweak: "Liquid dark matter blob spore smoke now cannot throw you. The effects of sorium, blob sorium, liquid dark matter and blob liquid dark matter are now scaled by their volume. Sorium/LDM blob's touch now throws the mobs who are close but simply moves the mobs that are further away."