Baystation Update Merge 01

Mahoosive update. A lot of things.
This commit is contained in:
skull132
2014-04-16 23:54:43 +03:00
parent defa9e7fd4
commit 6d192181ea
383 changed files with 36251 additions and 10238 deletions
+252
View File
@@ -0,0 +1,252 @@
/////////////////////////////////////////////
// Chem smoke
/////////////////////////////////////////////
/obj/effect/effect/smoke/chem
icon = 'icons/effects/chemsmoke.dmi'
opacity = 0
time_to_live = 300
pass_flags = PASSTABLE | PASSGRILLE | PASSGLASS //PASSGLASS is fine here, it's just so the visual effect can "flow" around glass
/obj/effect/effect/smoke/chem/New()
..()
var/datum/reagents/R = new/datum/reagents(500)
reagents = R
R.my_atom = src
return
/datum/effect/effect/system/smoke_spread/chem
smoke_type = /obj/effect/effect/smoke/chem
var/obj/chemholder
var/range
var/list/targetTurfs
var/list/wallList
var/density
/datum/effect/effect/system/smoke_spread/chem/New()
..()
chemholder = new/obj()
var/datum/reagents/R = new/datum/reagents(500)
chemholder.reagents = R
R.my_atom = chemholder
//------------------------------------------
//Sets up the chem smoke effect
//
// Calculates the max range smoke can travel, then gets all turfs in that view range.
// Culls the selected turfs to a (roughly) circle shape, then calls smokeFlow() to make
// sure the smoke can actually path to the turfs. This culls any turfs it can't reach.
//------------------------------------------
/datum/effect/effect/system/smoke_spread/chem/set_up(var/datum/reagents/carry = null, n = 10, c = 0, loca, direct)
range = n * 0.3
cardinals = c
carry.copy_to(chemholder, carry.total_volume)
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
if(!location)
return
targetTurfs = new()
//build affected area list
for(var/turf/T in view(range, location))
//cull turfs to circle
if(cheap_pythag(T.x - location.x, T.y - location.y) <= range)
targetTurfs += T
//make secondary list for reagents that affect walls
if(chemholder.reagents.has_reagent("thermite") || chemholder.reagents.has_reagent("plantbgone"))
wallList = new()
//pathing check
smokeFlow(location, targetTurfs, wallList)
//set the density of the cloud - for diluting reagents
density = max(1, targetTurfs.len / 4) //clamp the cloud density minimum to 1 so it cant multiply the reagents
//Admin messaging
var/contained = ""
for(var/reagent in carry.reagent_list)
contained += " [reagent] "
if(contained)
contained = "\[[contained]\]"
var/area/A = get_area(location)
var/where = "[A.name] | [location.x], [location.y]"
var/whereLink = "<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>[where]</a>"
if(carry.my_atom.fingerprintslast)
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
var/more = ""
if(M)
more = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</a>)"
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
else
message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
//------------------------------------------
//Runs the chem smoke effect
//
// Spawns damage over time loop for each reagent held in the cloud.
// Applies reagents to walls that affect walls (only thermite and plant-b-gone at the moment).
// Also calculates target locations to spawn the visual smoke effect on, so the whole area
// is covered fairly evenly.
//------------------------------------------
/datum/effect/effect/system/smoke_spread/chem/start()
if(!location) //kill grenade if it somehow ends up in nullspace
return
//reagent application - only run if there are extra reagents in the smoke
if(chemholder.reagents.reagent_list.len)
for(var/datum/reagent/R in chemholder.reagents.reagent_list)
var/proba = 100
var/runs = 5
//dilute the reagents according to cloud density
R.volume /= density
chemholder.reagents.update_total()
//apply wall affecting reagents to walls
if(R.id in list("thermite", "plantbgone"))
for(var/turf/T in wallList)
R.reaction_turf(T, R.volume)
//reagents that should be applied to turfs in a random pattern
if(R.id == "carbon")
proba = 75
else if(R.id in list("blood", "radium", "uranium"))
proba = 25
spawn(0)
for(var/i = 0, i < runs, i++)
for(var/turf/T in targetTurfs)
if(prob(proba))
R.reaction_turf(T, R.volume)
for(var/atom/A in T.contents)
if(istype(A, /obj/effect/effect/smoke/chem)) //skip the item if it is chem smoke
continue
else if(istype(A, /mob))
var/dist = cheap_pythag(T.x - location.x, T.y - location.y)
if(!dist)
dist = 1
R.reaction_mob(A, volume = R.volume / dist)
else if(istype(A, /obj))
R.reaction_obj(A, R.volume)
sleep(30)
//build smoke icon
var/color = mix_color_from_reagents(chemholder.reagents.reagent_list)
var/icon/I
if(color)
I = icon('icons/effects/chemsmoke.dmi')
I += color
else
I = icon('icons/effects/96x96.dmi', "smoke")
//distance between each smoke cloud
var/const/arcLength = 2.3559
//calculate positions for smoke coverage - then spawn smoke
for(var/i = 0, i < range, i++)
var/radius = i * 1.5
if(!radius)
spawn(0)
spawnSmoke(location, I, 1)
continue
var/offset = 0
var/points = round((radius * 2 * PI) / arcLength)
var/angle = round(ToDegrees(arcLength / radius), 1)
if(!IsInteger(radius))
offset = 45 //degrees
for(var/j = 0, j < points, j++)
var/a = (angle * j) + offset
var/x = round(radius * cos(a) + location.x, 1)
var/y = round(radius * sin(a) + location.y, 1)
var/turf/T = locate(x,y,location.z)
if(!T)
continue
if(T in targetTurfs)
spawn(0)
spawnSmoke(T, I, range)
//------------------------------------------
// Randomizes and spawns the smoke effect.
// Also handles deleting the smoke once the effect is finished.
//------------------------------------------
/datum/effect/effect/system/smoke_spread/chem/proc/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1)
var/obj/effect/effect/smoke/chem/smoke = new(location)
if(chemholder.reagents.reagent_list.len)
chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / dist, safety = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents
smoke.icon = I
smoke.layer = 6
smoke.dir = pick(cardinal)
smoke.pixel_x = -32 + rand(-8,8)
smoke.pixel_y = -32 + rand(-8,8)
walk_to(smoke, T)
smoke.opacity = 1 //switching opacity on after the smoke has spawned, and then
sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner
smoke.opacity = 0 // lighting and view range updates
fadeOut(smoke)
smoke.delete()
//------------------------------------------
// Fades out the smoke smoothly using it's alpha variable.
//------------------------------------------
/datum/effect/effect/system/smoke_spread/chem/proc/fadeOut(var/atom/A, var/frames = 16)
var/step = A.alpha / frames
for(var/i = 0, i < frames, i++)
A.alpha -= step
sleep(world.tick_lag)
return
//------------------------------------------
// Smoke pathfinder. Uses a flood fill method based on zones to
// quickly check what turfs the smoke (airflow) can actually reach.
//------------------------------------------
/datum/effect/effect/system/smoke_spread/chem/proc/smokeFlow()
var/list/pending = new()
var/list/complete = new()
pending += location
while(pending.len)
for(var/turf/simulated/current in pending)
for(var/D in cardinal)
var/turf/simulated/target = get_step(current, D)
if(wallList)
if(istype(target, /turf/simulated/wall))
if(!(target in wallList))
wallList += target
continue
if(!target.zone)
continue
if(target in pending)
continue
if(target in complete)
continue
if(!(target in targetTurfs))
continue
pending += target
pending -= current
complete += current
targetTurfs = complete
return
+22 -83
View File
@@ -1,8 +1,6 @@
//########################## CONTRABAND ;3333333333333333333 -Agouri ###################################################
#define NUM_OF_POSTER_DESIGNS 10
/obj/item/weapon/contraband
name = "contraband item"
desc = "You probably shouldn't be holding this."
@@ -15,54 +13,16 @@
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface."
icon_state = "rolled_poster"
var/serial_number = 0
var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor
/obj/item/weapon/contraband/poster/New(turf/loc, var/given_serial = 0)
if(given_serial == 0)
serial_number = rand(1, NUM_OF_POSTER_DESIGNS)
resulting_poster = new(serial_number)
serial_number = rand(1, poster_designs.len)
else
serial_number = given_serial
//We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster.
name += " - No. [serial_number]"
..(loc)
/*/obj/item/weapon/contraband/poster/attack(mob/M as mob, mob/user as mob)
src.add_fingerprint(user)
if(resulting_poster)
resulting_poster.add_fingerprint(user)
..()*/
/*/obj/item/weapon/contraband/poster/attack(atom/A, mob/user as mob) //This shit is handled through the wall's attackby()
if(istype(A, /turf/simulated/wall))
if(resulting_poster == null)
return
else
var/turf/simulated/wall/W = A
var/check = 0
var/stuff_on_wall = 0
for(var/obj/O in W.contents) //Let's see if it already has a poster on it or too much stuff
if(istype(O,/obj/structure/sign/poster))
check = 1
break
stuff_on_wall++
if(stuff_on_wall == 3)
check = 1
break
if(check)
user << "<span class='notice'>The wall is far too cluttered to place a poster!</span>"
return
resulting_poster.loc = W //Looks like it's uncluttered enough. Place the poster
W.contents += resulting_poster
del(src)*/
//############################## THE ACTUAL DECALS ###########################
obj/structure/sign/poster
@@ -79,44 +39,13 @@ obj/structure/sign/poster/New(var/serial)
serial_number = serial
if(serial_number == loc)
serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters.
serial_number = rand(1, poster_designs.len) //This is for the mappers that want individual posters without having to use rolled posters.
icon_state = "poster[serial_number]"
switch(serial_number)
if(1)
name += " - Free Tonto"
desc += " A framed shred of a much larger flag, colors bled together and faded from age."
if(2)
name += " - Atmosia Declaration of Independence"
desc += " A relic of a failed rebellion"
if(3)
name += " - Fun Police"
desc += " A poster condemning the station's security forces."
if(4)
name += " - Lusty Xeno"
desc += " A heretical poster depicting the titular star of an equally heretical book."
if(5)
name += " - Syndicate Recruitment Poster"
desc += " See the galaxy! Shatter corrupt megacorporations! Join today!"
if(6)
name += " - Clown"
desc += " Honk."
if(7)
name += " - Smoke"
desc += " A poster depicting a carton of cigarettes."
if(8)
name += " - Grey Tide"
desc += " A rebellious poster symbolizing assistant solidarity."
if(9)
name += " - Missing Gloves"
desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
if(10)
name += " - Hacking Guide"
desc += " This poster details the internal workings of the common Nanotrasen airlock."
else
name = "This shit just bugged. Report it to Agouri - polyxenitopalidou@gmail.com"
desc = "Why are you still here?"
var/designtype = poster_designs[serial_number]
var/datum/poster/design=new designtype
name += " - [design.name]"
desc += " [design.desc]"
icon_state = design.icon_state // poster[serial_number]
..()
obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -151,14 +80,17 @@ obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/structure/sign/poster/proc/roll_and_drop(turf/newloc)
var/obj/item/weapon/contraband/poster/P = new(src, serial_number)
P.resulting_poster = src
P.loc = newloc
src.loc = P
del(src)
//seperated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby()
//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby()
/turf/simulated/wall/proc/place_poster(var/obj/item/weapon/contraband/poster/P, var/mob/user)
if(!P.resulting_poster) return
if(!istype(src,/turf/simulated/wall))
user << "\red You can't place this here!"
return
var/stuff_on_wall = 0
for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff
@@ -173,7 +105,7 @@ obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
user << "<span class='notice'>You start placing the poster on the wall...</span>" //Looks like it's uncluttered enough. Place the poster.
//declaring D because otherwise if P gets 'deconstructed' we lose our reference to P.resulting_poster
var/obj/structure/sign/poster/D = P.resulting_poster
var/obj/structure/sign/poster/D = new(P.serial_number)
var/temp_loc = user.loc
flick("poster_being_set",D)
@@ -188,4 +120,11 @@ obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
user << "<span class='notice'>You place the poster!</span>"
else
D.roll_and_drop(temp_loc)
return
return
/datum/poster
// Name suffix. Poster - [name]
var/name=""
// Description suffix
var/desc=""
var/icon_state=""
@@ -0,0 +1,145 @@
// baystation12 posters
/datum/poster/bay_1
icon_state="bsposter1"
name = "Unlucky Space Explorer"
desc = "This particular one depicts a skeletal form within a space suit."
/datum/poster/bay_2
icon_state="bsposter2"
name = "Positronic Logic Conflicts"
desc = "This particular one depicts the cold, unmoving stare of a particular advanced AI."
/datum/poster/bay_3
icon_state="bsposter3"
name = "Paranoia"
desc = "This particular one warns of the dangers of trusting your co-workers too much."
/datum/poster/bay_4
icon_state="bsposter4"
name = "Keep Calm"
desc = "This particular one is of a famous New Earth design, although a bit modified. Someone has scribbled an O over the A on the poster."
/datum/poster/bay_5
icon_state="bsposter5"
name = "Martian Warlord"
desc = "This particular one depicts the cartoony mug of a certain Martial Warmonger."
/datum/poster/bay_6
icon_state="bsposter6"
name = "Technological Singularity"
desc = "This particular one is of the blood-curdling symbol of a long-since defeated enemy of humanity."
/datum/poster/bay_7
icon_state="bsposter7"
name = "Wasteland"
desc = "This particular one is of a couple of ragged gunmen, one male and one female, on top of a mound of rubble. The number \"12\" is visible on their blue jumpsuits."
/datum/poster/bay_8
icon_state="bsposter8"
name = "Pinup Girl Cindy"
desc = "This particular one is of Nanotrasen's PR girl, Cindy, in a particularly feminine pose."
/datum/poster/bay_9
icon_state="bsposter9"
name = "Pinup Girl Amy"
desc = "This particular one is of Amy, the nymphomaniac Urban Legend of Nanotrasen Space Stations. How this photograph came to be is not known."
/datum/poster/bay_10
icon_state="bsposter10"
name = "Don't Panic"
desc = "This particular one depicts some sort of star in a grimace. The \"Don't Panic\" is written in big, friendly letters."
/datum/poster/bay_11
icon_state="bsposter11"
name = "Underwater Laboratory"
desc = "This particular one is of the fabled last crew of Nanotrasen's previous project before going big on plasma research."
/datum/poster/bay_12
icon_state="bsposter12"
name = "Rogue AI"
desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of Nanotrasen's earliest space stations. Back then, the corporation was just known as TriOptimum."
/datum/poster/bay_13
icon_state="bsposter13"
name = "User of the Arcane Arts"
desc = "This particular one depicts a wizard, casting a spell. You can't really make out if it's an actual photograph or a computer-generated image."
/datum/poster/bay_14
icon_state="bsposter14"
name = "Levitating Skull"
desc = "This particular one is the portrait of a flying enchanted skull. Its adventures along with its fabled companion are now fading through history..."
/datum/poster/bay_15
icon_state="bsposter15"
name = "Augmented Legend"
desc = "This particular one is of an obviously augmented individual, gazing towards the sky. The cyber-city in the backround is rather punkish."
/datum/poster/bay_16
icon_state="bsposter16"
name = "Dangerous Static"
desc = "This particular one depicts nothing remarkable other than a rather mesmerising pattern of monitor static. There's a tag on the sides of the poster, but it's ripped off."
/datum/poster/bay_17
icon_state="bsposter17"
name = "Pinup Girl Val"
desc = "Luscious Val McNeil, the vertically challenged Legal Extraordinaire, winner of Miss Space two years running and favoured pinup girl of Lawyers Weekly."
/datum/poster/bay_18
icon_state="bsposter18"
name = "Derpman, Enforcer of the State"
desc = "Here to protect and serve... your donuts! A generously proportioned man, he teaches you the value of hiding your snacks."
/datum/poster/bay_19
icon_state="bsposter19"
name = "Respect a Unathi"
desc = "This poster depicts a well dressed looking Unathi receiving a prestigious award. It appears to espouse greater co-operation and harmony between the two races."
/datum/poster/bay_20
icon_state="bsposter20"
name = "Skrell Twilight"
desc = "This poster depicts a mysteriously inscrutable, alien scene. Numerous Skrell can be seen conversing amidst great, crystalline towers rising above crashing waves"
/datum/poster/bay_21
icon_state="bsposter21"
name = "Join the Fuzz!"
desc = "It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\""
/datum/poster/bay_22
icon_state="bsposter22"
name = "Looking for a career with excitement?"
desc = "A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom."
/datum/poster/bay_23
icon_state="bsposter23"
name = "Safety first: because electricity doesn't wait!"
desc = "A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\""
/datum/poster/bay_24
icon_state="bsposter24"
name = "Responsible medbay habits, No #259"
desc = "A poster with a nervous looking geneticist on it states; \"Friends Don't Tell Friends They're Clones. It can cause severe and irreparable emotional trauma. Always do the right thing and never tell them that they were dead.\""
/datum/poster/bay_25
icon_state="bsposter25"
name = "Irresponsible medbay habits, No #2"
desc = "This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\""
/datum/poster/bay_26
icon_state="bsposter26"
name = "The Men We Knew"
desc = "This movie poster depicts a group of soldiers fighting a large mech, the movie seems to be a patriotic war movie."
/datum/poster/bay_27
icon_state="bsposter27"
name = "Plastic Sheep Can't Scream"
desc = "This is a movie poster for an upcoming horror movie, it features an AI in the front of it."
/datum/poster/bay_28
icon_state="bsposter28"
name = "The Stars Know Love"
desc = "This is a movie poster. A bleeding woman is shown drawing a heart in her blood on the window of space ship, it seems to be a romantic Drama."
/datum/poster/bay_29
icon_state="bsposter29"
name = "Winter Is Coming"
desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep the station from freezing during planetary occultation!\""
@@ -0,0 +1,50 @@
// /tg/ posters.
/datum/poster/tg_1
name = "Free Tonto"
desc = "A framed shred of a much larger flag, colors bled together and faded from age."
icon_state="poster1"
/datum/poster/tg_2
name = "Atmosia Declaration of Independence"
desc = "A relic of a failed rebellion"
icon_state="poster2"
/datum/poster/tg_3
name = "Fun Police"
desc = "A poster condemning the station's security forces."
icon_state="poster3"
/datum/poster/tg_4
name = "Lusty Xeno"
desc = "A heretical poster depicting the titular star of an equally heretical book."
icon_state="poster4"
/datum/poster/tg_5
name = "Syndicate Recruitment Poster"
desc = "See the galaxy! Shatter corrupt megacorporations! Join today!"
icon_state="poster5"
/datum/poster/tg_6
name = "Clown"
desc = "Honk."
icon_state="poster6"
/datum/poster/tg_7
name = "Smoke"
desc = "A poster depicting a carton of cigarettes."
icon_state="poster7"
/datum/poster/tg_8
name = "Grey Tide"
desc = "A rebellious poster symbolizing assistant solidarity."
icon_state="poster8"
/datum/poster/tg_9
name = "Missing Gloves"
desc = "This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
icon_state="poster9"
/datum/poster/tg_10
name = "Hacking Guide"
desc = "This poster details the internal workings of the common Nanotrasen airlock."
icon_state="poster10"
+10 -118
View File
@@ -201,7 +201,8 @@ steam.start() -- spawns the effect
sleep(5)
step(sparks,direction)
spawn(20)
sparks.delete()
if(sparks)
sparks.delete()
src.total_sparks--
@@ -379,116 +380,7 @@ steam.start() -- spawns the effect
/datum/effect/effect/system/smoke_spread/mustard
smoke_type = /obj/effect/effect/smoke/mustard
/////////////////////////////////////////////
// Chem smoke
/////////////////////////////////////////////
/obj/effect/effect/smoke/chem
icon = 'icons/effects/chemsmoke.dmi'
/obj/effect/effect/smoke/chem/New()
..()
var/datum/reagents/R = new/datum/reagents(500)
reagents = R
R.my_atom = src
return
/obj/effect/effect/smoke/chem/Move()
..()
for(var/atom/A in view(2, src))
if(reagents.has_reagent("radium")||reagents.has_reagent("uranium")||reagents.has_reagent("carbon")||reagents.has_reagent("thermite"))//Prevents unholy radium spam by reducing the number of 'greenglows' down to something reasonable -Sieve
if(prob(5))
reagents.reaction(A)
else
reagents.reaction(A)
return
/obj/effect/effect/smoke/chem/affect(mob/living/carbon/M as mob )
reagents.reaction(M)
/datum/effect/effect/system/smoke_spread/chem
smoke_type = /obj/effect/effect/smoke/chem
var/obj/chemholder
New()
..()
chemholder = new/obj()
var/datum/reagents/R = new/datum/reagents(500)
chemholder.reagents = R
R.my_atom = chemholder
set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct)
if(n > 20)
n = 20
number = n
cardinals = c
carry.copy_to(chemholder, carry.total_volume)
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
if(direct)
direction = direct
var/contained = ""
for(var/reagent in carry.reagent_list)
contained += " [reagent] "
if(contained)
contained = "\[[contained]\]"
var/area/A = get_area(location)
var/where = "[A.name] | [location.x], [location.y]"
var/whereLink = "<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>[where]</a>"
if(carry.my_atom.fingerprintslast)
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
var/more = ""
if(M)
more = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</a>)"
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
else
message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", 0, 1)
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
start()
var/i = 0
var/color = mix_color_from_reagents(chemholder.reagents.reagent_list)
for(i=0, i<src.number, i++)
if(src.total_smoke > 20)
return
spawn(0)
if(holder)
src.location = get_turf(holder)
var/obj/effect/effect/smoke/chem/smoke = new /obj/effect/effect/smoke/chem(src.location)
src.total_smoke++
var/direction = src.direction
if(!direction)
if(src.cardinals)
direction = pick(cardinal)
else
direction = pick(alldirs)
if(chemholder.reagents.total_volume != 1) // can't split 1 very well
chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly
if(color)
smoke.icon += color // give the smoke color, if it has any to begin with
else
// if no color, just use the old smoke icon
smoke.icon = 'icons/effects/96x96.dmi'
smoke.icon_state = "smoke"
for(i=0, i<pick(0,1,1,1,2,2,2,3), i++)
sleep(10)
step(smoke,direction)
spawn(150+rand(10,30))
smoke.delete()
src.total_smoke--
/////////////////////////////////////////////
//////// Attach an Ion trail to any object, that spawns when it moves (like for the jetpack)
@@ -615,6 +507,7 @@ steam.start() -- spawns the effect
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
spawn(3 + metal*3)
process()
checkReagents()
spawn(120)
processing_objects.Remove(src)
sleep(30)
@@ -629,14 +522,13 @@ steam.start() -- spawns the effect
delete()
return
// on delete, transfer any reagents to the floor
/obj/effect/effect/foam/Del()
// transfer any reagents to the floor
/obj/effect/effect/foam/proc/checkReagents()
if(!metal && reagents)
for(var/atom/A in oview(0,src))
for(var/atom/A in src.loc.contents)
if(A == src)
continue
reagents.reaction(A, 1, 1)
..()
/obj/effect/effect/foam/process()
if(--amount < 0)
@@ -663,7 +555,7 @@ steam.start() -- spawns the effect
F.create_reagents(10)
if (reagents)
for(var/datum/reagent/R in reagents.reagent_list)
F.reagents.add_reagent(R.id,1)
F.reagents.add_reagent(R.id, 1, safety = 1) //added safety check since reagents in the foam have already had a chance to react
// foam disolves when heated
// except metal foams
@@ -734,9 +626,9 @@ steam.start() -- spawns the effect
if(carried_reagents)
for(var/id in carried_reagents)
F.reagents.add_reagent(id,1)
F.reagents.add_reagent(id, 1, null, 1) //makes a safety call because all reagents should have already reacted anyway
else
F.reagents.add_reagent("water", 1)
F.reagents.add_reagent("water", 1, safety = 1)
// wall formed by metal foams
// dense and opaque, but easy to break
@@ -827,7 +719,7 @@ steam.start() -- spawns the effect
if(!air_master)
return 0
air_master.AddTurfToUpdate(get_turf(src))
air_master.mark_for_update(get_turf(src))
return 1