Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into STILLALOTOFBLOOD

This commit is contained in:
Aurorablade
2015-07-17 10:14:46 -04:00
57 changed files with 1294 additions and 1040 deletions
+14
View File
@@ -493,6 +493,20 @@
dat += "in [flag_loc.loc] at ([flag_loc.x], [flag_loc.y], [flag_loc.z])</td></tr>"
dat += "</table>"
if(istype(ticker.mode, /datum/game_mode/blob))
var/datum/game_mode/blob/mode = ticker.mode
dat += "<br><table cellspacing=5><tr><td><B>Blob</B></td><td></td><td></td></tr>"
dat += "<tr><td><i>Progress: [blobs.len]/[mode.blobwincount]</i></td></tr>"
for(var/datum/mind/blob in mode.infected_crew)
var/mob/M = blob.current
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
else
dat += "<tr><td><i>Blob not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.changelings.len)
dat += check_role_table("Changelings", ticker.mode.changelings, src)
+1 -2
View File
@@ -668,12 +668,11 @@
jobs += "</tr><tr align='center'>" //Breaking it up so it fits nicer on the screen every 5 entries
/* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment
//Malfunctioning AI
if(jobban_isbanned(M, "malf AI") || isbanned_dept)
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=malf AI;jobban4=\ref[M]'><font color=red>[replacetext("Malf AI", " ", "&nbsp")]</font></a></td>"
else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=malf AI;jobban4=\ref[M]'>[replacetext("Malf AI", " ", "&nbsp")]</a></td>"
*/
//Alien
if(jobban_isbanned(M, "alien") || isbanned_dept)
+8 -57
View File
@@ -1,73 +1,24 @@
/datum/event/blob
announceWhen = 120
noAutoEnd = 1
var/nuke_announced = 0
announceWhen = 12
endWhen = 120
var/obj/effect/blob/core/Blob
/datum/event/blob/announce()
command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. Nanotrasen has issued a directive 7-10. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage."
aiPlayer.set_zeroth_law(law)
aiPlayer << "\red <b>You have detected a change in your laws information:</b>"
aiPlayer << "Laws Updated: [law]"
/datum/event/blob/start()
var/turf/T = pick(blobstart)
if(!T)
kill()
return
return kill()
Blob = new /obj/effect/blob/core(T, 200)
for(var/i = 1; i < rand(3, 6), i++)
Blob.process()
/datum/event/blob/tick()
if(Blob && IsMultiple(activeFor, 3))
Blob.process()
if(blobs.len > 700*0.6 && !nuke_announced)
announce_nuke()
nuke_announced = 1
if(!Blob && !blob_cores.len)
if(!Blob)
kill()
return
/datum/event/blob/proc/announce_nuke()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code && (bomb.z in config.station_levels))
nukecode = bomb.r_code
command_announcement.Announce("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to maintain quarantine. The Nuclear Authentication Code is [nukecode] ", "Biohazard Alert")
set_security_level("gamma")
var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world
if(V && (V.z in config.station_levels))
V.locked = 0
V.update_icon()
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs. The nuclear failsafe must be activated at any cost, the code is: [nukecode]."
aiPlayer.set_zeroth_law(law)
aiPlayer << "\red <b>You have detected a change in your laws information:</b>"
aiPlayer << "Laws Updated: [law]"
spawn(10)
world << sound('sound/effects/siren.ogg')
/datum/event/blob/kill()
spawn(10)
if(Blob || blob_cores.len)
return
command_announcement.Announce("The level 7 biohazard aboard [station_name()] has been eliminated. Directive 7-10 has been lifted, and the station is no longer quarantined.", "Biohazard Update")
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
aiPlayer.clear_zeroth_law()
aiPlayer << "\red <b>You have detected a change in your laws information:</b>"
aiPlayer << "Laws Updated: Zeroth law removed."
..()
if(IsMultiple(activeFor, 3))
Blob.process()
+10 -39
View File
@@ -116,11 +116,7 @@
/datum/light_source/proc/falloff(atom/movable/lighting_overlay/O)
#if LIGHTING_FALLOFF == 1 // circular
#if LIGHTING_RESOLUTION == 1
. = (O.x - source_turf.x)**2 + (O.y - source_turf.y)**2 + LIGHTING_HEIGHT
#else
. = (O.x - source_turf.x + O.xoffset)**2 + (O.y - source_turf.y + O.yoffset)**2 + LIGHTING_HEIGHT
#endif
#if LIGHTING_LAMBERTIAN == 1
. = CLAMP01((1 - CLAMP01(sqrt(.) / max(1,light_range))) * (1 / (sqrt(. + 1))))
@@ -129,11 +125,7 @@
#endif
#elif LIGHTING_FALLOFF == 2 // square
#if LIGHTING_RESOLUTION == 1
. = abs(O.x - source_turf.x) + abs(O.y - source_turf.y) + LIGHTING_HEIGHT
#else
. = abs(O.x - source_turf.x + O.xoffset) + abs(O.y - source_turf.y + O.yoffset) + LIGHTING_HEIGHT
#endif
#if LIGHTING_LAMBERTIAN == 1
. = CLAMP01((1 - CLAMP01(. / max(1,light_range))) * (1 / (sqrt(.)**2 + )))
@@ -145,16 +137,15 @@
/datum/light_source/proc/apply_lum()
applied = 1
if(istype(source_turf))
#if LIGHTING_RESOLUTION == 1
for(var/turf/T in dview(light_range, source_turf, INVISIBILITY_LIGHTING))
if(T.lighting_overlay)
var/strength = light_power * falloff(T.lighting_overlay)
if(!strength) //Don't add turfs that aren't affected to the affected turfs.
continue
effect_r[T.lighting_overlay] = round(lum_r * strength, LIGHTING_ROUND_VALUE)
effect_g[T.lighting_overlay] = round(lum_g * strength, LIGHTING_ROUND_VALUE)
effect_b[T.lighting_overlay] = round(lum_b * strength, LIGHTING_ROUND_VALUE)
effect_r += round(lum_r * strength, LIGHTING_ROUND_VALUE)
effect_g += round(lum_g * strength, LIGHTING_ROUND_VALUE)
effect_b += round(lum_b * strength, LIGHTING_ROUND_VALUE)
T.lighting_overlay.update_lumcount(
round(lum_r * strength, LIGHTING_ROUND_VALUE),
@@ -162,48 +153,28 @@
round(lum_b * strength, LIGHTING_ROUND_VALUE)
)
if(!T.affecting_lights)
T.affecting_lights = list()
T.affecting_lights += src
effect_turf += T
#else
for(var/turf/T in dview(light_range, source_turf, INVISIBILITY_LIGHTING))
for(var/atom/movable/lighting_overlay/L in T.lighting_overlays)
var/strength = light_power * falloff(L)
effect_r[L] = round(lum_r * strength, LIGHTING_ROUND_VALUE)
effect_g[L] = round(lum_g * strength, LIGHTING_ROUND_VALUE)
effect_b[L] = round(lum_b * strength, LIGHTING_ROUND_VALUE)
L.update_lumcount(
round(lum_r * strength, LIGHTING_ROUND_VALUE),
round(lum_g * strength, LIGHTING_ROUND_VALUE),
round(lum_b * strength, LIGHTING_ROUND_VALUE)
)
else
effect_r += 0
effect_g += 0
effect_b += 0
if(!T.affecting_lights)
T.affecting_lights = list()
T.affecting_lights += src
effect_turf += T
#endif
/datum/light_source/proc/remove_lum()
applied = 0
var/i = 1
for(var/turf/T in effect_turf)
if(T.affecting_lights)
T.affecting_lights -= src
#if LIGHTING_RESOLUTION == 1
if(T.lighting_overlay)
T.lighting_overlay.update_lumcount(-effect_r[T.lighting_overlay], -effect_g[T.lighting_overlay], -effect_b[T.lighting_overlay])
#else
for(var/atom/movable/lighting_overlay/L in T.lighting_overlays)
L.lighting_overlay.update_lumcount(-effect_r[L], -effect_g[L], -effect_b[L])
#endif
T.lighting_overlay.update_lumcount(-effect_r[i], -effect_g[i], -effect_b[i])
i++
effect_r.Cut()
effect_g.Cut()
+1 -9
View File
@@ -9,16 +9,12 @@
invisibility = INVISIBILITY_LIGHTING
blend_mode = BLEND_MULTIPLY
color = "#000000"
icon_state = "light1"
var/lum_r
var/lum_g
var/lum_b
#if LIGHTING_RESOLUTION != 1
var/xoffset
var/yoffset
#endif
var/needs_update
/atom/movable/lighting_overlay/New()
@@ -107,11 +103,7 @@
var/turf/T = loc
if(istype(T))
#if LIGHTING_RESOLUTION == 1
T.lighting_overlay = null
#else
T.lighting_overlays -= src
#endif
for(var/datum/light_source/D in T.affecting_lights) //Remove references to us on the light sources affecting us.
D.effect_r -= src
D.effect_g -= src
+1 -27
View File
@@ -5,28 +5,15 @@
// duplicates lots of code, but this proc needs to be as fast as possible.
/proc/create_lighting_overlays(zlevel = 0)
var/state = "light[LIGHTING_RESOLUTION]"
var/area/A
if(zlevel == 0) // populate all zlevels
for(var/turf/T in world)
if(T.dynamic_lighting)
A = T.loc
if(A.lighting_use_dynamic)
#if LIGHTING_RESOLUTION == 1
var/atom/movable/lighting_overlay/O = new(T)
O.icon_state = state
T.lighting_overlay = O
#else
for(var/i = 0; i < LIGHTING_RESOLUTION; i++)
for(var/j = 0; j < LIGHTING_RESOLUTION; j++)
var/atom/movable/lighting_overlay/O = new(T)
O.pixel_x = i * (32 / LIGHTING_RESOLUTION)
O.pixel_y = j * (32 / LIGHTING_RESOLUTION)
O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
O.icon_state = state
T.lighting_overlays += O
#endif
else
for(var/x = 1; x <= world.maxx; x++)
for(var/y = 1; y <= world.maxy; y++)
@@ -34,18 +21,5 @@
if(T.dynamic_lighting)
A = T.loc
if(A.lighting_use_dynamic)
#if LIGHTING_RESOLUTION == 1
var/atom/movable/lighting_overlay/O = new(T)
O.icon_state = state
T.lighting_overlay = O
#else
for(var/i = 0; i < LIGHTING_RESOLUTION; i++)
for(var/j = 0; j < LIGHTING_RESOLUTION; j++)
var/atom/movable/lighting_overlay/O = new(T)
O.pixel_x = i * (32 / LIGHTING_RESOLUTION)
O.pixel_y = j * (32 / LIGHTING_RESOLUTION)
O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
O.icon_state = state
T.lighting_overlays += O
#endif
-27
View File
@@ -1,47 +1,20 @@
/turf
var/list/affecting_lights
#if LIGHTING_RESOLUTION == 1
var/atom/movable/lighting_overlay/lighting_overlay
#else
var/list/lighting_overlays[0]
#endif
/turf/proc/reconsider_lights()
for(var/datum/light_source/L in affecting_lights)
L.force_update()
/turf/proc/lighting_clear_overlays()
#if LIGHTING_RESOLUTION == 1
if(lighting_overlay)
qdel(lighting_overlay)
#else
for(var/atom/movable/lighting_overlay/L in lighting_overlays)
qdel(L)
#endif
/turf/proc/lighting_build_overlays()
#if LIGHTING_RESOLUTION == 1
if(lighting_overlay)
#else
if(lighting_overlays.len)
#endif
return
var/state = "light[LIGHTING_RESOLUTION]"
var/area/A = loc
if(A.lighting_use_dynamic)
#if LIGHTING_RESOLUTION == 1
var/atom/movable/lighting_overlay/O = new(src)
O.icon_state = state
lighting_overlay = O
#else
for(var/i = 0; i < LIGHTING_RESOLUTION; i++)
for(var/j = 0; j < LIGHTING_RESOLUTION; j++)
var/atom/movable/lighting_overlay/O = new(src)
O.pixel_x = i * (32 / LIGHTING_RESOLUTION)
O.pixel_y = j * (32 / LIGHTING_RESOLUTION)
O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
O.icon_state = state
lighting_overlays += O
#endif
+7
View File
@@ -3,6 +3,7 @@
/mob/camera
name = "camera mob"
density = 0
anchored = 1
status_flags = GODMODE // You can't damage it.
mouse_opacity = 0
see_in_dark = 7
@@ -10,3 +11,9 @@
move_on_shuttle = 0
/mob/camera/experience_pressure_difference()
return
/mob/camera/Destroy()
..()
return QDEL_HINT_HARDDEL_NOW
@@ -110,21 +110,6 @@
updatehealth()
/mob/living/carbon/alien/humanoid/blob_act()
if (stat == 2)
return
var/shielded = 0
var/damage = null
if (stat != 2)
damage = rand(30,40)
if(shielded)
damage /= 4
show_message("<span class='userdanger'>The blob attacks!</span>")
adjustFireLoss(damage)
return
/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
@@ -101,30 +101,6 @@
updatehealth()
/mob/living/carbon/alien/larva/blob_act()
if (stat == 2)
return
var/shielded = 0
var/damage = null
if (stat != 2)
damage = rand(10,30)
if(shielded)
damage /= 4
//paralysis += 1
show_message("<span class='userdanger'>The blob attacks you!</span>")
adjustFireLoss(damage)
updatehealth()
return
//can't equip anything
/mob/living/carbon/alien/larva/attack_ui(slot_id)
return
@@ -60,5 +60,8 @@
/mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
/mob/living/carbon/brain/blob_act()
return
/mob/living/carbon/brain/binarycheck()
return istype(loc, /obj/item/device/mmi/posibrain)
+7
View File
@@ -20,6 +20,13 @@ mob/living
if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level
germ_level++
/mob/living/carbon/blob_act()
if (stat == DEAD)
return
else
show_message("<span class='userdanger'>The blob attacks!</span>")
adjustBruteLoss(10)
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
if(.)
@@ -381,11 +381,11 @@
..()
/mob/living/carbon/human/blob_act()
if(stat == 2) return
show_message("\red The blob attacks you!")
if(stat == DEAD) return
show_message("<span class='userdanger'>The blob attacks you!</span>")
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee"))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
return
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
@@ -212,23 +212,8 @@
/mob/living/carbon/slime/blob_act()
if (stat == 2)
return
var/shielded = 0
var/damage = null
if (stat != 2)
damage = rand(10,30)
if(shielded)
damage /= 4
//paralysis += 1
show_message("<span class='userdanger'> The blob attacks you!</span>")
adjustFireLoss(damage)
adjustBruteLoss(20)
updatehealth()
return
@@ -1,8 +1,8 @@
/obj/machinery/computer/drone_control
name = "Maintenance Drone Control"
desc = "Used to monitor the station's drone population and the assembler that services them."
icon = 'icons/obj/computer.dmi'
icon_state = "power"
icon_screen = "power"
icon_keyboard = "power_key"
req_access = list(access_engine_equip)
circuit = "/obj/item/weapon/circuitboard/drone_control"
-3
View File
@@ -966,9 +966,6 @@ var/list/slot_equipment_priority = list( \
process = processScheduler.getProcess("pipenet")
stat(null, "PIP([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("powernet")
stat(null, "POW([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("nanoui")
stat(null, "NAN([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
@@ -0,0 +1,192 @@
// These can only be applied by blobs. They are what blobs are made out of.
// The 4 damage
/datum/reagent/blob
var/message = "The blob strikes you" //message sent to any mob hit by the blob
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
/datum/reagent/blob/boiling_oil
name = "Boiling Oil"
id = "boiling_oil"
description = ""
color = "#B68D00"
message = "The blob splashes you with burning oil"
/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(15*ratio, BURN)
M.adjust_fire_stacks(2*ratio)
M.IgniteMob()
if(isliving(M))
M.emote("scream")
/datum/reagent/blob/toxic_goop
name = "Toxic Goop"
id = "toxic_goop"
description = ""
color = "#008000"
message_living = ", and you feel sick and nauseated"
/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(20*ratio, TOX)
/datum/reagent/blob/skin_ripper
name = "Skin Ripper"
id = "skin_ripper"
description = ""
color = "#FF4C4C"
message_living = ", and you feel your skin ripping and tearing off"
/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(20*ratio, BRUTE)
if(iscarbon(M))
M.emote("scream")
// Combo Reagents
/datum/reagent/blob/skin_melter
name = "Skin Melter"
id = "skin_melter"
description = ""
color = "#7F0000"
message_living = ", and you feel your skin char and melt"
/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(10*ratio, BRUTE)
M.apply_damage(10*ratio, BURN)
M.adjust_fire_stacks(2*ratio)
M.IgniteMob()
if(iscarbon(M))
M.emote("scream")
/datum/reagent/blob/lung_destroying_toxin
name = "Lung Destroying Toxin"
id = "lung_destroying_toxin"
description = ""
color = "#00FFC5"
message_living = ", and your lungs feel heavy and weak"
/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(20* ratio, OXY)
M.losebreath += 15*ratio
M.apply_damage(20*ratio, TOX)
// Special Reagents
/datum/reagent/blob/radioactive_liquid
name = "Radioactive Liquid"
id = "radioactive_liquid"
description = ""
color = "#00EE00"
message_living = ", and your skin feels papery and everything hurts"
/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(10*ratio, BRUTE)
if(istype(M, /mob/living/carbon/human))
M.apply_effect(40*ratio,IRRADIATE,0)
if(prob(33*ratio))
randmuti(M)
if(prob(98))
randmutb(M)
domutcheck(M, null)
M.UpdateAppearance()
/datum/reagent/blob/dark_matter
name = "Dark Matter"
id = "dark_matter"
description = ""
color = "#61407E"
message = "You feel a thrum as the blob strikes you, and everything flies at you"
/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(15*ratio, BRUTE)
reagent_vortex(M, 0)
/datum/reagent/blob/b_sorium
name = "Sorium"
id = "b_sorium"
description = ""
color = "#808000"
message = "The blob slams into you, and sends you flying"
/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.apply_damage(15*ratio, BRUTE)
reagent_vortex(M, 1)
/datum/reagent/blob/explosive // I'm gonna burn in hell for this one
name = "Explosive Gelatin"
id = "explosive"
description = ""
color = "#FFA500"
message = "The blob strikes you, and its tendrils explode"
/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
if(prob(75*ratio))
explosion(M.loc, 0, 0, 1, 0, 0)
/datum/reagent/blob/omnizine
name = "Omnizine"
id = "b_omnizine"
description = ""
color = "#C8A5DC"
message = "The blob squirts something at you"
message_living = ", and you feel great"
/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.reagents.add_reagent("omnizine", 11*ratio)
/datum/reagent/blob/spacedrugs
name = "Space drugs"
id = "b_space_drugs"
description = ""
color = "#60A584"
message = "The blob squirts something at you"
message_living = ", and you feel funny"
/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
var/ratio = volume/25
M.hallucination += 20*ratio
M.reagents.add_reagent("space_drugs", 15*ratio)
M.apply_damage(10*ratio, TOX)
/datum/reagent/blob/proc/reagent_vortex(var/mob/living/M as mob, var/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)
else
X.throw_at(pull)
/datum/reagent/blob/proc/send_message(var/mob/living/M as mob)
var/totalmessage = message
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
M << "<span class='userdanger'>[totalmessage]</span>"