Merge pull request #10493 from phil235/SmokeFoamBuff

Foam&Smoke buff, some tweaks to sorium/ldm effect, plus some fixes.
This commit is contained in:
Remie Richards
2015-07-18 03:45:38 +01:00
16 changed files with 136 additions and 77 deletions
@@ -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
@@ -11,6 +11,8 @@
can_unwrench = 1
welded = 0
var/area/initial_loc
level = 1
var/area_uid
@@ -12,6 +12,8 @@
can_unwrench = 1
welded = 0
var/area/initial_loc
var/id_tag = null
var/frequency = 1439
-2
View File
@@ -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
+4 -7
View File
@@ -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)
+4 -4
View File
@@ -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()
@@ -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
@@ -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
@@ -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
@@ -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 << "<span class='warning'>Metal foam mix is still being synthesized...</span>"
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("<span class='danger'>[V] was frozen shut!</span>")
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("<span class='danger'>[U] was frozen shut!</span>")
for(var/mob/living/L in T)
L.ExtinguishMob()
for(var/obj/item/Item in T)
+1 -1
View File
@@ -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)
@@ -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
+22 -9
View File
@@ -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)
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
@@ -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"
+27 -18
View File
@@ -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)
/obj/structure/reagent_dispensers/virusfood/New()
..()
reagents.add_reagent("virusfood", 1000)
+14
View File
@@ -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."