mirror of
https://github.com/goonstation/goonstation-2020.git
synced 2026-07-12 07:32:20 +01:00
1657 lines
48 KiB
Plaintext
1657 lines
48 KiB
Plaintext
////////////////
|
|
// CLEANABLES //
|
|
////////////////
|
|
|
|
proc/make_cleanable(var/type,var/loc,var/list/viral_list)
|
|
var/obj/decal/cleanable/C = unpool(type)
|
|
C.setup(loc,viral_list)
|
|
.= C
|
|
|
|
/obj/decal/cleanable
|
|
density = 0
|
|
anchored = 1
|
|
var/can_sample = 0
|
|
var/sampled = 0
|
|
var/sample_amt = 10
|
|
var/sample_reagent = "water"
|
|
var/sample_verb = "scoop"
|
|
var/list/diseases = list()
|
|
var/slippery = 0 // set it to the probability that you want people to slip in the stuff, ie urine's slippery is 80 so you have an 80% chance to slip on it
|
|
var/slipped_in_blood = 0 // self explanitory hopefully
|
|
var/can_dry = 0
|
|
var/dry = 0 // if it's slippery to start, is it dry now?
|
|
var/stain = null // clothing will be stained with this message if the decal is created in the same tile as them
|
|
|
|
var/can_fluid_absorb = 1
|
|
//var/turf/last_turf //unset 'messy' on my last turf after a move
|
|
//moved up to atom/movable
|
|
|
|
var/last_dry_start = 0
|
|
var/dry_time = 100
|
|
|
|
flags = NOSPLASH
|
|
layer = DECAL_LAYER
|
|
plane = PLANE_NOSHADOW_BELOW
|
|
event_handler_flags = USE_HASENTERED | USE_FLUID_ENTER
|
|
|
|
//plane = PLANE_FLOOR - BAD IDEA, STUFF GOES BELOW WALLS
|
|
|
|
New(var/loc,var/list/viral_list)
|
|
if (!pooled)
|
|
setup(loc,viral_list)
|
|
|
|
setup(var/L,var/list/viral_list)
|
|
..()
|
|
|
|
src.real_name = src.name
|
|
|
|
if (viral_list && viral_list.len > 0)
|
|
for (var/datum/ailment_data/AD in viral_list)
|
|
src.diseases += AD
|
|
if (src.can_dry)
|
|
src.Dry()
|
|
|
|
if (src.loc != null)
|
|
var/area/Ar = get_area(src)
|
|
if (Ar)
|
|
Ar.sims_score = max(Ar.sims_score - 6, 0)
|
|
|
|
if (src.stain)
|
|
src.Stain()
|
|
|
|
if (istype(src.loc, /turf/simulated/floor))
|
|
var/turf/simulated/T = src.loc
|
|
T.messy++
|
|
last_turf = T
|
|
T.cleanable_fluid_react()
|
|
|
|
disposing()
|
|
if (can_dry)
|
|
processing_items.Remove(src)
|
|
|
|
if (istype(src.loc, /turf/simulated/floor))
|
|
var/turf/simulated/T = src.loc
|
|
T.messy = max(T.messy-1, 0)
|
|
|
|
var/area/Ar = get_area(src)
|
|
if (Ar)
|
|
Ar.sims_score = min(Ar.sims_score + 6, 100)
|
|
..()
|
|
|
|
unpooled()
|
|
..()
|
|
dry = initial(dry)
|
|
src.stain = initial(stain)
|
|
src.name = initial(name)
|
|
src.desc = initial(desc)
|
|
color = initial(color)
|
|
|
|
src.diseases.len = 0
|
|
|
|
|
|
proc/process()
|
|
if (world.time > last_dry_start + dry_time)
|
|
end_dry()
|
|
|
|
ex_act(severity)
|
|
if (isrestrictedz(src.z))
|
|
return
|
|
else
|
|
pool(src)
|
|
|
|
Move(NewLoc, direct)
|
|
..()
|
|
if (last_turf && istype(last_turf))
|
|
last_turf.messy = max(last_turf.messy-1, 0)
|
|
last_turf = src.loc
|
|
|
|
if (istype(src.loc, /turf/simulated/floor))
|
|
var/turf/simulated/floor/F = src.loc
|
|
F.messy++
|
|
|
|
HasEntered(AM as mob|obj)
|
|
..()
|
|
if (src.qdeled || src.pooled)
|
|
return
|
|
if (src.stain && !src.dry && (ishuman(AM) || istype(AM, /obj/item/clothing)))
|
|
src.Stain(AM)
|
|
if (!src.slippery || src.dry)
|
|
return
|
|
if (istype(src, /obj/decal/cleanable/blood/dynamic))
|
|
var/obj/decal/cleanable/blood/dynamic/D = src
|
|
if (D.blood_volume <= 2)
|
|
return
|
|
if (istype(src.loc, /turf/space))
|
|
return
|
|
if (iscarbon(AM))
|
|
var/mob/M = AM
|
|
if (!M.can_slip())
|
|
return
|
|
if (prob(src.slippery))
|
|
M.pulling = null
|
|
M.visible_message("<span style='color:red'><b>[M]</b> slips on [src]!</span>",\
|
|
"<span style='color:red'>You slip on [src]!</span>")
|
|
playsound(src.loc, "sound/misc/slip.ogg", 50, 1, -3)
|
|
M.changeStatus("stunned", 3 SECONDS)
|
|
M.changeStatus("weakened", 3 SECONDS)
|
|
M.force_laydown_standup()
|
|
if (src.slipped_in_blood)
|
|
M.add_blood(src)
|
|
|
|
attackby(obj/item/W, mob/user)
|
|
if (src.can_sample && W.is_open_container() && W.reagents)
|
|
src.Sample(W, user)
|
|
if (istype(W,/obj/item/mop))
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
proc/Dry(var/time = rand(600,1000))
|
|
if (!src.can_dry || src.dry)
|
|
return 0
|
|
|
|
dry_time = time
|
|
last_dry_start = world.time
|
|
processing_items.Add(src)
|
|
|
|
proc/end_dry()
|
|
pool(src)
|
|
|
|
proc/Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!src.can_sample || !W.reagents)
|
|
return 0
|
|
if (src.sampled)
|
|
user.show_text("There's not enough left of [src] to [src.sample_verb] into [W].", "red")
|
|
return 0
|
|
|
|
if (src.reagents)
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - (src.reagents.total_volume - 1))
|
|
user.show_text("[W] is too full!", "red")
|
|
return 0
|
|
else
|
|
if (src.reagents.total_volume)
|
|
src.reagents.trans_to(W, src.reagents.total_volume)
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> [src.sample_verb]s some of [src] into [W].</span>",\
|
|
"<span style=\"color:blue\">You [src.sample_verb] some of [src] into [W].</span>")
|
|
W.reagents.handle_reactions()
|
|
src.sampled = 1
|
|
return 1
|
|
|
|
else if (src.sample_amt && src.sample_reagent)
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - (src.sample_amt - 1))
|
|
user.show_text("[W] is too full!", "red")
|
|
return 0
|
|
else
|
|
W.reagents.add_reagent(src.sample_reagent, src.sample_amt)
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> [src.sample_verb]s some of [src] into [W].</span>",\
|
|
"<span style=\"color:blue\">You [src.sample_verb] some of [src] into [W].</span>")
|
|
W.reagents.handle_reactions()
|
|
src.sampled = 1
|
|
return 1
|
|
|
|
proc/Stain(var/atom/movable/AM)
|
|
if (src.stain)
|
|
if (AM)
|
|
if (ishuman(AM))
|
|
var/mob/living/carbon/human/H = AM
|
|
if (H.lying)
|
|
if (H.wear_suit)
|
|
H.wear_suit.add_stain(src.stain)
|
|
else if (H.w_uniform)
|
|
H.w_uniform.add_stain(src.stain)
|
|
else
|
|
if (H.shoes)
|
|
H.shoes.add_stain(src.stain)
|
|
return
|
|
else if (istype(AM, /obj/item/clothing))
|
|
var/obj/item/clothing/C = AM
|
|
C.add_stain(src.stain)
|
|
return
|
|
else
|
|
SPAWN_DBG(0) //sorry. i want to lagcheck this. DO SOMETHING BETTER LATER ARUUGh
|
|
for (var/mob/living/carbon/human/H in src.loc)
|
|
if (H.lying)
|
|
if (H.wear_suit)
|
|
H.wear_suit.add_stain(src.stain)
|
|
else if (H.w_uniform)
|
|
H.w_uniform.add_stain(src.stain)
|
|
else
|
|
if (H.shoes)
|
|
H.shoes.add_stain(src.stain)
|
|
LAGCHECK(LAG_REALTIME)
|
|
LAGCHECK(LAG_HIGH)
|
|
for (var/obj/item/clothing/C in src.loc)
|
|
C.add_stain(src.stain)
|
|
LAGCHECK(LAG_REALTIME)
|
|
|
|
#define DRY_BLOOD 1
|
|
#define FRESH_BLOOD -1
|
|
|
|
/obj/decal/cleanable/blood
|
|
name = "blood"
|
|
icon = 'icons/effects/blood.dmi'
|
|
icon_state = "floor1"
|
|
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
|
var/ling_blood = 0
|
|
var/blood_volume = 0
|
|
color = DEFAULT_BLOOD_COLOR
|
|
slippery = 10
|
|
slipped_in_blood = 1
|
|
can_sample = 1
|
|
sample_reagent = "blood"
|
|
can_dry = 1
|
|
stain = "blood-stained"
|
|
var/can_track = 1
|
|
|
|
New()
|
|
var/datum/reagents/R = new/datum/reagents(10) // 9u is the max since we wanna leave at least 1u of blood in the blood puddle
|
|
reagents = R
|
|
R.my_atom = src
|
|
if (ling_blood)
|
|
src.reagents.add_reagent("bloodc", 10)
|
|
src.sample_reagent = "bloodc"
|
|
else
|
|
src.reagents.add_reagent("blood", 10)
|
|
|
|
..()
|
|
|
|
pooled()
|
|
..()
|
|
|
|
unpooled()
|
|
..()
|
|
blood_volume = 0
|
|
|
|
setup()
|
|
if (!src.reagents)
|
|
var/datum/reagents/R = new/datum/reagents(10)
|
|
reagents = R
|
|
R.my_atom = src
|
|
else
|
|
src.reagents.clear_reagents()
|
|
|
|
|
|
if (ling_blood)
|
|
src.reagents.add_reagent("bloodc", 10)
|
|
src.sample_reagent = "bloodc"
|
|
else
|
|
src.reagents.add_reagent("blood", 10)
|
|
|
|
..()
|
|
|
|
SPAWN_DBG(0)
|
|
if (!src.pooled)
|
|
for (var/obj/O in src.loc)
|
|
LAGCHECK(LAG_LOW)
|
|
if (O && prob(max(src.blood_volume*10, 10)))
|
|
O.add_blood(src)
|
|
|
|
HasEntered(atom/movable/AM as mob|obj)
|
|
..()
|
|
if (!istype(AM))
|
|
return
|
|
if (src.dry == FRESH_BLOOD && src.blood_volume >= 3 && src.can_track)
|
|
if (ishuman(AM))
|
|
var/mob/living/carbon/human/H = AM
|
|
if (H.lying)
|
|
if (H.wear_suit)
|
|
H.wear_suit.add_blood(src)
|
|
H.set_clothing_icon_dirty()
|
|
else if (H.w_uniform)
|
|
H.w_uniform.add_blood(src)
|
|
H.set_clothing_icon_dirty()
|
|
else
|
|
if (H.shoes)
|
|
H.shoes.add_blood(src)
|
|
H.set_clothing_icon_dirty()
|
|
if (H.m_intent != "walk")
|
|
src.add_tracked_blood(H)
|
|
else if (isliving(AM))// || isobj(AM))
|
|
AM.add_blood(src)
|
|
if (!AM.anchored)
|
|
src.add_tracked_blood(AM)
|
|
|
|
Dry(var/time = rand(300,600))
|
|
if (!src.can_dry || src.dry == DRY_BLOOD)
|
|
src.stain = null
|
|
return 0
|
|
if (ticker) // don't do this unless the game has started
|
|
src.dry = FRESH_BLOOD // fresh!!
|
|
src.UpdateName()
|
|
|
|
dry_time = time
|
|
last_dry_start = world.time
|
|
processing_items.Add(src)
|
|
|
|
end_dry()
|
|
src.dry = DRY_BLOOD
|
|
src.stain = null
|
|
src.UpdateName()
|
|
|
|
proc/add_tracked_blood(atom/movable/AM as mob|obj)
|
|
AM.tracked_blood = list("bDNA" = src.blood_DNA, "btype" = src.blood_type, "color" = src.color, "count" = rand(2,6))
|
|
if (ismob(AM))
|
|
var/mob/M = AM
|
|
M.set_clothing_icon_dirty()
|
|
|
|
disposing(var/obj/decal/bloodtrace/B)
|
|
if (!B)
|
|
diseases = list()
|
|
B = new /obj/decal/bloodtrace(src.loc)
|
|
B.blood_DNA = src.blood_DNA // okay so we shouldn't check to see if B has DNA/type because it's brand new and it does not, duh
|
|
B.blood_type = src.blood_type
|
|
B.icon = src.icon
|
|
B.icon_state = src.icon_state
|
|
B.color = "#3399FF"
|
|
B.alpha = 100
|
|
..()
|
|
|
|
UpdateName()
|
|
src.name = "[name_prefix(null, 1)][src.dry == DRY_BLOOD ? "dried " : src.dry == FRESH_BLOOD ? "fresh " : null][src.real_name][name_suffix(null, 1)]"
|
|
|
|
get_desc(dist)
|
|
if (src.dry) // either fresh (-1) or dry (1)
|
|
. = " It's [src.dry == DRY_BLOOD ? "dry and flakey" : "fresh"]."
|
|
|
|
proc/streak(var/list/directions, randcolor = 0)
|
|
SPAWN_DBG (0)
|
|
var/direction = pick(directions)
|
|
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
|
LAGCHECK(LAG_LOW)//sleep(3)
|
|
if (i > 0)
|
|
var/obj/decal/cleanable/blood/b = make_cleanable( /obj/decal/cleanable/blood/splatter/extra,get_turf(src))
|
|
if (!b) continue //ZeWaka: fix for null.diseases
|
|
if (src && src.diseases)
|
|
b.diseases += src.diseases
|
|
if (src.blood_DNA && src.blood_type) // For forensics (Convair880).
|
|
b.blood_DNA = src.blood_DNA
|
|
b.blood_type = src.blood_type
|
|
if (randcolor) // only used by funnygibs atm. in the future, the possibilities are endless for this var. imagine what it could do..........
|
|
b.color = random_saturated_hex_color()
|
|
//else if (src.color != DEFAULT_BLOOD_COLOR)
|
|
//b.color = src.color
|
|
if (step_to(src, get_step(src, direction), 0))
|
|
break
|
|
|
|
// I don't think every blood decal needed these lists on them, I can't imagine that was nice for performance
|
|
var/list/blood_decal_low_icon_states = list("drip1a", "drip1b", "drip1c", "drip1d", "drip1e", "drip1f")
|
|
var/list/blood_decal_med_icon_states = list("drip2a", "drip2b", "drip2c", "drip2d", "drip2e", "drip2f")
|
|
var/list/blood_decal_high_icon_states = list("drip3a", "drip3b", "drip3c", "drip3d", "drip3e", "drip3f")
|
|
var/list/blood_decal_max_icon_states = list("drip4a", "drip4b", "drip4c", "drip4d", "drip5a", "drip5b", "drip5c", "drip5d")
|
|
var/list/blood_decal_violent_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7", "gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
|
|
|
|
#define list_and_len(x) (istype(x, /list) && x:len) // just to make sure it's a list and it's got something in it
|
|
|
|
/obj/decal/cleanable/blood/dynamic
|
|
desc = "It's blood."
|
|
icon_state = "blank" // if you make any more giant white cumblobs all over my nice blood decals
|
|
random_icon_states = null // I swear to god I will fucking end you
|
|
blood_volume = 0
|
|
slippery = 0 // increases as blood volume does
|
|
color = null
|
|
var/last_color = null
|
|
var/last_volume = 1
|
|
|
|
disposing()
|
|
diseases = list()
|
|
var/obj/decal/bloodtrace/B = new /obj/decal/bloodtrace(src.loc)
|
|
B.blood_DNA = src.blood_DNA
|
|
B.blood_type = src.blood_type
|
|
B.icon = src.icon
|
|
B.icon_state = src.icon_state
|
|
var/image/working_image
|
|
//for (var/i = src.blood_volume, i > 0, i--)
|
|
for (var/i in src.overlay_refs)
|
|
working_image = GetOverlayImage(i)
|
|
if (!working_image)
|
|
break
|
|
working_image.color = "#3399FF"
|
|
working_image.alpha = 100
|
|
B.UpdateOverlays(working_image, i)
|
|
|
|
..(B)
|
|
|
|
unpooled()
|
|
..()
|
|
|
|
Dry(var/time = rand(300,600))
|
|
if (!src.can_dry) // if it's already dry, unlike the non-dynamic blood decals, we don't wanna return, since the blood will be freshened up again
|
|
src.stain = null
|
|
return 0
|
|
if (ticker) // don't do this unless the game has started
|
|
dry_time = time
|
|
src.dry = FRESH_BLOOD // fresh!!
|
|
src.UpdateName()
|
|
src.dry_time = time
|
|
last_dry_start = world.time
|
|
if (!processing_items.Find(src))
|
|
processing_items.Add(src)
|
|
return 1
|
|
|
|
add_tracked_blood(atom/movable/AM as mob|obj)
|
|
AM.tracked_blood = list("bDNA" = src.blood_DNA, "btype" = src.blood_type, "color" = src.last_color, "count" = round(src.blood_volume / 2))
|
|
if (ismob(AM))
|
|
var/mob/M = AM
|
|
M.set_clothing_icon_dirty()
|
|
|
|
end_dry()
|
|
if (src.dry == FRESH_BLOOD)
|
|
src.dry = 0
|
|
src.UpdateName()
|
|
src.dry_time = rand(300,600)
|
|
else
|
|
src.dry = DRY_BLOOD
|
|
src.stain = null
|
|
src.UpdateName()
|
|
processing_items.Remove(src)
|
|
return
|
|
|
|
proc/add_volume(var/add_color, var/amount = 1, var/list/bdata = null, var/i_state = null, var/direction = null, var/do_fluid_react = 1)
|
|
// add_color passes the blood's color to the overlays
|
|
// amount should only be 1-5 if you want anything to happen
|
|
if (istype(bdata))
|
|
src.blood_DNA = bdata["bDNA"]
|
|
src.blood_type = bdata["btype"]
|
|
|
|
src.blood_volume += amount
|
|
|
|
var/turf/simulated/floor/T = src.loc
|
|
if (istype(T) && do_fluid_react)
|
|
if (T.cleanable_fluid_react(src))
|
|
return
|
|
|
|
if (src.blood_volume - amount >= 13)
|
|
return
|
|
|
|
/*if (istext(amount))
|
|
create_overlay(amount, add_color, direction)
|
|
amount = 1 // so the rand()s and prob()s down there doesn't freak out
|
|
*/
|
|
|
|
if (i_state)
|
|
create_overlay(i_state, add_color, direction)
|
|
else if (isnum(amount))
|
|
switch (amount)
|
|
if (1)
|
|
if (!list_and_len(blood_decal_low_icon_states))
|
|
return
|
|
create_overlay(blood_decal_low_icon_states, add_color, direction)
|
|
// no increase in slipperiness if there's just a little bit of blood being added
|
|
if (2)
|
|
if (!list_and_len(blood_decal_med_icon_states))
|
|
return
|
|
create_overlay(blood_decal_med_icon_states, add_color, direction)
|
|
src.slippery = min(src.slippery+1, 10)
|
|
if (3)
|
|
if (!list_and_len(blood_decal_high_icon_states))
|
|
return
|
|
create_overlay(blood_decal_high_icon_states, add_color, direction)
|
|
src.slippery = min(src.slippery+2, 10)
|
|
if (4)
|
|
if (!list_and_len(blood_decal_max_icon_states))
|
|
return
|
|
create_overlay(blood_decal_max_icon_states, add_color, direction)
|
|
src.slippery = min(src.slippery+5, 10)
|
|
if (5)
|
|
if (!list_and_len(blood_decal_violent_icon_states))
|
|
return
|
|
create_overlay(blood_decal_violent_icon_states, add_color, direction) // for when you wanna create a BIG MESS
|
|
src.slippery = 10
|
|
|
|
src.Dry(rand(amount*80,amount*120))
|
|
if (src.reagents && src.reagents.maximum_volume < 100)
|
|
src.reagents.maximum_volume += 10
|
|
|
|
for (var/obj/item/I in get_turf(src))
|
|
LAGCHECK(LAG_LOW)
|
|
if (prob(amount*10))
|
|
I.add_blood(src)
|
|
|
|
proc/create_overlay(var/list/icons_to_choose, var/add_color, var/direction)
|
|
var/blood_addition
|
|
if (islist(icons_to_choose) && icons_to_choose.len)
|
|
blood_addition = pick(icons_to_choose)
|
|
else if (istext(icons_to_choose))
|
|
blood_addition = icons_to_choose
|
|
else
|
|
return
|
|
if (blood_addition)
|
|
var/image/blood_overlay// = image('icons/effects/blood.dmi', blood_addition)
|
|
if (direction)
|
|
blood_overlay = image('icons/effects/blood.dmi', blood_addition, dir = direction)
|
|
blood_overlay.pixel_x += rand(-1,1)
|
|
blood_overlay.pixel_y += rand(-1,1)
|
|
else
|
|
blood_overlay = image('icons/effects/blood.dmi', blood_addition)
|
|
blood_overlay.transform = turn(blood_overlay.transform, pick(0, 180)) // gets funky with 0,90,180,-90
|
|
blood_overlay.pixel_x += rand(-4,4)
|
|
blood_overlay.pixel_y += rand(-4,4)
|
|
if (blood_overlay)
|
|
if (add_color)
|
|
blood_overlay.color = add_color
|
|
src.last_color = add_color
|
|
|
|
if (src.overlays.len > 4) //stop adding more overlays you're lagging up the client FPS! just replace the last one.
|
|
src.UpdateOverlays(blood_overlay, "bloodfinal")
|
|
else
|
|
src.UpdateOverlays(blood_overlay, "blood[src.blood_volume]")
|
|
|
|
/obj/decal/cleanable/blood/dynamic/tracks
|
|
//name = "bloody footprints"
|
|
desc = "Someone walked through some blood and got it everywhere, jeez!"
|
|
can_track = 0
|
|
|
|
add_volume(var/add_color, var/amount = 1, var/list/bdata = null, var/i_state = null, var/direction = null, var/e_tracking = 1)
|
|
// e_tracking will be set to 0 by the track_blood() proc atoms run when moving, so anything that doesn't set it to 0 is a regular sort of bleed and should re-enable tracking
|
|
if (e_tracking)
|
|
src.can_track = 1
|
|
..()
|
|
|
|
/obj/decal/cleanable/blood/drip
|
|
New()
|
|
..()
|
|
src.pixel_y += rand(0,16)
|
|
|
|
/obj/decal/cleanable/blood/drip/low
|
|
random_icon_states = list("drip1a", "drip1b", "drip1c", "drip1d", "drip1e", "drip1f")
|
|
/obj/decal/cleanable/blood/drip/med
|
|
random_icon_states = list("drip2a", "drip2b", "drip2c", "drip2d", "drip2e", "drip2f")
|
|
/obj/decal/cleanable/blood/drip/high
|
|
random_icon_states = list("drip3a", "drip3b", "drip3c", "drip3d", "drip3e", "drip3f")
|
|
|
|
/obj/decal/cleanable/blood/splatter
|
|
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
|
|
|
|
/obj/decal/cleanable/blood/splatter/extra
|
|
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7", "gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
|
|
|
|
|
|
/obj/decal/cleanable/blood/tracks
|
|
icon_state = "tracks"
|
|
random_icon_states = null
|
|
color = "#FFFFFF"
|
|
|
|
/obj/decal/cleanable/blood/hurting1
|
|
icon_state = "hurting1"
|
|
color = "#FFFFFF"
|
|
random_icon_states = null
|
|
|
|
hurting2
|
|
icon_state = "hurting2"
|
|
|
|
|
|
/obj/decal/cleanable/blood/gibs
|
|
name = "gibs"
|
|
desc = "Grisly..."
|
|
anchored = 0
|
|
layer = OBJ_LAYER
|
|
icon = 'icons/effects/blood.dmi'
|
|
icon_state = "gibbl5"
|
|
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
|
|
color = "#FFFFFF"
|
|
slippery = 5
|
|
can_dry = 0
|
|
can_fluid_absorb = 0
|
|
|
|
attack_hand(var/mob/user as mob)
|
|
if (ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
if (H.job == "Chef" || H.job == "Sous-Chef")
|
|
user.visible_message("<span style=\"color:blue\"><b>[H]</b> starts rifling through \the [src] with their hands. What a weirdo.</span>",\
|
|
"<span style=\"color:blue\">You rake through \the [src] with your bare hands.</span>")
|
|
playsound(src.loc, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
|
|
if (H.gloves)
|
|
H.gloves.blood_DNA = src.blood_DNA
|
|
else
|
|
H.blood_DNA = src.blood_DNA
|
|
if (src.sampled)
|
|
H.show_text("You didn't find anything useful. Now your hands are all bloody for nothing!", "red")
|
|
else
|
|
if (H.job == "Sous-Chef" && prob(30))
|
|
H.show_text("The... meat... slips through your inexperienced hands.", "blue")
|
|
else
|
|
H.show_text("You find some... salvageable... meat.. you guess?", "blue")
|
|
H.unlock_medal("Sheesh!", 1)
|
|
new /obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat(src.loc)
|
|
src.sampled = 1
|
|
else
|
|
return ..()
|
|
else
|
|
return ..()
|
|
|
|
/obj/decal/cleanable/blood/gibs/body
|
|
random_icon_states = list("gibhead", "gibtorso")
|
|
|
|
/obj/decal/cleanable/blood/gibs/core
|
|
random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
|
|
|
|
#undef DRY_BLOOD
|
|
#undef FRESH_BLOOD
|
|
|
|
/obj/decal/cleanable/glitter //WE'RE TRYING THIS NOW
|
|
name = "glitter"
|
|
desc = "You can try to clean it up, but there'll always be a little bit left."
|
|
icon = 'icons/effects/glitter.dmi'
|
|
icon_state = "glitter"
|
|
random_dir = 4
|
|
random_icon_states = list("glitter-1", "glitter-2", "glitter-3", "glitter-4", "glitter-5", "glitter-6", "glitter-7", "glitter-8", "glitter-9", "glitter-10")
|
|
can_sample = 1
|
|
sample_reagent = "glitter"
|
|
sample_verb = "scrape"
|
|
stain = "sparkly"
|
|
|
|
/obj/decal/cleanable/glitter/harmless //updated to not be lethal
|
|
sample_reagent = "glitter_harmless"
|
|
|
|
|
|
/obj/decal/cleanable/ketchup //It's ketchup that looks like blood.
|
|
name = "blood"
|
|
desc = "It's strangely bright red. Smells a bit like tomatoes as well." //Grody
|
|
icon = 'icons/effects/blood.dmi'
|
|
icon_state = "floor1"
|
|
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
|
color = "#cc0000" //Just a bit brighter than DEFAULT_BLOOD_COLOR
|
|
slippery = 10
|
|
can_sample = 1
|
|
sample_reagent = "ketchup"
|
|
|
|
/obj/decal/cleanable/paper
|
|
name = "paper"
|
|
desc = "Ripped up little flecks of paper."
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "paper"
|
|
random_dir = 4
|
|
can_sample = 1
|
|
sample_reagent = "paper"
|
|
sample_verb = "scrape"
|
|
|
|
New()
|
|
..()
|
|
pixel_y += rand(-4,4)
|
|
pixel_x += rand(-4,4)
|
|
return
|
|
|
|
/obj/decal/cleanable/rust
|
|
name = "rust"
|
|
desc = "That sure looks safe."
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "rust1"
|
|
random_icon_states = list("rust1", "rust2", "rust3","rust4","rust5")
|
|
can_sample = 1
|
|
sample_reagent = "iron"
|
|
sample_verb = "scrape"
|
|
|
|
/obj/decal/cleanable/balloon
|
|
name = "balloon"
|
|
desc = "The remains of a balloon."
|
|
icon = 'icons/obj/balloon.dmi'
|
|
icon_state = "balloon_white_pop"
|
|
|
|
/obj/decal/cleanable/writing
|
|
name = "writing"
|
|
desc = "Someone's scribbled something here."
|
|
layer = TURF_LAYER + 1
|
|
icon = 'icons/obj/writing.dmi'
|
|
icon_state = "writing1"
|
|
color = "#000000"
|
|
random_icon_states = list("writing1", "writing2", "writing3", "writing4", "writing5", "writing6", "writing7")
|
|
var/words = "Nothing."
|
|
var/font = null
|
|
var/webfont = 0
|
|
var/font_color = "#000000"
|
|
var/color_name = null
|
|
var/artist = null//the key of the one who wrote it
|
|
real_name = "writing"
|
|
|
|
get_desc(dist)
|
|
. = "<br><span style='color: blue'>It says[src.material ? src.material : src.color_name ? " in [src.color_name]" : null]:</span><br><span style='color:[src.font_color]'>[words]</span>"
|
|
//. = "[src.webfont ? "<link href='http://fonts.googleapis.com/css?family=[src.font]' rel='stylesheet' type='text/css'>" : null]<span style='color: blue'>It says:</span><br><span style='[src.font ? "font-family: [src.font][src.webfont ? ", cursive" : null];" : null]color: [src.font_color]'>[words]</span>"
|
|
|
|
UpdateName()
|
|
src.name = "[name_prefix(null, 1)][src.real_name][name_suffix(null, 1)]"
|
|
|
|
/obj/decal/cleanable/writing/spooky
|
|
icon = 'icons/obj/writing_animated_blood.dmi'
|
|
color = null
|
|
/obj/decal/cleanable/writing/infrared
|
|
name = "infrared writing"
|
|
desc = "Someone's scribbled something here, with infrared ink. Ain't that spiffy?"
|
|
icon_state = "IRwriting1"
|
|
color = "#D20040"
|
|
random_icon_states = list("IRwriting1", "IRwriting2", "IRwriting3", "IRwriting4", "IRwriting5", "IRwriting6", "IRwriting7")
|
|
infra_luminosity = 4
|
|
invisibility = 1
|
|
font_color = "#D20040"
|
|
|
|
/obj/decal/cleanable/writing/postit
|
|
name = "sticky note"
|
|
desc = "Someone's stuck a little note here."
|
|
icon_state = "postit"
|
|
random_icon_states = list()
|
|
layer = EFFECTS_LAYER_BASE - 1
|
|
color = null
|
|
words = ""
|
|
var/max_message = 128
|
|
|
|
New()
|
|
..()
|
|
pixel_y += rand(-12,12)
|
|
pixel_x += rand(-12,12)
|
|
|
|
attackby(obj/item/W as obj, mob/living/user as mob)
|
|
if (istype(W, /obj/item/pen))
|
|
if(!user.literate)
|
|
boutput(user, "<span style=\"color:red\">You don't know how to write.</span>")
|
|
return ..()
|
|
var/obj/item/pen/pen = W
|
|
pen.in_use = 1
|
|
var/t = input(user, "What do you want to write?", null, null) as null|text
|
|
if (!t)
|
|
pen.in_use = 0
|
|
return
|
|
if ((length(src.words) + length(t)) > src.max_message)
|
|
user.show_text("All that won't fit on [src]!", "red")
|
|
pen.in_use = 0
|
|
return
|
|
logTheThing("station", user, null, "writes on [src] with [pen] at [showCoords(src.x, src.y, src.z)]: [t]")
|
|
t = copytext(html_encode(t), 1, MAX_MESSAGE_LEN)
|
|
if (pen.font_color)
|
|
src.color = pen.font_color
|
|
if (pen.uses_handwriting && user && user.mind && user.mind.handwriting)
|
|
src.font = user.mind.handwriting
|
|
src.webfont = 1
|
|
else if (pen.font)
|
|
src.font = pen.font
|
|
if (pen.webfont)
|
|
src.webfont = 1
|
|
if (src.words)
|
|
src.words += "<br>"
|
|
var/search_t = lowertext(t)
|
|
if (copytext(search_t, 1, 4) == "no ")
|
|
src.icon_state = "postit-no"
|
|
else if (copytext(search_t, -1) == "?")
|
|
src.icon_state = "postit-quest"
|
|
else if (copytext(search_t, -1) == "!")
|
|
src.icon_state = "postit-excl"
|
|
else if (findtext(search_t, " wrong "))
|
|
src.icon_state = "postit-x"
|
|
else
|
|
src.icon_state = "postit-writing"
|
|
src.words += "[t]"
|
|
pen.in_use = 0
|
|
else
|
|
return ..()
|
|
|
|
/obj/decal/cleanable/water
|
|
name = "water"
|
|
desc = "Water, on the floor. Amazing!"
|
|
icon = 'icons/effects/water.dmi'
|
|
icon_state = "floor1"
|
|
random_icon_states = list("floor1", "floor2", "floor3")
|
|
can_dry = 1
|
|
slippery = 90
|
|
can_sample = 1
|
|
sample_reagent = "water"
|
|
sample_amt = 5
|
|
stain = "damp"
|
|
|
|
Crossed(atom/movable/O)
|
|
if (istype(O, /obj/item/clothing/under/towel))
|
|
var/obj/item/clothing/under/towel/T = O
|
|
T.dry_turf(get_turf(src))
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
/obj/decal/cleanable/urine
|
|
name = "urine"
|
|
desc = "It's yellow, and it smells."
|
|
icon = 'icons/effects/urine.dmi'
|
|
icon_state = "floor1"
|
|
blood_DNA = null
|
|
blood_type = null
|
|
random_icon_states = list("floor1", "floor2", "floor3")
|
|
var/thrice_drunk = 0
|
|
can_dry = 1
|
|
slippery = 80
|
|
can_sample = 1
|
|
sample_reagent = "urine"
|
|
stain = "piss-soaked"
|
|
|
|
Crossed(atom/movable/O)
|
|
if (istype(O, /obj/item/clothing/under/towel))
|
|
var/obj/item/clothing/under/towel/T = O
|
|
T.dry_turf(get_turf(src))
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!src.can_sample)
|
|
return 0
|
|
|
|
if (W.is_open_container() && W.reagents)
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - 2)
|
|
user.show_text("[W] is too full!", "red")
|
|
return
|
|
|
|
else
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> is splashing the urine puddle into \the [W]. How singular.</span>",\
|
|
"<span style=\"color:blue\">You splash a little urine into \the [W].</span>")
|
|
|
|
switch (thrice_drunk)
|
|
if (0)
|
|
W.reagents.add_reagent("urine", 1)
|
|
if (1)
|
|
W.reagents.add_reagent("urine", 1)
|
|
W.reagents.add_reagent("toeoffrog", 1)
|
|
if (2)
|
|
W.reagents.add_reagent("urine", 1)
|
|
W.reagents.add_reagent("woolofbat", 1)
|
|
if (3)
|
|
W.reagents.add_reagent("urine", 1)
|
|
W.reagents.add_reagent("tongueofdog", 1)
|
|
if (4)
|
|
W.reagents.add_reagent("triplepiss",1)
|
|
|
|
if (prob(20))
|
|
pool(src)
|
|
|
|
W.reagents.handle_reactions()
|
|
return 1
|
|
|
|
/obj/decal/cleanable/vomit
|
|
name = "pool of vomit"
|
|
desc = "Someone lost their lunch."
|
|
icon = 'icons/effects/vomit.dmi'
|
|
icon_state = "floor1"
|
|
random_icon_states = list("floor1", "floor2", "floor3")
|
|
slippery = 30
|
|
can_dry = 1
|
|
can_sample = 1
|
|
sample_amt = 5
|
|
sample_reagent = "vomit"
|
|
sample_verb = "scrape"
|
|
stain = "puke-coated"
|
|
|
|
Dry(var/time = rand(200,500))
|
|
if (!src.can_dry || src.dry)
|
|
return 0
|
|
dry_time = time
|
|
last_dry_start = world.time
|
|
processing_items.Add(src)
|
|
|
|
end_dry()
|
|
src.dry = 1
|
|
src.stain = null
|
|
src.name = "dried [src.real_name]"
|
|
src.desc = "It's all gummy. Ew."
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!src.can_sample || !W.reagents)
|
|
return 0
|
|
if (src.sampled)
|
|
user.show_text("There's not enough left of [src] to [src.sample_verb] into [W].", "red")
|
|
return 0
|
|
|
|
if (src.sample_amt && src.sample_reagent)
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - (src.sample_amt - 1))
|
|
user.show_text("[W] is too full!", "red")
|
|
return 0
|
|
else
|
|
W.reagents.add_reagent(src.sample_reagent, src.sample_amt)
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> is sticking their fingers into [src] and pushing it into [W]. It's probably best not to ask.</span>",\
|
|
"<span style=\"color:blue\">You [src.sample_verb] some of the puke into [W]. You are absolutely disgusting.</span>")
|
|
W.reagents.handle_reactions()
|
|
playsound(src.loc, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
|
|
src.sampled = 1
|
|
return 1
|
|
|
|
/obj/decal/cleanable/vomit/spiders
|
|
desc = "Someone lost their lunch. Oh god their lunch was spiders?!"
|
|
random_icon_states = list("spiders1", "spiders2", "spiders3")
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!src.can_sample || !W.reagents)
|
|
return 0
|
|
if (src.sampled)
|
|
user.show_text("There's not enough left of [src] to [src.sample_verb] into [W].", "red")
|
|
return 0
|
|
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - (src.sample_amt - 1))
|
|
user.show_text("[W] is too full!", "red")
|
|
return 0
|
|
else
|
|
W.reagents.add_reagent("vomit", 2)
|
|
W.reagents.add_reagent("black_goop", 2)
|
|
W.reagents.add_reagent("spiders", 1)
|
|
|
|
var/fluff = pick("twitches", "wriggles", "wiggles", "skitters")
|
|
var/fluff2
|
|
if (prob(10))
|
|
fluff2 = ""
|
|
else // I only code good & worthwhile things :D
|
|
var/swear1 = pick("Oh", "Holy[pick("", " fucking")]", "Fucking", "Goddamn[pick("", " fucking")]", "Mother of[pick("", " fucking")]", "Jesus[pick("", " fucking")]")
|
|
var/swear2 = pick("shit", "fuck", "hell", "heck", "hellfarts", "piss")
|
|
var/that_is = " that is the [pick("worst", "most vile", "most utterly horrendous", "grodiest", "most horrific")] thing you've seen[pick(" in your entire life", " this week", " today", "", "!")]"
|
|
fluff2 = " [swear1] [swear2][prob(50) ? "[that_is]" : null][pick(".", "!", "!!")]"
|
|
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> is sticking their fingers into [src] and pushing it into [W].<span style=\"color:red\">It [fluff] a bit.[fluff2]</span></span>",\
|
|
"<span style=\"color:blue\">You [src.sample_verb] some of the puke into [W].<span style=\"color:red\">It [fluff] a bit.[fluff2]</span></span>")
|
|
W.reagents.handle_reactions()
|
|
playsound(src.loc, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
|
|
src.sampled = 1
|
|
return 1
|
|
|
|
/obj/decal/cleanable/greenpuke
|
|
name = "green vomit"
|
|
desc = "That's just wrong."
|
|
density = 0
|
|
anchored = 1
|
|
icon = 'icons/effects/vomit.dmi'
|
|
icon_state = "green1"
|
|
var/dried = 0
|
|
random_icon_states = list("green1", "green2", "green3")
|
|
can_dry = 1
|
|
slippery = 35
|
|
can_sample = 1
|
|
sample_amt = 5
|
|
sample_reagent = "gvomit"
|
|
sample_verb = "scrape"
|
|
stain = "green-puke-coated"
|
|
|
|
Dry(var/time = rand(200,500))
|
|
if (!src.can_dry)
|
|
return 0
|
|
dry_time = time
|
|
last_dry_start = world.time
|
|
processing_items.Add(src)
|
|
|
|
end_dry()
|
|
src.dry = 1
|
|
src.stain = null
|
|
src.name = "dried [src.real_name]"
|
|
src.desc = "It's all gummy. Ew."
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!src.can_sample || !W.reagents)
|
|
return 0
|
|
if (src.sampled)
|
|
user.show_text("There's not enough left of [src] to [src.sample_verb] into [W].", "red")
|
|
return 0
|
|
|
|
if (src.sample_amt && src.sample_reagent)
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - (src.sample_amt - 1))
|
|
user.show_text("[W] is too full!", "red")
|
|
return 0
|
|
else
|
|
W.reagents.add_reagent(src.sample_reagent, src.sample_amt)
|
|
user.show_text("You scoop some of the sticky, slimy, stringy green puke into [W]. You are absolutely horrifying.", "blue")
|
|
for (var/mob/O in AIviewers(user, null))
|
|
if (O != user)
|
|
O.show_message("<span style=\"color:blue\"><b>[user]</b> is sticking their fingers into [src] and pushing it into [W]. It's all slimy and stringy. Oh god.</span>", 1)
|
|
if (prob(33) && ishuman(O))
|
|
O.show_message("<span style=\"color:red\">You feel ill from watching that.</span>")
|
|
for (var/mob/V in viewers(O, null))
|
|
V.show_message("<span style=\"color:red\">[O] pukes all over \himself. Thanks, [user].</span>", 1)
|
|
O.vomit()
|
|
|
|
W.reagents.handle_reactions()
|
|
playsound(src.loc, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
|
|
src.sampled = 1
|
|
return 1
|
|
|
|
/obj/decal/cleanable/tomatosplat
|
|
name = "ruined tomato"
|
|
desc = "Gallows humour."
|
|
icon = 'icons/effects/blood.dmi'
|
|
icon_state = "floor1"
|
|
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
|
color = "#FF0000"
|
|
slippery = 10
|
|
can_sample = 1
|
|
sample_reagent = "juice_tomato"
|
|
|
|
/obj/decal/cleanable/eggsplat
|
|
name = "smashed egg"
|
|
desc = "Chickens will be none too pleased about this."
|
|
icon = 'icons/effects/water.dmi'
|
|
icon_state = "egg1"
|
|
random_icon_states = list("egg1", "egg2", "egg3")
|
|
slippery = 5
|
|
can_sample = 1
|
|
sample_amt = 5
|
|
sample_reagent = "egg"
|
|
|
|
/obj/decal/cleanable/ash
|
|
name = "ashes"
|
|
desc = "Ashes to ashes, dust to dust."
|
|
icon = 'icons/obj/objects.dmi'
|
|
icon_state = "ash"
|
|
can_sample = 1
|
|
sample_reagent = "ash"
|
|
sample_verb = "scrape"
|
|
stain = "dirty"
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
..()
|
|
pool(src)
|
|
|
|
attack_hand(mob/user as mob)
|
|
user.show_text("The ashes slip through your fingers.", "blue")
|
|
pool(src)
|
|
return
|
|
|
|
/obj/decal/cleanable/slime // made by slugs and snails
|
|
name = "slime"
|
|
desc = "Eww."
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "slimeline1"
|
|
random_icon_states = list("slimeline1", "slimeline2", "slimeline3", "slimeline4")
|
|
color = "#A5BC64"
|
|
slippery = 10
|
|
can_dry = 1
|
|
can_sample = 1
|
|
sample_reagent = "slime"
|
|
stain = "slimy"
|
|
|
|
Dry(var/time = rand(100,200))
|
|
if (!src.can_dry)
|
|
return 0
|
|
|
|
dry_time = time
|
|
last_dry_start = world.time
|
|
processing_items.Add(src)
|
|
|
|
end_dry()
|
|
src.dry = 1
|
|
src.stain = null
|
|
src.name = "dried [src.real_name]"
|
|
src.desc = "It's all gummy. Ew."
|
|
|
|
/obj/decal/cleanable/generic
|
|
name = "clutter"
|
|
desc = "Someone should clean that up."
|
|
layer = TURF_LAYER
|
|
icon = 'icons/obj/objects.dmi'
|
|
icon_state = "shards"
|
|
|
|
/obj/decal/cleanable/dirt
|
|
name = "dirt"
|
|
desc = "Someone should clean that up."
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "dirt"
|
|
random_dir = 1
|
|
stain = "dirty"
|
|
can_sample = 1
|
|
sample_reagent = "carbon"
|
|
|
|
dirt2
|
|
icon_state = "dirt2"
|
|
|
|
dirt3
|
|
icon_state = "dirt3"
|
|
|
|
dirt4
|
|
icon_state = "dirt4"
|
|
|
|
dirt5
|
|
icon_state = "dirt5"
|
|
|
|
|
|
/obj/decal/cleanable/cobweb
|
|
name = "cobweb"
|
|
desc = "Someone should remove that."
|
|
layer = MOB_LAYER+1
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "cobweb1"
|
|
|
|
/obj/decal/cleanable/molten_item
|
|
name = "gooey grey mass"
|
|
desc = "huh."
|
|
layer = OBJ_LAYER
|
|
icon = 'icons/obj/chemical.dmi'
|
|
icon_state = "molten"
|
|
|
|
/obj/decal/cleanable/cobweb2
|
|
name = "cobweb"
|
|
desc = "Someone should remove that."
|
|
layer = MOB_LAYER+1
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "cobweb2"
|
|
|
|
/obj/decal/cleanable/cobwebFloor
|
|
name = "cobweb"
|
|
desc = "\"Will you walk into my parlour?\" said the spider to the fly."
|
|
layer = MOB_LAYER-1
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "cobweb_floor-c"
|
|
event_handler_flags = USE_CANPASS
|
|
|
|
CanPass(atom/A, turf/T)
|
|
if (ismob(A))
|
|
A.changeStatus("slowed", 2)
|
|
SPAWN_DBG(-1)
|
|
qdel(src) //break when walked over
|
|
else return 1
|
|
..()
|
|
|
|
|
|
/obj/decal/cleanable/fungus
|
|
name = "space fungus"
|
|
desc = "A fungal growth. Looks pretty nasty."
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "fungus1"
|
|
var/amount = 1
|
|
can_sample = 1
|
|
sample_reagent = "space_fungus"
|
|
sample_verb = "scrape"
|
|
|
|
New()
|
|
if (prob(5))
|
|
src.amount += rand(1,2)
|
|
src.update_icon()
|
|
..()
|
|
return
|
|
|
|
unpooled()
|
|
..()
|
|
if (prob(5))
|
|
src.amount += rand(1,2)
|
|
src.update_icon()
|
|
|
|
proc/update_icon()
|
|
src.icon_state = "fungus[max(1,min(3, amount))]"
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
if (!src.can_sample || !W.reagents)
|
|
return 0
|
|
|
|
else if (src.sample_amt && src.sample_reagent)
|
|
if (W.reagents.total_volume >= W.reagents.maximum_volume - (src.sample_amt - 1))
|
|
user.show_text("[W] is too full!", "red")
|
|
return 0
|
|
else
|
|
W.reagents.add_reagent(src.sample_reagent, src.sample_amt)
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> [src.sample_verb]s some of [src] into [W].</span>",\
|
|
"<span style=\"color:blue\">You [src.sample_verb] some of [src] into [W].</span>")
|
|
W.reagents.handle_reactions()
|
|
playsound(src.loc, "sound/items/Screwdriver.ogg", 50, 1)
|
|
src.amount--
|
|
if (src.amount <= 0)
|
|
pool(src)
|
|
src.update_icon()
|
|
return 1
|
|
|
|
|
|
/obj/decal/cleanable/martian_viscera
|
|
name = "chunky martian goop"
|
|
desc = "Gross alien flesh. Do not ingest. Do not apply to face."
|
|
anchored = 0
|
|
layer = OBJ_LAYER
|
|
sample_reagent = "martian_flesh"
|
|
sample_verb = "scoop"
|
|
can_sample = 1
|
|
icon = 'icons/obj/martian.dmi'
|
|
icon_state = "gib1"
|
|
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5")
|
|
|
|
// eeeeeey it's copy paste code from your pal cirr
|
|
proc/streak(var/list/directions)
|
|
SPAWN_DBG (0)
|
|
var/direction = pick(directions)
|
|
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
|
LAGCHECK(LAG_LOW)//sleep(3)
|
|
if (i > 0)
|
|
make_cleanable( /obj/decal/cleanable/martian_viscera/fluid,src.loc)
|
|
if (step_to(src, get_step(src, direction), 0))
|
|
break
|
|
|
|
/obj/decal/cleanable/martian_viscera/fluid
|
|
name = "sticky martian goop"
|
|
icon_state = "goop1"
|
|
random_icon_states = list("goop1", "goop2", "goop3", "goop4")
|
|
|
|
/obj/decal/cleanable/flockdrone_debris
|
|
name = "weird stringy crystal fibres"
|
|
desc = "Aw hell it's probably going to ruin your lungs if you breathe those. It's probably space alien asbestos or something. They're all sticky too, eww."
|
|
anchored = 0
|
|
layer = OBJ_LAYER
|
|
sample_reagent = "flockdrone_fluid"
|
|
sample_verb = "scoop"
|
|
can_sample = 1
|
|
icon = 'icons/misc/featherzone.dmi'
|
|
icon_state = "gib1"
|
|
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5")
|
|
slippery = 30
|
|
|
|
proc/streak(var/list/directions)
|
|
SPAWN_DBG (0)
|
|
var/direction = pick(directions)
|
|
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
|
LAGCHECK(LAG_LOW)//sleep(3)
|
|
if (i > 0)
|
|
make_cleanable( /obj/decal/cleanable/flockdrone_debris/fluid,src.loc)
|
|
if (step_to(src, get_step(src, direction), 0))
|
|
break
|
|
|
|
/obj/decal/cleanable/flockdrone_debris/fluid
|
|
name = "viscous teal fluid"
|
|
desc = "Is it like weird alien blood? Weird alien oil? Aw man that looks like it'd never wash out."
|
|
random_icon_states = list("fluid1", "fluid2", "fluid3")
|
|
anchored = 1
|
|
slippery = 50
|
|
stain = "teal-stained"
|
|
|
|
/obj/decal/cleanable/machine_debris
|
|
name = "twisted shrapnel"
|
|
desc = "A chunk of broken and melted scrap metal."
|
|
anchored = 0
|
|
layer = OBJ_LAYER
|
|
icon = 'icons/mob/robots.dmi'
|
|
icon_state = "gib1"
|
|
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
|
|
|
proc/streak(var/list/directions)
|
|
SPAWN_DBG (0)
|
|
var/direction = pick(directions)
|
|
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
|
LAGCHECK(LAG_LOW)//sleep(3)
|
|
if (i > 0)
|
|
if (prob(10))
|
|
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
|
|
s.set_up(3, 1, src)
|
|
s.start()
|
|
if (step_to(src, get_step(src, direction), 0))
|
|
break
|
|
|
|
/obj/decal/cleanable/robot_debris
|
|
name = "robot debris"
|
|
desc = "Useless heap of junk."
|
|
anchored = 0
|
|
layer = OBJ_LAYER
|
|
icon = 'icons/mob/robots.dmi'
|
|
icon_state = "gib1"
|
|
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
|
|
|
attack_hand(var/mob/user as mob)
|
|
if (ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
if (H.job == "Roboticist" || H.job == "Engineer" || H.job == "Mechanic")
|
|
user.visible_message("<span style=\"color:blue\"><b>[H]</b> starts rifling through \the [src] with their hands. What a weirdo.</span>",\
|
|
"<span style=\"color:blue\">You rake through \the [src] with your bare hands.</span>")
|
|
playsound(src.loc, "sound/effects/sparks3.ogg", 50, 1)
|
|
if (src.sampled)
|
|
H.show_text("You didn't find anything useful. Now you have grime all over your hands for nothing!", "red")
|
|
else
|
|
H.show_text("You find some... salvageable... wires.. you guess?", "blue")
|
|
new /obj/item/cable_coil/cut/small(src.loc)
|
|
src.sampled = 1
|
|
if (H.job == "Chef" || H.job == "Sous-Chef")
|
|
user.visible_message("<span style=\"color:blue\"><b>[H]</b> starts rifling through \the [src] with their hands. What a weirdo.</span>",\
|
|
"<span style=\"color:blue\">You rake through \the [src] with your bare hands.</span>")
|
|
playsound(src.loc, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
|
|
if (src.sampled)
|
|
H.show_text("You didn't find anything useful. Now your hands are all grimey for nothing!", "red")
|
|
else
|
|
if (H.job == "Sous-Chef" && prob(30))
|
|
H.show_text("The... twitching meat... slips through your inexperienced hands.", "blue")
|
|
else
|
|
H.show_text("You find some... salvageable... twitching meat.. you guess?", "blue")
|
|
var/obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/M = new /obj/item/reagent_containers/food/snacks/ingredient/meat/mysterymeat/(src.loc)
|
|
M.cybermeat = 1
|
|
M.name = "meatal"
|
|
M.desc = "Raw, twitching silicon based muscle. Eww."
|
|
M.icon_state = "cybermeat"
|
|
if (prob(25))
|
|
M.reagents.add_reagent("nanites", 2)
|
|
src.sampled = 1
|
|
else
|
|
return ..()
|
|
else
|
|
return ..()
|
|
|
|
proc/streak(var/list/directions)
|
|
SPAWN_DBG (0)
|
|
var/direction = pick(directions)
|
|
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
|
LAGCHECK(LAG_LOW)//sleep(3)
|
|
if (i > 0)
|
|
if (prob(40))
|
|
/*var/obj/decal/cleanable/oil/o =*/
|
|
make_cleanable(/obj/decal/cleanable/oil/streak,src.loc)
|
|
else if (prob(10))
|
|
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
|
|
s.set_up(3, 1, src)
|
|
s.start()
|
|
if (step_to(src, get_step(src, direction), 0))
|
|
break
|
|
|
|
/obj/decal/cleanable/robot_debris/limb
|
|
random_icon_states = list("gibarm", "gibleg")
|
|
|
|
/obj/decal/cleanable/oil
|
|
name = "motor oil"
|
|
desc = "It's black."
|
|
icon = 'icons/effects/oil.dmi'
|
|
icon_state = "floor1"
|
|
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
|
slippery = 70
|
|
can_sample = 1
|
|
sample_reagent = "oil"
|
|
stain = "oily"
|
|
|
|
/obj/decal/cleanable/oil/streak
|
|
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
|
|
|
|
/obj/decal/cleanable/greenglow
|
|
name = "green glow"
|
|
desc = "Eerie."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "greenglow"
|
|
can_dry = 1
|
|
dry_time = 1200
|
|
var/datum/light/light
|
|
|
|
New()
|
|
..()
|
|
light = new /datum/light/point
|
|
light.set_brightness(0.4)
|
|
light.set_height(0.5)
|
|
light.set_color(0.2, 1, 0.2)
|
|
light.attach(src)
|
|
light.enable()
|
|
|
|
setup()
|
|
..()
|
|
|
|
/obj/decal/cleanable/saltpile
|
|
name = "salt pile"
|
|
desc = "Bad luck, that."
|
|
icon = 'icons/effects/salt.dmi'
|
|
icon_state = "0"
|
|
can_sample = 1
|
|
sample_reagent = "salt"
|
|
sample_verb = "scrape"
|
|
var/health = 30
|
|
|
|
New()
|
|
..()
|
|
src.updateIcon()
|
|
var/turf/T = get_turf(src)
|
|
if (T)
|
|
updateSurroundingSalt(T)
|
|
|
|
setup()
|
|
..()
|
|
src.updateIcon()
|
|
health = 30
|
|
var/turf/T = get_turf(src)
|
|
if (T)
|
|
updateSurroundingSalt(T)
|
|
|
|
HasEntered(AM as mob|obj)
|
|
..()
|
|
if (istype(AM, /obj/critter/slug))
|
|
var/obj/critter/slug/S = AM
|
|
S.visible_message("<span style='color:red'>[S] shrivels up!</span>")
|
|
S.CritterDeath()
|
|
return
|
|
else if (!isliving(AM) || isobj(AM) || isintangible(AM))
|
|
return
|
|
var/mob/M = AM
|
|
var/oopschance = 0
|
|
if (ismob(AM))
|
|
if (istype(AM, /mob/living/critter/small_animal/slug)) // slugs are not good with salt
|
|
M.visible_message("<span style='color:red'>[M] shrivels up!</span>",\
|
|
"<span style='color:red'><b>OH GOD THE SALT [pick("IT BURNS","HOLY SHIT THAT HURTS","JESUS FUCK YOU'RE DYING")]![pick("","!","!!")]</b></span>")
|
|
M.TakeDamage(null, 15, 15)
|
|
pool(src)
|
|
return
|
|
if (isghostdrone(AM) || isghostcritter(AM)) // slugs are not good with salt
|
|
return
|
|
if (M.m_intent != "walk") // walk, don't run
|
|
oopschance += 28
|
|
if (prob(oopschance))
|
|
health -= 5
|
|
if (health <= 0)
|
|
M.visible_message("<span style='color:red'>[M.name] accidentally scuffs a foot across the [src], scattering it everywhere! [pick("Fuck!", "Shit!", "Damnit!", "Welp.")]</span>")
|
|
pool(src)
|
|
else
|
|
|
|
get_desc(dist)
|
|
if (health >= 30)
|
|
. = " It's a good size."
|
|
else if (health >= 15)
|
|
. = " It's slightly scuffed."
|
|
else if (health > 0)
|
|
. = " It's very small."
|
|
|
|
disposing()
|
|
var/turf/T = get_turf(src)
|
|
..()
|
|
updateSurroundingSalt(T)
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
..()
|
|
pool(src)
|
|
|
|
proc/updateIcon()
|
|
if (!src.loc)
|
|
return
|
|
var/dirs = 0
|
|
for (var/dir in cardinal)
|
|
var/turf/T = get_step(src, dir)
|
|
if (istype(T))
|
|
var/obj/decal/cleanable/saltpile/S = T.getSaltHere()
|
|
if (S)
|
|
dirs |= dir
|
|
|
|
icon_state = num2text(dirs)
|
|
//need sprites for this
|
|
|
|
// var/hp_name
|
|
// if (health >= 30)
|
|
// hp_name = "big"
|
|
// else if (health >= 15)
|
|
// hp_name = "med"
|
|
// else if (health > 0)
|
|
// hp_name = "small"
|
|
//icon_state = "[hp_name]-[num2text(dirs)]" //for health
|
|
|
|
/proc/updateSurroundingSalt(var/turf/T)
|
|
if (!istype(T)) return
|
|
for (var/obj/decal/cleanable/saltpile/S in orange(1,T))
|
|
S.updateIcon()
|
|
|
|
/obj/decal/cleanable/magnesiumpile
|
|
name = "magnesium pile"
|
|
desc = "Uh-oh."
|
|
icon = 'icons/effects/salt.dmi'
|
|
icon_state = "0"
|
|
can_sample = 1
|
|
sample_reagent = "magnesium"
|
|
sample_verb = "scrape"
|
|
var/on_fire = null
|
|
var/burn_time = 4
|
|
|
|
New()
|
|
..()
|
|
src.updateIcon()
|
|
updateSurroundingMagnesium(get_turf(src))
|
|
|
|
setup()
|
|
..()
|
|
src.updateIcon()
|
|
updateSurroundingMagnesium(get_turf(src))
|
|
|
|
disposing()
|
|
var/turf/T = get_turf(src)
|
|
..()
|
|
updateSurroundingMagnesium(T)
|
|
|
|
Sample(var/obj/item/W as obj, var/mob/user as mob)
|
|
..()
|
|
pool(src)
|
|
|
|
proc/updateIcon()
|
|
var/dirs = 0
|
|
for (var/dir in cardinal)
|
|
var/turf/T = get_step(src, dir)
|
|
var/obj/decal/cleanable/magnesiumpile/S = locate(/obj/decal/cleanable/magnesiumpile) in T
|
|
if (S)
|
|
dirs |= dir
|
|
icon_state = num2text(dirs)
|
|
|
|
proc/ignite()
|
|
if (on_fire)
|
|
return
|
|
on_fire = image('icons/effects/fire.dmi', "2old")
|
|
visible_message("<span style='color:red'>[src] ignites!</span>")
|
|
src.overlays += on_fire
|
|
SPAWN_DBG(0)
|
|
var/turf/T = get_turf(src)
|
|
while (burn_time > 0)
|
|
if (loc == T && !disposed && on_fire)
|
|
fireflash_sm(T, 0, T0C + 3100, 0, 1, 0)
|
|
if (burn_time <= 2)
|
|
for (var/D in cardinal)
|
|
var/turf/Q = get_step(T, D)
|
|
var/obj/decal/cleanable/magnesiumpile/M = locate() in Q
|
|
if (M)
|
|
M.ignite()
|
|
if (src.loc && src.loc.reagents && src.loc.reagents.total_volume)
|
|
for (var/i = 0, i < 10, i++)
|
|
src.loc.reagents.temperature_reagents(T0C + 3100, 10)
|
|
if (src.loc)
|
|
for (var/obj/O in src.loc)
|
|
if (O != src && O.reagents && O.reagents.total_volume)
|
|
for (var/i = 0, i < 10, i++)
|
|
O.reagents.temperature_reagents(T0C + 3100, 10)
|
|
sleep(5)
|
|
else
|
|
return
|
|
burn_time--
|
|
pool(src)
|
|
|
|
reagent_act(id, volume)
|
|
if (disposed)
|
|
return
|
|
if (id == "water")
|
|
if (on_fire)
|
|
if (volume >= 10)
|
|
explosion_new(src, get_turf(src), 1)
|
|
pool(src)
|
|
else
|
|
overlays -= on_fire
|
|
on_fire = null
|
|
burn_time = initial(burn_time)
|
|
else if (id == "ff-foam")
|
|
if (on_fire)
|
|
overlays -= on_fire
|
|
on_fire = null
|
|
burn_time = initial(burn_time)
|
|
|
|
temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
|
if (exposed_temperature >= T0C + 473)
|
|
ignite()
|
|
..()
|
|
|
|
/turf/proc/getSaltHere()
|
|
for (var/obj/decal/cleanable/saltpile/S in src.contents)
|
|
return S
|
|
|
|
/proc/updateSurroundingMagnesium(var/turf/T)
|
|
if (!istype(T)) return
|
|
for (var/obj/decal/cleanable/magnesiumpile/S in orange(1,T))
|
|
S.updateIcon()
|
|
|
|
/obj/decal/cleanable/nitrotriiodide
|
|
name = "gooey mess"
|
|
desc = "Someone should DEFINITELY clean that up"
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "nitrotri_wet"
|
|
color = "#cb5e97"
|
|
can_dry = 1
|
|
var/do_bang = 0
|
|
|
|
HasEntered(AM as mob|obj)
|
|
if( !src.dry || !(isliving(AM) || isobj(AM)) ) return
|
|
src.bang()
|
|
|
|
attackby(var/obj/item/W, var/mob/user)
|
|
if (src.dry)
|
|
src.bang()
|
|
return
|
|
return ..()
|
|
|
|
attack_hand(var/mob/user)
|
|
if (src.dry)
|
|
src.bang()
|
|
else
|
|
boutput(user, "<span style=\"color:blue\">You poke the mess. It's slightly viscous and smells strange. [prob(25) ? pick("Ew.", "Grody.", "Weird.") : null]</span>")
|
|
|
|
proc/bang()
|
|
src.visible_message("<b>The dust emits a loud bang!</b>")
|
|
if(prob(20))
|
|
var/datum/effects/system/bad_smoke_spread/smoke = new /datum/effects/system/bad_smoke_spread()
|
|
smoke.set_up(5, 0, src.loc, ,"#cb5e97")
|
|
smoke.start()
|
|
/*
|
|
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
|
|
s.set_up(5, 1, src.loc)
|
|
s.start()
|
|
*/
|
|
explosion(src, src.loc, -1, -1, -1, 1)
|
|
pool(src)
|
|
|
|
Dry(var/time = 200 + 20 * rand(0,30))
|
|
if (!src.can_dry || src.dry)
|
|
return 0
|
|
last_dry_start = world.time
|
|
dry_time = time
|
|
return 1
|
|
|
|
end_dry()
|
|
src.dry = 1
|
|
name = "dusty powder"
|
|
desc = "Janitor's clearly not doing his job properly, sigh."
|
|
icon_state = "nitrotri_dry"
|
|
if (prob(25)) //This emulates the effect of air randomly passing over the stuff
|
|
src.bang()
|
|
|
|
// GANG TAGS
|
|
|
|
/obj/decal/cleanable/gangtag
|
|
name = "gang tag"
|
|
desc = "A spraypainted gang tag."
|
|
density = 0
|
|
anchored = 1
|
|
layer = OBJ_LAYER
|
|
icon = 'icons/obj/decals.dmi'
|
|
icon_state = "gangtag0"
|
|
var/datum/gang/owners = null
|
|
|
|
proc/delete_same_tags()
|
|
for(var/obj/decal/cleanable/gangtag/T in get_turf(src))
|
|
if(T.owners == src.owners && T != src) pool(T)
|
|
|
|
New()
|
|
..()
|
|
for(var/obj/decal/cleanable/gangtag/T in get_turf(src))
|
|
T.layer = 3
|
|
src.layer = 4
|
|
|
|
setup()
|
|
..()
|
|
for(var/obj/decal/cleanable/gangtag/T in get_turf(src))
|
|
T.layer = 3
|
|
src.layer = 4
|
|
|
|
disposing(var/uncapture = 1)
|
|
var/area/tagarea = get_area(src)
|
|
if(tagarea.gang_owners == src.owners && uncapture)
|
|
tagarea.gang_owners = null
|
|
var/turf/T = get_turf(src)
|
|
T.tagged = 0
|
|
..() |