Merge remote-tracking branch 'refs/remotes/origin/master' into smoothing-improvements

This commit is contained in:
Purpose
2018-10-13 21:34:04 +01:00
756 changed files with 13384 additions and 9584 deletions
+2 -2
View File
@@ -18,11 +18,11 @@
var/new_frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ))
aSignal.set_frequency(new_frequency)
poi_list |= src
GLOB.poi_list |= src
/obj/effect/anomaly/Destroy()
QDEL_NULL(aSignal)
poi_list.Remove(src)
GLOB.poi_list.Remove(src)
return ..()
/obj/effect/anomaly/proc/anomalyEffect()
@@ -21,10 +21,10 @@
color = "#FFFFFF"
/obj/effect/decal/cleanable/blood/gibs/xeno/up
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6", "xgibup1", "xgibup1", "xgibup1")
/obj/effect/decal/cleanable/blood/gibs/xeno/down
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1")
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6", "xgibdown1", "xgibdown1", "xgibdown1")
/obj/effect/decal/cleanable/blood/gibs/xeno/body
random_icon_states = list("xgibhead", "xgibtorso")
@@ -36,4 +36,4 @@
random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
/obj/effect/decal/cleanable/blood/xtracks
basecolor = "#05EE05"
basecolor = "#05EE05"
@@ -2,11 +2,11 @@
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
layer = TURF_LAYER+0.2
anchored = 1
layer = LATTICE_LAYER
anchored = TRUE
var/amount = 1 //Basically moles.
/obj/effect/decal/cleanable/liquid_fuel/New(newLoc,amt=1)
/obj/effect/decal/cleanable/liquid_fuel/Initialize(newLoc, amt = 1)
amount = amt
//Be absorbed by any other liquid fuel in the tile.
@@ -21,38 +21,42 @@
/obj/effect/decal/cleanable/liquid_fuel/proc/Spread()
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 0.5) return
if(amount < 0.5)
return
var/turf/simulated/S = loc
if(!istype(S)) return
if(!istype(S))
return
for(var/d in cardinal)
if(rand(25))
var/turf/simulated/target = get_step(src, d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
new/obj/effect/decal/cleanable/liquid_fuel(target, amount * 0.25)
amount *= 0.75
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
icon_state = "mustard"
anchored = 0
anchored = FALSE
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0)
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Initialize(newLoc, amt = 1, d = 0)
dir = d //Setting this direction means you won't get torched by your own flamethrower.
. = ..()
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
if(amount < 0.1) return
if(amount < 0.1)
return
var/turf/simulated/S = loc
if(!istype(S)) return
if(!istype(S))
return
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
var/turf/simulated/O = get_step(S,d)
for(var/d in list(turn(dir, 90), turn(dir, -90), dir))
var/turf/simulated/O = get_step(S, d)
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
continue
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O, amount * 0.25, d)
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
amount *= 0.25
@@ -1,6 +1,6 @@
#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var)
#define DRYING_TIME 5 * 60 * 10 //for 1 unit of depth in puddle (amount var)
var/global/list/image/splatter_cache=list()
var/global/list/image/splatter_cache = list()
/obj/effect/decal/cleanable/blood
name = "blood"
@@ -8,24 +8,24 @@ var/global/list/image/splatter_cache=list()
desc = "It's thick and gooey. Perhaps it's the chef's cooking?"
var/drydesc = "It's dry and crusty. Someone is not doing their job."
gender = PLURAL
density = 0
anchored = 1
layer = 2
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
var/base_icon = 'icons/effects/blood.dmi'
appearance_flags = NO_CLIENT_COLOR
blood_DNA = list()
var/base_icon = 'icons/effects/blood.dmi'
var/blood_state = BLOOD_STATE_HUMAN
var/bloodiness = MAX_SHOE_BLOODINESS
var/basecolor = "#A10808" // Color when wet.
var/amount = 5
appearance_flags = NO_CLIENT_COLOR
var/dry_timer = 0
var/off_floor = FALSE
/obj/effect/decal/cleanable/blood/New()
..()
/obj/effect/decal/cleanable/blood/Initialize()
. = ..()
update_icon()
if(GAMEMODE_IS_CULT)
var/datum/game_mode/cult/mode_ticker = ticker.mode
@@ -58,7 +58,8 @@ var/global/list/image/splatter_cache=list()
return ..()
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
if(basecolor == "rainbow")
basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
color = basecolor
/obj/effect/decal/cleanable/blood/proc/dry()
@@ -93,9 +94,9 @@ var/global/list/image/splatter_cache=list()
var/mob/living/carbon/human/H = O
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
var/hasfeet = 1
var/hasfeet = TRUE
if(!l_foot && !r_foot)
hasfeet = 0
hasfeet = FALSE
if(H.shoes && blood_state && bloodiness)
var/obj/item/clothing/shoes/S = H.shoes
var/add_blood = 0
@@ -137,10 +138,10 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
icon = 'icons/effects/drip.dmi'
icon_state = "1"
random_icon_states = list("1","2","3","4","5")
random_icon_states = list("1", "2", "3", "4", "5")
amount = 0
var/drips = 1
bloodiness = 0
var/drips = 1
/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
return TRUE
@@ -150,12 +151,12 @@ var/global/list/image/splatter_cache=list()
icon_state = "ltrails_1"
desc = "Your instincts say you shouldn't be following these."
gender = PLURAL
density = 0
layer = 2
density = FALSE
layer = TURF_LAYER
random_icon_states = null
var/list/existing_dirs = list()
blood_DNA = list()
appearance_flags = NO_CLIENT_COLOR
var/list/existing_dirs = list()
/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
return TRUE
@@ -164,12 +165,12 @@ var/global/list/image/splatter_cache=list()
icon_state = "tracks"
desc = "It looks like a writing in blood."
gender = NEUTER
random_icon_states = list("writing1","writing2","writing3","writing4","writing5")
random_icon_states = list("writing1", "writing2", "writing3", "writing4", "writing5")
amount = 0
var/message
/obj/effect/decal/cleanable/blood/writing/New()
..()
/obj/effect/decal/cleanable/blood/writing/Initialize()
. = ..()
if(random_icon_states.len)
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
random_icon_states.Remove(W.icon_state)
@@ -179,20 +180,20 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/writing/examine(mob/user)
..(user)
to_chat(user, "It reads: <font color='[basecolor]'>\"[message]\"<font>")
to_chat(user, "<span class='notice'>It reads: <font color='[basecolor]'>\"[message]\"<font></span>")
/obj/effect/decal/cleanable/blood/gibs
name = "gibs"
desc = "They look bloody and gruesome."
gender = PLURAL
density = 0
anchored = 1
layer = 2
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/blood.dmi'
icon_state = "gibbl5"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
noclear = TRUE
var/fleshcolor = "#FFFFFF"
noclear = 1
/obj/effect/decal/cleanable/blood/gibs/update_icon()
var/image/giblets = new(base_icon, "[icon_state]_flesh", dir)
@@ -207,10 +208,10 @@ var/global/list/image/splatter_cache=list()
. = ..()
/obj/effect/decal/cleanable/blood/gibs/up
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gibup1", "gibup1", "gibup1")
/obj/effect/decal/cleanable/blood/gibs/down
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gibdown1", "gibdown1", "gibdown1")
/obj/effect/decal/cleanable/blood/gibs/body
random_icon_states = list("gibhead", "gibtorso")
@@ -221,15 +222,15 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/gibs/core
random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
/obj/effect/decal/cleanable/blood/gibs/New()
..()
/obj/effect/decal/cleanable/blood/gibs/Initialize()
. = ..()
reagents.add_reagent("liquidgibs", 5)
/obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever...
/obj/effect/decal/cleanable/blood/gibs/cleangibs/New() //no reagent!
..()
/obj/effect/decal/cleanable/blood/gibs/cleangibs/Initialize() //no reagent!
. = ..()
reagents.remove_reagent("liquidgibs",5)
@@ -246,18 +247,20 @@ var/global/list/image/splatter_cache=list()
break
/obj/effect/decal/cleanable/blood/old/New()
..()
/obj/effect/decal/cleanable/blood/old/Initialize()
. = ..()
bloodiness = 0
dry()
/obj/effect/decal/cleanable/blood/old/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/blood/gibs/old/New()
..()
/obj/effect/decal/cleanable/blood/gibs/old/Initialize()
. = ..()
bloodiness = 0
dry()
/obj/effect/decal/cleanable/blood/gibs/old/can_bloodcrawl_in()
return FALSE
#undef DRYING_TIME
+203 -203
View File
@@ -1,203 +1,203 @@
/obj/effect/decal/cleanable/generic
name = "clutter"
desc = "Someone should clean that up."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
/obj/effect/decal/cleanable/ash
name = "ashes"
desc = "Ashes to ashes, dust to dust, and into space."
gender = PLURAL
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
anchored = 1
/obj/effect/decal/cleanable/ash/New()
..()
reagents.add_reagent("ash", 10)
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "dirt"
mouse_opacity = 0
/obj/effect/decal/cleanable/dirt/blackpowder
name = "black powder"
mouse_opacity = 1
noscoop = 1
/obj/effect/decal/cleanable/dirt/blackpowder/New()
..()
reagents.add_reagent("blackpowder", 40) //size 2 explosion when activated
/obj/effect/decal/cleanable/flour
name = "flour"
desc = "It's still good. Four second rule!"
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
/obj/effect/decal/cleanable/flour/foam
name = "Fire fighting foam"
desc = "It's foam."
color = "#EBEBEB"
New()
..()
spawn(150)// 15 seconds
qdel(src)
/obj/effect/decal/cleanable/greenglow
name = "glowing goo"
desc = "Jeez. I hope that's not for lunch."
gender = PLURAL
density = 0
anchored = 1
layer = 2
light_range = 1
icon = 'icons/effects/effects.dmi'
icon_state = "greenglow"
New()
..()
spawn(1200)// 2 minutes
qdel(src)
/obj/effect/decal/cleanable/cobweb
name = "cobweb"
desc = "Somebody should remove that."
density = 0
anchored = 1
layer = 3
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb1"
burntime = 1
/obj/effect/decal/cleanable/cobweb/fire_act()
qdel(src)
/obj/effect/decal/cleanable/molten_object
name = "gooey grey mass"
desc = "It looks like a melted... something."
density = 0
anchored = 1
layer = 3
gender = NEUTER
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
/obj/effect/decal/cleanable/cobweb2
name = "cobweb"
desc = "Somebody should remove that."
density = 0
anchored = 1
layer = 3
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb2"
//Vomit (sorry)
/obj/effect/decal/cleanable/vomit
name = "vomit"
desc = "Gosh, how unpleasant."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
noclear = 1
/obj/effect/decal/cleanable/vomit/New()
..()
reagents.add_reagent("vomit", 5)
/obj/effect/decal/cleanable/vomit/green
name = "green vomit"
desc = "It's all gummy. Ew."
icon_state = "gvomit_1"
random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4")
/obj/effect/decal/cleanable/vomit/green/New()
..()
reagents.remove_reagent("vomit", 5)
reagents.add_reagent("green_vomit", 5)
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
desc = "It's red."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
/obj/effect/decal/cleanable/plant_smudge
name = "plant smudge"
density = 0
anchored = 1
layer = 2
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_plant")
/obj/effect/decal/cleanable/egg_smudge
name = "smashed egg"
desc = "Seems like this one won't hatch."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
/obj/effect/decal/cleanable/pie_smudge //honk
name = "smashed pie"
desc = "It's pie cream from a cream pie."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
/obj/effect/decal/cleanable/fungus
name = "space fungus"
desc = "A fungal growth. Looks pretty nasty."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
color = "#D5820B"
/obj/effect/decal/cleanable/fungus/New()
..()
reagents.add_reagent("fungus", 10)
/obj/effect/decal/cleanable/confetti //PARTY TIME!
name = "confetti"
desc = "Party time!"
gender = PLURAL
icon = 'icons/obj/objects.dmi'
icon_state = "confetti1"
random_icon_states = list("confetti1", "confetti2", "confetti3")
anchored = 1
/obj/effect/decal/cleanable/generic
name = "clutter"
desc = "Someone should clean that up."
gender = PLURAL
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
/obj/effect/decal/cleanable/ash
name = "ashes"
desc = "Ashes to ashes, dust to dust, and into space."
gender = PLURAL
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
anchored = TRUE
/obj/effect/decal/cleanable/ash/Initialize()
. = ..()
reagents.add_reagent("ash", 10)
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
gender = PLURAL
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/dirt.dmi'
icon_state = "dirt"
canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/simulated/wall, /obj/structure/falsewall)
smooth = SMOOTH_MORE
mouse_opacity = FALSE
/obj/effect/decal/cleanable/dirt/Initialize()
..()
icon_state = ""
/obj/effect/decal/cleanable/dirt/blackpowder
name = "black powder"
mouse_opacity = TRUE
noscoop = TRUE
/obj/effect/decal/cleanable/dirt/blackpowder/Initialize()
. = ..()
reagents.add_reagent("blackpowder", 40) // size 2 explosion when activated
/obj/effect/decal/cleanable/flour
name = "flour"
desc = "It's still good. Four second rule!"
gender = PLURAL
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
/obj/effect/decal/cleanable/flour/foam
name = "Fire fighting foam"
desc = "It's foam."
color = "#EBEBEB"
/obj/effect/decal/cleanable/flour/foam/Initialize()
. = ..()
QDEL_IN(src, 15 SECONDS)
/obj/effect/decal/cleanable/greenglow
name = "glowing goo"
desc = "Jeez. I hope that's not for lunch."
gender = PLURAL
density = FALSE
anchored = TRUE
layer = TURF_LAYER
light_range = 1
icon = 'icons/effects/effects.dmi'
icon_state = "greenglow"
/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
. = ..()
QDEL_IN(src, 2 MINUTES)
/obj/effect/decal/cleanable/cobweb
name = "cobweb"
desc = "Somebody should remove that."
density = FALSE
anchored = TRUE
layer = OBJ_LAYER
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb1"
burntime = 1
/obj/effect/decal/cleanable/cobweb/fire_act()
qdel(src)
/obj/effect/decal/cleanable/molten_object
name = "gooey grey mass"
desc = "It looks like a melted... something."
density = FALSE
anchored = TRUE
layer = OBJ_LAYER
gender = NEUTER
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
/obj/effect/decal/cleanable/cobweb2
name = "cobweb"
desc = "Somebody should remove that."
density = FALSE
anchored = TRUE
layer = OBJ_LAYER
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb2"
/obj/effect/decal/cleanable/vomit
name = "vomit"
desc = "Gosh, how unpleasant."
gender = PLURAL
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
noclear = TRUE
/obj/effect/decal/cleanable/vomit/Initialize()
. = ..()
reagents.add_reagent("vomit", 5)
/obj/effect/decal/cleanable/vomit/green
name = "green vomit"
desc = "It's all gummy. Ew."
icon_state = "gvomit_1"
random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4")
/obj/effect/decal/cleanable/vomit/green/Initialize()
. = ..()
reagents.remove_reagent("vomit", 5)
reagents.add_reagent("green_vomit", 5)
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
desc = "It's red."
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
/obj/effect/decal/cleanable/plant_smudge
name = "plant smudge"
density = FALSE
anchored = TRUE
layer = TURF_LAYER
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_plant")
/obj/effect/decal/cleanable/egg_smudge
name = "smashed egg"
desc = "Seems like this one won't hatch."
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
/obj/effect/decal/cleanable/pie_smudge //honk
name = "smashed pie"
desc = "It's pie cream from a cream pie."
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
/obj/effect/decal/cleanable/fungus
name = "space fungus"
desc = "A fungal growth. Looks pretty nasty."
density = FALSE
anchored = TRUE
layer = TURF_LAYER
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
color = "#D5820B"
/obj/effect/decal/cleanable/fungus/Initialize()
. = ..()
reagents.add_reagent("fungus", 10)
/obj/effect/decal/cleanable/confetti //PARTY TIME!
name = "confetti"
desc = "Party time!"
gender = PLURAL
icon = 'icons/obj/objects.dmi'
icon_state = "confetti1"
random_icon_states = list("confetti1", "confetti2", "confetti3")
anchored = TRUE
@@ -3,7 +3,7 @@
desc = "It's a useless heap of junk... <i>or is it?</i>"
icon = 'icons/mob/robots.dmi'
icon_state = "gib1"
basecolor="#030303"
basecolor = "#030303"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
bloodiness = MAX_SHOE_BLOODINESS
@@ -20,7 +20,7 @@
return FALSE
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
spawn (0)
spawn(0)
var/direction = pick(directions)
for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
@@ -39,15 +39,15 @@
random_icon_states = list("gibarm", "gibleg")
/obj/effect/decal/cleanable/blood/gibs/robot/up
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1") //2:7 is close enough to 1:4
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7", "gibup1", "gibup1") //2:7 is close enough to 1:4
/obj/effect/decal/cleanable/blood/gibs/robot/down
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1") //2:7 is close enough to 1:4
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7", "gibdown1", "gibdown1") //2:7 is close enough to 1:4
/obj/effect/decal/cleanable/blood/oil
name = "motor oil"
desc = "It's black and greasy. Looks like Beepsky made another mess."
basecolor="#030303"
basecolor = "#030303"
bloodiness = MAX_SHOE_BLOODINESS
/obj/effect/decal/cleanable/blood/oil/can_bloodcrawl_in()
@@ -2,7 +2,7 @@
#define TRACKS_CRUSTIFY_TIME 50
// color-dir-dry
var/global/list/image/fluidtrack_cache=list()
var/global/list/image/fluidtrack_cache = list()
// Footprints, tire trails...
/obj/effect/decal/cleanable/blood/tracks
@@ -23,7 +23,7 @@ var/global/list/image/fluidtrack_cache=list()
desc = "You REALLY shouldn't follow these.."
gender = PLURAL
random_icon_states = null
basecolor="#A10808"
basecolor = "#A10808"
var/entered_dirs = 0
var/exited_dirs = 0
blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
@@ -35,9 +35,9 @@ var/global/list/image/fluidtrack_cache=list()
var/obj/item/clothing/shoes/S = H.shoes
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
var/hasfeet = 1
var/hasfeet = TRUE
if(!l_foot && !r_foot)
hasfeet = 0
hasfeet = FALSE
if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor)
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
entered_dirs |= H.dir
@@ -58,9 +58,9 @@ var/global/list/image/fluidtrack_cache=list()
var/obj/item/clothing/shoes/S = H.shoes
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
var/hasfeet = 1
var/hasfeet = TRUE
if(!l_foot && !r_foot)
hasfeet = 0
hasfeet = FALSE
if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor)
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
exited_dirs |= H.dir
+13 -4
View File
@@ -1,8 +1,8 @@
/obj/effect/decal/cleanable
anchored = 1
anchored = TRUE
var/list/random_icon_states = list()
var/noscoop = 0 //if it has this, don't let it be scooped up
var/noclear = 0 //if it has this, don't delete it when its' scooped up
var/noscoop = FALSE //if it has this, don't let it be scooped up
var/noclear = FALSE //if it has this, don't delete it when its' scooped up
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
return FALSE
@@ -11,8 +11,16 @@
if(random_icon_states && length(src.random_icon_states) > 0)
src.icon_state = pick(src.random_icon_states)
create_reagents(100)
if(smooth)
smooth_icon(src)
smooth_icon_neighbors(src)
..()
/obj/effect/decal/cleanable/Destroy()
if(smooth)
smooth_icon_neighbors(src)
return ..()
/obj/effect/decal/cleanable/attackby(obj/item/W as obj, mob/user as mob,)
if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks))
if(src.reagents && W.reagents && !noscoop)
@@ -28,7 +36,8 @@
qdel(src)
return
if(is_hot(W)) //todo: make heating a reagent holder proc
if(istype(W, /obj/item/clothing/mask/cigarette)) return
if(istype(W, /obj/item/clothing/mask/cigarette))
return
else
src.reagents.chem_temp += 15
src.reagents.handle_reactions()
+3 -3
View File
@@ -3,8 +3,8 @@
desc = "A rune drawn in crayon."
icon = 'icons/effects/crayondecal.dmi'
icon_state = "rune1"
layer = 2.1
anchored = 1
layer = MID_TURF_LAYER
anchored = TRUE
/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
@@ -15,4 +15,4 @@
desc = "A [name] drawn in crayon."
icon_state = type
color = main
color = main
+22 -22
View File
@@ -1,7 +1,7 @@
// Used for spray that you spray at walls, tables, hydrovats etc
/obj/effect/decal/spraystill
density = 0
anchored = 1
density = FALSE
anchored = TRUE
layer = 50
plane = HUD_PLANE
@@ -11,38 +11,38 @@
pass_flags = PASSTABLE | PASSGRILLE
/obj/effect/decal/snow
name="snow"
density=0
anchored=1
layer=2
icon='icons/turf/snow.dmi'
name = "snow"
density = FALSE
anchored = TRUE
layer = TURF_DECAL_LAYER
icon = 'icons/turf/snow.dmi'
/obj/effect/decal/snow/clean/edge
icon_state="snow_corner"
icon_state = "snow_corner"
/obj/effect/decal/snow/sand/edge
icon_state="gravsnow_corner"
icon_state = "gravsnow_corner"
/obj/effect/decal/snow/clean/surround
icon_state="snow_surround"
icon_state = "snow_surround"
/obj/effect/decal/snow/sand/surround
icon_state="gravsnow_surround"
icon_state = "gravsnow_surround"
/obj/effect/decal/leaves
name="fall leaves"
density = 0
anchored = 1
layer = 2
icon='icons/obj/flora/plants.dmi'
name = "fall leaves"
density = FALSE
anchored = TRUE
layer = HIGH_TURF_LAYER
icon = 'icons/obj/flora/plants.dmi'
icon_state = "fallleaves"
/obj/effect/decal/straw
name="scattered straw"
density = 0
anchored = 1
layer = 2
icon='icons/obj/flora/plants.dmi'
name = "scattered straw"
density = FALSE
anchored = TRUE
layer = HIGH_TURF_LAYER
icon = 'icons/obj/flora/plants.dmi'
icon_state = "strawscattered"
/obj/effect/decal/straw/medium
@@ -52,4 +52,4 @@
icon_state = "strawscattered2"
/obj/effect/decal/straw/edge
icon_state = "strawscatterededge"
icon_state = "strawscatterededge"
+4 -4
View File
@@ -6,21 +6,21 @@
desc = "They look like human remains. They have a strange aura about them."
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
anchored = 1
anchored = TRUE
/obj/effect/decal/remains/xeno
name = "remains"
desc = "They look like the remains of something... alien. They have a strange aura about them."
icon = 'icons/effects/blood.dmi'
icon_state = "remainsxeno"
anchored = 1
anchored = TRUE
/obj/effect/decal/remains/robot
name = "remains"
desc = "They look like the remains of something mechanical. They have a strange aura about them."
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
anchored = 1
anchored = TRUE
/obj/effect/decal/remains/robot/New()
..()
@@ -33,7 +33,7 @@
desc = "Noooooooooooooooooooooo"
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
anchored = 1
anchored = TRUE
/obj/effect/decal/remains/slime/New()
..()
@@ -1,6 +1,6 @@
/obj/effect/decal/warning_stripes
icon = 'icons/effects/warning_stripes.dmi'
layer = 2
layer = TURF_LAYER
/obj/effect/decal/warning_stripes/north
icon_state = "N"
@@ -50,7 +50,7 @@
/obj/effect/decal/warning_stripes/northwestsouth
icon_state = "U-E"
/obj/effect/decal/warning_stripes/New()
/obj/effect/decal/warning_stripes/Initialize()
. = ..()
loc.overlays += src
qdel(src)
@@ -107,4 +107,4 @@
icon_state = "16"
/obj/effect/decal/warning_stripes/blue/hollow
icon_state = "18"
icon_state = "18"
@@ -7,7 +7,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/particle_effect
name = "particle effect"
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
unacidable = 1//So effects are not targeted by alien acid.
pass_flags = PASSTABLE | PASSGRILLE
@@ -27,7 +27,7 @@
icon_state = "explosion"
opacity = 1
anchored = 1
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pixel_x = -32
pixel_y = -32
+5 -5
View File
@@ -88,11 +88,11 @@
emergencyresponseteamspawn += loc
qdel(src)
landmarks_list += src
GLOB.landmarks_list += src
return 1
/obj/effect/landmark/Destroy()
landmarks_list -= src
GLOB.landmarks_list -= src
..()
return QDEL_HINT_HARDDEL_NOW
@@ -259,13 +259,13 @@
var/datum/map_template/ruin/ruin_template
/obj/effect/landmark/ruin/New(loc, my_ruin_template)
name = "ruin_[ruin_landmarks.len + 1]"
name = "ruin_[GLOB.ruin_landmarks.len + 1]"
..(loc)
ruin_template = my_ruin_template
ruin_landmarks |= src
GLOB.ruin_landmarks |= src
/obj/effect/landmark/ruin/Destroy()
ruin_landmarks -= src
GLOB.ruin_landmarks -= src
ruin_template = null
. = ..()
+1 -1
View File
@@ -11,7 +11,7 @@
/obj/effect/manifest/proc/manifest()
var/dat = "<B>Crew Manifest</B>:<BR>"
for(var/mob/living/carbon/human/M in mob_list)
for(var/mob/living/carbon/human/M in GLOB.mob_list)
dat += text(" <B>[]</B> - []<BR>", M.name, M.get_assignment())
var/obj/item/paper/P = new /obj/item/paper( src.loc )
P.info = dat
+1 -1
View File
@@ -32,7 +32,7 @@
anchored = 1
layer = 99
plane = HUD_PLANE
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
unacidable = 1//Just to be sure.
/obj/effect/beam
+1 -1
View File
@@ -58,7 +58,7 @@
anchored = 1
density = 1
layer = 5
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/overlay/wall_rot/New()
..()
+2 -2
View File
@@ -17,7 +17,7 @@
teleport(M)
/obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300)
portals += src
GLOB.portals += src
src.loc = loc
src.target = target
src.creator = creator
@@ -26,7 +26,7 @@
qdel(src)
/obj/effect/portal/Destroy()
portals -= src
GLOB.portals -= src
if(istype(creator, /obj))
var/obj/O = creator
O.portal_destroyed(src)
@@ -42,3 +42,8 @@
name = "reinforced window spawner"
icon_state = "rwindow_spawner"
windowtospawn = /obj/structure/window/reinforced
/obj/effect/spawner/window/reinforced/plasma
name = "reinforced plasma window spawner"
icon_state = "pwindow_spawner"
windowtospawn = /obj/structure/window/plasmareinforced
@@ -134,7 +134,7 @@
name = mimiced_atom.name
appearance = mimiced_atom.appearance
setDir(mimiced_atom.dir)
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/temp_visual/decoy/fading/New(loc, atom/mimiced_atom)
..()
@@ -2,7 +2,7 @@
/obj/effect/temp_visual
anchored = 1
layer = ABOVE_MOB_LAYER
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/duration = 10
var/randomdir = TRUE
+3 -3
View File
@@ -1,12 +1,12 @@
/proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
/proc/empulse(turf/epicenter, heavy_range, light_range, log=0, cause = null)
if(!epicenter) return
if(!istype(epicenter, /turf))
epicenter = get_turf(epicenter.loc)
if(log)
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [ADMIN_COORDJMP(epicenter)]</a>")
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [COORD(epicenter)]")
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ] [ADMIN_COORDJMP(epicenter)]</a>")
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)]")
if(heavy_range > 1)
new/obj/effect/temp_visual/emp/pulse(epicenter)
+4 -4
View File
@@ -1,6 +1,6 @@
//TODO: Flash range does nothing currently
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1)
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
@@ -25,8 +25,8 @@
var/list/cached_exp_block = list()
if(adminlog)
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</a>)")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [ADMIN_COORDJMP(epicenter)] ")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)] ")
// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
// Stereo users will also hear the direction of the explosion!
@@ -43,7 +43,7 @@
var/sound/explosion_sound = sound(get_sfx("explosion"))
var/sound/global_boom = sound('sound/effects/explosionfar.ogg')
for(var/P in player_list)
for(var/P in GLOB.player_list)
var/mob/M = P
// Double check for client
if(M && M.client)
+5 -2
View File
@@ -232,7 +232,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
if(affecting && affecting.receive_damage(0, 5)) // 5 burn damage
H.UpdateDamageIcon()
H.updatehealth()
return
else
extinguish()
@@ -342,6 +341,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/proc/on_found(mob/finder as mob)
return
// called when the giver gives it to the receiver
/obj/item/proc/on_give(mob/living/carbon/giver, mob/living/carbon/receiver)
return
// called after an item is placed in an equipment slot
// user is mob that equipped it
// slot uses the slot_X defines found in setup.dm
@@ -554,4 +557,4 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
return TRUE
/obj/item/attack_hulk(mob/living/carbon/human/user)
return FALSE
return FALSE
+5 -5
View File
@@ -91,15 +91,15 @@
color = "#FFD7A7"
switch(new_appearance)
if("Assistant")
name = "[pick(first_names_male)] [pick(last_names)]"
name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
desc = "A cardboard cutout of an assistant."
icon_state = "cutout_greytide"
if("Clown")
name = pick(clown_names)
name = pick(GLOB.clown_names)
desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner."
icon_state = "cutout_clown"
if("Mime")
name = pick(mime_names)
name = pick(GLOB.mime_names)
desc = "...(A cardboard cutout of a mime.)"
icon_state = "cutout_mime"
if("Traitor")
@@ -123,7 +123,7 @@
desc = "A cardboard cutout of a revolutionary."
icon_state = "cutout_viva"
if("Wizard")
name = "[pick(wizard_first)], [pick(wizard_second)]"
name = "[pick(GLOB.wizard_first)], [pick(GLOB.wizard_second)]"
desc = "A cardboard cutout of a wizard."
icon_state = "cutout_wizard"
if("Shadowling")
@@ -145,7 +145,7 @@
// desc = "A cardboard cutout of an ash walker."
// icon_state = "cutout_free_antag"
if("Deathsquad Officer")
name = pick(commando_names)
name = pick(GLOB.commando_names)
desc = "A cardboard cutout of a death commando."
icon_state = "cutout_deathsquad"
if("Ian")
@@ -90,7 +90,6 @@
to_chat(AI, "Your core files are being wiped!")
while(AI && AI.stat != DEAD)
AI.adjustOxyLoss(2)
AI.updatehealth()
sleep(10)
flush = 0
+1 -1
View File
@@ -84,7 +84,7 @@
var/dead_notes = input("Insert any relevant notes")
var/obj/item/paper/R = new(user.loc)
R.name = "Official Coroner's Report - [dead_name]"
R.info = "<b>NanoTrasen Science Station Cyberiad - Coroner's Report</b><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [dead_rank]<br><br><b>Time of Death:</b> [dead_tod]<br><br><b>Cause of Death:</b> [dead_cause]<br><br><b>Trace Chemicals:</b> [dead_chems]<br><br><b>Additional Coroner's Notes:</b> [dead_notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
R.info = "<b>Nanotrasen Science Station [using_map.station_short] - Coroner's Report</b><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [dead_rank]<br><br><b>Time of Death:</b> [dead_tod]<br><br><b>Cause of Death:</b> [dead_cause]<br><br><b>Trace Chemicals:</b> [dead_chems]<br><br><b>Additional Coroner's Notes:</b> [dead_notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
user.put_in_hands(R)
+4 -4
View File
@@ -27,7 +27,7 @@
/obj/item/powersink/Destroy()
processing_objects.Remove(src)
processing_power_items.Remove(src)
GLOB.processing_power_items.Remove(src)
PN = null
attached = null
return ..()
@@ -54,7 +54,7 @@
else
if(mode == 2)
processing_objects.Remove(src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite
processing_power_items.Remove(src)
GLOB.processing_power_items.Remove(src)
anchored = 0
mode = 0
src.visible_message("<span class='notice'>[user] detaches [src] from the cable!</span>")
@@ -77,14 +77,14 @@
mode = 2
icon_state = "powersink1"
processing_objects.Add(src)
processing_power_items.Add(src)
GLOB.processing_power_items.Add(src)
if(2) //This switch option wasn't originally included. It exists now. --NeoFite
src.visible_message("<span class='notice'>[user] deactivates [src]!</span>")
mode = 1
set_light(0)
icon_state = "powersink0"
processing_objects.Remove(src)
processing_power_items.Remove(src)
GLOB.processing_power_items.Remove(src)
/obj/item/powersink/pwr_drain()
if(!attached)
@@ -11,11 +11,11 @@
/obj/item/radio/beacon/New()
..()
code = "[code] ([beacons.len + 1])"
beacons += src
code = "[code] ([GLOB.beacons.len + 1])"
GLOB.beacons += src
/obj/item/radio/beacon/Destroy()
beacons -= src
GLOB.beacons -= src
return ..()
/obj/item/radio/beacon/emag_act(user as mob)
@@ -49,11 +49,11 @@
/obj/item/radio/headset/handle_message_mode(mob/living/M as mob, message, channel)
if(channel == "special")
if(translate_binary)
var/datum/language/binary = all_languages["Robot Talk"]
var/datum/language/binary = GLOB.all_languages["Robot Talk"]
binary.broadcast(M, message)
return RADIO_CONNECTION_NON_SUBSPACE
if(translate_hive)
var/datum/language/hivemind = all_languages["Hivemind"]
var/datum/language/hivemind = GLOB.all_languages["Hivemind"]
hivemind.broadcast(M, message)
return RADIO_CONNECTION_NON_SUBSPACE
return RADIO_CONNECTION_FAIL
@@ -57,7 +57,7 @@
dir=ndir
b_stat=1
on = 0
global_intercoms.Add(src)
GLOB.global_intercoms.Add(src)
update_icon()
/obj/item/radio/intercom/department/medbay/New()
@@ -106,7 +106,7 @@
/obj/item/radio/intercom/Destroy()
processing_objects.Remove(src)
global_intercoms.Remove(src)
GLOB.global_intercoms.Remove(src)
return ..()
/obj/item/radio/intercom/attack_ai(mob/user as mob)
@@ -69,7 +69,7 @@ var/global/list/default_medbay_channels = list(
wires = new(src)
internal_channels = default_internal_channels.Copy()
global_radios |= src
GLOB.global_radios |= src
/obj/item/radio/Destroy()
QDEL_NULL(wires)
@@ -78,7 +78,7 @@ var/global/list/default_medbay_channels = list(
for(var/ch_name in channels)
radio_controller.remove_object(src, radiochannels[ch_name])
radio_connection = null
global_radios -= src
GLOB.global_radios -= src
follow_target = null
return ..()
@@ -250,7 +250,7 @@ var/global/list/default_medbay_channels = list(
A.role = role
A.message = message
var/jammed = FALSE
for(var/obj/item/jammer/jammer in active_jammers)
for(var/obj/item/jammer/jammer in GLOB.active_jammers)
if(get_dist(get_turf(src), get_turf(jammer)) < jammer.range)
jammed = TRUE
break
@@ -342,7 +342,7 @@ var/global/list/default_medbay_channels = list(
var/turf/position = get_turf(src)
var/jammed = FALSE
for(var/obj/item/jammer/jammer in active_jammers)
for(var/obj/item/jammer/jammer in GLOB.active_jammers)
if(get_dist(position, get_turf(jammer)) < jammer.range)
jammed = TRUE
break
+251 -1
View File
@@ -228,7 +228,7 @@ REAGENT SCANNER
var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100)
var/blood_type = H.b_type
if(blood_id != "blood")//special blood substance
var/datum/reagent/R = chemical_reagents_list[blood_id]
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id]
if(R)
blood_type = R.name
else
@@ -632,3 +632,253 @@ REAGENT SCANNER
if(T.cores > 1)
user.show_message("Anomalous slime core amount detected", 1)
user.show_message("Growth progress: [T.amount_grown]/10", 1)
/obj/item/bodyanalyzer
name = "handheld body analyzer"
icon = 'icons/obj/device.dmi'
icon_state = "bodyanalyzer_0"
item_state = "healthanalyser"
desc = "A handheld scanner capable of deep-scanning an entire body."
slot_flags = SLOT_BELT
throwforce = 3
w_class = WEIGHT_CLASS_TINY
throw_speed = 5
throw_range = 10
origin_tech = "magnets=6;biotech=6"
var/obj/item/stock_parts/cell/power_supply
var/cell_type = /obj/item/stock_parts/cell/upgraded
var/ready = TRUE // Ready to scan
var/time_to_use = 0 // How much time remaining before next scan is available.
var/usecharge = 750
/obj/item/bodyanalyzer/advanced
cell_type = /obj/item/stock_parts/cell/upgraded/plus
/obj/item/bodyanalyzer/New()
..()
power_supply = new cell_type(src)
power_supply.give(power_supply.maxcharge)
update_icon()
/obj/item/bodyanalyzer/proc/setReady()
ready = TRUE
playsound(src, 'sound/machines/defib_saftyOn.ogg', 50, 0)
update_icon()
/obj/item/bodyanalyzer/update_icon(printing = FALSE)
overlays.Cut()
var/percent = power_supply.percent()
if(ready)
icon_state = "bodyanalyzer_1"
else
icon_state = "bodyanalyzer_2"
var/overlayid = round(percent / 10)
overlayid = "bodyanalyzer_charge[overlayid]"
overlays += icon(icon, overlayid)
if(printing)
overlays += icon(icon, "bodyanalyzer_printing")
/obj/item/bodyanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
if(user.incapacitated() || !user.Adjacent(M))
return
if(!ready)
to_chat(user, "<span class='notice'>The scanner beeps angrily at you! It's currently recharging - [round((time_to_use - world.time) * 0.1)] seconds remaining.</span>")
playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
return
if(power_supply.charge >= usecharge)
mobScan(M, user)
else
to_chat(user, "<span class='notice'>The scanner beeps angrily at you! It's out of charge!</span>")
playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
/obj/item/bodyanalyzer/proc/mobScan(mob/living/M, mob/user)
if(ishuman(M))
var/report = generate_printing_text(M, user)
user.visible_message("[user] begins scanning [M] with [src].", "You begin scanning [M].")
if(do_after(user, 100, target = M))
var/obj/item/paper/printout = new
printout.info = report
printout.name = "Scan report - [M.name]"
playsound(user.loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
user.put_in_hands(printout)
time_to_use = world.time + 600
power_supply.use(usecharge)
ready = FALSE
update_icon(TRUE)
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/setReady), 600)
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/update_icon), 20)
else if(iscorgi(M) && M.stat == DEAD)
to_chat(user, "<span class='notice'>You wonder if [M.p_they()] was a good dog. <b>[src] tells you they were the best...</b></span>") // :'(
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
ready = FALSE
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/setReady), 600)
time_to_use = world.time + 600
else
to_chat(user, "<span class='notice'>Scanning error detected. Invalid specimen.</span>")
//Unashamedly ripped from adv_med.dm
/obj/item/bodyanalyzer/proc/generate_printing_text(mob/living/M, mob/user)
var/dat = ""
var/mob/living/carbon/human/target = M
dat = "<font color='blue'><b>Target Statistics:</b></font><br>"
var/t1
switch(target.stat) // obvious, see what their status is
if(CONSCIOUS)
t1 = "Conscious"
if(UNCONSCIOUS)
t1 = "Unconscious"
else
t1 = "*dead*"
dat += "[target.health > 50 ? "<font color='blue'>" : "<font color='red'>"]\tHealth %: [target.health], ([t1])</font><br>"
var/found_disease = FALSE
for(var/thing in target.viruses)
var/datum/disease/D = thing
if(D.visibility_flags) //If any visibility flags are on.
continue
found_disease = TRUE
break
if(found_disease)
dat += "<font color='red'>Disease detected in target.</font><BR>"
var/extra_font = null
extra_font = (target.getBruteLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\t-Brute Damage %: [target.getBruteLoss()]</font><br>"
extra_font = (target.getOxyLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\t-Respiratory Damage %: [target.getOxyLoss()]</font><br>"
extra_font = (target.getToxLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\t-Toxin Content %: [target.getToxLoss()]</font><br>"
extra_font = (target.getFireLoss() < 60 ? "<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\t-Burn Severity %: [target.getFireLoss()]</font><br>"
extra_font = (target.radiation < 10 ?"<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\tRadiation Level %: [target.radiation]</font><br>"
extra_font = (target.getCloneLoss() < 1 ?"<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\tGenetic Tissue Damage %: [target.getCloneLoss()]<br>"
extra_font = (target.getBrainLoss() < 1 ?"<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\tApprox. Brain Damage %: [target.getBrainLoss()]<br>"
dat += "Paralysis Summary %: [target.paralysis] ([round(target.paralysis / 4)] seconds left!)<br>"
dat += "Body Temperature: [target.bodytemperature-T0C]&deg;C ([target.bodytemperature*1.8-459.67]&deg;F)<br>"
dat += "<hr>"
if(target.has_brain_worms())
dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.<br>"
var/blood_percent = round((target.blood_volume / BLOOD_VOLUME_NORMAL))
blood_percent *= 100
extra_font = (target.blood_volume > 448 ? "<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\tBlood Level %: [blood_percent] ([target.blood_volume] units)</font><br>"
if(target.reagents)
dat += "Epinephrine units: [target.reagents.get_reagent_amount("Epinephrine")] units<BR>"
dat += "Ether: [target.reagents.get_reagent_amount("ether")] units<BR>"
extra_font = (target.reagents.get_reagent_amount("silver_sulfadiazine") < 30 ? "<font color='black'>" : "<font color='red'>")
dat += "[extra_font]\tSilver Sulfadiazine: [target.reagents.get_reagent_amount("silver_sulfadiazine")]</font><br>"
extra_font = (target.reagents.get_reagent_amount("styptic_powder") < 30 ? "<font color='black'>" : "<font color='red'>")
dat += "[extra_font]\tStyptic Powder: [target.reagents.get_reagent_amount("styptic_powder")] units<BR>"
extra_font = (target.reagents.get_reagent_amount("salbutamol") < 30 ? "<font color='black'>" : "<font color='red'>")
dat += "[extra_font]\tSalbutamol: [target.reagents.get_reagent_amount("salbutamol")] units<BR>"
dat += "<hr><table border='1'>"
dat += "<tr>"
dat += "<th>Organ</th>"
dat += "<th>Burn Damage</th>"
dat += "<th>Brute Damage</th>"
dat += "<th>Other Wounds</th>"
dat += "</tr>"
for(var/obj/item/organ/external/e in target.bodyparts)
dat += "<tr>"
var/AN = ""
var/open = ""
var/infected = ""
var/robot = ""
var/imp = ""
var/bled = ""
var/splint = ""
var/internal_bleeding = ""
var/lung_ruptured = ""
if(e.internal_bleeding)
internal_bleeding = "<br>Internal bleeding"
if(istype(e, /obj/item/organ/external/chest) && target.is_lung_ruptured())
lung_ruptured = "Lung ruptured:"
if(e.status & ORGAN_SPLINTED)
splint = "Splinted:"
if(e.status & ORGAN_BROKEN)
AN = "[e.broken_description]:"
if(e.is_robotic())
robot = "Robotic:"
if(e.open)
open = "Open:"
switch(e.germ_level)
if(INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200)
infected = "Mild Infection:"
if(INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
infected = "Mild Infection+:"
if(INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
infected = "Mild Infection++:"
if(INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
infected = "Acute Infection:"
if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
infected = "Acute Infection+:"
if(INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400)
infected = "Acute Infection++:"
if(INFECTION_LEVEL_THREE to INFINITY)
infected = "Septic:"
var/unknown_body = 0
for(var/I in e.embedded_objects)
unknown_body++
if(unknown_body || e.hidden)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
dat += "<td>[e.name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]</td>"
dat += "</tr>"
for(var/obj/item/organ/internal/i in target.internal_organs)
var/mech = i.desc
var/infection = "None"
switch(i.germ_level)
if(1 to INFECTION_LEVEL_ONE + 200)
infection = "Mild Infection:"
if(INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
infection = "Mild Infection+:"
if(INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
infection = "Mild Infection++:"
if(INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
infection = "Acute Infection:"
if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
infection = "Acute Infection+:"
if(INFECTION_LEVEL_TWO + 300 to INFINITY)
infection = "Acute Infection++:"
dat += "<tr>"
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech]</td><td></td>"
dat += "</tr>"
dat += "</table>"
if(target.disabilities & BLIND)
dat += "<font color='red'>Cataracts detected.</font><BR>"
if(target.disabilities & COLOURBLIND)
dat += "<font color='red'>Photoreceptor abnormalities detected.</font><BR>"
if(target.disabilities & NEARSIGHTED)
dat += "<font color='red'>Retinal misalignment detected.</font><BR>"
return dat
@@ -158,13 +158,13 @@ effective or pretty fucking useless.
var/range = 12
/obj/item/jammer/Destroy()
active_jammers -= src
GLOB.active_jammers -= src
return ..()
/obj/item/jammer/attack_self(mob/user)
to_chat(user,"<span class='notice'>You [active ? "deactivate" : "activate"] the [src].</span>")
active = !active
if(active)
active_jammers |= src
GLOB.active_jammers |= src
else
active_jammers -= src
GLOB.active_jammers -= src
+2 -2
View File
@@ -50,7 +50,7 @@
/obj/item/reagent_containers/glass/bottle/random_reagent/New()
..()
var/list/possible_chems = chemical_reagents_list.Copy()
var/list/possible_chems = GLOB.chemical_reagents_list.Copy()
possible_chems -= blocked_chems.Copy()
var/datum/reagent/R = pick(possible_chems)
if(rare_chemicals.Find(R))
@@ -186,7 +186,7 @@
var/obj/item/reagent_containers/glass/bottle/B = new(src)
B.reagents.add_reagent(chem, B.volume)
if(prob(85))
var/datum/reagent/r = chemical_reagents_list[chem]
var/datum/reagent/r = GLOB.chemical_reagents_list[chem]
B.name = "[r.name] bottle"
// B.identify_probability = 100
else
+3 -3
View File
@@ -229,12 +229,12 @@
if(!M.brainmob.key)
var/ghost_can_reenter = 0
if(M.brainmob.mind)
for(var/mob/dead/observer/G in player_list)
for(var/mob/dead/observer/G in GLOB.player_list)
if(G.can_reenter_corpse && G.mind == M.brainmob.mind)
ghost_can_reenter = 1
break
for(var/mob/living/simple_animal/S in player_list)
if(S in respawnable_list)
for(var/mob/living/simple_animal/S in GLOB.player_list)
if(S in GLOB.respawnable_list)
ghost_can_reenter = 1
break
if(!ghost_can_reenter)
@@ -90,13 +90,13 @@
return 0
if(!R.key)
for(var/mob/dead/observer/ghost in player_list)
for(var/mob/dead/observer/ghost in GLOB.player_list)
if(ghost.mind && ghost.mind.current == R)
R.key = ghost.key
R.stat = CONSCIOUS
dead_mob_list -= R //please never forget this ever kthx
living_mob_list += R
GLOB.dead_mob_list -= R //please never forget this ever kthx
GLOB.living_mob_list += R
R.notify_ai(1)
return 1
@@ -302,14 +302,12 @@
if(cyborg.health < cyborg.maxHealth)
if(cyborg.health < 0)
repair_amount = -2.5
repair_amount = 2.5
powercost = 30
else
repair_amount = -1
repair_amount = 1
powercost = 10
cyborg.adjustBruteLoss(repair_amount)
cyborg.adjustFireLoss(repair_amount)
cyborg.updatehealth()
cyborg.heal_overall_damage(repair_amount, repair_amount)
cyborg.cell.use(powercost)
else
cyborg.cell.use(5)
+1 -3
View File
@@ -94,9 +94,7 @@
hp -= Proj.damage
if(hp <= 0)
for(var/mob/O in oviewers())
if((O.client && !( O.blinded )))
to_chat(O, "<span class='warning'>[src] breaks into tiny pieces and collapses!</span>")
visible_message("<span class='warning'>[src] breaks into tiny pieces and collapses!</span>")
qdel(src)
// Create a temporary object to represent the damage
@@ -73,7 +73,6 @@
else
M.heal_organ_damage(heal_brute, heal_burn)
M.updatehealth()
user.visible_message("<span class='green'>[user] applies [src] on [M].</span>", \
"<span class='green'>You apply [src] on [M].</span>")
use(1)
+1 -4
View File
@@ -15,9 +15,7 @@
if(istype(M,/mob/living/silicon/robot)) //Repairing cyborgs
var/mob/living/silicon/robot/R = M
if(R.getBruteLoss() || R.getFireLoss() )
R.adjustBruteLoss(-15)
R.adjustFireLoss(-15)
R.updatehealth()
R.heal_overall_damage(15, 15)
use(1)
user.visible_message("<span class='notice'>\The [user] applied some [src] at [R]'s damaged areas.</span>",\
"<span class='notice'>You apply some [src] at [R]'s damaged areas.</span>")
@@ -31,7 +29,6 @@
if(S && S.is_robotic())
if(S.get_damage())
S.heal_damage(15, 15, robo_repair = 1)
H.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.name] with \the [src].</span>",\
"<span class='notice'>You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.name].</span>")
-1
View File
@@ -47,7 +47,6 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
if(WT.remove_fuel(0,user))
var/obj/item/stack/sheet/metal/new_item = new(user.loc)
new_item.add_to_stacks(user)
if(new_item.get_amount() <= 0)
// stack was moved into another one on the pile
new_item = locate() in user.loc
@@ -58,7 +58,6 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
var/obj/item/stack/rods/V = W
var/obj/item/stack/sheet/rglass/RG = new (user.loc)
RG.add_fingerprint(user)
RG.add_to_stacks(user)
V.use(1)
var/obj/item/stack/sheet/glass/G = src
src = null
@@ -124,7 +123,6 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
var/obj/item/stack/rods/V = W
var/obj/item/stack/sheet/plasmarglass/RG = new (user.loc)
RG.add_fingerprint(user)
RG.add_to_stacks(user)
V.use(1)
var/obj/item/stack/sheet/glass/G = src
src = null
@@ -19,7 +19,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
null, \
new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Breakdown into sand", /obj/item/ore/glass, 1, one_per_turf = 0, on_floor = 1), \
new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1), \
)
var/global/list/datum/stack_recipe/silver_recipes = list ( \
+94 -62
View File
@@ -14,15 +14,34 @@
var/singular_name
var/amount = 1
var/to_transfer = 0
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/max_amount = 50 //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/merge_type = null // This path and its children should merge with this stack, defaults to src.type
/obj/item/stack/New(var/loc, var/amt = null)
/obj/item/stack/New(loc, new_amount, merge = TRUE)
..()
if(amt != null) //Allow for stacks with the amount=0
amount = amt
if(new_amount != null)
amount = new_amount
while(amount > max_amount)
amount -= max_amount
new type(loc, max_amount, FALSE)
if(!merge_type)
merge_type = type
if(merge && !(amount >= max_amount))
for(var/obj/item/stack/S in loc)
if(S.merge_type == merge_type)
merge(S)
/obj/item/stack/Crossed(obj/O)
if(amount >= max_amount || ismob(loc)) // Prevents unnecessary call. Also prevents merging stack automatically in a mob's inventory
return
if(istype(O, merge_type) && !O.throwing)
merge(O)
..()
/obj/item/stack/hitby(atom/movable/AM, skipcatch, hitpush)
if(istype(AM, merge_type) && !(amount >= max_amount))
merge(AM)
..()
/obj/item/stack/Destroy()
if(usr && usr.machine == src)
@@ -35,6 +54,11 @@
to_chat(user, "There are [amount] [singular_name]\s in the stack.")
else
to_chat(user, "There are [amount] [name]\s in the stack.")
to_chat(user,"<span class='notice'>Alt-click to take a custom amount.</span>")
/obj/item/stack/proc/add(newamount)
amount += newamount
update_icon()
/obj/item/stack/attack_self(mob/user)
list_recipes(user)
@@ -141,7 +165,6 @@
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
var/multiplier = text2num(href_list["multiplier"])
var/atom/creation_loc = (loc == usr) ? usr.loc : loc
if(!multiplier)
multiplier = 1
@@ -156,11 +179,11 @@
to_chat(usr, "<span class='warning'>The [R.title] won't fit here!</span>")
return FALSE
if(R.one_per_turf && (locate(R.result_type) in creation_loc))
if(R.one_per_turf && (locate(R.result_type) in usr.drop_location()))
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
return 0
if(R.on_floor && !istype(creation_loc, /turf/simulated))
if(R.on_floor && !istype(usr.drop_location(), /turf/simulated))
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
return 0
@@ -172,16 +195,16 @@
if(amount < R.req_amount * multiplier)
return
var/atom/O = new R.result_type(creation_loc)
var/atom/O
if(R.max_res_amount > 1) //Is it a stack?
O = new R.result_type(usr.drop_location(), R.res_amount * multiplier)
else
O = new R.result_type(usr.drop_location())
O.setDir(usr.dir)
if(R.max_res_amount > 1)
var/obj/item/stack/new_item = O
new_item.amount = R.res_amount * multiplier
//new_item.add_to_stacks(usr)
use(R.req_amount * multiplier)
R.post_build(src, O)
amount -= R.req_amount * multiplier
if(amount < 1) // Just in case a stack's amount ends up fractional somehow
var/oldsrc = src
src = null //dont kill proc after del()
@@ -202,37 +225,23 @@
interact(usr)
return
/obj/item/stack/proc/use(used)
/obj/item/stack/proc/use(used, check = TRUE)
if(check && zero_amount())
return FALSE
if(amount < used)
return 0
return FALSE
amount -= used
if(amount < 1) // Just in case a stack's amount ends up fractional somehow
if(amount < 1)
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc //Horrifying cyborg snowflake code that allows stacks to GC and cyborgs not to horrendously break
var/mob/living/silicon/robot/R = loc
if(locate(src) in R.module.modules)
R.module.modules -= src
if(usr)
usr.unEquip(src, TRUE) // this has to be unEquip() over drop_item() or something similar because of cyborgs
qdel(src)
if(R)
R.unEquip(src, TRUE)
zero_amount()
update_icon()
return 1
/obj/item/stack/proc/add_to_stacks(mob/usr)
var/obj/item/stack/oldsrc = src
src = null
for(var/obj/item/stack/item in usr.loc)
if(item == oldsrc)
continue
if(!istype(item, oldsrc.type))
continue
if(item.amount >= item.max_amount)
continue
oldsrc.attackby(item, usr)
to_chat(usr, "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s.")
if(oldsrc.amount <= 0)
break
oldsrc.update_icon()
/obj/item/stack/proc/get_amount()
return amount
@@ -252,46 +261,69 @@
return F
/obj/item/stack/attack_hand(mob/user)
if(user.is_in_inactive_hand(src))
var/obj/item/stack/F = split(user, 1)
user.put_in_hands(F)
if(user.is_in_inactive_hand(src) && amount > 1)
change_stack(user, 1)
if(src && usr.machine == src)
spawn(0)
interact(usr)
else
..()
/obj/item/stack/AltClick(mob/living/user)
if(!istype(user) || user.incapacitated())
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(!in_range(src, user) || issilicon(usr))
return
if(amount < 1)
return
//get amount from user
var/min = 0
var/max = get_amount()
var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as num)
if(stackmaterial == null || stackmaterial <= min || stackmaterial > get_amount())
return
change_stack(user,stackmaterial)
to_chat(user, "<span class='notice'>You take [stackmaterial] sheets out of the stack.</span>")
/obj/item/stack/proc/change_stack(mob/user,amount)
var/obj/item/stack/F = new type(user, amount, FALSE)
. = F
F.copy_evidences(src)
user.put_in_hands(F)
add_fingerprint(user)
F.add_fingerprint(user)
use(amount)
/obj/item/stack/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, merge_type))
var/obj/item/stack/S = W
if(S.amount >= max_amount)
return 1
if(user.is_in_inactive_hand(src))
var/desired = input("How much would you like to transfer from this stack?", "How much?", 1) as null|num
if(!desired)
return
desired = round(desired)
to_transfer = max(1,min(desired,S.max_amount-S.amount,src.amount))
else
to_transfer = min(src.amount, S.max_amount-S.amount)
S.amount += to_transfer
if(S && usr.machine == S)
spawn(0)
S.interact(usr)
use(to_transfer)
if(src && usr.machine == src)
spawn(0)
interact(usr)
S.update_icon()
merge(S)
to_chat(user, "<span class='notice'>Your [S.name] stack now contains [S.get_amount()] [S.singular_name]\s.</span>")
else
return ..()
/obj/item/stack/proc/zero_amount()
if(amount < 1)
qdel(src)
return TRUE
return FALSE
/obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible
if(QDELETED(S) || QDELETED(src) || S == src) //amusingly this can cause a stack to consume itself, let's not allow that.
return FALSE
var/transfer = get_amount()
transfer = min(transfer, S.max_amount - S.amount)
if(transfer <= 0)
return
if(pulledby)
pulledby.start_pulling(S)
S.copy_evidences(src)
S.add(transfer)
use(transfer)
/obj/item/stack/proc/copy_evidences(obj/item/stack/from)
blood_DNA = from.blood_DNA
fingerprints = from.fingerprints
fingerprintshidden = from.fingerprintshidden
fingerprintslast = from.fingerprintslast
//TODO bloody overlay
@@ -43,7 +43,7 @@ AI MODULES
src.transmitInstructions(comp.current, usr)
to_chat(comp.current, "These are your laws now:")
comp.current.show_laws()
for(var/mob/living/silicon/robot/R in mob_list)
for(var/mob/living/silicon/robot/R in GLOB.mob_list)
if(R.lawupdate && (R.connected_ai == comp.current))
to_chat(R, "These are your laws now:")
R.show_laws()
+2 -2
View File
@@ -57,7 +57,7 @@ RCD
spark_system = new /datum/effect_system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
rcd_list += src
GLOB.rcd_list += src
door_accesses_list = list()
for(var/access in get_all_accesses())
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
@@ -65,7 +65,7 @@ RCD
/obj/item/rcd/Destroy()
QDEL_NULL(spark_system)
rcd_list -= src
GLOB.rcd_list -= src
return ..()
/obj/item/rcd/attackby(obj/item/W, mob/user, params)
-2
View File
@@ -332,7 +332,6 @@
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
H.adjustStaminaLoss(50)
H.Weaken(5)
H.updatehealth() //forces health update before next life tick
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
@@ -479,7 +478,6 @@
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
H.adjustStaminaLoss(50)
H.Weaken(5)
H.updatehealth() //forces health update before next life tick
if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
H.set_heartattack(TRUE)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+36 -1
View File
@@ -60,7 +60,7 @@
if(nadeassembly)
nadeassembly.attack_self(user)
return
var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
var/newtime = input(usr, "Please set the timer.", "Timer", det_time) as num
if(user.is_in_active_hand(src))
newtime = Clamp(newtime, 10, 60000)
det_time = newtime
@@ -231,3 +231,38 @@
CB.prime()
..()
/obj/item/grenade/plastic/x4/thermite
name = "T4"
desc = "A wall breaching charge, containing fuel, metal oxide and metal powder mixed in just the right way. One hell of a combination. Effective against walls, ineffective against airlocks..."
det_time = 2
icon_state = "t4breach0"
item_state = "t4breach"
/obj/item/grenade/plastic/x4/thermite/prime()
var/turf/location
if(target)
if(!QDELETED(target))
location = get_turf(target)
target.overlays -= image_overlay
else
location = get_turf(src)
if(location)
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(8,0, location, aim_dir)
if(target && target.density)
var/turf/T = get_step(location, aim_dir)
for(var/turf/simulated/wall/W in range(1, location))
W.thermitemelt(speed = 30)
addtimer(CALLBACK(null, .proc/explosion, T, 0, 0, 2), 3)
addtimer(CALLBACK(smoke, /datum/effect_system/smoke_spread/.proc/start), 3)
else
addtimer(CALLBACK(null, .proc/explosion, T, 0, 0, 2), 3)
addtimer(CALLBACK(smoke, /datum/effect_system/smoke_spread/.proc/start), 3)
if(isliving(target))
var/mob/living/M = target
M.adjust_fire_stacks(2)
M.IgniteMob()
qdel(src)
@@ -40,7 +40,7 @@
/obj/item/implant/abductor/proc/get_team_console(var/team)
var/obj/machinery/abductor/console/console
for(var/obj/machinery/abductor/console/c in abductor_equipment)
for(var/obj/machinery/abductor/console/c in GLOB.abductor_equipment)
if(c.team == team)
console = c
break
@@ -24,10 +24,10 @@
/obj/item/implant/chem/New()
..()
create_reagents(50)
tracked_implants += src
GLOB.tracked_implants += src
/obj/item/implant/chem/Destroy()
tracked_implants -= src
GLOB.tracked_implants -= src
return ..()
@@ -8,10 +8,10 @@
/obj/item/implant/tracking/New()
..()
tracked_implants += src
GLOB.tracked_implants += src
/obj/item/implant/tracking/Destroy()
tracked_implants -= src
GLOB.tracked_implants -= src
return ..()
/obj/item/implant/tracking/get_data()
+2 -1
View File
@@ -56,7 +56,6 @@
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
if(affecting.receive_damage( 0, 5 )) //INFERNO
H.UpdateDamageIcon()
H.updatehealth()
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.</span>")
set_light(2)
@@ -184,6 +183,7 @@
attack_verb = list("burnt","singed")
processing_objects.Add(src)
update_icon()
return TRUE
/obj/item/match/proc/matchburnout()
if(lit)
@@ -197,6 +197,7 @@
desc = "A match. This one has seen better days."
attack_verb = list("flicked")
processing_objects.Remove(src)
return TRUE
/obj/item/match/dropped(mob/user)
matchburnout()
+6 -6
View File
@@ -1636,7 +1636,7 @@
<li>The Chief Engineer is bound to the same rules regarding the axe as Atmospheric Technicians;</li>
<li>The Chief Engineer is permitted to carry a telescopic baton and a flash; </li>
<li>The Chief Engineer is responsible for maintaining the integrity of the Gravitational Singularity Engine and/or the Supermatter Engine and/or the Tesla Engine. Neglecting this duty is grounds for termination should the Engine malfunction;</li>
<li>The Chief Engineer is responsible for maintaining the integrity of the Cyberiad's Atmospherics System. Failure to maintain this integrity is grounds for termination;</li>
<li>The Chief Engineer is responsible for maintaining the integrity of the station's Atmospherics System. Failure to maintain this integrity is grounds for termination;</li>
<li>The Chief Engineer may declare an area "Condemned", if it is damaged to the point where repairs cannot reasonably be completed within an acceptable frame of time;</li>
<li>The Chief Engineer is permitted to grant Building Permits to crewmembers, but must keep the Station Blueprints in a safe location at all times.</li>
</ol>
@@ -1652,7 +1652,7 @@
<li>Engineers must constantly monitor the Supermatter Engine, if it is the chosen method of power generation, if it is currently active (ie, under Emitter Fire). This is not negotiable;</li>
<li>Engineers must respond promptly to breaches, regardless of size. Failure to report within fifteen (15) minutes will be considered a breach of Standard Operating Procedure, unless there are no spare Engineers to report or an Atmospheric Technician has arrived on scene first. All Hazard Zones must be cordoned off with Engineering Tape, for the sake of everyone else;</li>
<li>Engineers are permitted to hack doors to gain unauthorized access to locations if said locations happen to require urgent repairs;</li>
<li>Engineers are to maintain the integrity of the Cyberiad's Power Network. In addition, hotwiring the Gravitational Singularity Engine, Supermatter Engine or Tesla Engine is strictly forbidden;</li>
<li>Engineers are to maintain the integrity of the station's Power Network. In addition, hotwiring the Gravitational Singularity Engine, Supermatter Engine or Tesla Engine is strictly forbidden;</li>
<li>Engineers must ensure there is at least one (1) engineering hardsuit available on the station at all times, unless there is an emergency that requires the use of all suits.</li>
</ol>
<br><br>
@@ -2063,7 +2063,7 @@
<li>The Security Pod Pilot is not permitted to use the Laser Module during arrests, and must switch to the Disabler Module;</li>
<li>The Security Pod Pilot must carry around a spare set of tools and energy cell, for their own sake;</li>
<li>The Security Pod Pilot may immediately, and without warning, conduct arrests on individuals attempting to perform E.V.A actions near the AI Satellite. Exception is made if the AI Unit is malfunctioning;</li>
<li>The Security Pod Pilot is not permitted to explore the area surrounding the station, and must therefore be confined to the immediate orbital area of the NSS Cyberiad, the NXS Klapaucius (the Telecomms Satellite) and the Mining/Research Asteroid. Exception is made if the Head of Security permits otherwise.</li>
<li>The Security Pod Pilot is not permitted to explore the area surrounding the station, and must therefore be confined to the immediate orbital area of the station, the NXS Klapaucius (the Telecomms Satellite) and the Mining/Research Asteroid. Exception is made if the Head of Security permits otherwise.</li>
</ol><BR>
<h style='color: darkblue'>Code Blue</h>
@@ -2506,11 +2506,11 @@
<li>The Captain is not permitted to perform regular Security Duty. However, they may still assist Security if they are understaffed, or if they see a crime being committed. However, the Captain is not permitted to take items from the Armory under normal circumstances, unless authorized by the Head of Security. In addition, the Captain may not requisition weaponry for themselves from Cargo and/or Science, unless there's an immediate threat to station and/or crew;</li>
<li>If a Department lacks a Head of Staff, the Captain should make reasonable efforts to appoint an Acting Head of Staff, if there are available personnel to fill the position;</li>
<li>The Captain is to ensure that Space Law is being correctly applied. This should be done in cooperation with the Head of Security;</li>
<li>The Captain is not to leave the NSS Cyberiad unless given specific permission by Central Command, or it happens to be the end of the shift. This includes via space or via the Gateway. To do so is to be considered abandoning their posts and is grounds for termination;</li>
<li>The Captain is not to leave the station unless given specific permission by Central Command, or it happens to be the end of the shift. This includes via space or via the Gateway. To do so is to be considered abandoning their posts and is grounds for termination;</li>
<li>The Captain must keep the Nuclear Authentication Disk on their person at all times or, failing that, in the possession of the Head of Security or Blueshield;</li>
<li>The Captain is to attempt to resolve every issue that arises in Command locally before contacting Central Command;</li>
<li>The Captain is not permitted to carry their Antique Laser Gun or Space Armor unless there's an immediate emergency that requires attending to;</li>
<li>The Captain, despite being in charge of the Cyberiad, is not independent from Nanotrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;</li>
<li>The Captain, despite being in charge of the station, is not independent from Nanotrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;</li>
<li>The Captain may only promote personnel to a Acting Head of Staff position if there is no assigned Head of Staff associated with the Department. Said Acting Head of Staff must be a member of the Department they are to lead. See below for more information on Chain of Command;</li>
<li>The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, Nanotrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.</li>
</ol><BR>
@@ -2560,4 +2560,4 @@
</body>
</html>
"}
"}
+2 -2
View File
@@ -18,10 +18,10 @@
/obj/item/mop/New()
..()
create_reagents(mopcap)
janitorial_equipment += src
GLOB.janitorial_equipment += src
/obj/item/mop/Destroy()
janitorial_equipment -= src
GLOB.janitorial_equipment -= src
return ..()
/obj/item/mop/proc/clean(turf/simulated/A)
+6 -6
View File
@@ -35,8 +35,8 @@
var/datum/robolimb/robohead = all_robolimbs[C.model]
if(H.gender == MALE || isvulpkanin(H))
if(C.dna.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
for(var/i in GLOB.facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = GLOB.facial_hair_styles_list[i]
if(C.dna.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
@@ -53,13 +53,13 @@
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s face worth cutting. How disappointing.</span>")
return
else
species_facial_hair = facial_hair_styles_list
species_facial_hair = GLOB.facial_hair_styles_list
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
//handle normal hair
var/list/species_hair = list()
if(C.dna.species)
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
for(var/i in GLOB.hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = GLOB.hair_styles_public_list[i]
if(C.dna.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
@@ -76,7 +76,7 @@
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s head worth cutting. How disappointing.</span>")
return
else
species_hair = hair_styles_public_list
species_hair = GLOB.hair_styles_public_list
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
user.visible_message("<span class='notice'>[user] starts cutting [M]'s hair!</span>", "<span class='notice'>You start cutting [M]'s hair!</span>") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo)
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
+1 -3
View File
@@ -50,7 +50,6 @@
to_chat(H, "<span class='warning'>[src] cuts into your hand!</span>")
if(affecting.receive_damage(force*0.5))
H.UpdateDamageIcon()
H.updatehealth()
/obj/item/shard/attackby(obj/item/I, mob/user, params)
if(iswelder(I))
@@ -87,7 +86,6 @@
H.Weaken(3)
if(affecting.receive_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
..()
/obj/item/shard/plasma
@@ -126,4 +124,4 @@
to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.")
qdel(src)
else
return ..()
return ..()
@@ -138,7 +138,7 @@
storage_slots = 50
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
max_w_class = WEIGHT_CLASS_NORMAL
can_hold = list(/obj/item/ore)
can_hold = list(/obj/item/stack/ore)
/obj/item/storage/bag/ore/cyborg
name = "cyborg mining satchel"
@@ -246,6 +246,15 @@
new /obj/item/grenade/flashbang(src)
update_icon()
/obj/item/storage/belt/security/response_team_gamma/New()
..()
new /obj/item/melee/baton/loaded(src)
new /obj/item/reagent_containers/spray/pepper(src)
new /obj/item/flash(src)
new /obj/item/grenade/flashbang(src)
new /obj/item/grenade/flashbang(src)
update_icon()
/obj/item/storage/belt/soulstone
name = "soul stone belt"
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
@@ -123,3 +123,13 @@
new /obj/item/clothing/accessory/medal/conduct(src)
new /obj/item/clothing/accessory/medal/conduct(src)
new /obj/item/clothing/accessory/medal/gold/captain(src)
/obj/item/storage/lockbox/t4
name = "lockbox (T4)"
desc = "Contains three T4 breaching charges."
req_access = list(access_cent_specops)
/obj/item/storage/lockbox/t4/New()
..()
for(var/i = 0, i < 3, i++)
new /obj/item/grenade/plastic/x4/thermite(src)
@@ -166,7 +166,7 @@
if(display_contents_with_number)
for(var/datum/numbered_display/ND in display_contents)
ND.sample_object.mouse_opacity = 2
ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE
ND.sample_object.screen_loc = "[cx]:16,[cy]:16"
ND.sample_object.maptext = "<font color='white'>[(ND.number > 1)? "[ND.number]" : ""]</font>"
ND.sample_object.layer = 20
@@ -177,7 +177,7 @@
cy--
else
for(var/obj/O in contents)
O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip"
O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
O.screen_loc = "[cx]:16,[cy]:16"
O.maptext = ""
O.layer = 20
@@ -309,7 +309,7 @@
src.orient2hud(usr)
if(usr.s_active)
usr.s_active.show_to(usr)
W.mouse_opacity = 2 //So you can click on the area around the item to equip it, instead of having to pixel hunt
W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt
update_icon()
return 1
@@ -60,12 +60,12 @@
new /obj/item/wirecutters(src)
new /obj/item/t_scanner(src)
new /obj/item/crowbar(src)
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
new /obj/item/stack/cable_coil(src, 30, paramcolor = pickedcolor)
new /obj/item/stack/cable_coil(src, 30, paramcolor = pickedcolor)
if(prob(5))
new /obj/item/clothing/gloves/color/yellow(src)
else
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
new /obj/item/stack/cable_coil(src, 30, paramcolor = pickedcolor)
/obj/item/storage/toolbox/syndicate
name = "suspicious looking toolbox"
@@ -108,7 +108,7 @@
new /obj/item/wrench(src)
new /obj/item/weldingtool(src)
new /obj/item/crowbar(src)
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
new /obj/item/stack/cable_coil(src, 30, paramcolor = pickedcolor)
new /obj/item/wirecutters(src)
new /obj/item/multitool(src)
+14 -7
View File
@@ -14,6 +14,7 @@
var/status = 0
var/obj/item/stock_parts/cell/high/bcell = null
var/hitcost = 1000
var/throw_hit_chance = 35
/obj/item/melee/baton/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.</span>")
@@ -28,6 +29,11 @@
QDEL_NULL(bcell)
return ..()
/obj/item/melee/baton/throw_impact(atom/hit_atom)
..()
if(status && prob(throw_hit_chance))
baton_stun(hit_atom)
/obj/item/melee/baton/loaded/New() //this one starts with a cell pre-installed.
..()
bcell = new(src)
@@ -138,15 +144,17 @@
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
return
user.lastattacked = L
L.lastattacker = user
L.Stun(stunforce)
L.Weaken(stunforce)
L.apply_effect(STUTTER, stunforce)
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
if(user)
user.lastattacked = L
L.lastattacker = user
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
add_attack_logs(user, L, "stunned")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
if(isrobot(loc))
@@ -158,9 +166,7 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.forcesay(hit_appends)
add_attack_logs(user, L, "Stunned with [src]")
H.forcesay(GLOB.hit_appends)
/obj/item/melee/baton/emp_act(severity)
if(bcell)
@@ -193,6 +199,7 @@
throwforce = 5
stunforce = 5
hitcost = 2000
throw_hit_chance = 10
slot_flags = SLOT_BACK
var/obj/item/assembly/igniter/sparkler = null
@@ -315,7 +315,7 @@
desc = "A frozen shell of ice containing nanofrost that freezes the surrounding area after activation."
icon = 'icons/effects/effects.dmi'
icon_state = "frozen_smoke_capsule"
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pass_flags = PASSTABLE
/obj/effect/nanofrost_container/proc/Smoke()
@@ -59,14 +59,14 @@ Frequency:
if(sr)
temp += "<B>Located Beacons:</B><BR>"
for(var/obj/item/radio/beacon/W in beacons)
for(var/obj/item/radio/beacon/W in GLOB.beacons)
if(W.frequency == frequency && !W.syndicate)
if(W && W.z == z)
var/turf/TB = get_turf(W)
temp += "[W.code]: [TB.x], [TB.y], [TB.z]<BR>"
temp += "<B>Located Implants:</B><BR>"
for(var/obj/item/implant/tracking/T in tracked_implants)
for(var/obj/item/implant/tracking/T in GLOB.tracked_implants)
if(!T.implanted || !T.imp_in)
continue
+19 -1
View File
@@ -147,6 +147,14 @@
wield(user)
..()
/obj/item/twohanded/required/on_give(mob/living/carbon/giver, mob/living/carbon/receiver)
var/obj/item/twohanded/required/H = receiver.get_inactive_hand()
if(H != null) //Check if he can wield it
receiver.drop_item() //Can't wear it so drop it
to_chat(receiver, "<span class='notice'>[src] is too cumbersome to carry in one hand!</span>")
return
equipped(receiver,receiver.hand ? slot_l_hand : slot_r_hand)
/obj/item/twohanded/required/equipped(mob/user, slot)
..()
if(slot == slot_l_hand || slot == slot_r_hand)
@@ -438,7 +446,7 @@
if(on)
playsound(loc, 'sound/weapons/chainsawstart.ogg', 50, 1)
force = on ? force_on : initial(force)
throwforce = on ? force_on : initial(force)
throwforce = on ? force_on : initial(throwforce)
icon_state = "gchainsaw_[on ? "on" : "off"]"
if(hitsound == "swing_hit")
@@ -453,6 +461,16 @@
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/twohanded/required/chainsaw/attack_hand(mob/user)
. = ..()
force = on ? force_on : initial(force)
throwforce = on ? force_on : initial(throwforce)
/obj/item/twohanded/required/chainsaw/on_give(mob/living/carbon/giver, mob/living/carbon/receiver)
. = ..()
force = on ? force_on : initial(force)
throwforce = on ? force_on : initial(throwforce)
/obj/item/twohanded/required/chainsaw/doomslayer
name = "OOOH BABY"
desc = "<span class='warning'>VRRRRRRR!!!</span>"
+4 -4
View File
@@ -65,9 +65,9 @@
// Nada
/obj/Destroy()
machines -= src
GLOB.machines -= src
processing_objects -= src
fast_processing -= src
GLOB.fast_processing -= src
SSnanoui.close_uis(src)
return ..()
@@ -287,14 +287,14 @@ a {
return
speed_process = TRUE
processing_objects.Remove(src)
fast_processing.Add(src)
GLOB.fast_processing.Add(src)
/obj/proc/makeNormalProcess()
if(!speed_process)
return
speed_process = FALSE
processing_objects.Add(src)
fast_processing.Remove(src)
GLOB.fast_processing.Remove(src)
/obj/vv_get_dropdown()
. = ..()
-1
View File
@@ -147,7 +147,6 @@
H.adjustBruteLoss(damage)
H.UpdateDamageIcon()
H.updatehealth()
return
/obj/structure/proc/can_touch(var/mob/user)
@@ -60,9 +60,7 @@
if(allowed(user))
locked = !locked
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded )))
to_chat(O, "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
visible_message("<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
update_icon()
else
to_chat(user, "<span class='notice'>Access Denied</span>")
@@ -93,12 +91,11 @@
/obj/structure/closet/secure_closet/emag_act(mob/user)
if(!broken)
broken = 1
locked = 0
desc = "It appears to be broken."
broken = TRUE
locked = FALSE
icon_state = icon_off
flick(icon_broken, src)
to_chat(user, "<span class='notice'>You unlock \the [src].</span>")
to_chat(user, "<span class='notice'>You break the lock on \the [src].</span>")
/obj/structure/closet/secure_closet/attack_hand(mob/user)
add_fingerprint(user)
@@ -69,8 +69,8 @@
break
if(O.density || O.anchored || istype(O,/obj/structure/closet))
continue
if(istype(O, /obj/structure/stool/bed)) //This is only necessary because of rollerbeds and swivel chairs.
var/obj/structure/stool/bed/B = O
if(istype(O, /obj/structure/bed)) //This is only necessary because of rollerbeds and swivel chairs.
var/obj/structure/bed/B = O
if(B.buckled_mob)
continue
O.forceMove(src)
@@ -270,9 +270,7 @@
return
if(src.allowed(user))
src.locked = !src.locked
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded )))
to_chat(O, "<span class='notice'>The crate has been [locked ? null : "un"]locked by [user].</span>")
visible_message("<span class='notice'>The crate has been [locked ? null : "un"]locked by [user].</span>")
update_icon()
else
to_chat(user, "<span class='notice'>Access Denied</span>")
+9 -9
View File
@@ -21,33 +21,33 @@
switch(choice)
if("Underwear")
var/list/valid_underwear = list()
for(var/underwear in underwear_list)
var/datum/sprite_accessory/S = underwear_list[underwear]
for(var/underwear in GLOB.underwear_list)
var/datum/sprite_accessory/S = GLOB.underwear_list[underwear]
if(!(H.dna.species.name in S.species_allowed))
continue
valid_underwear[underwear] = underwear_list[underwear]
valid_underwear[underwear] = GLOB.underwear_list[underwear]
var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear
if(new_underwear)
H.underwear = new_underwear
if("Undershirt")
var/list/valid_undershirts = list()
for(var/undershirt in undershirt_list)
var/datum/sprite_accessory/S = undershirt_list[undershirt]
for(var/undershirt in GLOB.undershirt_list)
var/datum/sprite_accessory/S = GLOB.undershirt_list[undershirt]
if(!(H.dna.species.name in S.species_allowed))
continue
valid_undershirts[undershirt] = undershirt_list[undershirt]
valid_undershirts[undershirt] = GLOB.undershirt_list[undershirt]
var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts
if(new_undershirt)
H.undershirt = new_undershirt
if("Socks")
var/list/valid_sockstyles = list()
for(var/sockstyle in socks_list)
var/datum/sprite_accessory/S = socks_list[sockstyle]
for(var/sockstyle in GLOB.socks_list)
var/datum/sprite_accessory/S = GLOB.socks_list[sockstyle]
if(!(H.dna.species.name in S.species_allowed))
continue
valid_sockstyles[sockstyle] = socks_list[sockstyle]
valid_sockstyles[sockstyle] = GLOB.socks_list[sockstyle]
var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles
if(new_socks)
H.socks = new_socks
+3 -1
View File
@@ -211,6 +211,7 @@
layer = 5
w_class = WEIGHT_CLASS_HUGE
force = 10
force_wielded = 10
throwforce = 13
throw_speed = 2
throw_range = 4
@@ -222,9 +223,10 @@
icon_state = "plant-36"
/obj/item/twohanded/required/kirbyplants/equipped(mob/living/user)
. = ..()
var/image/I = image(icon = 'icons/obj/flora/plants.dmi' , icon_state = src.icon_state, loc = user)
I.override = 1
user.add_alt_appearance("sneaking_mission", I, player_list)
user.add_alt_appearance("sneaking_mission", I, GLOB.player_list)
/obj/item/twohanded/required/kirbyplants/dropped(mob/living/user)
..()
+1 -1
View File
@@ -18,7 +18,7 @@
var/grille_type
var/broken_type = /obj/structure/grille/broken
var/shockcooldown = 0
var/my_shockcooldown = 50
var/my_shockcooldown = 1 SECONDS
/obj/structure/grille/fence/
var/width = 3
+2 -2
View File
@@ -21,10 +21,10 @@
/obj/structure/janitorialcart/New()
..()
create_reagents(100)
janitorial_equipment += src
GLOB.janitorial_equipment += src
/obj/structure/janitorialcart/Destroy()
janitorial_equipment -= src
GLOB.janitorial_equipment -= src
QDEL_NULL(mybag)
QDEL_NULL(mymop)
QDEL_NULL(myspray)
@@ -29,7 +29,7 @@
/obj/structure/kitchenspike
name = "a meat spike"
name = "meat spike"
icon = 'icons/obj/kitchen.dmi'
icon_state = "spike"
desc = "A spike for collecting meat from animals."
+2 -5
View File
@@ -69,10 +69,7 @@
if(src.destroyed)
return
else
to_chat(usr, text("<span class='notice'>You kick the lab cage.</span>"))
for(var/mob/O in oviewers())
if((O.client && !( O.blinded )))
to_chat(O, text("<span class='warning'>[] kicks the lab cage.</span>", usr))
user.visible_message("<span class='warning'>[user] kicks the lab cage.</span>", "<span class='notice'>You kick the lab cage.</span>")
src.health -= 2
healthcheck()
return
@@ -82,4 +79,4 @@
new /obj/item/clothing/mask/facehugger/lamarr(src.loc)
occupied = 0
update_icon()
return
return
+2 -2
View File
@@ -10,14 +10,14 @@
/obj/structure/mopbucket/New()
..()
create_reagents(100)
janitorial_equipment += src
GLOB.janitorial_equipment += src
/obj/structure/mopbucket/full/New()
..()
reagents.add_reagent("water", 100)
/obj/structure/mopbucket/Destroy()
janitorial_equipment -= src
GLOB.janitorial_equipment -= src
return ..()
/obj/structure/mopbucket/examine(mob/user)
+2 -6
View File
@@ -207,9 +207,7 @@
return
O.forceMove(loc)
if(user != O)
for(var/mob/B in viewers(user, 3))
if((B.client && !( B.blinded )))
to_chat(B, text("<span class='warning'>[] stuffs [] into []!</span>", user, O, src))
user.visible_message("<span class='warning'>[user] stuffs [O] into [src]!</span>")
return
/obj/structure/m_tray/Destroy()
@@ -440,9 +438,7 @@
return
O.forceMove(loc)
if(user != O)
for(var/mob/B in viewers(user, 3))
if((B.client && !( B.blinded )))
to_chat(B, text("<span class='warning'>[] stuffs [] into []!</span>", user, O, src))
user.visible_message("<span class='warning'>[user] stuffs [O] into [src]!</span>")
//Foreach goto(99)
return
+3 -3
View File
@@ -65,8 +65,8 @@
if(istype(A) && A.checkpass(PASSGLASS))
return prob(60)
var/obj/structure/stool/bed/B = A
if(istype(A, /obj/structure/stool/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
var/obj/structure/bed/B = A
if(istype(A, /obj/structure/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
return 0
if(istype(A, /obj/structure/closet/cardboard))
@@ -133,4 +133,4 @@
return ..()
/obj/structure/plasticflaps/mining/CanAtmosPass(turf/T)
return 0
return 0
@@ -138,6 +138,7 @@
icon_state = "wooden_chair_wings"
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
item_chair = /obj/item/chair/wood/wings
/obj/structure/chair/comfy
name = "comfy chair"
+1 -1
View File
@@ -278,7 +278,7 @@
icon_state = "mist"
layer = MOB_LAYER + 1
anchored = 1
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/machinery/shower/attack_hand(mob/M as mob)
on = !on