mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-11 23:23:28 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into STILLALOTOFBLOOD
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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", " ", " ")]</font></a></td>"
|
||||
else
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=malf AI;jobban4=\ref[M]'>[replacetext("Malf AI", " ", " ")]</a></td>"
|
||||
*/
|
||||
|
||||
//Alien
|
||||
if(jobban_isbanned(M, "alien") || isbanned_dept)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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>"
|
||||
Reference in New Issue
Block a user