Chem grenade fixes

Fixes #3986

- Foam reagent inheritance fixed:
The trans_to() proc in Chemistry-Holder.dm was calling handle_reactions() every time it would add and remove reagents with add_reagent() and remove_reagent(). I've added a safety flag to both of these procs (and copy_to()) so that trans_to will not call handle_reactions() until it has added all the reagents to the target container. This allows foam to reliably take on the properties of other leftover reagents.

- Fixed a bug in effect_system.dm that wasn't applying reagents from foam to the environment.

- Tweaked smoke to apply reagent effects after it has stopped moving
This was causing huge reagent spam at the center of the smoke cloud as it was spawning, since they were being applied every time the cloud of smoke moved. Also changed it to apply the effects 2-3 times at longer intervals (2 seconds).

- Smoke also only effects tiles in a 3x3 grid now, rather than 5x5.

- Summary:
Chem smoke does slightly less damage (if it contains damaging reagents)
Chem smoke proc calls reduced by 60-70% (significant lag reduction)
Foam works properly again
Foam proc calls reduced by 70-80%
This commit is contained in:
Loganbacca
2014-02-13 00:15:02 +13:00
parent 47083c63ef
commit 02810f7e89
5 changed files with 51 additions and 49 deletions

View File

@@ -112,8 +112,8 @@ datum
if(preserve_data)
trans_data = current_reagent.data
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
src.remove_reagent(current_reagent.id, current_reagent_transfer)
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety checks on these so all chemicals are transferred
src.remove_reagent(current_reagent.id, current_reagent_transfer, safety = 1) // to the target container before handling reactions
src.update_total()
R.update_total()
@@ -121,7 +121,7 @@ datum
src.handle_reactions()
return amount
copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)
copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0)
if(!target)
return
if(!target.reagents || src.total_volume<=0)
@@ -134,12 +134,13 @@ datum
var/current_reagent_transfer = current_reagent.volume * part
if(preserve_data)
trans_data = current_reagent.data
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety check so all chemicals are transferred before reacting
src.update_total()
R.update_total()
R.handle_reactions()
src.handle_reactions()
if(!safety)
R.handle_reactions()
src.handle_reactions()
return amount
trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
@@ -397,7 +398,7 @@ datum
else R.reaction_obj(A, R.volume+volume_modifier)
return
add_reagent(var/reagent, var/amount, var/list/data=null)
add_reagent(var/reagent, var/amount, var/list/data=null, var/safety = 0)
if(!isnum(amount)) return 1
update_total()
if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
@@ -435,7 +436,8 @@ datum
preserve += D
R.data["viruses"] = preserve
handle_reactions()
if(!safety)
handle_reactions()
return 0
var/datum/reagent/D = chemical_reagents_list[reagent]
@@ -454,17 +456,18 @@ datum
//debug
update_total()
my_atom.on_reagent_change()
handle_reactions()
if(!safety)
handle_reactions()
return 0
else
warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])")
handle_reactions()
if(!safety)
handle_reactions()
return 1
remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
remove_reagent(var/reagent, var/amount, var/safety = 0)//Added a safety check for the trans_id_to
if(!isnum(amount)) return 1
for(var/A in reagent_list)

View File

@@ -925,18 +925,20 @@ datum
else
if(O)
O.clean_blood()
reaction_turf(var/turf/T, var/volume)
if(volume >= 1)
if(istype(T, /turf/simulated))
var/turf/simulated/S = T
S.dirt = 0
T.overlays.Cut()
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in src)
for(var/obj/effect/decal/cleanable/C in T.contents)
src.reaction_obj(C, volume)
del(C)
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5,10))
reaction_turf(var/turf/simulated/S, var/volume)
if(volume >= 1)
S.dirt = 0
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))

View File

@@ -458,7 +458,7 @@ datum
var/location = get_turf(holder.my_atom)
var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem
S.attach(location)
S.set_up(holder, 10, 0, location)
S.set_up(holder, created_volume/7.5, 0, location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
spawn(0)
S.start()