mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-22 11:38:12 +01:00
Whitespace Standardization [MDB IGNORE] (#15748)
* Update settings * Whitespace changes * Comment out merger hooks in gitattributes Corrupt maps would have to be resolved in repo before hooks could be updated * Revert "Whitespace changes" This reverts commitafbdd1d844. * Whitespace again minus example * Gitignore example changelog * Restore changelog merge setting * Keep older dmi hook attribute until hooks can be updated * update vscode settings too * Renormalize remaining * Revert "Gitignore example changelog" This reverts commitde22ad375d. * Attempt to normalize example.yml (and another file I guess) * Try again
This commit is contained in:
@@ -1,34 +1,34 @@
|
||||
var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list()
|
||||
|
||||
/obj/effect/bump_teleporter
|
||||
name = "bump-teleporter"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x2"
|
||||
var/id = null //id of this bump_teleporter.
|
||||
var/id_target = null //id of bump_teleporter which this moves you to.
|
||||
invisibility = 101 //nope, can't see this
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = 0
|
||||
|
||||
/obj/effect/bump_teleporter/New()
|
||||
..()
|
||||
BUMP_TELEPORTERS += src
|
||||
|
||||
/obj/effect/bump_teleporter/Destroy()
|
||||
BUMP_TELEPORTERS -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/bump_teleporter/Bumped(atom/user)
|
||||
if(!ismob(user))
|
||||
//user.loc = src.loc //Stop at teleporter location
|
||||
return
|
||||
var/mob/M = user //VOREStation edit
|
||||
if(!id_target)
|
||||
//user.loc = src.loc //Stop at teleporter location, there is nowhere to teleport to.
|
||||
return
|
||||
|
||||
for(var/obj/effect/bump_teleporter/BT in BUMP_TELEPORTERS)
|
||||
if(BT.id == src.id_target)
|
||||
M.forceMove(BT.loc) //Teleport to location with correct id. //VOREStation Edit
|
||||
return
|
||||
var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list()
|
||||
|
||||
/obj/effect/bump_teleporter
|
||||
name = "bump-teleporter"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x2"
|
||||
var/id = null //id of this bump_teleporter.
|
||||
var/id_target = null //id of bump_teleporter which this moves you to.
|
||||
invisibility = 101 //nope, can't see this
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = 0
|
||||
|
||||
/obj/effect/bump_teleporter/New()
|
||||
..()
|
||||
BUMP_TELEPORTERS += src
|
||||
|
||||
/obj/effect/bump_teleporter/Destroy()
|
||||
BUMP_TELEPORTERS -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/bump_teleporter/Bumped(atom/user)
|
||||
if(!ismob(user))
|
||||
//user.loc = src.loc //Stop at teleporter location
|
||||
return
|
||||
var/mob/M = user //VOREStation edit
|
||||
if(!id_target)
|
||||
//user.loc = src.loc //Stop at teleporter location, there is nowhere to teleport to.
|
||||
return
|
||||
|
||||
for(var/obj/effect/bump_teleporter/BT in BUMP_TELEPORTERS)
|
||||
if(BT.id == src.id_target)
|
||||
M.forceMove(BT.loc) //Teleport to location with correct id. //VOREStation Edit
|
||||
return
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
/obj/effect/decal/cleanable/blood/xeno
|
||||
name = "xeno blood"
|
||||
desc = "It's green and acidic. It looks like... <i>blood?</i>"
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
basecolor = "#05EE05"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno
|
||||
name = "xeno gibs"
|
||||
desc = "Gnarly..."
|
||||
icon_state = "xgib1"
|
||||
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
|
||||
basecolor = "#05EE05"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon()
|
||||
color = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/up
|
||||
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")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/body
|
||||
random_icon_states = list("xgibhead", "xgibtorso")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/limb
|
||||
random_icon_states = list("xgibleg", "xgibarm")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/core
|
||||
random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/xtracks
|
||||
/obj/effect/decal/cleanable/blood/xeno
|
||||
name = "xeno blood"
|
||||
desc = "It's green and acidic. It looks like... <i>blood?</i>"
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
basecolor = "#05EE05"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno
|
||||
name = "xeno gibs"
|
||||
desc = "Gnarly..."
|
||||
icon_state = "xgib1"
|
||||
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
|
||||
basecolor = "#05EE05"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon()
|
||||
color = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/up
|
||||
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")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/body
|
||||
random_icon_states = list("xgibhead", "xgibtorso")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/limb
|
||||
random_icon_states = list("xgibleg", "xgibarm")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/core
|
||||
random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/xtracks
|
||||
basecolor = "#05EE05"
|
||||
@@ -1,253 +1,253 @@
|
||||
#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var)
|
||||
|
||||
var/global/list/image/splatter_cache=list()
|
||||
|
||||
/obj/effect/decal/cleanable/blood
|
||||
name = "blood"
|
||||
var/dryname = "dried blood"
|
||||
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 = FALSE
|
||||
anchored = TRUE
|
||||
plane = BLOOD_PLANE
|
||||
layer = BLOOD_DECAL_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'
|
||||
blood_DNA = list()
|
||||
var/basecolor="#A10808" // Color when wet.
|
||||
var/synthblood = 0
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/amount = 5
|
||||
generic_filth = TRUE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/reveal_blood()
|
||||
if(!fluorescent)
|
||||
fluorescent = 1
|
||||
basecolor = COLOR_LUMINOL
|
||||
update_icon()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/clean_blood()
|
||||
fluorescent = 0
|
||||
if(invisibility != 100)
|
||||
invisibility = 100
|
||||
amount = 0
|
||||
..(ignore=1)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/New()
|
||||
..()
|
||||
update_icon()
|
||||
if(istype(src, /obj/effect/decal/cleanable/blood/gibs))
|
||||
return
|
||||
if(src.type == /obj/effect/decal/cleanable/blood)
|
||||
if(src.loc && isturf(src.loc))
|
||||
for(var/obj/effect/decal/cleanable/blood/B in src.loc)
|
||||
if(B != src)
|
||||
if (B.blood_DNA)
|
||||
blood_DNA |= B.blood_DNA.Copy()
|
||||
qdel(B)
|
||||
addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1))
|
||||
|
||||
/obj/effect/decal/cleanable/blood/update_icon()
|
||||
if(basecolor == "rainbow") basecolor = get_random_colour(1)
|
||||
color = basecolor
|
||||
|
||||
if(basecolor == SYNTH_BLOOD_COLOUR)
|
||||
name = "oil"
|
||||
desc = "It's quite oily."
|
||||
else if(synthblood)
|
||||
name = "synthetic blood"
|
||||
desc = "It's quite greasy."
|
||||
else
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
|
||||
if(perp.is_incorporeal())
|
||||
return
|
||||
if (!istype(perp))
|
||||
return
|
||||
if(amount < 1)
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/l_foot = perp.get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = perp.get_organ("r_foot")
|
||||
var/hasfeet = 1
|
||||
if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump()))
|
||||
hasfeet = 0
|
||||
if(perp.shoes && !perp.buckled)//Adding blood to shoes
|
||||
var/obj/item/clothing/shoes/S = perp.shoes
|
||||
if(istype(S))
|
||||
S.blood_color = basecolor
|
||||
S.track_blood = max(amount,S.track_blood)
|
||||
if(!S.blood_overlay)
|
||||
S.generate_blood_overlay()
|
||||
if(!S.blood_DNA)
|
||||
S.blood_DNA = list()
|
||||
S.blood_overlay.color = basecolor
|
||||
S.add_overlay(S.blood_overlay)
|
||||
if(S.blood_overlay && S.blood_overlay.color != basecolor)
|
||||
S.blood_overlay.color = basecolor
|
||||
S.add_overlay(S.blood_overlay)
|
||||
S.blood_DNA |= blood_DNA.Copy()
|
||||
perp.update_inv_shoes()
|
||||
|
||||
else if (hasfeet)//Or feet
|
||||
perp.feet_blood_color = basecolor
|
||||
perp.track_blood = max(amount,perp.track_blood)
|
||||
LAZYINITLIST(perp.feet_blood_DNA)
|
||||
perp.feet_blood_DNA |= blood_DNA.Copy()
|
||||
perp.update_bloodied()
|
||||
else if (perp.buckled && istype(perp.buckled, /obj/structure/bed/chair/wheelchair))
|
||||
var/obj/structure/bed/chair/wheelchair/W = perp.buckled
|
||||
W.bloodiness = 4
|
||||
|
||||
amount--
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/dry()
|
||||
name = dryname
|
||||
desc = drydesc
|
||||
color = adjust_brightness(color, -50)
|
||||
amount = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
|
||||
..()
|
||||
if (amount && istype(user))
|
||||
add_fingerprint(user)
|
||||
if (user.gloves)
|
||||
return
|
||||
var/taken = rand(1,amount)
|
||||
amount -= taken
|
||||
to_chat(user, "<span class='notice'>You get some of \the [src] on your hands.</span>")
|
||||
if (!user.blood_DNA)
|
||||
user.blood_DNA = list()
|
||||
user.blood_DNA |= blood_DNA.Copy()
|
||||
user.bloody_hands += taken
|
||||
user.hand_blood_color = basecolor
|
||||
user.update_inv_gloves(1)
|
||||
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
|
||||
/obj/effect/decal/cleanable/blood/splatter
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip
|
||||
name = "drips of blood"
|
||||
desc = "It's red."
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/drip.dmi'
|
||||
icon_state = "1"
|
||||
random_icon_states = list("1","2","3","4","5")
|
||||
amount = 0
|
||||
var/list/drips = list()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip/New()
|
||||
..()
|
||||
drips |= icon_state
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing
|
||||
icon_state = "tracks"
|
||||
desc = "It looks like a writing in blood."
|
||||
gender = NEUTER
|
||||
random_icon_states = list("writing1","writing2","writing3","writing4","writing5")
|
||||
amount = 0
|
||||
var/message
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing/New()
|
||||
..()
|
||||
if(random_icon_states.len)
|
||||
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
|
||||
random_icon_states.Remove(W.icon_state)
|
||||
icon_state = pick(random_icon_states)
|
||||
else
|
||||
icon_state = "writing1"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing/examine(mob/user)
|
||||
. = ..()
|
||||
. += "It reads: <font color='[basecolor]'>\"[message]\"</font>"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs
|
||||
name = "gibs"
|
||||
desc = "They look bloody and gruesome."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "gibbl5"
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6")
|
||||
var/fleshcolor = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/update_icon()
|
||||
|
||||
var/image/giblets = new(base_icon, "[icon_state]_flesh", dir)
|
||||
if(!fleshcolor || fleshcolor == "rainbow")
|
||||
fleshcolor = get_random_colour(1)
|
||||
giblets.color = fleshcolor
|
||||
|
||||
var/icon/blood = new(base_icon,"[icon_state]",dir)
|
||||
if(basecolor == "rainbow") basecolor = get_random_colour(1)
|
||||
blood.Blend(basecolor,ICON_MULTIPLY)
|
||||
|
||||
icon = blood
|
||||
cut_overlays()
|
||||
add_overlay(giblets)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/up
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/down
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/body
|
||||
random_icon_states = list("gibhead", "gibtorso")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/limb
|
||||
random_icon_states = list("gibleg", "gibarm")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/core
|
||||
random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
|
||||
b.basecolor = src.basecolor
|
||||
b.update_icon()
|
||||
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/mucus
|
||||
name = "mucus"
|
||||
desc = "Disgusting mucus."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "mucus"
|
||||
random_icon_states = list("mucus")
|
||||
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/dry = 0 // Keeps the lag down
|
||||
|
||||
/obj/effect/decal/cleanable/mucus/Initialize()
|
||||
. = ..()
|
||||
VARSET_IN(src, dry, TRUE, DRYING_TIME * 2)
|
||||
|
||||
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
|
||||
/obj/effect/decal/cleanable/mucus/mapped/Initialize()
|
||||
. = ..()
|
||||
virus2 |= new /datum/disease2/disease
|
||||
virus2[1].makerandom()
|
||||
|
||||
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
|
||||
virus2.Cut()
|
||||
return ..()
|
||||
#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var)
|
||||
|
||||
var/global/list/image/splatter_cache=list()
|
||||
|
||||
/obj/effect/decal/cleanable/blood
|
||||
name = "blood"
|
||||
var/dryname = "dried blood"
|
||||
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 = FALSE
|
||||
anchored = TRUE
|
||||
plane = BLOOD_PLANE
|
||||
layer = BLOOD_DECAL_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'
|
||||
blood_DNA = list()
|
||||
var/basecolor="#A10808" // Color when wet.
|
||||
var/synthblood = 0
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/amount = 5
|
||||
generic_filth = TRUE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/reveal_blood()
|
||||
if(!fluorescent)
|
||||
fluorescent = 1
|
||||
basecolor = COLOR_LUMINOL
|
||||
update_icon()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/clean_blood()
|
||||
fluorescent = 0
|
||||
if(invisibility != 100)
|
||||
invisibility = 100
|
||||
amount = 0
|
||||
..(ignore=1)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/New()
|
||||
..()
|
||||
update_icon()
|
||||
if(istype(src, /obj/effect/decal/cleanable/blood/gibs))
|
||||
return
|
||||
if(src.type == /obj/effect/decal/cleanable/blood)
|
||||
if(src.loc && isturf(src.loc))
|
||||
for(var/obj/effect/decal/cleanable/blood/B in src.loc)
|
||||
if(B != src)
|
||||
if (B.blood_DNA)
|
||||
blood_DNA |= B.blood_DNA.Copy()
|
||||
qdel(B)
|
||||
addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1))
|
||||
|
||||
/obj/effect/decal/cleanable/blood/update_icon()
|
||||
if(basecolor == "rainbow") basecolor = get_random_colour(1)
|
||||
color = basecolor
|
||||
|
||||
if(basecolor == SYNTH_BLOOD_COLOUR)
|
||||
name = "oil"
|
||||
desc = "It's quite oily."
|
||||
else if(synthblood)
|
||||
name = "synthetic blood"
|
||||
desc = "It's quite greasy."
|
||||
else
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
|
||||
if(perp.is_incorporeal())
|
||||
return
|
||||
if (!istype(perp))
|
||||
return
|
||||
if(amount < 1)
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/l_foot = perp.get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = perp.get_organ("r_foot")
|
||||
var/hasfeet = 1
|
||||
if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump()))
|
||||
hasfeet = 0
|
||||
if(perp.shoes && !perp.buckled)//Adding blood to shoes
|
||||
var/obj/item/clothing/shoes/S = perp.shoes
|
||||
if(istype(S))
|
||||
S.blood_color = basecolor
|
||||
S.track_blood = max(amount,S.track_blood)
|
||||
if(!S.blood_overlay)
|
||||
S.generate_blood_overlay()
|
||||
if(!S.blood_DNA)
|
||||
S.blood_DNA = list()
|
||||
S.blood_overlay.color = basecolor
|
||||
S.add_overlay(S.blood_overlay)
|
||||
if(S.blood_overlay && S.blood_overlay.color != basecolor)
|
||||
S.blood_overlay.color = basecolor
|
||||
S.add_overlay(S.blood_overlay)
|
||||
S.blood_DNA |= blood_DNA.Copy()
|
||||
perp.update_inv_shoes()
|
||||
|
||||
else if (hasfeet)//Or feet
|
||||
perp.feet_blood_color = basecolor
|
||||
perp.track_blood = max(amount,perp.track_blood)
|
||||
LAZYINITLIST(perp.feet_blood_DNA)
|
||||
perp.feet_blood_DNA |= blood_DNA.Copy()
|
||||
perp.update_bloodied()
|
||||
else if (perp.buckled && istype(perp.buckled, /obj/structure/bed/chair/wheelchair))
|
||||
var/obj/structure/bed/chair/wheelchair/W = perp.buckled
|
||||
W.bloodiness = 4
|
||||
|
||||
amount--
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/dry()
|
||||
name = dryname
|
||||
desc = drydesc
|
||||
color = adjust_brightness(color, -50)
|
||||
amount = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
|
||||
..()
|
||||
if (amount && istype(user))
|
||||
add_fingerprint(user)
|
||||
if (user.gloves)
|
||||
return
|
||||
var/taken = rand(1,amount)
|
||||
amount -= taken
|
||||
to_chat(user, "<span class='notice'>You get some of \the [src] on your hands.</span>")
|
||||
if (!user.blood_DNA)
|
||||
user.blood_DNA = list()
|
||||
user.blood_DNA |= blood_DNA.Copy()
|
||||
user.bloody_hands += taken
|
||||
user.hand_blood_color = basecolor
|
||||
user.update_inv_gloves(1)
|
||||
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
|
||||
/obj/effect/decal/cleanable/blood/splatter
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip
|
||||
name = "drips of blood"
|
||||
desc = "It's red."
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/drip.dmi'
|
||||
icon_state = "1"
|
||||
random_icon_states = list("1","2","3","4","5")
|
||||
amount = 0
|
||||
var/list/drips = list()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip/New()
|
||||
..()
|
||||
drips |= icon_state
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing
|
||||
icon_state = "tracks"
|
||||
desc = "It looks like a writing in blood."
|
||||
gender = NEUTER
|
||||
random_icon_states = list("writing1","writing2","writing3","writing4","writing5")
|
||||
amount = 0
|
||||
var/message
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing/New()
|
||||
..()
|
||||
if(random_icon_states.len)
|
||||
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
|
||||
random_icon_states.Remove(W.icon_state)
|
||||
icon_state = pick(random_icon_states)
|
||||
else
|
||||
icon_state = "writing1"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing/examine(mob/user)
|
||||
. = ..()
|
||||
. += "It reads: <font color='[basecolor]'>\"[message]\"</font>"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs
|
||||
name = "gibs"
|
||||
desc = "They look bloody and gruesome."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "gibbl5"
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6")
|
||||
var/fleshcolor = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/update_icon()
|
||||
|
||||
var/image/giblets = new(base_icon, "[icon_state]_flesh", dir)
|
||||
if(!fleshcolor || fleshcolor == "rainbow")
|
||||
fleshcolor = get_random_colour(1)
|
||||
giblets.color = fleshcolor
|
||||
|
||||
var/icon/blood = new(base_icon,"[icon_state]",dir)
|
||||
if(basecolor == "rainbow") basecolor = get_random_colour(1)
|
||||
blood.Blend(basecolor,ICON_MULTIPLY)
|
||||
|
||||
icon = blood
|
||||
cut_overlays()
|
||||
add_overlay(giblets)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/up
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/down
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/body
|
||||
random_icon_states = list("gibhead", "gibtorso")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/limb
|
||||
random_icon_states = list("gibleg", "gibarm")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/core
|
||||
random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
|
||||
b.basecolor = src.basecolor
|
||||
b.update_icon()
|
||||
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/mucus
|
||||
name = "mucus"
|
||||
desc = "Disgusting mucus."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "mucus"
|
||||
random_icon_states = list("mucus")
|
||||
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/dry = 0 // Keeps the lag down
|
||||
|
||||
/obj/effect/decal/cleanable/mucus/Initialize()
|
||||
. = ..()
|
||||
VARSET_IN(src, dry, TRUE, DRYING_TIME * 2)
|
||||
|
||||
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
|
||||
/obj/effect/decal/cleanable/mucus/mapped/Initialize()
|
||||
. = ..()
|
||||
virus2 |= new /datum/disease2/disease
|
||||
virus2[1].makerandom()
|
||||
|
||||
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
|
||||
virus2.Cut()
|
||||
return ..()
|
||||
|
||||
@@ -1,163 +1,163 @@
|
||||
/obj/effect/decal/cleanable/generic
|
||||
name = "clutter"
|
||||
desc = "Someone should clean that up."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
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/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>[src] sifts through your fingers.</span>")
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if (istype(F))
|
||||
F.dirt += 4
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow/New()
|
||||
..()
|
||||
QDEL_IN(src, 2 MINUTES)
|
||||
|
||||
/obj/effect/decal/cleanable/dirt
|
||||
name = "dirt"
|
||||
desc = "Someone should clean that up."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "dirt"
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/decal/cleanable/dirt/Initialize(var/mapload, var/_age, var/dirt)
|
||||
.=..()
|
||||
var/turf/simulated/our_turf = src.loc
|
||||
if(our_turf && istype(our_turf) && our_turf.can_dirty)
|
||||
our_turf.dirt = clamp(max(age ? (dirt ? dirt : 101) : our_turf.dirt, our_turf.dirt), 0, 101)
|
||||
var/calcalpha = our_turf.dirt > 50 ? min((our_turf.dirt - 50) * 5, 255) : 0
|
||||
var/alreadyfound = FALSE
|
||||
for (var/obj/effect/decal/cleanable/dirt/alreadythere in our_turf) //in case of multiple
|
||||
if (alreadythere == src)
|
||||
continue
|
||||
else if (alreadyfound)
|
||||
qdel(alreadythere)
|
||||
continue
|
||||
alreadyfound = TRUE
|
||||
alreadythere.alpha = calcalpha //don't need to constantly recalc for all of them in it because it'll just max if a non-persistent dirt overlay gets added, and then the new dirt overlay will be deleted
|
||||
if (alreadyfound)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
alpha = calcalpha
|
||||
|
||||
/obj/effect/decal/cleanable/flour
|
||||
name = "flour"
|
||||
desc = "It's still good. Four second rule!"
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "flour"
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow
|
||||
name = "glowing goo"
|
||||
desc = "Jeez. I hope that's not for lunch."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
light_range = 1
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "greenglow"
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb
|
||||
name = "cobweb"
|
||||
desc = "Somebody should remove that."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = OBJ_PLANE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "cobweb1"
|
||||
|
||||
/obj/effect/decal/cleanable/molten_item
|
||||
name = "gooey grey mass"
|
||||
desc = "It looks like a melted... something."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = OBJ_PLANE
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "molten"
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb2
|
||||
name = "cobweb"
|
||||
desc = "Somebody should remove that."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = OBJ_PLANE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "cobweb2"
|
||||
|
||||
//Vomit (sorry)
|
||||
/obj/effect/decal/cleanable/vomit
|
||||
name = "vomit"
|
||||
desc = "Gosh, how unpleasant."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "vomit_1"
|
||||
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
|
||||
/obj/effect/decal/cleanable/tomato_smudge
|
||||
name = "tomato smudge"
|
||||
desc = "It's red."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/tomatodecal.dmi'
|
||||
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
|
||||
|
||||
/obj/effect/decal/cleanable/egg_smudge
|
||||
name = "smashed egg"
|
||||
desc = "Seems like this one won't hatch."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
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
|
||||
icon = 'icons/effects/tomatodecal.dmi'
|
||||
random_icon_states = list("smashed_pie")
|
||||
|
||||
/obj/effect/decal/cleanable/fruit_smudge
|
||||
name = "smudge"
|
||||
desc = "Some kind of fruit smear."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "mfloor1"
|
||||
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
|
||||
|
||||
/obj/effect/decal/cleanable/confetti
|
||||
name = "confetti"
|
||||
desc = "Tiny bits of colored paper thrown about for the janitor to enjoy!"
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "confetti"
|
||||
|
||||
/obj/effect/decal/cleanable/confetti/attack_hand(mob/user)
|
||||
to_chat(user, "<span class='notice'>You start to meticulously pick up the confetti.</span>")
|
||||
if(do_after(user, 60))
|
||||
qdel(src)
|
||||
/obj/effect/decal/cleanable/generic
|
||||
name = "clutter"
|
||||
desc = "Someone should clean that up."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
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/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>[src] sifts through your fingers.</span>")
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if (istype(F))
|
||||
F.dirt += 4
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow/New()
|
||||
..()
|
||||
QDEL_IN(src, 2 MINUTES)
|
||||
|
||||
/obj/effect/decal/cleanable/dirt
|
||||
name = "dirt"
|
||||
desc = "Someone should clean that up."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "dirt"
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/decal/cleanable/dirt/Initialize(var/mapload, var/_age, var/dirt)
|
||||
.=..()
|
||||
var/turf/simulated/our_turf = src.loc
|
||||
if(our_turf && istype(our_turf) && our_turf.can_dirty)
|
||||
our_turf.dirt = clamp(max(age ? (dirt ? dirt : 101) : our_turf.dirt, our_turf.dirt), 0, 101)
|
||||
var/calcalpha = our_turf.dirt > 50 ? min((our_turf.dirt - 50) * 5, 255) : 0
|
||||
var/alreadyfound = FALSE
|
||||
for (var/obj/effect/decal/cleanable/dirt/alreadythere in our_turf) //in case of multiple
|
||||
if (alreadythere == src)
|
||||
continue
|
||||
else if (alreadyfound)
|
||||
qdel(alreadythere)
|
||||
continue
|
||||
alreadyfound = TRUE
|
||||
alreadythere.alpha = calcalpha //don't need to constantly recalc for all of them in it because it'll just max if a non-persistent dirt overlay gets added, and then the new dirt overlay will be deleted
|
||||
if (alreadyfound)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
alpha = calcalpha
|
||||
|
||||
/obj/effect/decal/cleanable/flour
|
||||
name = "flour"
|
||||
desc = "It's still good. Four second rule!"
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "flour"
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow
|
||||
name = "glowing goo"
|
||||
desc = "Jeez. I hope that's not for lunch."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
light_range = 1
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "greenglow"
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb
|
||||
name = "cobweb"
|
||||
desc = "Somebody should remove that."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = OBJ_PLANE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "cobweb1"
|
||||
|
||||
/obj/effect/decal/cleanable/molten_item
|
||||
name = "gooey grey mass"
|
||||
desc = "It looks like a melted... something."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = OBJ_PLANE
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "molten"
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb2
|
||||
name = "cobweb"
|
||||
desc = "Somebody should remove that."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = OBJ_PLANE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "cobweb2"
|
||||
|
||||
//Vomit (sorry)
|
||||
/obj/effect/decal/cleanable/vomit
|
||||
name = "vomit"
|
||||
desc = "Gosh, how unpleasant."
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "vomit_1"
|
||||
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
|
||||
/obj/effect/decal/cleanable/tomato_smudge
|
||||
name = "tomato smudge"
|
||||
desc = "It's red."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/tomatodecal.dmi'
|
||||
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
|
||||
|
||||
/obj/effect/decal/cleanable/egg_smudge
|
||||
name = "smashed egg"
|
||||
desc = "Seems like this one won't hatch."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
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
|
||||
icon = 'icons/effects/tomatodecal.dmi'
|
||||
random_icon_states = list("smashed_pie")
|
||||
|
||||
/obj/effect/decal/cleanable/fruit_smudge
|
||||
name = "smudge"
|
||||
desc = "Some kind of fruit smear."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "mfloor1"
|
||||
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
|
||||
|
||||
/obj/effect/decal/cleanable/confetti
|
||||
name = "confetti"
|
||||
desc = "Tiny bits of colored paper thrown about for the janitor to enjoy!"
|
||||
gender = PLURAL
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "confetti"
|
||||
|
||||
/obj/effect/decal/cleanable/confetti/attack_hand(mob/user)
|
||||
to_chat(user, "<span class='notice'>You start to meticulously pick up the confetti.</span>")
|
||||
if(do_after(user, 60))
|
||||
qdel(src)
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot
|
||||
name = "robot debris"
|
||||
desc = "It's a useless heap of junk... <i>or is it?</i>"
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "gib1"
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
||||
generic_filth = FALSE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
|
||||
color = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
if (prob(40))
|
||||
var/obj/effect/decal/cleanable/blood/oil/streak = new(src.loc)
|
||||
streak.update_icon()
|
||||
else if (prob(10))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/limb
|
||||
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
|
||||
|
||||
/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
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
generic_filth = FALSE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/streak
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot
|
||||
name = "robot debris"
|
||||
desc = "It's a useless heap of junk... <i>or is it?</i>"
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "gib1"
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
||||
generic_filth = FALSE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
|
||||
color = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
if (prob(40))
|
||||
var/obj/effect/decal/cleanable/blood/oil/streak = new(src.loc)
|
||||
streak.update_icon()
|
||||
else if (prob(10))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/limb
|
||||
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
|
||||
|
||||
/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
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
generic_filth = FALSE
|
||||
persistent = FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/streak
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
@@ -1,38 +1,38 @@
|
||||
/*
|
||||
USAGE NOTE
|
||||
For decals, the var Persistent = 'has already been saved', and is primarily used to prevent duplicate savings of generic filth (filth.dm).
|
||||
This also means 'TRUE' can be used to define a decal as "Do not save at all, even as a generic replacement." if a dirt decal is considered 'too common' to save.
|
||||
generic_filth = TRUE means when the decal is saved, it will be switched out for a generic green 'filth' decal.
|
||||
*/
|
||||
|
||||
/obj/effect/decal/cleanable
|
||||
plane = DIRTY_PLANE
|
||||
layer = DIRTY_LAYER
|
||||
var/persistent = FALSE
|
||||
var/generic_filth = FALSE
|
||||
var/age = 0
|
||||
var/list/random_icon_states = list()
|
||||
|
||||
/obj/effect/decal/cleanable/Initialize(var/mapload, var/_age)
|
||||
if(!isnull(_age))
|
||||
age = _age
|
||||
if(random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
if(!mapload || !config.persistence_ignore_mapload)
|
||||
SSpersistence.track_value(src, /datum/persistent/filth)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/decal/cleanable/Destroy()
|
||||
SSpersistence.forget_value(src, /datum/persistent/filth)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
|
||||
if(!ignore)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/New()
|
||||
if (random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
..()
|
||||
/*
|
||||
USAGE NOTE
|
||||
For decals, the var Persistent = 'has already been saved', and is primarily used to prevent duplicate savings of generic filth (filth.dm).
|
||||
This also means 'TRUE' can be used to define a decal as "Do not save at all, even as a generic replacement." if a dirt decal is considered 'too common' to save.
|
||||
generic_filth = TRUE means when the decal is saved, it will be switched out for a generic green 'filth' decal.
|
||||
*/
|
||||
|
||||
/obj/effect/decal/cleanable
|
||||
plane = DIRTY_PLANE
|
||||
layer = DIRTY_LAYER
|
||||
var/persistent = FALSE
|
||||
var/generic_filth = FALSE
|
||||
var/age = 0
|
||||
var/list/random_icon_states = list()
|
||||
|
||||
/obj/effect/decal/cleanable/Initialize(var/mapload, var/_age)
|
||||
if(!isnull(_age))
|
||||
age = _age
|
||||
if(random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
if(!mapload || !config.persistence_ignore_mapload)
|
||||
SSpersistence.track_value(src, /datum/persistent/filth)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/decal/cleanable/Destroy()
|
||||
SSpersistence.forget_value(src, /datum/persistent/filth)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
|
||||
if(!ignore)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/New()
|
||||
if (random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
..()
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
/obj/effect/decal/cleanable/crayon
|
||||
name = "rune"
|
||||
desc = "A rune drawn in crayon."
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
plane = DIRTY_PLANE
|
||||
layer = DIRTY_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune")
|
||||
..()
|
||||
loc = location
|
||||
|
||||
name = type
|
||||
desc = "A [type] drawn in crayon."
|
||||
|
||||
switch(type)
|
||||
if("rune")
|
||||
type = "rune[rand(1,6)]"
|
||||
if("graffiti")
|
||||
type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa")
|
||||
|
||||
var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1)
|
||||
var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1)
|
||||
|
||||
mainOverlay.Blend(main,ICON_ADD)
|
||||
shadeOverlay.Blend(shade,ICON_ADD)
|
||||
|
||||
add_overlay(mainOverlay)
|
||||
add_overlay(shadeOverlay)
|
||||
|
||||
add_hiddenprint(usr)
|
||||
/obj/effect/decal/cleanable/crayon
|
||||
name = "rune"
|
||||
desc = "A rune drawn in crayon."
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
plane = DIRTY_PLANE
|
||||
layer = DIRTY_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune")
|
||||
..()
|
||||
loc = location
|
||||
|
||||
name = type
|
||||
desc = "A [type] drawn in crayon."
|
||||
|
||||
switch(type)
|
||||
if("rune")
|
||||
type = "rune[rand(1,6)]"
|
||||
if("graffiti")
|
||||
type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa")
|
||||
|
||||
var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1)
|
||||
var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1)
|
||||
|
||||
mainOverlay.Blend(main,ICON_ADD)
|
||||
shadeOverlay.Blend(shade,ICON_ADD)
|
||||
|
||||
add_overlay(mainOverlay)
|
||||
add_overlay(shadeOverlay)
|
||||
|
||||
add_hiddenprint(usr)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
/obj/effect/decal/point
|
||||
name = "arrow"
|
||||
desc = "It's an arrow hanging in mid-air. There may be a wizard about."
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "arrow"
|
||||
plane = ABOVE_PLANE
|
||||
anchored = TRUE
|
||||
mouse_opacity = 0
|
||||
|
||||
// Used for spray that you spray at walls, tables, hydrovats etc
|
||||
/obj/effect/decal/spraystill
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
/obj/effect/decal/point
|
||||
name = "arrow"
|
||||
desc = "It's an arrow hanging in mid-air. There may be a wizard about."
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "arrow"
|
||||
plane = ABOVE_PLANE
|
||||
anchored = TRUE
|
||||
mouse_opacity = 0
|
||||
|
||||
// Used for spray that you spray at walls, tables, hydrovats etc
|
||||
/obj/effect/decal/spraystill
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
plane = ABOVE_PLANE
|
||||
@@ -1,70 +1,70 @@
|
||||
/obj/effect/decal/remains
|
||||
name = "remains"
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
anchored = FALSE
|
||||
|
||||
/obj/effect/decal/remains/human
|
||||
desc = "They look like human remains. They have a strange aura about them."
|
||||
|
||||
/obj/effect/decal/remains/xeno
|
||||
desc = "They look like the remains of something... alien. They have a strange aura about them."
|
||||
icon_state = "remainsxeno"
|
||||
|
||||
/obj/effect/decal/remains/robot
|
||||
desc = "They look like the remains of something mechanical. They have a strange aura about them."
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "remainsrobot"
|
||||
|
||||
/obj/effect/decal/remains/mouse
|
||||
desc = "They look like the remains of a small rodent."
|
||||
icon_state = "mouse"
|
||||
|
||||
/obj/effect/decal/remains/lizard
|
||||
desc = "They look like the remains of a small lizard."
|
||||
icon_state = "lizard"
|
||||
|
||||
/obj/effect/decal/remains/unathi
|
||||
desc = "They look like Unathi remains. Pointy."
|
||||
icon_state = "remainsunathi"
|
||||
|
||||
/obj/effect/decal/remains/tajaran
|
||||
desc = "They look like Tajaran remains. They're surprisingly small."
|
||||
icon_state = "remainstajaran"
|
||||
|
||||
/obj/effect/decal/remains/ribcage
|
||||
desc = "They look like animal remains of some sort... You hope."
|
||||
icon_state = "remainsribcage"
|
||||
|
||||
/obj/effect/decal/remains/deer
|
||||
desc = "They look like the remains of a large herbivore, picked clean."
|
||||
icon_state = "remainsdeer"
|
||||
|
||||
/obj/effect/decal/remains/posi
|
||||
desc = "This looks like part of an old FBP. Hopefully it was empty."
|
||||
icon_state = "remainsposi"
|
||||
|
||||
/obj/effect/decal/remains/mummy1
|
||||
name = "mummified remains"
|
||||
desc = "They look like human remains. They've been here a long time."
|
||||
icon_state = "mummified1"
|
||||
|
||||
/obj/effect/decal/remains/mummy2
|
||||
name = "mummified remains"
|
||||
desc = "They look like human remains. They've been here a long time."
|
||||
icon_state = "mummified2"
|
||||
|
||||
/obj/effect/decal/remains/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>[src] sinks together into a pile of ash.</span>")
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if(istype(F))
|
||||
new /obj/effect/decal/cleanable/ash(F)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/remains/robot/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>[src] crumbles down into a pile of debris.</span>")
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if(istype(F))
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(F)
|
||||
qdel(src)
|
||||
/obj/effect/decal/remains
|
||||
name = "remains"
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
anchored = FALSE
|
||||
|
||||
/obj/effect/decal/remains/human
|
||||
desc = "They look like human remains. They have a strange aura about them."
|
||||
|
||||
/obj/effect/decal/remains/xeno
|
||||
desc = "They look like the remains of something... alien. They have a strange aura about them."
|
||||
icon_state = "remainsxeno"
|
||||
|
||||
/obj/effect/decal/remains/robot
|
||||
desc = "They look like the remains of something mechanical. They have a strange aura about them."
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "remainsrobot"
|
||||
|
||||
/obj/effect/decal/remains/mouse
|
||||
desc = "They look like the remains of a small rodent."
|
||||
icon_state = "mouse"
|
||||
|
||||
/obj/effect/decal/remains/lizard
|
||||
desc = "They look like the remains of a small lizard."
|
||||
icon_state = "lizard"
|
||||
|
||||
/obj/effect/decal/remains/unathi
|
||||
desc = "They look like Unathi remains. Pointy."
|
||||
icon_state = "remainsunathi"
|
||||
|
||||
/obj/effect/decal/remains/tajaran
|
||||
desc = "They look like Tajaran remains. They're surprisingly small."
|
||||
icon_state = "remainstajaran"
|
||||
|
||||
/obj/effect/decal/remains/ribcage
|
||||
desc = "They look like animal remains of some sort... You hope."
|
||||
icon_state = "remainsribcage"
|
||||
|
||||
/obj/effect/decal/remains/deer
|
||||
desc = "They look like the remains of a large herbivore, picked clean."
|
||||
icon_state = "remainsdeer"
|
||||
|
||||
/obj/effect/decal/remains/posi
|
||||
desc = "This looks like part of an old FBP. Hopefully it was empty."
|
||||
icon_state = "remainsposi"
|
||||
|
||||
/obj/effect/decal/remains/mummy1
|
||||
name = "mummified remains"
|
||||
desc = "They look like human remains. They've been here a long time."
|
||||
icon_state = "mummified1"
|
||||
|
||||
/obj/effect/decal/remains/mummy2
|
||||
name = "mummified remains"
|
||||
desc = "They look like human remains. They've been here a long time."
|
||||
icon_state = "mummified2"
|
||||
|
||||
/obj/effect/decal/remains/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>[src] sinks together into a pile of ash.</span>")
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if(istype(F))
|
||||
new /obj/effect/decal/cleanable/ash(F)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/remains/robot/attack_hand(mob/user as mob)
|
||||
to_chat(user, "<span class='notice'>[src] crumbles down into a pile of debris.</span>")
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if(istype(F))
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(F)
|
||||
qdel(src)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/obj/effect/decal/warning_stripes
|
||||
icon = 'icons/effects/warning_stripes.dmi'
|
||||
|
||||
/obj/effect/decal/warning_stripes/Initialize()
|
||||
. = ..()
|
||||
var/turf/T=get_turf(src)
|
||||
var/image/I=image(icon, icon_state = icon_state, dir = dir)
|
||||
I.color=color
|
||||
T.add_overlay(I)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
/obj/effect/decal/warning_stripes
|
||||
icon = 'icons/effects/warning_stripes.dmi'
|
||||
|
||||
/obj/effect/decal/warning_stripes/Initialize()
|
||||
. = ..()
|
||||
var/turf/T=get_turf(src)
|
||||
var/image/I=image(icon, icon_state = icon_state, dir = dir)
|
||||
I.color=color
|
||||
T.add_overlay(I)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,72 +1,72 @@
|
||||
/obj/effect/expl_particles
|
||||
name = "explosive particles"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "explosion_particle"
|
||||
opacity = 1
|
||||
anchored = TRUE
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/expl_particles/New()
|
||||
..()
|
||||
spawn (15)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/datum/effect/system/expl_particles
|
||||
var/number = 10
|
||||
var/turf/location
|
||||
var/total_particles = 0
|
||||
|
||||
/datum/effect/system/expl_particles/proc/set_up(n = 10, loca)
|
||||
number = n
|
||||
if(istype(loca, /turf/)) location = loca
|
||||
else location = get_turf(loca)
|
||||
|
||||
/datum/effect/system/expl_particles/proc/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
spawn(0)
|
||||
var/obj/effect/expl_particles/expl = new /obj/effect/expl_particles(src.location)
|
||||
var/direct = pick(alldirs)
|
||||
for(i=0, i<pick(1;25,2;50,3,4;200), i++)
|
||||
sleep(1)
|
||||
step(expl,direct)
|
||||
|
||||
/obj/effect/explosion
|
||||
name = "explosive particles"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "explosion"
|
||||
opacity = 1
|
||||
anchored = TRUE
|
||||
mouse_opacity = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/explosion/New()
|
||||
..()
|
||||
spawn (10)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/datum/effect/system/explosion
|
||||
var/turf/location
|
||||
|
||||
/datum/effect/system/explosion/proc/set_up(loca)
|
||||
if(istype(loca, /turf/)) location = loca
|
||||
else location = get_turf(loca)
|
||||
|
||||
/datum/effect/system/explosion/proc/start()
|
||||
new/obj/effect/explosion( location )
|
||||
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
|
||||
P.set_up(10,location)
|
||||
P.start()
|
||||
spawn(5)
|
||||
var/datum/effect/effect/system/smoke_spread/S = new/datum/effect/effect/system/smoke_spread()
|
||||
S.set_up(5,0,location,null)
|
||||
S.start()
|
||||
|
||||
/datum/effect/system/explosion/smokeless/start()
|
||||
new/obj/effect/explosion(location)
|
||||
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
|
||||
P.set_up(10,location)
|
||||
/obj/effect/expl_particles
|
||||
name = "explosive particles"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "explosion_particle"
|
||||
opacity = 1
|
||||
anchored = TRUE
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/expl_particles/New()
|
||||
..()
|
||||
spawn (15)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/datum/effect/system/expl_particles
|
||||
var/number = 10
|
||||
var/turf/location
|
||||
var/total_particles = 0
|
||||
|
||||
/datum/effect/system/expl_particles/proc/set_up(n = 10, loca)
|
||||
number = n
|
||||
if(istype(loca, /turf/)) location = loca
|
||||
else location = get_turf(loca)
|
||||
|
||||
/datum/effect/system/expl_particles/proc/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
spawn(0)
|
||||
var/obj/effect/expl_particles/expl = new /obj/effect/expl_particles(src.location)
|
||||
var/direct = pick(alldirs)
|
||||
for(i=0, i<pick(1;25,2;50,3,4;200), i++)
|
||||
sleep(1)
|
||||
step(expl,direct)
|
||||
|
||||
/obj/effect/explosion
|
||||
name = "explosive particles"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "explosion"
|
||||
opacity = 1
|
||||
anchored = TRUE
|
||||
mouse_opacity = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/explosion/New()
|
||||
..()
|
||||
spawn (10)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/datum/effect/system/explosion
|
||||
var/turf/location
|
||||
|
||||
/datum/effect/system/explosion/proc/set_up(loca)
|
||||
if(istype(loca, /turf/)) location = loca
|
||||
else location = get_turf(loca)
|
||||
|
||||
/datum/effect/system/explosion/proc/start()
|
||||
new/obj/effect/explosion( location )
|
||||
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
|
||||
P.set_up(10,location)
|
||||
P.start()
|
||||
spawn(5)
|
||||
var/datum/effect/effect/system/smoke_spread/S = new/datum/effect/effect/system/smoke_spread()
|
||||
S.set_up(5,0,location,null)
|
||||
S.start()
|
||||
|
||||
/datum/effect/system/explosion/smokeless/start()
|
||||
new/obj/effect/explosion(location)
|
||||
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
|
||||
P.set_up(10,location)
|
||||
P.start()
|
||||
@@ -1,55 +1,55 @@
|
||||
/proc/gibs(atom/location, var/datum/dna/MobDNA, gibber_type = /obj/effect/gibspawner/generic, var/fleshcolor, var/bloodcolor)
|
||||
new gibber_type(location,MobDNA,fleshcolor,bloodcolor)
|
||||
|
||||
/obj/effect/gibspawner
|
||||
var/sparks = 0 //whether sparks spread on Gib()
|
||||
var/list/gibtypes = list()
|
||||
var/list/gibamounts = list()
|
||||
var/list/gibdirections = list() //of lists
|
||||
var/fleshcolor //Used for gibbed humans.
|
||||
var/bloodcolor //Used for gibbed humans.
|
||||
|
||||
/obj/effect/gibspawner/New(location, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor)
|
||||
..()
|
||||
|
||||
if(fleshcolor) src.fleshcolor = fleshcolor
|
||||
if(bloodcolor) src.bloodcolor = bloodcolor
|
||||
Gib(loc,MobDNA)
|
||||
|
||||
/obj/effect/gibspawner/proc/Gib(atom/location, var/datum/dna/MobDNA = null)
|
||||
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
|
||||
to_world("<span class='warning'>Gib list length mismatch!</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
|
||||
if(sparks)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo
|
||||
s.start()
|
||||
|
||||
for(var/i = 1, i<= gibtypes.len, i++)
|
||||
if(gibamounts[i])
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(location)
|
||||
|
||||
// Apply human species colouration to masks.
|
||||
if(fleshcolor)
|
||||
gib.fleshcolor = fleshcolor
|
||||
if(bloodcolor)
|
||||
gib.basecolor = bloodcolor
|
||||
|
||||
gib.update_icon()
|
||||
|
||||
gib.blood_DNA = list()
|
||||
if(MobDNA)
|
||||
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
if(istype(location,/turf/))
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
|
||||
qdel(src)
|
||||
/proc/gibs(atom/location, var/datum/dna/MobDNA, gibber_type = /obj/effect/gibspawner/generic, var/fleshcolor, var/bloodcolor)
|
||||
new gibber_type(location,MobDNA,fleshcolor,bloodcolor)
|
||||
|
||||
/obj/effect/gibspawner
|
||||
var/sparks = 0 //whether sparks spread on Gib()
|
||||
var/list/gibtypes = list()
|
||||
var/list/gibamounts = list()
|
||||
var/list/gibdirections = list() //of lists
|
||||
var/fleshcolor //Used for gibbed humans.
|
||||
var/bloodcolor //Used for gibbed humans.
|
||||
|
||||
/obj/effect/gibspawner/New(location, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor)
|
||||
..()
|
||||
|
||||
if(fleshcolor) src.fleshcolor = fleshcolor
|
||||
if(bloodcolor) src.bloodcolor = bloodcolor
|
||||
Gib(loc,MobDNA)
|
||||
|
||||
/obj/effect/gibspawner/proc/Gib(atom/location, var/datum/dna/MobDNA = null)
|
||||
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
|
||||
to_world("<span class='warning'>Gib list length mismatch!</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
|
||||
if(sparks)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo
|
||||
s.start()
|
||||
|
||||
for(var/i = 1, i<= gibtypes.len, i++)
|
||||
if(gibamounts[i])
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(location)
|
||||
|
||||
// Apply human species colouration to masks.
|
||||
if(fleshcolor)
|
||||
gib.fleshcolor = fleshcolor
|
||||
if(bloodcolor)
|
||||
gib.basecolor = bloodcolor
|
||||
|
||||
gib.update_icon()
|
||||
|
||||
gib.blood_DNA = list()
|
||||
if(MobDNA)
|
||||
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
if(istype(location,/turf/))
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
|
||||
qdel(src)
|
||||
|
||||
@@ -1,291 +1,291 @@
|
||||
/obj/effect/landmark
|
||||
name = "landmark"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x2"
|
||||
anchored = TRUE
|
||||
unacidable = TRUE
|
||||
simulated = FALSE
|
||||
invisibility = 100
|
||||
var/delete_me = 0
|
||||
|
||||
/obj/effect/landmark/New()
|
||||
..()
|
||||
tag = text("landmark*[]", name)
|
||||
invisibility = 101
|
||||
|
||||
switch(name) //some of these are probably obsolete
|
||||
if("monkey")
|
||||
monkeystart += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("start")
|
||||
newplayer_start += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLate") // Bit difference, since we need the spawn point to move.
|
||||
latejoin += src
|
||||
simulated = TRUE
|
||||
// delete_me = 1
|
||||
return
|
||||
if("JoinLateGateway")
|
||||
latejoin_gateway += loc
|
||||
latejoin += src //VOREStation Addition
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLateElevator")
|
||||
latejoin_elevator += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLateCryo")
|
||||
latejoin_cryo += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLateCyborg")
|
||||
latejoin_cyborg += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("prisonwarp")
|
||||
prisonwarp += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("Holding Facility")
|
||||
holdingfacility += loc
|
||||
if("tdome1")
|
||||
tdome1 += loc
|
||||
if("tdome2")
|
||||
tdome2 += loc
|
||||
if("tdomeadmin")
|
||||
tdomeadmin += loc
|
||||
if("tdomeobserve")
|
||||
tdomeobserve += loc
|
||||
if("prisonsecuritywarp")
|
||||
prisonsecuritywarp += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("blobstart")
|
||||
blobstart += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("xeno_spawn")
|
||||
xeno_spawn += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("endgame_exit")
|
||||
endgame_safespawns += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("bluespacerift")
|
||||
endgame_exits += loc
|
||||
delete_me = 1
|
||||
return
|
||||
//VOREStation Add Start
|
||||
if("vinestart")
|
||||
vinestart += loc
|
||||
delete_me = 1
|
||||
return
|
||||
//VORE Station Add End
|
||||
|
||||
landmarks_list += src
|
||||
return 1
|
||||
|
||||
/obj/effect/landmark/proc/delete()
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/Initialize()
|
||||
. = ..()
|
||||
if(delete_me)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/landmark/Destroy(var/force = FALSE)
|
||||
if(delete_me || force)
|
||||
landmarks_list -= src
|
||||
return ..()
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/effect/landmark/start
|
||||
name = "start"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/landmark/start/New()
|
||||
..()
|
||||
tag = "start*[name]"
|
||||
invisibility = 101
|
||||
|
||||
return 1
|
||||
|
||||
/obj/effect/landmark/forbidden_level
|
||||
delete_me = 1
|
||||
/obj/effect/landmark/forbidden_level/Initialize()
|
||||
. = ..()
|
||||
if(using_map)
|
||||
using_map.secret_levels |= z
|
||||
else
|
||||
log_error("[type] mapped in but no using_map")
|
||||
|
||||
/obj/effect/landmark/hidden_level
|
||||
delete_me = 1
|
||||
/obj/effect/landmark/hidden_level/Initialize()
|
||||
. = ..()
|
||||
if(using_map)
|
||||
using_map.hidden_levels |= z
|
||||
else
|
||||
log_error("[type] mapped in but no using_map")
|
||||
|
||||
|
||||
/obj/effect/landmark/virtual_reality
|
||||
name = "virtual_reality"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/landmark/virtual_reality/New()
|
||||
..()
|
||||
tag = "virtual_reality*[name]"
|
||||
invisibility = 101
|
||||
return 1
|
||||
|
||||
|
||||
//Costume spawner landmarks
|
||||
/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
|
||||
|
||||
var/list/options = typesof(/obj/effect/landmark/costume)
|
||||
var/PICK= options[rand(1,options.len)]
|
||||
new PICK(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
//SUBCLASSES. Spawn a bunch of items and disappear likewise
|
||||
/obj/effect/landmark/costume/chicken/New()
|
||||
new /obj/item/clothing/suit/chickensuit(src.loc)
|
||||
new /obj/item/clothing/head/chicken(src.loc)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/gladiator/New()
|
||||
new /obj/item/clothing/under/gladiator(src.loc)
|
||||
new /obj/item/clothing/head/helmet/gladiator(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/madscientist/New()
|
||||
new /obj/item/clothing/under/suit_jacket/green(src.loc)
|
||||
new /obj/item/clothing/head/flatcap(src.loc)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/mad(src.loc)
|
||||
new /obj/item/clothing/glasses/gglasses(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/elpresidente/New()
|
||||
new /obj/item/clothing/under/suit_jacket/green(src.loc)
|
||||
new /obj/item/clothing/head/flatcap(src.loc)
|
||||
new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(src.loc)
|
||||
new /obj/item/clothing/shoes/boots/jackboots(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/nyangirl/New()
|
||||
new /obj/item/clothing/under/schoolgirl(src.loc)
|
||||
new /obj/item/clothing/head/kitty(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/maid/New()
|
||||
new /obj/item/clothing/under/skirt(src.loc)
|
||||
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/butler/New()
|
||||
new /obj/item/clothing/accessory/wcoat(src.loc)
|
||||
new /obj/item/clothing/under/suit_jacket(src.loc)
|
||||
new /obj/item/clothing/head/that(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/scratch/New()
|
||||
new /obj/item/clothing/gloves/white(src.loc)
|
||||
new /obj/item/clothing/shoes/white(src.loc)
|
||||
new /obj/item/clothing/under/scratch(src.loc)
|
||||
if (prob(30))
|
||||
new /obj/item/clothing/head/cueball(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/highlander/New()
|
||||
new /obj/item/clothing/under/kilt(src.loc)
|
||||
new /obj/item/clothing/head/beret(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/prig/New()
|
||||
new /obj/item/clothing/accessory/wcoat(src.loc)
|
||||
new /obj/item/clothing/glasses/monocle(src.loc)
|
||||
var/CHOICE= pick( /obj/item/clothing/head/bowler, /obj/item/clothing/head/that)
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/shoes/black(src.loc)
|
||||
new /obj/item/weapon/cane(src.loc)
|
||||
new /obj/item/clothing/under/sl_suit(src.loc)
|
||||
new /obj/item/clothing/mask/fakemoustache(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/plaguedoctor/New()
|
||||
new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
|
||||
new /obj/item/clothing/head/plaguedoctorhat(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/nightowl/New()
|
||||
new /obj/item/clothing/under/owl(src.loc)
|
||||
new /obj/item/clothing/mask/gas/owl_mask(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/waiter/New()
|
||||
new /obj/item/clothing/under/waiter(src.loc)
|
||||
var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/suit/storage/apron(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/pirate/New()
|
||||
new /obj/item/clothing/under/pirate(src.loc)
|
||||
new /obj/item/clothing/suit/pirate(src.loc)
|
||||
var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/glasses/eyepatch(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/commie/New()
|
||||
new /obj/item/clothing/under/soviet(src.loc)
|
||||
new /obj/item/clothing/head/ushanka(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/imperium_monk/New()
|
||||
new /obj/item/clothing/suit/imperium_monk(src.loc)
|
||||
if (prob(25))
|
||||
new /obj/item/clothing/mask/gas/cyborg(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/holiday_priest/New()
|
||||
new /obj/item/clothing/suit/holidaypriest(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/marisawizard/fake/New()
|
||||
new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
|
||||
new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/cutewitch/New()
|
||||
new /obj/item/clothing/under/sundress(src.loc)
|
||||
new /obj/item/clothing/head/witchwig(src.loc)
|
||||
new /obj/item/weapon/staff/broom(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/fakewizard/New()
|
||||
new /obj/item/clothing/suit/wizrobe/fake(src.loc)
|
||||
new /obj/item/clothing/head/wizard/fake(src.loc)
|
||||
new /obj/item/weapon/staff/(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/sexyclown/New()
|
||||
new /obj/item/clothing/mask/gas/sexyclown(src.loc)
|
||||
new /obj/item/clothing/under/sexyclown(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/sexymime/New()
|
||||
new /obj/item/clothing/mask/gas/sexymime(src.loc)
|
||||
new /obj/item/clothing/under/sexymime(src.loc)
|
||||
delete_me = 1
|
||||
/obj/effect/landmark
|
||||
name = "landmark"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x2"
|
||||
anchored = TRUE
|
||||
unacidable = TRUE
|
||||
simulated = FALSE
|
||||
invisibility = 100
|
||||
var/delete_me = 0
|
||||
|
||||
/obj/effect/landmark/New()
|
||||
..()
|
||||
tag = text("landmark*[]", name)
|
||||
invisibility = 101
|
||||
|
||||
switch(name) //some of these are probably obsolete
|
||||
if("monkey")
|
||||
monkeystart += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("start")
|
||||
newplayer_start += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLate") // Bit difference, since we need the spawn point to move.
|
||||
latejoin += src
|
||||
simulated = TRUE
|
||||
// delete_me = 1
|
||||
return
|
||||
if("JoinLateGateway")
|
||||
latejoin_gateway += loc
|
||||
latejoin += src //VOREStation Addition
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLateElevator")
|
||||
latejoin_elevator += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLateCryo")
|
||||
latejoin_cryo += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("JoinLateCyborg")
|
||||
latejoin_cyborg += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("prisonwarp")
|
||||
prisonwarp += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("Holding Facility")
|
||||
holdingfacility += loc
|
||||
if("tdome1")
|
||||
tdome1 += loc
|
||||
if("tdome2")
|
||||
tdome2 += loc
|
||||
if("tdomeadmin")
|
||||
tdomeadmin += loc
|
||||
if("tdomeobserve")
|
||||
tdomeobserve += loc
|
||||
if("prisonsecuritywarp")
|
||||
prisonsecuritywarp += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("blobstart")
|
||||
blobstart += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("xeno_spawn")
|
||||
xeno_spawn += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("endgame_exit")
|
||||
endgame_safespawns += loc
|
||||
delete_me = 1
|
||||
return
|
||||
if("bluespacerift")
|
||||
endgame_exits += loc
|
||||
delete_me = 1
|
||||
return
|
||||
//VOREStation Add Start
|
||||
if("vinestart")
|
||||
vinestart += loc
|
||||
delete_me = 1
|
||||
return
|
||||
//VORE Station Add End
|
||||
|
||||
landmarks_list += src
|
||||
return 1
|
||||
|
||||
/obj/effect/landmark/proc/delete()
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/Initialize()
|
||||
. = ..()
|
||||
if(delete_me)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/landmark/Destroy(var/force = FALSE)
|
||||
if(delete_me || force)
|
||||
landmarks_list -= src
|
||||
return ..()
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/effect/landmark/start
|
||||
name = "start"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/landmark/start/New()
|
||||
..()
|
||||
tag = "start*[name]"
|
||||
invisibility = 101
|
||||
|
||||
return 1
|
||||
|
||||
/obj/effect/landmark/forbidden_level
|
||||
delete_me = 1
|
||||
/obj/effect/landmark/forbidden_level/Initialize()
|
||||
. = ..()
|
||||
if(using_map)
|
||||
using_map.secret_levels |= z
|
||||
else
|
||||
log_error("[type] mapped in but no using_map")
|
||||
|
||||
/obj/effect/landmark/hidden_level
|
||||
delete_me = 1
|
||||
/obj/effect/landmark/hidden_level/Initialize()
|
||||
. = ..()
|
||||
if(using_map)
|
||||
using_map.hidden_levels |= z
|
||||
else
|
||||
log_error("[type] mapped in but no using_map")
|
||||
|
||||
|
||||
/obj/effect/landmark/virtual_reality
|
||||
name = "virtual_reality"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/landmark/virtual_reality/New()
|
||||
..()
|
||||
tag = "virtual_reality*[name]"
|
||||
invisibility = 101
|
||||
return 1
|
||||
|
||||
|
||||
//Costume spawner landmarks
|
||||
/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
|
||||
|
||||
var/list/options = typesof(/obj/effect/landmark/costume)
|
||||
var/PICK= options[rand(1,options.len)]
|
||||
new PICK(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
//SUBCLASSES. Spawn a bunch of items and disappear likewise
|
||||
/obj/effect/landmark/costume/chicken/New()
|
||||
new /obj/item/clothing/suit/chickensuit(src.loc)
|
||||
new /obj/item/clothing/head/chicken(src.loc)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/gladiator/New()
|
||||
new /obj/item/clothing/under/gladiator(src.loc)
|
||||
new /obj/item/clothing/head/helmet/gladiator(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/madscientist/New()
|
||||
new /obj/item/clothing/under/suit_jacket/green(src.loc)
|
||||
new /obj/item/clothing/head/flatcap(src.loc)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/mad(src.loc)
|
||||
new /obj/item/clothing/glasses/gglasses(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/elpresidente/New()
|
||||
new /obj/item/clothing/under/suit_jacket/green(src.loc)
|
||||
new /obj/item/clothing/head/flatcap(src.loc)
|
||||
new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(src.loc)
|
||||
new /obj/item/clothing/shoes/boots/jackboots(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/nyangirl/New()
|
||||
new /obj/item/clothing/under/schoolgirl(src.loc)
|
||||
new /obj/item/clothing/head/kitty(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/maid/New()
|
||||
new /obj/item/clothing/under/skirt(src.loc)
|
||||
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/butler/New()
|
||||
new /obj/item/clothing/accessory/wcoat(src.loc)
|
||||
new /obj/item/clothing/under/suit_jacket(src.loc)
|
||||
new /obj/item/clothing/head/that(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/scratch/New()
|
||||
new /obj/item/clothing/gloves/white(src.loc)
|
||||
new /obj/item/clothing/shoes/white(src.loc)
|
||||
new /obj/item/clothing/under/scratch(src.loc)
|
||||
if (prob(30))
|
||||
new /obj/item/clothing/head/cueball(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/highlander/New()
|
||||
new /obj/item/clothing/under/kilt(src.loc)
|
||||
new /obj/item/clothing/head/beret(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/prig/New()
|
||||
new /obj/item/clothing/accessory/wcoat(src.loc)
|
||||
new /obj/item/clothing/glasses/monocle(src.loc)
|
||||
var/CHOICE= pick( /obj/item/clothing/head/bowler, /obj/item/clothing/head/that)
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/shoes/black(src.loc)
|
||||
new /obj/item/weapon/cane(src.loc)
|
||||
new /obj/item/clothing/under/sl_suit(src.loc)
|
||||
new /obj/item/clothing/mask/fakemoustache(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/plaguedoctor/New()
|
||||
new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
|
||||
new /obj/item/clothing/head/plaguedoctorhat(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/nightowl/New()
|
||||
new /obj/item/clothing/under/owl(src.loc)
|
||||
new /obj/item/clothing/mask/gas/owl_mask(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/waiter/New()
|
||||
new /obj/item/clothing/under/waiter(src.loc)
|
||||
var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/suit/storage/apron(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/pirate/New()
|
||||
new /obj/item/clothing/under/pirate(src.loc)
|
||||
new /obj/item/clothing/suit/pirate(src.loc)
|
||||
var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/glasses/eyepatch(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/commie/New()
|
||||
new /obj/item/clothing/under/soviet(src.loc)
|
||||
new /obj/item/clothing/head/ushanka(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/imperium_monk/New()
|
||||
new /obj/item/clothing/suit/imperium_monk(src.loc)
|
||||
if (prob(25))
|
||||
new /obj/item/clothing/mask/gas/cyborg(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/holiday_priest/New()
|
||||
new /obj/item/clothing/suit/holidaypriest(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/marisawizard/fake/New()
|
||||
new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
|
||||
new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/cutewitch/New()
|
||||
new /obj/item/clothing/under/sundress(src.loc)
|
||||
new /obj/item/clothing/head/witchwig(src.loc)
|
||||
new /obj/item/weapon/staff/broom(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/fakewizard/New()
|
||||
new /obj/item/clothing/suit/wizrobe/fake(src.loc)
|
||||
new /obj/item/clothing/head/wizard/fake(src.loc)
|
||||
new /obj/item/weapon/staff/(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/sexyclown/New()
|
||||
new /obj/item/clothing/mask/gas/sexyclown(src.loc)
|
||||
new /obj/item/clothing/under/sexyclown(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/sexymime/New()
|
||||
new /obj/item/clothing/mask/gas/sexymime(src.loc)
|
||||
new /obj/item/clothing/under/sexymime(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/obj/effect/manifest
|
||||
name = "manifest"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
unacidable = TRUE//Just to be sure.
|
||||
|
||||
/obj/effect/manifest/New()
|
||||
|
||||
src.invisibility = 101
|
||||
return
|
||||
|
||||
/obj/effect/manifest/proc/manifest()
|
||||
var/dat = "<B>Crew Manifest</B>:<BR>"
|
||||
for(var/mob/living/carbon/human/M in mob_list)
|
||||
dat += text(" <B>[]</B> - []<BR>", M.name, M.get_assignment())
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
|
||||
P.info = dat
|
||||
P.name = "paper- 'Crew Manifest'"
|
||||
//SN src = null
|
||||
qdel(src)
|
||||
/obj/effect/manifest
|
||||
name = "manifest"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
unacidable = TRUE//Just to be sure.
|
||||
|
||||
/obj/effect/manifest/New()
|
||||
|
||||
src.invisibility = 101
|
||||
return
|
||||
|
||||
/obj/effect/manifest/proc/manifest()
|
||||
var/dat = "<B>Crew Manifest</B>:<BR>"
|
||||
for(var/mob/living/carbon/human/M in mob_list)
|
||||
dat += text(" <B>[]</B> - []<BR>", M.name, M.get_assignment())
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
|
||||
P.info = dat
|
||||
P.name = "paper- 'Crew Manifest'"
|
||||
//SN src = null
|
||||
qdel(src)
|
||||
return
|
||||
@@ -1,191 +1,191 @@
|
||||
GLOBAL_LIST_EMPTY(all_beam_points)
|
||||
|
||||
// Creates and manages a beam attached to itself and another beam_point.
|
||||
// You can do cool things with these such as moving the beam_point to move the beam, turning them on and off on a timer, triggered by external input, and more.
|
||||
/obj/effect/map_effect/beam_point
|
||||
name = "beam point"
|
||||
icon_state = "beam_point"
|
||||
|
||||
// General variables.
|
||||
var/list/my_beams = list() // Instances of beams. Deleting one will kill the beam.
|
||||
var/id = "A" // Two beam_points must share the same ID to be connected to each other.
|
||||
var/max_beams = 10 // How many concurrent beams to seperate beam_points to have at once. Set to zero to only act as targets for other beam_points.
|
||||
var/seek_range = 7 // How far to look for an end beam_point when not having a beam. Defaults to screen height/width. Make sure this is below beam_max_distance.
|
||||
|
||||
// Controls how and when the beam is created.
|
||||
var/make_beams_on_init = FALSE
|
||||
var/use_timer = FALSE // Sadly not the /tg/ timers.
|
||||
var/list/on_duration = list(2 SECONDS, 2 SECONDS, 2 SECONDS) // How long the beam should stay on for, if use_timer is true. Alternates between each duration in the list.
|
||||
var/list/off_duration = list(3 SECONDS, 0.5 SECOND, 0.5 SECOND) // How long it should stay off for. List length is not needed to be the same as on_duration.
|
||||
var/timer_on_index = 1 // Index to use for on_duration list.
|
||||
var/timer_off_index = 1// Ditto, for off_duration list.
|
||||
var/initial_delay = 0 // How long to wait before first turning on the beam, to sync beam times or create a specific pattern.
|
||||
var/beam_creation_sound = null // Optional sound played when one or more beams are created.
|
||||
var/beam_destruction_sound = null // Optional sound played when a beam is destroyed.
|
||||
|
||||
// Beam datum arguments.
|
||||
var/beam_icon = 'icons/effects/beam.dmi' // Icon file to use for beam visuals.
|
||||
var/beam_icon_state = "b_beam" // Icon state to use for visuals.
|
||||
var/beam_time = INFINITY // How long the beam lasts. By default it will last forever until destroyed.
|
||||
var/beam_max_distance = 10 // If the beam is farther than this, it will be destroyed. Make sure it's higher than seek_range.
|
||||
var/beam_type = /obj/effect/ebeam // The type of beam. Default has no special properties. Some others may do things like hurt things touching it.
|
||||
var/beam_sleep_time = 3 // How often the beam updates visually. Suggested to leave this alone, 3 is already fast.
|
||||
|
||||
/obj/effect/map_effect/beam_point/Initialize()
|
||||
GLOB.all_beam_points += src
|
||||
if(make_beams_on_init)
|
||||
create_beams()
|
||||
if(use_timer)
|
||||
addtimer(CALLBACK(src, PROC_REF(handle_beam_timer)), initial_delay)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/beam_point/Destroy()
|
||||
destroy_all_beams()
|
||||
use_timer = FALSE
|
||||
GLOB.all_beam_points -= src
|
||||
return ..()
|
||||
|
||||
// This is the top level proc to make the magic happen.
|
||||
/obj/effect/map_effect/beam_point/proc/create_beams()
|
||||
if(my_beams.len >= max_beams)
|
||||
return
|
||||
var/beams_to_fill = max_beams - my_beams.len
|
||||
for(var/i = 1 to beams_to_fill)
|
||||
var/obj/effect/map_effect/beam_point/point = seek_beam_point()
|
||||
if(!point)
|
||||
break // No more points could be found, no point checking repeatively.
|
||||
build_beam(point)
|
||||
|
||||
// Finds a suitable beam point.
|
||||
/obj/effect/map_effect/beam_point/proc/seek_beam_point()
|
||||
for(var/obj/effect/map_effect/beam_point/point in GLOB.all_beam_points)
|
||||
if(id != point.id)
|
||||
continue // Not linked together by ID.
|
||||
if(has_active_beam(point))
|
||||
continue // Already got one.
|
||||
if(point.z != src.z)
|
||||
continue // Not on same z-level. get_dist() ignores z-levels by design according to docs.
|
||||
if(get_dist(src, point) > seek_range)
|
||||
continue // Too far.
|
||||
return point
|
||||
|
||||
// Checks if the two points have an active beam between them.
|
||||
// Used to make sure two points don't have more than one beam.
|
||||
/obj/effect/map_effect/beam_point/proc/has_active_beam(var/obj/effect/map_effect/beam_point/them)
|
||||
// First, check our beams.
|
||||
for(var/datum/beam/B in my_beams)
|
||||
if(B.target == them)
|
||||
return TRUE
|
||||
if(B.origin == them) // This shouldn't be needed unless the beam gets built backwards but why not.
|
||||
return TRUE
|
||||
|
||||
// Now check theirs, to see if they have a beam on us.
|
||||
for(var/datum/beam/B in them.my_beams)
|
||||
if(B.target == src)
|
||||
return TRUE
|
||||
if(B.origin == src) // Same story as above.
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
/obj/effect/map_effect/beam_point/proc/build_beam(var/atom/beam_target)
|
||||
if(!beam_target)
|
||||
log_debug("[src] ([src.type] \[[x],[y],[z]\]) failed to build its beam due to not having a target.")
|
||||
return FALSE
|
||||
|
||||
var/datum/beam/new_beam = Beam(beam_target, beam_icon_state, beam_icon, beam_time, beam_max_distance, beam_type, beam_sleep_time)
|
||||
my_beams += new_beam
|
||||
if(beam_creation_sound)
|
||||
playsound(src, beam_creation_sound, 70, 1)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/effect/map_effect/beam_point/proc/destroy_beam(var/datum/beam/B)
|
||||
if(!B)
|
||||
log_debug("[src] ([src.type] \[[x],[y],[z]\]) was asked to destroy a beam that does not exist.")
|
||||
return FALSE
|
||||
|
||||
if(!(B in my_beams))
|
||||
log_debug("[src] ([src.type] \[[x],[y],[z]\]) was asked to destroy a beam it did not own.")
|
||||
return FALSE
|
||||
|
||||
my_beams -= B
|
||||
qdel(B)
|
||||
if(beam_destruction_sound)
|
||||
playsound(src, beam_destruction_sound, 70, 1)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/effect/map_effect/beam_point/proc/destroy_all_beams()
|
||||
for(var/datum/beam/B in my_beams)
|
||||
destroy_beam(B)
|
||||
return TRUE
|
||||
|
||||
// This code makes me sad.
|
||||
/obj/effect/map_effect/beam_point/proc/handle_beam_timer()
|
||||
if(!use_timer || QDELETED(src))
|
||||
return
|
||||
|
||||
if(my_beams.len) // Currently on.
|
||||
destroy_all_beams()
|
||||
color = "#FF0000"
|
||||
|
||||
timer_off_index++
|
||||
if(timer_off_index > off_duration.len)
|
||||
timer_off_index = 1
|
||||
|
||||
spawn(off_duration[timer_off_index])
|
||||
.()
|
||||
|
||||
else // Currently off.
|
||||
// If nobody's around, keep the beams off to avoid wasteful beam process(), if they have one.
|
||||
if(!always_run && !check_for_player_proximity(src, proximity_needed, ignore_ghosts, ignore_afk))
|
||||
spawn(retry_delay)
|
||||
.()
|
||||
return
|
||||
|
||||
create_beams()
|
||||
color = "#00FF00"
|
||||
|
||||
timer_on_index++
|
||||
if(timer_on_index > on_duration.len)
|
||||
timer_on_index = 1
|
||||
|
||||
spawn(on_duration[timer_on_index])
|
||||
.()
|
||||
|
||||
|
||||
|
||||
// Subtypes to use in maps and adminbuse.
|
||||
// Remember, beam_points ONLY connect to other beam_points with the same id variable.
|
||||
|
||||
// Creates the beam when instantiated and stays on until told otherwise.
|
||||
/obj/effect/map_effect/beam_point/instant
|
||||
make_beams_on_init = TRUE
|
||||
|
||||
/obj/effect/map_effect/beam_point/instant/electric
|
||||
beam_icon_state = "nzcrentrs_power"
|
||||
beam_type = /obj/effect/ebeam/reactive/electric
|
||||
beam_creation_sound = 'sound/effects/lightningshock.ogg'
|
||||
beam_destruction_sound = "sparks"
|
||||
|
||||
// Turns on and off on a timer.
|
||||
/obj/effect/map_effect/beam_point/timer
|
||||
use_timer = TRUE
|
||||
|
||||
// Shocks people who touch the beam while it's on. Flicks on and off on a specific pattern.
|
||||
/obj/effect/map_effect/beam_point/timer/electric
|
||||
beam_icon_state = "nzcrentrs_power"
|
||||
beam_type = /obj/effect/ebeam/reactive/electric
|
||||
beam_creation_sound = 'sound/effects/lightningshock.ogg'
|
||||
beam_destruction_sound = "sparks"
|
||||
seek_range = 3
|
||||
|
||||
// Is only a target for other beams to connect to.
|
||||
/obj/effect/map_effect/beam_point/end
|
||||
max_beams = 0
|
||||
|
||||
// Can only have one beam.
|
||||
/obj/effect/map_effect/beam_point/mono
|
||||
make_beams_on_init = TRUE
|
||||
max_beams = 1
|
||||
GLOBAL_LIST_EMPTY(all_beam_points)
|
||||
|
||||
// Creates and manages a beam attached to itself and another beam_point.
|
||||
// You can do cool things with these such as moving the beam_point to move the beam, turning them on and off on a timer, triggered by external input, and more.
|
||||
/obj/effect/map_effect/beam_point
|
||||
name = "beam point"
|
||||
icon_state = "beam_point"
|
||||
|
||||
// General variables.
|
||||
var/list/my_beams = list() // Instances of beams. Deleting one will kill the beam.
|
||||
var/id = "A" // Two beam_points must share the same ID to be connected to each other.
|
||||
var/max_beams = 10 // How many concurrent beams to seperate beam_points to have at once. Set to zero to only act as targets for other beam_points.
|
||||
var/seek_range = 7 // How far to look for an end beam_point when not having a beam. Defaults to screen height/width. Make sure this is below beam_max_distance.
|
||||
|
||||
// Controls how and when the beam is created.
|
||||
var/make_beams_on_init = FALSE
|
||||
var/use_timer = FALSE // Sadly not the /tg/ timers.
|
||||
var/list/on_duration = list(2 SECONDS, 2 SECONDS, 2 SECONDS) // How long the beam should stay on for, if use_timer is true. Alternates between each duration in the list.
|
||||
var/list/off_duration = list(3 SECONDS, 0.5 SECOND, 0.5 SECOND) // How long it should stay off for. List length is not needed to be the same as on_duration.
|
||||
var/timer_on_index = 1 // Index to use for on_duration list.
|
||||
var/timer_off_index = 1// Ditto, for off_duration list.
|
||||
var/initial_delay = 0 // How long to wait before first turning on the beam, to sync beam times or create a specific pattern.
|
||||
var/beam_creation_sound = null // Optional sound played when one or more beams are created.
|
||||
var/beam_destruction_sound = null // Optional sound played when a beam is destroyed.
|
||||
|
||||
// Beam datum arguments.
|
||||
var/beam_icon = 'icons/effects/beam.dmi' // Icon file to use for beam visuals.
|
||||
var/beam_icon_state = "b_beam" // Icon state to use for visuals.
|
||||
var/beam_time = INFINITY // How long the beam lasts. By default it will last forever until destroyed.
|
||||
var/beam_max_distance = 10 // If the beam is farther than this, it will be destroyed. Make sure it's higher than seek_range.
|
||||
var/beam_type = /obj/effect/ebeam // The type of beam. Default has no special properties. Some others may do things like hurt things touching it.
|
||||
var/beam_sleep_time = 3 // How often the beam updates visually. Suggested to leave this alone, 3 is already fast.
|
||||
|
||||
/obj/effect/map_effect/beam_point/Initialize()
|
||||
GLOB.all_beam_points += src
|
||||
if(make_beams_on_init)
|
||||
create_beams()
|
||||
if(use_timer)
|
||||
addtimer(CALLBACK(src, PROC_REF(handle_beam_timer)), initial_delay)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/beam_point/Destroy()
|
||||
destroy_all_beams()
|
||||
use_timer = FALSE
|
||||
GLOB.all_beam_points -= src
|
||||
return ..()
|
||||
|
||||
// This is the top level proc to make the magic happen.
|
||||
/obj/effect/map_effect/beam_point/proc/create_beams()
|
||||
if(my_beams.len >= max_beams)
|
||||
return
|
||||
var/beams_to_fill = max_beams - my_beams.len
|
||||
for(var/i = 1 to beams_to_fill)
|
||||
var/obj/effect/map_effect/beam_point/point = seek_beam_point()
|
||||
if(!point)
|
||||
break // No more points could be found, no point checking repeatively.
|
||||
build_beam(point)
|
||||
|
||||
// Finds a suitable beam point.
|
||||
/obj/effect/map_effect/beam_point/proc/seek_beam_point()
|
||||
for(var/obj/effect/map_effect/beam_point/point in GLOB.all_beam_points)
|
||||
if(id != point.id)
|
||||
continue // Not linked together by ID.
|
||||
if(has_active_beam(point))
|
||||
continue // Already got one.
|
||||
if(point.z != src.z)
|
||||
continue // Not on same z-level. get_dist() ignores z-levels by design according to docs.
|
||||
if(get_dist(src, point) > seek_range)
|
||||
continue // Too far.
|
||||
return point
|
||||
|
||||
// Checks if the two points have an active beam between them.
|
||||
// Used to make sure two points don't have more than one beam.
|
||||
/obj/effect/map_effect/beam_point/proc/has_active_beam(var/obj/effect/map_effect/beam_point/them)
|
||||
// First, check our beams.
|
||||
for(var/datum/beam/B in my_beams)
|
||||
if(B.target == them)
|
||||
return TRUE
|
||||
if(B.origin == them) // This shouldn't be needed unless the beam gets built backwards but why not.
|
||||
return TRUE
|
||||
|
||||
// Now check theirs, to see if they have a beam on us.
|
||||
for(var/datum/beam/B in them.my_beams)
|
||||
if(B.target == src)
|
||||
return TRUE
|
||||
if(B.origin == src) // Same story as above.
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
/obj/effect/map_effect/beam_point/proc/build_beam(var/atom/beam_target)
|
||||
if(!beam_target)
|
||||
log_debug("[src] ([src.type] \[[x],[y],[z]\]) failed to build its beam due to not having a target.")
|
||||
return FALSE
|
||||
|
||||
var/datum/beam/new_beam = Beam(beam_target, beam_icon_state, beam_icon, beam_time, beam_max_distance, beam_type, beam_sleep_time)
|
||||
my_beams += new_beam
|
||||
if(beam_creation_sound)
|
||||
playsound(src, beam_creation_sound, 70, 1)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/effect/map_effect/beam_point/proc/destroy_beam(var/datum/beam/B)
|
||||
if(!B)
|
||||
log_debug("[src] ([src.type] \[[x],[y],[z]\]) was asked to destroy a beam that does not exist.")
|
||||
return FALSE
|
||||
|
||||
if(!(B in my_beams))
|
||||
log_debug("[src] ([src.type] \[[x],[y],[z]\]) was asked to destroy a beam it did not own.")
|
||||
return FALSE
|
||||
|
||||
my_beams -= B
|
||||
qdel(B)
|
||||
if(beam_destruction_sound)
|
||||
playsound(src, beam_destruction_sound, 70, 1)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/effect/map_effect/beam_point/proc/destroy_all_beams()
|
||||
for(var/datum/beam/B in my_beams)
|
||||
destroy_beam(B)
|
||||
return TRUE
|
||||
|
||||
// This code makes me sad.
|
||||
/obj/effect/map_effect/beam_point/proc/handle_beam_timer()
|
||||
if(!use_timer || QDELETED(src))
|
||||
return
|
||||
|
||||
if(my_beams.len) // Currently on.
|
||||
destroy_all_beams()
|
||||
color = "#FF0000"
|
||||
|
||||
timer_off_index++
|
||||
if(timer_off_index > off_duration.len)
|
||||
timer_off_index = 1
|
||||
|
||||
spawn(off_duration[timer_off_index])
|
||||
.()
|
||||
|
||||
else // Currently off.
|
||||
// If nobody's around, keep the beams off to avoid wasteful beam process(), if they have one.
|
||||
if(!always_run && !check_for_player_proximity(src, proximity_needed, ignore_ghosts, ignore_afk))
|
||||
spawn(retry_delay)
|
||||
.()
|
||||
return
|
||||
|
||||
create_beams()
|
||||
color = "#00FF00"
|
||||
|
||||
timer_on_index++
|
||||
if(timer_on_index > on_duration.len)
|
||||
timer_on_index = 1
|
||||
|
||||
spawn(on_duration[timer_on_index])
|
||||
.()
|
||||
|
||||
|
||||
|
||||
// Subtypes to use in maps and adminbuse.
|
||||
// Remember, beam_points ONLY connect to other beam_points with the same id variable.
|
||||
|
||||
// Creates the beam when instantiated and stays on until told otherwise.
|
||||
/obj/effect/map_effect/beam_point/instant
|
||||
make_beams_on_init = TRUE
|
||||
|
||||
/obj/effect/map_effect/beam_point/instant/electric
|
||||
beam_icon_state = "nzcrentrs_power"
|
||||
beam_type = /obj/effect/ebeam/reactive/electric
|
||||
beam_creation_sound = 'sound/effects/lightningshock.ogg'
|
||||
beam_destruction_sound = "sparks"
|
||||
|
||||
// Turns on and off on a timer.
|
||||
/obj/effect/map_effect/beam_point/timer
|
||||
use_timer = TRUE
|
||||
|
||||
// Shocks people who touch the beam while it's on. Flicks on and off on a specific pattern.
|
||||
/obj/effect/map_effect/beam_point/timer/electric
|
||||
beam_icon_state = "nzcrentrs_power"
|
||||
beam_type = /obj/effect/ebeam/reactive/electric
|
||||
beam_creation_sound = 'sound/effects/lightningshock.ogg'
|
||||
beam_destruction_sound = "sparks"
|
||||
seek_range = 3
|
||||
|
||||
// Is only a target for other beams to connect to.
|
||||
/obj/effect/map_effect/beam_point/end
|
||||
max_beams = 0
|
||||
|
||||
// Can only have one beam.
|
||||
/obj/effect/map_effect/beam_point/mono
|
||||
make_beams_on_init = TRUE
|
||||
max_beams = 1
|
||||
|
||||
@@ -1,69 +1,69 @@
|
||||
// These are objects you can use inside special maps (like PoIs), or for adminbuse.
|
||||
// Players cannot see or interact with these.
|
||||
/obj/effect/map_effect
|
||||
anchored = TRUE
|
||||
invisibility = 99 // So a badmin can go view these by changing their see_invisible.
|
||||
icon = 'icons/effects/map_effects.dmi'
|
||||
|
||||
// Below vars concern check_for_player_proximity() and is used to not waste effort if nobody is around to appreciate the effects.
|
||||
var/always_run = FALSE // If true, the game will not try to suppress this from firing if nobody is around to see it.
|
||||
var/proximity_needed = 12 // How many tiles a mob with a client must be for this to run.
|
||||
var/ignore_ghosts = FALSE // If true, ghosts won't satisfy the above requirement.
|
||||
var/ignore_afk = TRUE // If true, AFK people (5 minutes) won't satisfy it as well.
|
||||
var/retry_delay = 5 SECONDS // How long until we check for players again.
|
||||
var/next_attempt = 0 // Next time we're going to do ACTUAL WORK
|
||||
|
||||
/obj/effect/map_effect/ex_act()
|
||||
return
|
||||
|
||||
/obj/effect/map_effect/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/map_effect/singularity_act()
|
||||
return
|
||||
|
||||
// Base type for effects that run on variable intervals.
|
||||
/obj/effect/map_effect/interval
|
||||
var/interval_lower_bound = 5 SECONDS // Lower number for how often the map_effect will trigger.
|
||||
var/interval_upper_bound = 5 SECONDS // Higher number for above.
|
||||
|
||||
/obj/effect/map_effect/interval/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/effect/map_effect/interval/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
// Override this for the specific thing to do.
|
||||
/obj/effect/map_effect/interval/proc/trigger()
|
||||
return
|
||||
|
||||
// Handles the delay and making sure it doesn't run when it would be bad.
|
||||
/obj/effect/map_effect/interval/process()
|
||||
//Not yet!
|
||||
if(world.time < next_attempt)
|
||||
return
|
||||
|
||||
// Check to see if we're useful first.
|
||||
if(!always_run && !check_for_player_proximity(src, proximity_needed, ignore_ghosts, ignore_afk))
|
||||
next_attempt = world.time + retry_delay
|
||||
// Hey there's someone nearby.
|
||||
else
|
||||
next_attempt = world.time + rand(interval_lower_bound, interval_upper_bound)
|
||||
trigger()
|
||||
|
||||
// Helper proc to optimize the use of effects by making sure they do not run if nobody is around to perceive it.
|
||||
/proc/check_for_player_proximity(var/atom/proximity_to, var/radius = 12, var/ignore_ghosts = FALSE, var/ignore_afk = TRUE)
|
||||
if(!proximity_to)
|
||||
return FALSE
|
||||
|
||||
for(var/thing in player_list)
|
||||
var/mob/M = thing // Avoiding typechecks for more speed, player_list will only contain mobs anyways.
|
||||
if(ignore_ghosts && isobserver(M))
|
||||
continue
|
||||
if(ignore_afk && M.client && M.client.is_afk(5 MINUTES))
|
||||
continue
|
||||
if(M.z == proximity_to.z && get_dist(M, proximity_to) <= radius)
|
||||
return TRUE
|
||||
return FALSE
|
||||
// These are objects you can use inside special maps (like PoIs), or for adminbuse.
|
||||
// Players cannot see or interact with these.
|
||||
/obj/effect/map_effect
|
||||
anchored = TRUE
|
||||
invisibility = 99 // So a badmin can go view these by changing their see_invisible.
|
||||
icon = 'icons/effects/map_effects.dmi'
|
||||
|
||||
// Below vars concern check_for_player_proximity() and is used to not waste effort if nobody is around to appreciate the effects.
|
||||
var/always_run = FALSE // If true, the game will not try to suppress this from firing if nobody is around to see it.
|
||||
var/proximity_needed = 12 // How many tiles a mob with a client must be for this to run.
|
||||
var/ignore_ghosts = FALSE // If true, ghosts won't satisfy the above requirement.
|
||||
var/ignore_afk = TRUE // If true, AFK people (5 minutes) won't satisfy it as well.
|
||||
var/retry_delay = 5 SECONDS // How long until we check for players again.
|
||||
var/next_attempt = 0 // Next time we're going to do ACTUAL WORK
|
||||
|
||||
/obj/effect/map_effect/ex_act()
|
||||
return
|
||||
|
||||
/obj/effect/map_effect/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/map_effect/singularity_act()
|
||||
return
|
||||
|
||||
// Base type for effects that run on variable intervals.
|
||||
/obj/effect/map_effect/interval
|
||||
var/interval_lower_bound = 5 SECONDS // Lower number for how often the map_effect will trigger.
|
||||
var/interval_upper_bound = 5 SECONDS // Higher number for above.
|
||||
|
||||
/obj/effect/map_effect/interval/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/effect/map_effect/interval/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
// Override this for the specific thing to do.
|
||||
/obj/effect/map_effect/interval/proc/trigger()
|
||||
return
|
||||
|
||||
// Handles the delay and making sure it doesn't run when it would be bad.
|
||||
/obj/effect/map_effect/interval/process()
|
||||
//Not yet!
|
||||
if(world.time < next_attempt)
|
||||
return
|
||||
|
||||
// Check to see if we're useful first.
|
||||
if(!always_run && !check_for_player_proximity(src, proximity_needed, ignore_ghosts, ignore_afk))
|
||||
next_attempt = world.time + retry_delay
|
||||
// Hey there's someone nearby.
|
||||
else
|
||||
next_attempt = world.time + rand(interval_lower_bound, interval_upper_bound)
|
||||
trigger()
|
||||
|
||||
// Helper proc to optimize the use of effects by making sure they do not run if nobody is around to perceive it.
|
||||
/proc/check_for_player_proximity(var/atom/proximity_to, var/radius = 12, var/ignore_ghosts = FALSE, var/ignore_afk = TRUE)
|
||||
if(!proximity_to)
|
||||
return FALSE
|
||||
|
||||
for(var/thing in player_list)
|
||||
var/mob/M = thing // Avoiding typechecks for more speed, player_list will only contain mobs anyways.
|
||||
if(ignore_ghosts && isobserver(M))
|
||||
continue
|
||||
if(ignore_afk && M.client && M.client.is_afk(5 MINUTES))
|
||||
continue
|
||||
if(M.z == proximity_to.z && get_dist(M, proximity_to) <= radius)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
// Emits light forever with magic. Useful for mood lighting in Points of Interest.
|
||||
// Be sure to check how it looks ingame, and fiddle with the settings until it looks right.
|
||||
/obj/effect/map_effect/perma_light
|
||||
name = "permanent light"
|
||||
icon_state = "permalight"
|
||||
|
||||
light_range = 3
|
||||
light_power = 1
|
||||
light_color = "#FFFFFF"
|
||||
light_on = TRUE
|
||||
|
||||
/obj/effect/map_effect/perma_light/brighter
|
||||
name = "permanent light (bright)"
|
||||
icon_state = "permalight"
|
||||
|
||||
light_range = 5
|
||||
light_power = 3
|
||||
light_color = "#FFFFFF"
|
||||
|
||||
/obj/effect/map_effect/perma_light/concentrated
|
||||
name = "permanent light (concentrated)"
|
||||
|
||||
light_range = 2
|
||||
light_power = 5
|
||||
|
||||
/obj/effect/map_effect/perma_light/concentrated/incandescent
|
||||
name = "permanent light (concentrated incandescent)"
|
||||
|
||||
light_color = LIGHT_COLOR_INCANDESCENT_TUBE
|
||||
|
||||
// VOREStation Addition Start
|
||||
/obj/effect/map_effect/perma_light/gateway
|
||||
name = "permanent light (gateway)"
|
||||
icon_state = "permalight"
|
||||
|
||||
light_range = 10
|
||||
light_power = 5
|
||||
light_color = "#b6cdff"
|
||||
// Emits light forever with magic. Useful for mood lighting in Points of Interest.
|
||||
// Be sure to check how it looks ingame, and fiddle with the settings until it looks right.
|
||||
/obj/effect/map_effect/perma_light
|
||||
name = "permanent light"
|
||||
icon_state = "permalight"
|
||||
|
||||
light_range = 3
|
||||
light_power = 1
|
||||
light_color = "#FFFFFF"
|
||||
light_on = TRUE
|
||||
|
||||
/obj/effect/map_effect/perma_light/brighter
|
||||
name = "permanent light (bright)"
|
||||
icon_state = "permalight"
|
||||
|
||||
light_range = 5
|
||||
light_power = 3
|
||||
light_color = "#FFFFFF"
|
||||
|
||||
/obj/effect/map_effect/perma_light/concentrated
|
||||
name = "permanent light (concentrated)"
|
||||
|
||||
light_range = 2
|
||||
light_power = 5
|
||||
|
||||
/obj/effect/map_effect/perma_light/concentrated/incandescent
|
||||
name = "permanent light (concentrated incandescent)"
|
||||
|
||||
light_color = LIGHT_COLOR_INCANDESCENT_TUBE
|
||||
|
||||
// VOREStation Addition Start
|
||||
/obj/effect/map_effect/perma_light/gateway
|
||||
name = "permanent light (gateway)"
|
||||
icon_state = "permalight"
|
||||
|
||||
light_range = 10
|
||||
light_power = 5
|
||||
light_color = "#b6cdff"
|
||||
// VOREStation Addition End
|
||||
@@ -1,19 +1,19 @@
|
||||
// Constantly emites radiation from the tile it's placed on.
|
||||
/obj/effect/map_effect/radiation_emitter
|
||||
name = "radiation emitter"
|
||||
icon_state = "radiation_emitter"
|
||||
var/radiation_power = 30 // Bigger numbers means more radiation.
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Initialize()
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/process()
|
||||
SSradiation.radiate(src, radiation_power)
|
||||
|
||||
// Constantly emites radiation from the tile it's placed on.
|
||||
/obj/effect/map_effect/radiation_emitter
|
||||
name = "radiation emitter"
|
||||
icon_state = "radiation_emitter"
|
||||
var/radiation_power = 30 // Bigger numbers means more radiation.
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Initialize()
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/process()
|
||||
SSradiation.radiate(src, radiation_power)
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/strong
|
||||
radiation_power = 100
|
||||
@@ -1,17 +1,17 @@
|
||||
// Makes the screen shake for nearby players every so often.
|
||||
/obj/effect/map_effect/interval/screen_shaker
|
||||
name = "screen shaker"
|
||||
icon_state = "screen_shaker"
|
||||
|
||||
interval_lower_bound = 1 SECOND
|
||||
interval_upper_bound = 2 SECONDS
|
||||
|
||||
var/shake_radius = 7 // How far the shaking effect extends to. By default it is one screen length.
|
||||
var/shake_duration = 2 // How long the shaking lasts.
|
||||
var/shake_strength = 1 // How much it shakes.
|
||||
|
||||
/obj/effect/map_effect/interval/screen_shaker/trigger()
|
||||
for(var/mob/M as anything in player_list)
|
||||
if(M.z == src.z && get_dist(src, M) <= shake_radius)
|
||||
shake_camera(M, shake_duration, shake_strength)
|
||||
// Makes the screen shake for nearby players every so often.
|
||||
/obj/effect/map_effect/interval/screen_shaker
|
||||
name = "screen shaker"
|
||||
icon_state = "screen_shaker"
|
||||
|
||||
interval_lower_bound = 1 SECOND
|
||||
interval_upper_bound = 2 SECONDS
|
||||
|
||||
var/shake_radius = 7 // How far the shaking effect extends to. By default it is one screen length.
|
||||
var/shake_duration = 2 // How long the shaking lasts.
|
||||
var/shake_strength = 1 // How much it shakes.
|
||||
|
||||
/obj/effect/map_effect/interval/screen_shaker/trigger()
|
||||
for(var/mob/M as anything in player_list)
|
||||
if(M.z == src.z && get_dist(src, M) <= shake_radius)
|
||||
shake_camera(M, shake_duration, shake_strength)
|
||||
..()
|
||||
+404
-404
@@ -1,404 +1,404 @@
|
||||
/obj/effect/mine
|
||||
name = "land mine" //The name and description are deliberately NOT modified, so you can't game the mines you find.
|
||||
desc = "A small explosive land mine."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "landmine"
|
||||
var/triggered = 0
|
||||
var/smoke_strength = 3
|
||||
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
|
||||
var/panel_open = FALSE
|
||||
var/datum/wires/mines/wires = null
|
||||
var/camo_net = FALSE // Will the mine 'cloak' on deployment?
|
||||
|
||||
// The trap item will be triggered in some manner when detonating. Default only checks for grenades.
|
||||
var/obj/item/trap = null
|
||||
|
||||
/obj/effect/mine/Initialize()
|
||||
icon_state = "landmine_armed"
|
||||
wires = new(src)
|
||||
. = ..()
|
||||
if(ispath(trap))
|
||||
trap = new trap(src)
|
||||
register_dangerous_to_step()
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
/obj/effect/mine/Destroy()
|
||||
unregister_dangerous_to_step()
|
||||
if(trap)
|
||||
QDEL_NULL(trap)
|
||||
qdel_null(wires)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mine/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
/obj/effect/mine/proc/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/trigger_trap(var/mob/living/victim)
|
||||
if(istype(trap, /obj/item/weapon/grenade))
|
||||
var/obj/item/weapon/grenade/G = trap
|
||||
trap = null
|
||||
G.forceMove(get_turf(src))
|
||||
if(victim.ckey)
|
||||
msg_admin_attack("[key_name_admin(victim)] stepped on \a [src.name], triggering [trap]")
|
||||
G.activate()
|
||||
|
||||
if(istype(trap, /obj/item/device/transfer_valve))
|
||||
var/obj/item/device/transfer_valve/TV = trap
|
||||
trap = null
|
||||
TV.forceMove(get_turf(src))
|
||||
TV.toggle_valve()
|
||||
|
||||
/obj/effect/mine/bullet_act()
|
||||
if(prob(50))
|
||||
explode()
|
||||
|
||||
/obj/effect/mine/ex_act(severity)
|
||||
if(severity <= 2 || prob(50))
|
||||
explode()
|
||||
..()
|
||||
|
||||
/obj/effect/mine/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/mine/Bumped(mob/M as mob|obj)
|
||||
|
||||
if(triggered)
|
||||
return
|
||||
|
||||
if(istype(M, /obj/mecha))
|
||||
explode(M)
|
||||
|
||||
if(istype(M, /mob/living/))
|
||||
var/mob/living/mob = M
|
||||
if(!mob.hovering || !mob.flying)
|
||||
explode(M)
|
||||
|
||||
/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(W.has_tool_quality(TOOL_SCREWDRIVER))
|
||||
panel_open = !panel_open
|
||||
user.visible_message("<span class='warning'>[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].</span>",
|
||||
"<span class='notice'>You very carefully screw the mine's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
|
||||
// Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha.
|
||||
alpha = camo_net ? (panel_open ? 255 : 50) : 255
|
||||
|
||||
else if((W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/multitool)) && panel_open)
|
||||
interact(user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/effect/mine/interact(mob/living/user as mob)
|
||||
if(!panel_open || istype(user, /mob/living/silicon/ai))
|
||||
return
|
||||
user.set_machine(src)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/effect/mine/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
mineitemtype = /obj/item/weapon/mine/dnascramble
|
||||
|
||||
/obj/effect/mine/dnascramble/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M))
|
||||
M.radiation += 50
|
||||
randmutb(M)
|
||||
domutcheck(M,null)
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/stun
|
||||
mineitemtype = /obj/item/weapon/mine/stun
|
||||
|
||||
/obj/effect/mine/stun/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M))
|
||||
M.Stun(30)
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/n2o
|
||||
mineitemtype = /obj/item/weapon/mine/n2o
|
||||
|
||||
/obj/effect/mine/n2o/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
for (var/turf/simulated/floor/target in range(1,src))
|
||||
if(!target.blocks_air)
|
||||
target.assume_gas("nitrous_oxide", 30)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/phoron
|
||||
mineitemtype = /obj/item/weapon/mine/phoron
|
||||
|
||||
/obj/effect/mine/phoron/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
for (var/turf/simulated/floor/target in range(1,src))
|
||||
if(!target.blocks_air)
|
||||
target.assume_gas("phoron", 30)
|
||||
target.hotspot_expose(1000, CELL_VOLUME)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/kick
|
||||
mineitemtype = /obj/item/weapon/mine/kick
|
||||
|
||||
/obj/effect/mine/kick/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M, /obj/mecha))
|
||||
var/obj/mecha/E = M
|
||||
M = E.occupant
|
||||
if(istype(M))
|
||||
qdel(M.client)
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/frag
|
||||
mineitemtype = /obj/item/weapon/mine/frag
|
||||
var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment)
|
||||
var/num_fragments = 20 //total number of fragments produced by the grenade
|
||||
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
|
||||
var/spread_range = 7
|
||||
|
||||
/obj/effect/mine/frag/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
var/turf/O = get_turf(src)
|
||||
if(!O)
|
||||
return
|
||||
src.fragmentate(O, 20, 7, list(/obj/item/projectile/bullet/pellet/fragment)) //only 20 weak fragments because you're stepping directly on it
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/training //Name and Desc commented out so it's possible to trick people with the training mines
|
||||
// name = "training mine"
|
||||
// desc = "A mine with its payload removed, for EOD training and demonstrations."
|
||||
mineitemtype = /obj/item/weapon/mine/training
|
||||
|
||||
/obj/effect/mine/training/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
visible_message("\The [src.name]'s light flashes rapidly as it 'explodes'.")
|
||||
new src.mineitemtype(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp
|
||||
mineitemtype = /obj/item/weapon/mine/emp
|
||||
|
||||
/obj/effect/mine/emp/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
empulse(loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/incendiary
|
||||
mineitemtype = /obj/item/weapon/mine/incendiary
|
||||
|
||||
/obj/effect/mine/incendiary/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M))
|
||||
M.adjust_fire_stacks(5)
|
||||
M.fire_act()
|
||||
visible_message("\The [src.name] bursts into flames!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/gadget
|
||||
mineitemtype = /obj/item/weapon/mine/gadget
|
||||
|
||||
/obj/effect/mine/gadget/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 0, 2, 2)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// The held item version of the above mines
|
||||
/////////////////////////////////////////////
|
||||
/obj/item/weapon/mine
|
||||
name = "mine"
|
||||
desc = "A small explosive mine with 'HE' and a grenade symbol on the side."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
var/countdown = 10
|
||||
var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
|
||||
|
||||
var/obj/item/trap = null
|
||||
|
||||
var/list/allowed_gadgets = null
|
||||
|
||||
/obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
|
||||
add_fingerprint(user)
|
||||
msg_admin_attack("[key_name_admin(user)] primed \a [src]")
|
||||
user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
prime(user)
|
||||
else
|
||||
visible_message("[user] triggers \the [src.name]!", "You accidentally trigger \the [src.name]!")
|
||||
prime(user, TRUE)
|
||||
return
|
||||
|
||||
/obj/item/weapon/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(W.has_tool_quality(TOOL_SCREWDRIVER) && trap)
|
||||
to_chat(user, "<span class='notice'>You begin removing \the [trap].</span>")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
to_chat(user, "<span class='notice'>You finish disconnecting the mine's trigger.</span>")
|
||||
trap.forceMove(get_turf(src))
|
||||
trap = null
|
||||
return
|
||||
|
||||
if(LAZYLEN(allowed_gadgets) && !trap)
|
||||
var/allowed = FALSE
|
||||
|
||||
for(var/path in allowed_gadgets)
|
||||
if(istype(W, path))
|
||||
allowed = TRUE
|
||||
break
|
||||
|
||||
if(allowed)
|
||||
user.drop_from_inventory(W)
|
||||
W.forceMove(src)
|
||||
trap = W
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
|
||||
visible_message("\The [src.name] beeps as the priming sequence completes.")
|
||||
var/obj/effect/mine/R = new minetype(get_turf(src))
|
||||
src.transfer_fingerprints_to(R)
|
||||
R.add_fingerprint(user)
|
||||
if(trap)
|
||||
R.trap = trap
|
||||
trap = null
|
||||
R.trap.forceMove(R)
|
||||
if(explode_now)
|
||||
R.explode(user)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/mine/dnascramble
|
||||
name = "radiation mine"
|
||||
desc = "A small explosive mine with a radiation symbol on the side."
|
||||
minetype = /obj/effect/mine/dnascramble
|
||||
|
||||
/obj/item/weapon/mine/phoron
|
||||
name = "incendiary mine"
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/phoron
|
||||
|
||||
/obj/item/weapon/mine/kick
|
||||
name = "kick mine"
|
||||
desc = "Concentrated war crimes. Handle with care."
|
||||
minetype = /obj/effect/mine/kick
|
||||
|
||||
/obj/item/weapon/mine/n2o
|
||||
name = "nitrous oxide mine"
|
||||
desc = "A small explosive mine with three Z's on the side."
|
||||
minetype = /obj/effect/mine/n2o
|
||||
|
||||
/obj/item/weapon/mine/stun
|
||||
name = "stun mine"
|
||||
desc = "A small explosive mine with a lightning bolt symbol on the side."
|
||||
minetype = /obj/effect/mine/stun
|
||||
|
||||
/obj/item/weapon/mine/frag
|
||||
name = "fragmentation mine"
|
||||
desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side."
|
||||
minetype = /obj/effect/mine/frag
|
||||
|
||||
/obj/item/weapon/mine/training
|
||||
name = "training mine"
|
||||
desc = "A mine with its payload removed, for EOD training and demonstrations."
|
||||
minetype = /obj/effect/mine/training
|
||||
|
||||
/obj/item/weapon/mine/emp
|
||||
name = "emp mine"
|
||||
desc = "A small explosive mine with a lightning bolt symbol on the side."
|
||||
minetype = /obj/effect/mine/emp
|
||||
|
||||
/obj/item/weapon/mine/incendiary
|
||||
name = "incendiary mine"
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/incendiary
|
||||
|
||||
/obj/item/weapon/mine/gadget
|
||||
name = "gadget mine"
|
||||
desc = "A small pressure-triggered device. If no component is added, the internal release bolts will detonate in unison when triggered."
|
||||
|
||||
allowed_gadgets = list(/obj/item/weapon/grenade, /obj/item/device/transfer_valve)
|
||||
|
||||
// This tells AI mobs to not be dumb and step on mines willingly.
|
||||
/obj/item/weapon/mine/is_safe_to_step(mob/living/L)
|
||||
if(!L.hovering || !L.flying)
|
||||
return FALSE
|
||||
return ..()
|
||||
/obj/effect/mine
|
||||
name = "land mine" //The name and description are deliberately NOT modified, so you can't game the mines you find.
|
||||
desc = "A small explosive land mine."
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "landmine"
|
||||
var/triggered = 0
|
||||
var/smoke_strength = 3
|
||||
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
|
||||
var/panel_open = FALSE
|
||||
var/datum/wires/mines/wires = null
|
||||
var/camo_net = FALSE // Will the mine 'cloak' on deployment?
|
||||
|
||||
// The trap item will be triggered in some manner when detonating. Default only checks for grenades.
|
||||
var/obj/item/trap = null
|
||||
|
||||
/obj/effect/mine/Initialize()
|
||||
icon_state = "landmine_armed"
|
||||
wires = new(src)
|
||||
. = ..()
|
||||
if(ispath(trap))
|
||||
trap = new trap(src)
|
||||
register_dangerous_to_step()
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
/obj/effect/mine/Destroy()
|
||||
unregister_dangerous_to_step()
|
||||
if(trap)
|
||||
QDEL_NULL(trap)
|
||||
qdel_null(wires)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mine/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
/obj/effect/mine/proc/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/trigger_trap(var/mob/living/victim)
|
||||
if(istype(trap, /obj/item/weapon/grenade))
|
||||
var/obj/item/weapon/grenade/G = trap
|
||||
trap = null
|
||||
G.forceMove(get_turf(src))
|
||||
if(victim.ckey)
|
||||
msg_admin_attack("[key_name_admin(victim)] stepped on \a [src.name], triggering [trap]")
|
||||
G.activate()
|
||||
|
||||
if(istype(trap, /obj/item/device/transfer_valve))
|
||||
var/obj/item/device/transfer_valve/TV = trap
|
||||
trap = null
|
||||
TV.forceMove(get_turf(src))
|
||||
TV.toggle_valve()
|
||||
|
||||
/obj/effect/mine/bullet_act()
|
||||
if(prob(50))
|
||||
explode()
|
||||
|
||||
/obj/effect/mine/ex_act(severity)
|
||||
if(severity <= 2 || prob(50))
|
||||
explode()
|
||||
..()
|
||||
|
||||
/obj/effect/mine/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/mine/Bumped(mob/M as mob|obj)
|
||||
|
||||
if(triggered)
|
||||
return
|
||||
|
||||
if(istype(M, /obj/mecha))
|
||||
explode(M)
|
||||
|
||||
if(istype(M, /mob/living/))
|
||||
var/mob/living/mob = M
|
||||
if(!mob.hovering || !mob.flying)
|
||||
explode(M)
|
||||
|
||||
/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(W.has_tool_quality(TOOL_SCREWDRIVER))
|
||||
panel_open = !panel_open
|
||||
user.visible_message("<span class='warning'>[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].</span>",
|
||||
"<span class='notice'>You very carefully screw the mine's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
|
||||
// Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha.
|
||||
alpha = camo_net ? (panel_open ? 255 : 50) : 255
|
||||
|
||||
else if((W.has_tool_quality(TOOL_WIRECUTTER) || istype(W, /obj/item/device/multitool)) && panel_open)
|
||||
interact(user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/effect/mine/interact(mob/living/user as mob)
|
||||
if(!panel_open || istype(user, /mob/living/silicon/ai))
|
||||
return
|
||||
user.set_machine(src)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/effect/mine/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
mineitemtype = /obj/item/weapon/mine/dnascramble
|
||||
|
||||
/obj/effect/mine/dnascramble/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M))
|
||||
M.radiation += 50
|
||||
randmutb(M)
|
||||
domutcheck(M,null)
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/stun
|
||||
mineitemtype = /obj/item/weapon/mine/stun
|
||||
|
||||
/obj/effect/mine/stun/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M))
|
||||
M.Stun(30)
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/n2o
|
||||
mineitemtype = /obj/item/weapon/mine/n2o
|
||||
|
||||
/obj/effect/mine/n2o/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
for (var/turf/simulated/floor/target in range(1,src))
|
||||
if(!target.blocks_air)
|
||||
target.assume_gas("nitrous_oxide", 30)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/phoron
|
||||
mineitemtype = /obj/item/weapon/mine/phoron
|
||||
|
||||
/obj/effect/mine/phoron/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
for (var/turf/simulated/floor/target in range(1,src))
|
||||
if(!target.blocks_air)
|
||||
target.assume_gas("phoron", 30)
|
||||
target.hotspot_expose(1000, CELL_VOLUME)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/kick
|
||||
mineitemtype = /obj/item/weapon/mine/kick
|
||||
|
||||
/obj/effect/mine/kick/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M, /obj/mecha))
|
||||
var/obj/mecha/E = M
|
||||
M = E.occupant
|
||||
if(istype(M))
|
||||
qdel(M.client)
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/frag
|
||||
mineitemtype = /obj/item/weapon/mine/frag
|
||||
var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment)
|
||||
var/num_fragments = 20 //total number of fragments produced by the grenade
|
||||
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
|
||||
var/spread_range = 7
|
||||
|
||||
/obj/effect/mine/frag/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
var/turf/O = get_turf(src)
|
||||
if(!O)
|
||||
return
|
||||
src.fragmentate(O, 20, 7, list(/obj/item/projectile/bullet/pellet/fragment)) //only 20 weak fragments because you're stepping directly on it
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/training //Name and Desc commented out so it's possible to trick people with the training mines
|
||||
// name = "training mine"
|
||||
// desc = "A mine with its payload removed, for EOD training and demonstrations."
|
||||
mineitemtype = /obj/item/weapon/mine/training
|
||||
|
||||
/obj/effect/mine/training/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
visible_message("\The [src.name]'s light flashes rapidly as it 'explodes'.")
|
||||
new src.mineitemtype(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp
|
||||
mineitemtype = /obj/item/weapon/mine/emp
|
||||
|
||||
/obj/effect/mine/emp/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
empulse(loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/incendiary
|
||||
mineitemtype = /obj/item/weapon/mine/incendiary
|
||||
|
||||
/obj/effect/mine/incendiary/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(istype(M))
|
||||
M.adjust_fire_stacks(5)
|
||||
M.fire_act()
|
||||
visible_message("\The [src.name] bursts into flames!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/gadget
|
||||
mineitemtype = /obj/item/weapon/mine/gadget
|
||||
|
||||
/obj/effect/mine/gadget/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 0, 2, 2)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// The held item version of the above mines
|
||||
/////////////////////////////////////////////
|
||||
/obj/item/weapon/mine
|
||||
name = "mine"
|
||||
desc = "A small explosive mine with 'HE' and a grenade symbol on the side."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
var/countdown = 10
|
||||
var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
|
||||
|
||||
var/obj/item/trap = null
|
||||
|
||||
var/list/allowed_gadgets = null
|
||||
|
||||
/obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
|
||||
add_fingerprint(user)
|
||||
msg_admin_attack("[key_name_admin(user)] primed \a [src]")
|
||||
user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
prime(user)
|
||||
else
|
||||
visible_message("[user] triggers \the [src.name]!", "You accidentally trigger \the [src.name]!")
|
||||
prime(user, TRUE)
|
||||
return
|
||||
|
||||
/obj/item/weapon/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(W.has_tool_quality(TOOL_SCREWDRIVER) && trap)
|
||||
to_chat(user, "<span class='notice'>You begin removing \the [trap].</span>")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
to_chat(user, "<span class='notice'>You finish disconnecting the mine's trigger.</span>")
|
||||
trap.forceMove(get_turf(src))
|
||||
trap = null
|
||||
return
|
||||
|
||||
if(LAZYLEN(allowed_gadgets) && !trap)
|
||||
var/allowed = FALSE
|
||||
|
||||
for(var/path in allowed_gadgets)
|
||||
if(istype(W, path))
|
||||
allowed = TRUE
|
||||
break
|
||||
|
||||
if(allowed)
|
||||
user.drop_from_inventory(W)
|
||||
W.forceMove(src)
|
||||
trap = W
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
|
||||
visible_message("\The [src.name] beeps as the priming sequence completes.")
|
||||
var/obj/effect/mine/R = new minetype(get_turf(src))
|
||||
src.transfer_fingerprints_to(R)
|
||||
R.add_fingerprint(user)
|
||||
if(trap)
|
||||
R.trap = trap
|
||||
trap = null
|
||||
R.trap.forceMove(R)
|
||||
if(explode_now)
|
||||
R.explode(user)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/mine/dnascramble
|
||||
name = "radiation mine"
|
||||
desc = "A small explosive mine with a radiation symbol on the side."
|
||||
minetype = /obj/effect/mine/dnascramble
|
||||
|
||||
/obj/item/weapon/mine/phoron
|
||||
name = "incendiary mine"
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/phoron
|
||||
|
||||
/obj/item/weapon/mine/kick
|
||||
name = "kick mine"
|
||||
desc = "Concentrated war crimes. Handle with care."
|
||||
minetype = /obj/effect/mine/kick
|
||||
|
||||
/obj/item/weapon/mine/n2o
|
||||
name = "nitrous oxide mine"
|
||||
desc = "A small explosive mine with three Z's on the side."
|
||||
minetype = /obj/effect/mine/n2o
|
||||
|
||||
/obj/item/weapon/mine/stun
|
||||
name = "stun mine"
|
||||
desc = "A small explosive mine with a lightning bolt symbol on the side."
|
||||
minetype = /obj/effect/mine/stun
|
||||
|
||||
/obj/item/weapon/mine/frag
|
||||
name = "fragmentation mine"
|
||||
desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side."
|
||||
minetype = /obj/effect/mine/frag
|
||||
|
||||
/obj/item/weapon/mine/training
|
||||
name = "training mine"
|
||||
desc = "A mine with its payload removed, for EOD training and demonstrations."
|
||||
minetype = /obj/effect/mine/training
|
||||
|
||||
/obj/item/weapon/mine/emp
|
||||
name = "emp mine"
|
||||
desc = "A small explosive mine with a lightning bolt symbol on the side."
|
||||
minetype = /obj/effect/mine/emp
|
||||
|
||||
/obj/item/weapon/mine/incendiary
|
||||
name = "incendiary mine"
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/incendiary
|
||||
|
||||
/obj/item/weapon/mine/gadget
|
||||
name = "gadget mine"
|
||||
desc = "A small pressure-triggered device. If no component is added, the internal release bolts will detonate in unison when triggered."
|
||||
|
||||
allowed_gadgets = list(/obj/item/weapon/grenade, /obj/item/device/transfer_valve)
|
||||
|
||||
// This tells AI mobs to not be dumb and step on mines willingly.
|
||||
/obj/item/weapon/mine/is_safe_to_step(mob/living/L)
|
||||
if(!L.hovering || !L.flying)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
+152
-152
@@ -1,152 +1,152 @@
|
||||
//The effect when you wrap a dead body in gift wrap
|
||||
/obj/effect/spresent
|
||||
name = "strange present"
|
||||
desc = "It's a ... present?"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "strangepresent"
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
|
||||
/obj/effect/temporary_effect
|
||||
name = "self deleting effect"
|
||||
desc = "How are you examining what which cannot be seen?"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
invisibility = 0
|
||||
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
|
||||
|
||||
/obj/effect/temporary_effect/Initialize()
|
||||
. = ..()
|
||||
if(time_to_die)
|
||||
QDEL_IN(src, time_to_die)
|
||||
|
||||
// Shown really briefly when attacking with axes.
|
||||
/obj/effect/temporary_effect/cleave_attack
|
||||
name = "cleaving attack"
|
||||
desc = "Something swinging really wide."
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "cleave"
|
||||
plane = ABOVE_MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
time_to_die = 6
|
||||
alpha = 140
|
||||
mouse_opacity = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/temporary_effect/cleave_attack/Initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself.
|
||||
. = ..()
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
|
||||
/obj/effect/temporary_effect/shuttle_landing
|
||||
name = "shuttle landing"
|
||||
desc = "You better move if you don't want to go splat!"
|
||||
//VOREStation Edit Start
|
||||
icon = 'icons/goonstation/featherzone.dmi'
|
||||
icon_state = "hazard-corners"
|
||||
time_to_die = 5 SECONDS
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
//VOREStation Edit End
|
||||
|
||||
// The manifestation of Zeus's might. Or just a really unlucky day.
|
||||
// This is purely a visual effect, this isn't the part of the code that hurts things.
|
||||
/obj/effect/temporary_effect/lightning_strike
|
||||
name = "lightning"
|
||||
desc = "How <i>shocked</i> you must be, to see this text. You must have <i>lightning</i> reflexes. \
|
||||
The humor in this description is just so <i>electrifying</i>."
|
||||
icon = 'icons/effects/96x256.dmi'
|
||||
icon_state = "lightning_strike"
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
time_to_die = 1 SECOND
|
||||
pixel_x = -32
|
||||
|
||||
/obj/effect/temporary_effect/lightning_strike/Initialize()
|
||||
icon_state += "[rand(1,2)]" // To have two variants of lightning sprites.
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/dummy/lighting_obj
|
||||
name = "lighting fx obj"
|
||||
desc = "Tell a coder if you're seeing this."
|
||||
icon_state = "nothing"
|
||||
light_system = MOVABLE_LIGHT
|
||||
light_range = MINIMUM_USEFUL_LIGHT_RANGE
|
||||
light_color = COLOR_WHITE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
light_on = TRUE
|
||||
blocks_emissive = FALSE
|
||||
|
||||
/obj/effect/dummy/lighting_obj/Initialize(mapload, _range, _power, _color, _duration)
|
||||
. = ..()
|
||||
if(!isnull(_range))
|
||||
set_light_range(_range)
|
||||
if(!isnull(_power))
|
||||
set_light_power(_power)
|
||||
if(!isnull(_color))
|
||||
set_light_color(_color)
|
||||
if(_duration)
|
||||
QDEL_IN(src, _duration)
|
||||
|
||||
/obj/effect/dummy/lighting_obj/moblight
|
||||
name = "mob lighting fx"
|
||||
|
||||
/obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, _color, _range, _power, _duration)
|
||||
. = ..()
|
||||
if(!ismob(loc))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/dummy/lighting_obj/moblight/fire
|
||||
name = "fire"
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
light_range = LIGHT_RANGE_FIRE
|
||||
|
||||
/obj/effect/abstract
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
plane = ABOVE_MOB_PLANE
|
||||
|
||||
/obj/effect/abstract/light_spot
|
||||
icon = 'icons/effects/eris_flashlight.dmi'
|
||||
icon_state = "medium"
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
|
||||
/obj/effect/abstract/directional_lighting
|
||||
var/obj/effect/abstract/light_spot/light_spot = new
|
||||
var/trans_angle
|
||||
var/icon_dist
|
||||
|
||||
/obj/effect/abstract/directional_lighting/Initialize()
|
||||
. = ..()
|
||||
vis_contents += light_spot
|
||||
|
||||
/obj/effect/abstract/directional_lighting/proc/face_light(atom/movable/source, angle, distance)
|
||||
if(!loc) // We're in nullspace
|
||||
return
|
||||
|
||||
// Save ourselves some matrix math
|
||||
if(angle != trans_angle)
|
||||
trans_angle = angle
|
||||
// Doing this in one operation (tn = turn(initial(tn), angle)) has strange results...
|
||||
light_spot.transform = initial(light_spot.transform)
|
||||
light_spot.transform = turn(light_spot.transform, angle)
|
||||
|
||||
if(icon_dist != distance)
|
||||
icon_dist = distance
|
||||
switch(distance)
|
||||
if(0)
|
||||
light_spot.icon_state = "vclose"
|
||||
if(1)
|
||||
light_spot.icon_state = "close"
|
||||
if(2)
|
||||
light_spot.icon_state = "medium"
|
||||
if(3 to INFINITY)
|
||||
light_spot.icon_state = "far"
|
||||
|
||||
/obj/effect/abstract/directional_lighting/Destroy(force)
|
||||
if(!force)
|
||||
stack_trace("Directional light atom deleted, but not by our component")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
vis_contents.Cut()
|
||||
qdel_null(light_spot)
|
||||
|
||||
return ..()
|
||||
//The effect when you wrap a dead body in gift wrap
|
||||
/obj/effect/spresent
|
||||
name = "strange present"
|
||||
desc = "It's a ... present?"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "strangepresent"
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
|
||||
/obj/effect/temporary_effect
|
||||
name = "self deleting effect"
|
||||
desc = "How are you examining what which cannot be seen?"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
invisibility = 0
|
||||
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
|
||||
|
||||
/obj/effect/temporary_effect/Initialize()
|
||||
. = ..()
|
||||
if(time_to_die)
|
||||
QDEL_IN(src, time_to_die)
|
||||
|
||||
// Shown really briefly when attacking with axes.
|
||||
/obj/effect/temporary_effect/cleave_attack
|
||||
name = "cleaving attack"
|
||||
desc = "Something swinging really wide."
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "cleave"
|
||||
plane = ABOVE_MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
time_to_die = 6
|
||||
alpha = 140
|
||||
mouse_opacity = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/temporary_effect/cleave_attack/Initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself.
|
||||
. = ..()
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
|
||||
/obj/effect/temporary_effect/shuttle_landing
|
||||
name = "shuttle landing"
|
||||
desc = "You better move if you don't want to go splat!"
|
||||
//VOREStation Edit Start
|
||||
icon = 'icons/goonstation/featherzone.dmi'
|
||||
icon_state = "hazard-corners"
|
||||
time_to_die = 5 SECONDS
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
//VOREStation Edit End
|
||||
|
||||
// The manifestation of Zeus's might. Or just a really unlucky day.
|
||||
// This is purely a visual effect, this isn't the part of the code that hurts things.
|
||||
/obj/effect/temporary_effect/lightning_strike
|
||||
name = "lightning"
|
||||
desc = "How <i>shocked</i> you must be, to see this text. You must have <i>lightning</i> reflexes. \
|
||||
The humor in this description is just so <i>electrifying</i>."
|
||||
icon = 'icons/effects/96x256.dmi'
|
||||
icon_state = "lightning_strike"
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
time_to_die = 1 SECOND
|
||||
pixel_x = -32
|
||||
|
||||
/obj/effect/temporary_effect/lightning_strike/Initialize()
|
||||
icon_state += "[rand(1,2)]" // To have two variants of lightning sprites.
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/dummy/lighting_obj
|
||||
name = "lighting fx obj"
|
||||
desc = "Tell a coder if you're seeing this."
|
||||
icon_state = "nothing"
|
||||
light_system = MOVABLE_LIGHT
|
||||
light_range = MINIMUM_USEFUL_LIGHT_RANGE
|
||||
light_color = COLOR_WHITE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
light_on = TRUE
|
||||
blocks_emissive = FALSE
|
||||
|
||||
/obj/effect/dummy/lighting_obj/Initialize(mapload, _range, _power, _color, _duration)
|
||||
. = ..()
|
||||
if(!isnull(_range))
|
||||
set_light_range(_range)
|
||||
if(!isnull(_power))
|
||||
set_light_power(_power)
|
||||
if(!isnull(_color))
|
||||
set_light_color(_color)
|
||||
if(_duration)
|
||||
QDEL_IN(src, _duration)
|
||||
|
||||
/obj/effect/dummy/lighting_obj/moblight
|
||||
name = "mob lighting fx"
|
||||
|
||||
/obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, _color, _range, _power, _duration)
|
||||
. = ..()
|
||||
if(!ismob(loc))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/dummy/lighting_obj/moblight/fire
|
||||
name = "fire"
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
light_range = LIGHT_RANGE_FIRE
|
||||
|
||||
/obj/effect/abstract
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
plane = ABOVE_MOB_PLANE
|
||||
|
||||
/obj/effect/abstract/light_spot
|
||||
icon = 'icons/effects/eris_flashlight.dmi'
|
||||
icon_state = "medium"
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
|
||||
/obj/effect/abstract/directional_lighting
|
||||
var/obj/effect/abstract/light_spot/light_spot = new
|
||||
var/trans_angle
|
||||
var/icon_dist
|
||||
|
||||
/obj/effect/abstract/directional_lighting/Initialize()
|
||||
. = ..()
|
||||
vis_contents += light_spot
|
||||
|
||||
/obj/effect/abstract/directional_lighting/proc/face_light(atom/movable/source, angle, distance)
|
||||
if(!loc) // We're in nullspace
|
||||
return
|
||||
|
||||
// Save ourselves some matrix math
|
||||
if(angle != trans_angle)
|
||||
trans_angle = angle
|
||||
// Doing this in one operation (tn = turn(initial(tn), angle)) has strange results...
|
||||
light_spot.transform = initial(light_spot.transform)
|
||||
light_spot.transform = turn(light_spot.transform, angle)
|
||||
|
||||
if(icon_dist != distance)
|
||||
icon_dist = distance
|
||||
switch(distance)
|
||||
if(0)
|
||||
light_spot.icon_state = "vclose"
|
||||
if(1)
|
||||
light_spot.icon_state = "close"
|
||||
if(2)
|
||||
light_spot.icon_state = "medium"
|
||||
if(3 to INFINITY)
|
||||
light_spot.icon_state = "far"
|
||||
|
||||
/obj/effect/abstract/directional_lighting/Destroy(force)
|
||||
if(!force)
|
||||
stack_trace("Directional light atom deleted, but not by our component")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
vis_contents.Cut()
|
||||
qdel_null(light_spot)
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -1,191 +1,191 @@
|
||||
/obj/effect/overlay
|
||||
name = "overlay"
|
||||
unacidable = TRUE
|
||||
var/i_attached//Added for possible image attachments to objects. For hallucinations and the like.
|
||||
|
||||
/obj/effect/overlay/beam//Not actually a projectile, just an effect.
|
||||
name="beam"
|
||||
icon='icons/effects/beam.dmi'
|
||||
icon_state="b_beam"
|
||||
plane = ABOVE_OBJ_PLANE
|
||||
var/tmp/atom/BeamSource
|
||||
|
||||
/obj/effect/overlay/beam/New()
|
||||
..()
|
||||
spawn(10) qdel(src)
|
||||
|
||||
/obj/effect/overlay/palmtree_r
|
||||
name = "Palm tree"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm1"
|
||||
density = TRUE
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/overlay/palmtree_l
|
||||
name = "Palm tree"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm2"
|
||||
density = TRUE
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/overlay/coconut
|
||||
name = "Coconuts"
|
||||
icon = 'icons/misc/beach.dmi'
|
||||
icon_state = "coconuts"
|
||||
|
||||
/obj/effect/overlay/bluespacify
|
||||
name = "Bluespace"
|
||||
icon = 'icons/turf/space_vr.dmi' //VOREStation Edit
|
||||
icon_state = "bluespacify"
|
||||
plane = ABOVE_PLANE
|
||||
|
||||
/obj/effect/overlay/wallrot
|
||||
name = "wallrot"
|
||||
desc = "Ick..."
|
||||
icon = 'icons/effects/wallrot.dmi'
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/overlay/wallrot/New()
|
||||
..()
|
||||
pixel_x += rand(-10, 10)
|
||||
pixel_y += rand(-10, 10)
|
||||
|
||||
/obj/effect/overlay/snow
|
||||
name = "snow"
|
||||
icon = 'icons/turf/overlays.dmi'
|
||||
icon_state = "snow"
|
||||
anchored = TRUE
|
||||
plane = TURF_PLANE
|
||||
|
||||
// Todo: Add a version that gradually reaccumulates over time by means of alpha transparency. -Spades
|
||||
/obj/effect/overlay/snow/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/shovel))
|
||||
user.visible_message("<span class='notice'>[user] begins to shovel away \the [src].</span>")
|
||||
if(do_after(user, 40))
|
||||
to_chat(user, "<span class='notice'>You have finished shoveling!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/overlay/snow/floor
|
||||
icon_state = "snowfloor"
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
mouse_opacity = 0 //Don't block underlying tile interactions
|
||||
|
||||
/obj/effect/overlay/snow/floor/edges
|
||||
icon_state = "snow_edges"
|
||||
|
||||
/obj/effect/overlay/snow/floor/surround
|
||||
icon_state = "snow_surround"
|
||||
|
||||
/obj/effect/overlay/snow/airlock
|
||||
icon_state = "snowairlock"
|
||||
layer = DOOR_CLOSED_LAYER+0.01
|
||||
|
||||
/obj/effect/overlay/snow/floor/pointy
|
||||
icon_state = "snowfloorpointy"
|
||||
|
||||
/obj/effect/overlay/snow/wall
|
||||
icon_state = "snowwall"
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/effect/overlay/holographic
|
||||
mouse_opacity = FALSE
|
||||
anchored = TRUE
|
||||
plane = ABOVE_PLANE
|
||||
|
||||
// Similar to the tesla ball but doesn't actually do anything and is purely visual.
|
||||
/obj/effect/overlay/energy_ball
|
||||
name = "energy ball"
|
||||
desc = "An energy ball."
|
||||
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
|
||||
icon_state = "energy_ball"
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/overlay/vis
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
anchored = TRUE
|
||||
vis_flags = VIS_INHERIT_DIR
|
||||
///When detected to be unused it gets set to world.time, after a while it gets removed
|
||||
var/unused = 0
|
||||
///overlays which go unused for this amount of time get cleaned up
|
||||
var/cache_expiration = 2 MINUTES
|
||||
|
||||
/*
|
||||
/obj/effect/overlay/atmos_excited
|
||||
name = "excited group"
|
||||
icon = null
|
||||
icon_state = null
|
||||
anchored = TRUE // should only appear in vis_contents, but to be safe
|
||||
appearance_flags = RESET_TRANSFORM | TILE_BOUND
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
plane = ATMOS_GROUP_PLANE
|
||||
*/
|
||||
|
||||
/obj/effect/overlay/light_visible
|
||||
name = ""
|
||||
icon = 'icons/effects/light_overlays/light_32.dmi'
|
||||
icon_state = "light"
|
||||
plane = PLANE_O_LIGHTING_VISUAL
|
||||
appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
alpha = 0
|
||||
vis_flags = NONE
|
||||
blocks_emissive = FALSE
|
||||
|
||||
/obj/effect/overlay/light_visible/Destroy(force)
|
||||
if(!force)
|
||||
stack_trace("Movable light visible mask deleted, but not by our component")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
return ..()
|
||||
|
||||
/obj/effect/overlay/light_cone
|
||||
name = ""
|
||||
icon = 'icons/effects/light_overlays/light_cone.dmi'
|
||||
icon_state = "light"
|
||||
plane = PLANE_O_LIGHTING_VISUAL
|
||||
appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
vis_flags = NONE
|
||||
alpha = 110
|
||||
blocks_emissive = FALSE
|
||||
|
||||
var/static/matrix/normal_transform
|
||||
|
||||
/obj/effect/overlay/light_cone/Initialize()
|
||||
. = ..()
|
||||
apply_standard_transform()
|
||||
|
||||
/obj/effect/overlay/light_cone/proc/reset_transform(apply_standard)
|
||||
transform = initial(transform)
|
||||
if(apply_standard)
|
||||
apply_standard_transform()
|
||||
|
||||
/obj/effect/overlay/light_cone/proc/apply_standard_transform()
|
||||
transform = transform.Translate(-32, -32)
|
||||
|
||||
/obj/effect/overlay/light_cone/Destroy(force)
|
||||
if(!force)
|
||||
stack_trace("Directional light cone deleted, but not by our component")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
return ..()
|
||||
|
||||
/obj/effect/overlay/closet_door
|
||||
anchored = TRUE
|
||||
plane = FLOAT_PLANE
|
||||
layer = FLOAT_LAYER
|
||||
vis_flags = VIS_INHERIT_ID
|
||||
appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE
|
||||
/obj/effect/overlay
|
||||
name = "overlay"
|
||||
unacidable = TRUE
|
||||
var/i_attached//Added for possible image attachments to objects. For hallucinations and the like.
|
||||
|
||||
/obj/effect/overlay/beam//Not actually a projectile, just an effect.
|
||||
name="beam"
|
||||
icon='icons/effects/beam.dmi'
|
||||
icon_state="b_beam"
|
||||
plane = ABOVE_OBJ_PLANE
|
||||
var/tmp/atom/BeamSource
|
||||
|
||||
/obj/effect/overlay/beam/New()
|
||||
..()
|
||||
spawn(10) qdel(src)
|
||||
|
||||
/obj/effect/overlay/palmtree_r
|
||||
name = "Palm tree"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm1"
|
||||
density = TRUE
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/overlay/palmtree_l
|
||||
name = "Palm tree"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm2"
|
||||
density = TRUE
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/overlay/coconut
|
||||
name = "Coconuts"
|
||||
icon = 'icons/misc/beach.dmi'
|
||||
icon_state = "coconuts"
|
||||
|
||||
/obj/effect/overlay/bluespacify
|
||||
name = "Bluespace"
|
||||
icon = 'icons/turf/space_vr.dmi' //VOREStation Edit
|
||||
icon_state = "bluespacify"
|
||||
plane = ABOVE_PLANE
|
||||
|
||||
/obj/effect/overlay/wallrot
|
||||
name = "wallrot"
|
||||
desc = "Ick..."
|
||||
icon = 'icons/effects/wallrot.dmi'
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/overlay/wallrot/New()
|
||||
..()
|
||||
pixel_x += rand(-10, 10)
|
||||
pixel_y += rand(-10, 10)
|
||||
|
||||
/obj/effect/overlay/snow
|
||||
name = "snow"
|
||||
icon = 'icons/turf/overlays.dmi'
|
||||
icon_state = "snow"
|
||||
anchored = TRUE
|
||||
plane = TURF_PLANE
|
||||
|
||||
// Todo: Add a version that gradually reaccumulates over time by means of alpha transparency. -Spades
|
||||
/obj/effect/overlay/snow/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/shovel))
|
||||
user.visible_message("<span class='notice'>[user] begins to shovel away \the [src].</span>")
|
||||
if(do_after(user, 40))
|
||||
to_chat(user, "<span class='notice'>You have finished shoveling!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/overlay/snow/floor
|
||||
icon_state = "snowfloor"
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
mouse_opacity = 0 //Don't block underlying tile interactions
|
||||
|
||||
/obj/effect/overlay/snow/floor/edges
|
||||
icon_state = "snow_edges"
|
||||
|
||||
/obj/effect/overlay/snow/floor/surround
|
||||
icon_state = "snow_surround"
|
||||
|
||||
/obj/effect/overlay/snow/airlock
|
||||
icon_state = "snowairlock"
|
||||
layer = DOOR_CLOSED_LAYER+0.01
|
||||
|
||||
/obj/effect/overlay/snow/floor/pointy
|
||||
icon_state = "snowfloorpointy"
|
||||
|
||||
/obj/effect/overlay/snow/wall
|
||||
icon_state = "snowwall"
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/effect/overlay/holographic
|
||||
mouse_opacity = FALSE
|
||||
anchored = TRUE
|
||||
plane = ABOVE_PLANE
|
||||
|
||||
// Similar to the tesla ball but doesn't actually do anything and is purely visual.
|
||||
/obj/effect/overlay/energy_ball
|
||||
name = "energy ball"
|
||||
desc = "An energy ball."
|
||||
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
|
||||
icon_state = "energy_ball"
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/overlay/vis
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
anchored = TRUE
|
||||
vis_flags = VIS_INHERIT_DIR
|
||||
///When detected to be unused it gets set to world.time, after a while it gets removed
|
||||
var/unused = 0
|
||||
///overlays which go unused for this amount of time get cleaned up
|
||||
var/cache_expiration = 2 MINUTES
|
||||
|
||||
/*
|
||||
/obj/effect/overlay/atmos_excited
|
||||
name = "excited group"
|
||||
icon = null
|
||||
icon_state = null
|
||||
anchored = TRUE // should only appear in vis_contents, but to be safe
|
||||
appearance_flags = RESET_TRANSFORM | TILE_BOUND
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
plane = ATMOS_GROUP_PLANE
|
||||
*/
|
||||
|
||||
/obj/effect/overlay/light_visible
|
||||
name = ""
|
||||
icon = 'icons/effects/light_overlays/light_32.dmi'
|
||||
icon_state = "light"
|
||||
plane = PLANE_O_LIGHTING_VISUAL
|
||||
appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
alpha = 0
|
||||
vis_flags = NONE
|
||||
blocks_emissive = FALSE
|
||||
|
||||
/obj/effect/overlay/light_visible/Destroy(force)
|
||||
if(!force)
|
||||
stack_trace("Movable light visible mask deleted, but not by our component")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
return ..()
|
||||
|
||||
/obj/effect/overlay/light_cone
|
||||
name = ""
|
||||
icon = 'icons/effects/light_overlays/light_cone.dmi'
|
||||
icon_state = "light"
|
||||
plane = PLANE_O_LIGHTING_VISUAL
|
||||
appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
vis_flags = NONE
|
||||
alpha = 110
|
||||
blocks_emissive = FALSE
|
||||
|
||||
var/static/matrix/normal_transform
|
||||
|
||||
/obj/effect/overlay/light_cone/Initialize()
|
||||
. = ..()
|
||||
apply_standard_transform()
|
||||
|
||||
/obj/effect/overlay/light_cone/proc/reset_transform(apply_standard)
|
||||
transform = initial(transform)
|
||||
if(apply_standard)
|
||||
apply_standard_transform()
|
||||
|
||||
/obj/effect/overlay/light_cone/proc/apply_standard_transform()
|
||||
transform = transform.Translate(-32, -32)
|
||||
|
||||
/obj/effect/overlay/light_cone/Destroy(force)
|
||||
if(!force)
|
||||
stack_trace("Directional light cone deleted, but not by our component")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
return ..()
|
||||
|
||||
/obj/effect/overlay/closet_door
|
||||
anchored = TRUE
|
||||
plane = FLOAT_PLANE
|
||||
layer = FLOAT_LAYER
|
||||
vis_flags = VIS_INHERIT_ID
|
||||
appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE
|
||||
|
||||
@@ -1,69 +1,69 @@
|
||||
GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
|
||||
|
||||
/obj/effect/portal
|
||||
name = "portal"
|
||||
desc = "Looks unstable. Best to test it with the clown."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "portal"
|
||||
density = TRUE
|
||||
unacidable = TRUE//Can't destroy energy portals.
|
||||
var/failchance = 5
|
||||
var/obj/item/target = null
|
||||
var/creator = null
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/portal/Bumped(mob/M as mob|obj)
|
||||
if(istype(M,/mob) && !(istype(M,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
src.teleport(M)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/portal/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
src.teleport(AM)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/portal/attack_hand(mob/user as mob)
|
||||
if(istype(user) && !(istype(user,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
src.teleport(user)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/portal/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 30 SECONDS)
|
||||
|
||||
/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
|
||||
if(istype(M, /obj/effect)) //sparks don't teleport
|
||||
return
|
||||
if (M.anchored&&istype(M, /obj/mecha))
|
||||
return
|
||||
if (icon_state == "portal1")
|
||||
return
|
||||
if (!( target ))
|
||||
qdel(src)
|
||||
return
|
||||
if (istype(M, /atom/movable))
|
||||
//VOREStation Addition Start: Prevent taurriding abuse
|
||||
if(istype(M, /mob/living))
|
||||
var/mob/living/L = M
|
||||
if(LAZYLEN(L.buckled_mobs))
|
||||
var/datum/riding/R = L.riding_datum
|
||||
for(var/rider in L.buckled_mobs)
|
||||
R.force_dismount(rider)
|
||||
//VOREStation Addition End: Prevent taurriding abuse
|
||||
if(prob(failchance)) //oh dear a problem, put em in deep space
|
||||
src.icon_state = "portal1"
|
||||
do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
|
||||
else
|
||||
do_teleport(M, target, 1) ///You will appear adjacent to the beacon
|
||||
|
||||
GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
|
||||
|
||||
/obj/effect/portal
|
||||
name = "portal"
|
||||
desc = "Looks unstable. Best to test it with the clown."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "portal"
|
||||
density = TRUE
|
||||
unacidable = TRUE//Can't destroy energy portals.
|
||||
var/failchance = 5
|
||||
var/obj/item/target = null
|
||||
var/creator = null
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/portal/Bumped(mob/M as mob|obj)
|
||||
if(istype(M,/mob) && !(istype(M,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
src.teleport(M)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/portal/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
src.teleport(AM)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/portal/attack_hand(mob/user as mob)
|
||||
if(istype(user) && !(istype(user,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
src.teleport(user)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/portal/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 30 SECONDS)
|
||||
|
||||
/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
|
||||
if(istype(M, /obj/effect)) //sparks don't teleport
|
||||
return
|
||||
if (M.anchored&&istype(M, /obj/mecha))
|
||||
return
|
||||
if (icon_state == "portal1")
|
||||
return
|
||||
if (!( target ))
|
||||
qdel(src)
|
||||
return
|
||||
if (istype(M, /atom/movable))
|
||||
//VOREStation Addition Start: Prevent taurriding abuse
|
||||
if(istype(M, /mob/living))
|
||||
var/mob/living/L = M
|
||||
if(LAZYLEN(L.buckled_mobs))
|
||||
var/datum/riding/R = L.riding_datum
|
||||
for(var/rider in L.buckled_mobs)
|
||||
R.force_dismount(rider)
|
||||
//VOREStation Addition End: Prevent taurriding abuse
|
||||
if(prob(failchance)) //oh dear a problem, put em in deep space
|
||||
src.icon_state = "portal1"
|
||||
do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
|
||||
else
|
||||
do_teleport(M, target, 1) ///You will appear adjacent to the beacon
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,143 +1,143 @@
|
||||
/client/proc/spawn_tanktransferbomb()
|
||||
set category = "Debug"
|
||||
set desc = "Spawn a tank transfer valve bomb"
|
||||
set name = "Instant TTV"
|
||||
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/obj/effect/spawner/newbomb/proto = /obj/effect/spawner/newbomb/radio/custom
|
||||
|
||||
var/p = tgui_input_number(usr, "Enter phoron amount (mol):","Phoron", initial(proto.phoron_amt))
|
||||
if(p == null) return
|
||||
|
||||
var/o = tgui_input_number(usr, "Enter oxygen amount (mol):","Oxygen", initial(proto.oxygen_amt))
|
||||
if(o == null) return
|
||||
|
||||
var/c = tgui_input_number(usr, "Enter carbon dioxide amount (mol):","Carbon Dioxide", initial(proto.carbon_amt))
|
||||
if(c == null) return
|
||||
|
||||
new /obj/effect/spawner/newbomb/radio/custom(get_turf(mob), p, o, c)
|
||||
|
||||
/obj/effect/spawner/newbomb
|
||||
name = "TTV bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
var/phoron_amt = 12
|
||||
var/oxygen_amt = 18
|
||||
var/carbon_amt = 0
|
||||
|
||||
/obj/effect/spawner/newbomb/timer
|
||||
name = "TTV bomb - timer"
|
||||
assembly_type = /obj/item/device/assembly/timer
|
||||
|
||||
/obj/effect/spawner/newbomb/timer/syndicate
|
||||
name = "TTV bomb - merc"
|
||||
//High yield bombs. Yes, it is possible to make these with toxins
|
||||
phoron_amt = 18.5
|
||||
oxygen_amt = 28.5
|
||||
|
||||
/obj/effect/spawner/newbomb/proximity
|
||||
name = "TTV bomb - proximity"
|
||||
assembly_type = /obj/item/device/assembly/prox_sensor
|
||||
|
||||
/obj/effect/spawner/newbomb/radio/custom/New(var/newloc, ph, ox, co)
|
||||
if(ph != null) phoron_amt = ph
|
||||
if(ox != null) oxygen_amt = ox
|
||||
if(co != null) carbon_amt = co
|
||||
..()
|
||||
|
||||
/obj/effect/spawner/newbomb/Initialize(newloc)
|
||||
..(newloc)
|
||||
var/obj/item/device/transfer_valve/V = new(src.loc)
|
||||
var/obj/item/weapon/tank/phoron/PT = new(V)
|
||||
var/obj/item/weapon/tank/oxygen/OT = new(V)
|
||||
|
||||
V.tank_one = PT
|
||||
V.tank_two = OT
|
||||
|
||||
PT.master = V
|
||||
OT.master = V
|
||||
|
||||
PT.valve_welded = 1
|
||||
PT.air_contents.gas["phoron"] = phoron_amt
|
||||
PT.air_contents.gas["carbon_dioxide"] = carbon_amt
|
||||
PT.air_contents.total_moles = phoron_amt + carbon_amt
|
||||
PT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1
|
||||
PT.air_contents.update_values()
|
||||
|
||||
OT.valve_welded = 1
|
||||
OT.air_contents.gas["oxygen"] = oxygen_amt
|
||||
OT.air_contents.total_moles = oxygen_amt
|
||||
OT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1
|
||||
OT.air_contents.update_values()
|
||||
|
||||
var/obj/item/device/assembly/S = new assembly_type(V)
|
||||
V.attached_device = S
|
||||
|
||||
S.holder = V
|
||||
S.toggle_secure()
|
||||
|
||||
V.update_icon()
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
|
||||
///////////////////////
|
||||
//One Tank Bombs, WOOOOOOO! -Luke
|
||||
///////////////////////
|
||||
|
||||
/obj/effect/spawner/onetankbomb
|
||||
name = "Single-tank bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
// var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
var/phoron_amt = 0
|
||||
var/oxygen_amt = 0
|
||||
|
||||
/obj/effect/spawner/onetankbomb/New(newloc) //just needs an assembly.
|
||||
..(newloc)
|
||||
|
||||
var/type = pick(/obj/item/weapon/tank/phoron/onetankbomb, /obj/item/weapon/tank/oxygen/onetankbomb)
|
||||
new type(src.loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/onetankbomb/full
|
||||
name = "Single-tank bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
// var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
/obj/effect/spawner/onetankbomb/full/New(newloc) //just needs an assembly.
|
||||
..(newloc)
|
||||
|
||||
var/type = pick(/obj/item/weapon/tank/phoron/onetankbomb/full, /obj/item/weapon/tank/oxygen/onetankbomb/full)
|
||||
new type(src.loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/onetankbomb/frag
|
||||
name = "Single-tank bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
// var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
/obj/effect/spawner/onetankbomb/full/New(newloc) //just needs an assembly.
|
||||
..(newloc)
|
||||
|
||||
var/type = pick(/obj/item/weapon/tank/phoron/onetankbomb/full, /obj/item/weapon/tank/oxygen/onetankbomb/full)
|
||||
new type(src.loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
/client/proc/spawn_tanktransferbomb()
|
||||
set category = "Debug"
|
||||
set desc = "Spawn a tank transfer valve bomb"
|
||||
set name = "Instant TTV"
|
||||
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/obj/effect/spawner/newbomb/proto = /obj/effect/spawner/newbomb/radio/custom
|
||||
|
||||
var/p = tgui_input_number(usr, "Enter phoron amount (mol):","Phoron", initial(proto.phoron_amt))
|
||||
if(p == null) return
|
||||
|
||||
var/o = tgui_input_number(usr, "Enter oxygen amount (mol):","Oxygen", initial(proto.oxygen_amt))
|
||||
if(o == null) return
|
||||
|
||||
var/c = tgui_input_number(usr, "Enter carbon dioxide amount (mol):","Carbon Dioxide", initial(proto.carbon_amt))
|
||||
if(c == null) return
|
||||
|
||||
new /obj/effect/spawner/newbomb/radio/custom(get_turf(mob), p, o, c)
|
||||
|
||||
/obj/effect/spawner/newbomb
|
||||
name = "TTV bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
var/phoron_amt = 12
|
||||
var/oxygen_amt = 18
|
||||
var/carbon_amt = 0
|
||||
|
||||
/obj/effect/spawner/newbomb/timer
|
||||
name = "TTV bomb - timer"
|
||||
assembly_type = /obj/item/device/assembly/timer
|
||||
|
||||
/obj/effect/spawner/newbomb/timer/syndicate
|
||||
name = "TTV bomb - merc"
|
||||
//High yield bombs. Yes, it is possible to make these with toxins
|
||||
phoron_amt = 18.5
|
||||
oxygen_amt = 28.5
|
||||
|
||||
/obj/effect/spawner/newbomb/proximity
|
||||
name = "TTV bomb - proximity"
|
||||
assembly_type = /obj/item/device/assembly/prox_sensor
|
||||
|
||||
/obj/effect/spawner/newbomb/radio/custom/New(var/newloc, ph, ox, co)
|
||||
if(ph != null) phoron_amt = ph
|
||||
if(ox != null) oxygen_amt = ox
|
||||
if(co != null) carbon_amt = co
|
||||
..()
|
||||
|
||||
/obj/effect/spawner/newbomb/Initialize(newloc)
|
||||
..(newloc)
|
||||
var/obj/item/device/transfer_valve/V = new(src.loc)
|
||||
var/obj/item/weapon/tank/phoron/PT = new(V)
|
||||
var/obj/item/weapon/tank/oxygen/OT = new(V)
|
||||
|
||||
V.tank_one = PT
|
||||
V.tank_two = OT
|
||||
|
||||
PT.master = V
|
||||
OT.master = V
|
||||
|
||||
PT.valve_welded = 1
|
||||
PT.air_contents.gas["phoron"] = phoron_amt
|
||||
PT.air_contents.gas["carbon_dioxide"] = carbon_amt
|
||||
PT.air_contents.total_moles = phoron_amt + carbon_amt
|
||||
PT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1
|
||||
PT.air_contents.update_values()
|
||||
|
||||
OT.valve_welded = 1
|
||||
OT.air_contents.gas["oxygen"] = oxygen_amt
|
||||
OT.air_contents.total_moles = oxygen_amt
|
||||
OT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1
|
||||
OT.air_contents.update_values()
|
||||
|
||||
var/obj/item/device/assembly/S = new assembly_type(V)
|
||||
V.attached_device = S
|
||||
|
||||
S.holder = V
|
||||
S.toggle_secure()
|
||||
|
||||
V.update_icon()
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
|
||||
///////////////////////
|
||||
//One Tank Bombs, WOOOOOOO! -Luke
|
||||
///////////////////////
|
||||
|
||||
/obj/effect/spawner/onetankbomb
|
||||
name = "Single-tank bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
// var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
var/phoron_amt = 0
|
||||
var/oxygen_amt = 0
|
||||
|
||||
/obj/effect/spawner/onetankbomb/New(newloc) //just needs an assembly.
|
||||
..(newloc)
|
||||
|
||||
var/type = pick(/obj/item/weapon/tank/phoron/onetankbomb, /obj/item/weapon/tank/oxygen/onetankbomb)
|
||||
new type(src.loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/onetankbomb/full
|
||||
name = "Single-tank bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
// var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
/obj/effect/spawner/onetankbomb/full/New(newloc) //just needs an assembly.
|
||||
..(newloc)
|
||||
|
||||
var/type = pick(/obj/item/weapon/tank/phoron/onetankbomb/full, /obj/item/weapon/tank/oxygen/onetankbomb/full)
|
||||
new type(src.loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/onetankbomb/frag
|
||||
name = "Single-tank bomb"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
// var/assembly_type = /obj/item/device/assembly/signaler
|
||||
|
||||
//Note that the maximum amount of gas you can put in a 70L air tank at 1013.25 kPa and 519K is 16.44 mol.
|
||||
/obj/effect/spawner/onetankbomb/full/New(newloc) //just needs an assembly.
|
||||
..(newloc)
|
||||
|
||||
var/type = pick(/obj/item/weapon/tank/phoron/onetankbomb/full, /obj/item/weapon/tank/oxygen/onetankbomb/full)
|
||||
new type(src.loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
/obj/effect/gibspawner/generic
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(2,2,1)
|
||||
|
||||
/obj/effect/gibspawner/generic/New()
|
||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||
..()
|
||||
|
||||
/obj/effect/gibspawner/human
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
|
||||
/obj/effect/gibspawner/human/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
/obj/effect/gibspawner/robot
|
||||
sparks = 1
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
|
||||
gibamounts = list(1,1,1,1,1,1)
|
||||
|
||||
/obj/effect/gibspawner/robot/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
/obj/effect/gibspawner/generic
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(2,2,1)
|
||||
|
||||
/obj/effect/gibspawner/generic/New()
|
||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||
..()
|
||||
|
||||
/obj/effect/gibspawner/human
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
|
||||
/obj/effect/gibspawner/human/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
/obj/effect/gibspawner/robot
|
||||
sparks = 1
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
|
||||
gibamounts = list(1,1,1,1,1,1)
|
||||
|
||||
/obj/effect/gibspawner/robot/New()
|
||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
@@ -1,324 +1,324 @@
|
||||
//generic procs copied from obj/effect/alien
|
||||
/obj/effect/spider
|
||||
name = "web"
|
||||
desc = "it's stringy and sticky"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
var/health = 15
|
||||
|
||||
//similar to weeds, but only barfed out by nurses manually
|
||||
/obj/effect/spider/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
|
||||
if(LAZYLEN(W.attack_verb))
|
||||
visible_message("<span class='warning'>\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
else
|
||||
visible_message("<span class='warning'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
if(W.has_tool_quality(TOOL_WELDER))
|
||||
var/obj/item/weapon/weldingtool/WT = W.get_welder()
|
||||
|
||||
if(WT.remove_fuel(0, user))
|
||||
damage = 15
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/spiderling/attack_hand(mob/living/user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.do_attack_animation(src)
|
||||
if(prob(20))
|
||||
visible_message("<span class='warning'>\The [user] tries to stomp on \the [src], but misses!</span>")
|
||||
var/list/nearby = oview(2, src)
|
||||
if(length(nearby))
|
||||
walk_to(src, pick(nearby), 2)
|
||||
return
|
||||
visible_message("<span class='warning'>\The [user] stomps \the [src] dead!</span>")
|
||||
die()
|
||||
|
||||
/obj/effect/spider/bullet_act(var/obj/item/projectile/Proj)
|
||||
..()
|
||||
health -= Proj.get_structure_damage()
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/proc/die()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
|
||||
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300 + T0C)
|
||||
health -= 5
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/stickyweb
|
||||
icon_state = "stickyweb1"
|
||||
|
||||
/obj/effect/spider/stickyweb/Initialize()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /mob/living/simple_mob/animal/giant_spider))
|
||||
return TRUE
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(50))
|
||||
to_chat(mover, span("warning", "You get stuck in \the [src] for a moment."))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/spider/eggcluster
|
||||
name = "egg cluster"
|
||||
desc = "They seem to pulse slightly with an inner life"
|
||||
icon_state = "eggs"
|
||||
var/amount_grown = 0
|
||||
var/spiders_min = 6
|
||||
var/spiders_max = 24
|
||||
var/spider_type = /obj/effect/spider/spiderling
|
||||
var/faction = "spiders"
|
||||
|
||||
/obj/effect/spider/eggcluster/Initialize()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/eggcluster/New(var/location, var/atom/parent)
|
||||
get_light_and_color(parent)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/eggcluster/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(istype(loc, /obj/item/organ/external))
|
||||
var/obj/item/organ/external/O = loc
|
||||
O.implants -= src
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(spiders_min, spiders_max)
|
||||
var/obj/item/organ/external/O = null
|
||||
if(istype(loc, /obj/item/organ/external))
|
||||
O = loc
|
||||
|
||||
for(var/i=0, i<num, i++)
|
||||
var/obj/effect/spider/spiderling/spiderling = new spider_type(src.loc, src)
|
||||
if(O)
|
||||
O.implants += spiderling
|
||||
spiderling.faction = faction
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/eggcluster/small
|
||||
spiders_min = 1
|
||||
spiders_max = 3
|
||||
|
||||
/obj/effect/spider/eggcluster/small/frost
|
||||
spider_type = /obj/effect/spider/spiderling/frost
|
||||
|
||||
/obj/effect/spider/eggcluster/royal
|
||||
spiders_min = 2
|
||||
spiders_max = 5
|
||||
spider_type = /obj/effect/spider/spiderling/varied
|
||||
|
||||
/obj/effect/spider/spiderling
|
||||
name = "spiderling"
|
||||
desc = "It never stays still for long."
|
||||
icon_state = "spiderling"
|
||||
anchored = FALSE
|
||||
layer = HIDING_LAYER
|
||||
health = 3
|
||||
var/last_itch = 0
|
||||
var/amount_grown = 0
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
||||
var/travelling_in_vent = 0
|
||||
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
var/faction = "spiders"
|
||||
|
||||
var/stunted = FALSE
|
||||
|
||||
/obj/effect/spider/spiderling/frost
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
/obj/effect/spider/spiderling/varied
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter,
|
||||
/mob/living/simple_mob/animal/giant_spider/frost, /mob/living/simple_mob/animal/giant_spider/electric, /mob/living/simple_mob/animal/giant_spider/lurker,
|
||||
/mob/living/simple_mob/animal/giant_spider/pepper, /mob/living/simple_mob/animal/giant_spider/thermic, /mob/living/simple_mob/animal/giant_spider/tunneler,
|
||||
/mob/living/simple_mob/animal/giant_spider/webslinger, /mob/living/simple_mob/animal/giant_spider/phorogenic, /mob/living/simple_mob/animal/giant_spider/carrier,
|
||||
/mob/living/simple_mob/animal/giant_spider/ion)
|
||||
|
||||
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
START_PROCESSING(SSobj, src)
|
||||
//50% chance to grow up
|
||||
if(amount_grown != -1 && prob(50))
|
||||
amount_grown = 1
|
||||
get_light_and_color(parent)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever.
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/spiderling/Bump(atom/user)
|
||||
if(istype(user, /obj/structure/table))
|
||||
src.loc = user.loc
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
|
||||
/obj/effect/spider/spiderling/process()
|
||||
healthcheck()
|
||||
if(travelling_in_vent)
|
||||
if(istype(src.loc, /turf))
|
||||
travelling_in_vent = 0
|
||||
entry_vent = null
|
||||
else if(entry_vent)
|
||||
if(get_dist(src, entry_vent) <= 1)
|
||||
//VOREStation Edit Start
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = get_safe_ventcrawl_target(entry_vent)
|
||||
if(!exit_vent)
|
||||
return
|
||||
spawn(rand(20,60))
|
||||
loc = exit_vent
|
||||
var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
|
||||
spawn(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
|
||||
if(prob(50))
|
||||
src.visible_message("<span class='notice'>You hear something squeezing through the ventilation ducts.</span>",2)
|
||||
sleep(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
loc = exit_vent.loc
|
||||
entry_vent = null
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
//VOREStation Edit End
|
||||
//=================
|
||||
|
||||
if(isturf(loc))
|
||||
skitter()
|
||||
|
||||
else if(isorgan(loc))
|
||||
if(amount_grown < 0) amount_grown = 1
|
||||
var/obj/item/organ/external/O = loc
|
||||
if(!O.owner || O.owner.stat == DEAD || amount_grown > 80)
|
||||
O.implants -= src
|
||||
src.loc = O.owner ? O.owner.loc : O.loc
|
||||
src.visible_message("<span class='warning'>\A [src] makes its way out of [O.owner ? "[O.owner]'s [O.name]" : "\the [O]"]!</span>")
|
||||
if(O.owner)
|
||||
O.owner.apply_damage(1, BRUTE, O.organ_tag)
|
||||
else if(prob(1))
|
||||
O.owner.apply_damage(1, TOX, O.organ_tag)
|
||||
if(world.time > last_itch + 30 SECONDS)
|
||||
last_itch = world.time
|
||||
to_chat(O.owner, "<span class='notice'>Your [O.name] itches...</span>")
|
||||
else if(prob(1))
|
||||
src.visible_message("<b>\The [src]</b> skitters.")
|
||||
|
||||
if(amount_grown >= 0)
|
||||
amount_grown += rand(0,2)
|
||||
|
||||
/obj/effect/spider/spiderling/proc/skitter()
|
||||
if(isturf(loc))
|
||||
if(prob(25))
|
||||
var/list/nearby = trange(5, src) - loc
|
||||
if(nearby.len)
|
||||
var/target_atom = pick(nearby)
|
||||
walk_to(src, target_atom, 5)
|
||||
if(prob(25))
|
||||
src.visible_message("<span class='notice'>\The [src] skitters[pick(" away"," around","")].</span>")
|
||||
else if(amount_grown < 75 && prob(5))
|
||||
//vent crawl!
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
|
||||
if(!v.welded)
|
||||
entry_vent = v
|
||||
walk_to(src, entry_vent, 5)
|
||||
break
|
||||
if(amount_grown >= 100)
|
||||
var/spawn_type = pick(grow_as)
|
||||
var/mob/living/simple_mob/animal/giant_spider/GS = new spawn_type(src.loc, src)
|
||||
GS.faction = faction
|
||||
if(stunted)
|
||||
spawn(2)
|
||||
GS.make_spiderling()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling/stunted
|
||||
stunted = TRUE
|
||||
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
|
||||
/obj/effect/spider/spiderling/non_growing
|
||||
amount_grown = -1
|
||||
|
||||
/obj/effect/spider/spiderling/princess
|
||||
name = "royal spiderling"
|
||||
desc = "There's a special aura about this one."
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/nurse/queen)
|
||||
|
||||
/obj/effect/spider/spiderling/princess/New(var/location, var/atom/parent)
|
||||
..()
|
||||
amount_grown = 50
|
||||
|
||||
/obj/effect/decal/cleanable/spiderling_remains
|
||||
name = "spiderling remains"
|
||||
desc = "Green squishy mess."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "greenshatter"
|
||||
|
||||
/obj/effect/spider/cocoon
|
||||
name = "cocoon"
|
||||
desc = "Something wrapped in silky spider web"
|
||||
icon_state = "cocoon1"
|
||||
health = 60
|
||||
|
||||
/obj/effect/spider/cocoon/New()
|
||||
icon_state = pick("cocoon1","cocoon2","cocoon3")
|
||||
|
||||
/obj/effect/spider/cocoon/Destroy()
|
||||
src.visible_message("<span class='warning'>\The [src] splits open.</span>")
|
||||
for(var/atom/movable/A in contents)
|
||||
A.loc = src.loc
|
||||
return ..()
|
||||
//generic procs copied from obj/effect/alien
|
||||
/obj/effect/spider
|
||||
name = "web"
|
||||
desc = "it's stringy and sticky"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
var/health = 15
|
||||
|
||||
//similar to weeds, but only barfed out by nurses manually
|
||||
/obj/effect/spider/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
|
||||
if(LAZYLEN(W.attack_verb))
|
||||
visible_message("<span class='warning'>\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
else
|
||||
visible_message("<span class='warning'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
if(W.has_tool_quality(TOOL_WELDER))
|
||||
var/obj/item/weapon/weldingtool/WT = W.get_welder()
|
||||
|
||||
if(WT.remove_fuel(0, user))
|
||||
damage = 15
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/spiderling/attack_hand(mob/living/user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.do_attack_animation(src)
|
||||
if(prob(20))
|
||||
visible_message("<span class='warning'>\The [user] tries to stomp on \the [src], but misses!</span>")
|
||||
var/list/nearby = oview(2, src)
|
||||
if(length(nearby))
|
||||
walk_to(src, pick(nearby), 2)
|
||||
return
|
||||
visible_message("<span class='warning'>\The [user] stomps \the [src] dead!</span>")
|
||||
die()
|
||||
|
||||
/obj/effect/spider/bullet_act(var/obj/item/projectile/Proj)
|
||||
..()
|
||||
health -= Proj.get_structure_damage()
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/proc/die()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
|
||||
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300 + T0C)
|
||||
health -= 5
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/stickyweb
|
||||
icon_state = "stickyweb1"
|
||||
|
||||
/obj/effect/spider/stickyweb/Initialize()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /mob/living/simple_mob/animal/giant_spider))
|
||||
return TRUE
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(50))
|
||||
to_chat(mover, span("warning", "You get stuck in \the [src] for a moment."))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/spider/eggcluster
|
||||
name = "egg cluster"
|
||||
desc = "They seem to pulse slightly with an inner life"
|
||||
icon_state = "eggs"
|
||||
var/amount_grown = 0
|
||||
var/spiders_min = 6
|
||||
var/spiders_max = 24
|
||||
var/spider_type = /obj/effect/spider/spiderling
|
||||
var/faction = "spiders"
|
||||
|
||||
/obj/effect/spider/eggcluster/Initialize()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/eggcluster/New(var/location, var/atom/parent)
|
||||
get_light_and_color(parent)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/eggcluster/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(istype(loc, /obj/item/organ/external))
|
||||
var/obj/item/organ/external/O = loc
|
||||
O.implants -= src
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(spiders_min, spiders_max)
|
||||
var/obj/item/organ/external/O = null
|
||||
if(istype(loc, /obj/item/organ/external))
|
||||
O = loc
|
||||
|
||||
for(var/i=0, i<num, i++)
|
||||
var/obj/effect/spider/spiderling/spiderling = new spider_type(src.loc, src)
|
||||
if(O)
|
||||
O.implants += spiderling
|
||||
spiderling.faction = faction
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/eggcluster/small
|
||||
spiders_min = 1
|
||||
spiders_max = 3
|
||||
|
||||
/obj/effect/spider/eggcluster/small/frost
|
||||
spider_type = /obj/effect/spider/spiderling/frost
|
||||
|
||||
/obj/effect/spider/eggcluster/royal
|
||||
spiders_min = 2
|
||||
spiders_max = 5
|
||||
spider_type = /obj/effect/spider/spiderling/varied
|
||||
|
||||
/obj/effect/spider/spiderling
|
||||
name = "spiderling"
|
||||
desc = "It never stays still for long."
|
||||
icon_state = "spiderling"
|
||||
anchored = FALSE
|
||||
layer = HIDING_LAYER
|
||||
health = 3
|
||||
var/last_itch = 0
|
||||
var/amount_grown = 0
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
||||
var/travelling_in_vent = 0
|
||||
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
var/faction = "spiders"
|
||||
|
||||
var/stunted = FALSE
|
||||
|
||||
/obj/effect/spider/spiderling/frost
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
/obj/effect/spider/spiderling/varied
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter,
|
||||
/mob/living/simple_mob/animal/giant_spider/frost, /mob/living/simple_mob/animal/giant_spider/electric, /mob/living/simple_mob/animal/giant_spider/lurker,
|
||||
/mob/living/simple_mob/animal/giant_spider/pepper, /mob/living/simple_mob/animal/giant_spider/thermic, /mob/living/simple_mob/animal/giant_spider/tunneler,
|
||||
/mob/living/simple_mob/animal/giant_spider/webslinger, /mob/living/simple_mob/animal/giant_spider/phorogenic, /mob/living/simple_mob/animal/giant_spider/carrier,
|
||||
/mob/living/simple_mob/animal/giant_spider/ion)
|
||||
|
||||
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
START_PROCESSING(SSobj, src)
|
||||
//50% chance to grow up
|
||||
if(amount_grown != -1 && prob(50))
|
||||
amount_grown = 1
|
||||
get_light_and_color(parent)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever.
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/spiderling/Bump(atom/user)
|
||||
if(istype(user, /obj/structure/table))
|
||||
src.loc = user.loc
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
|
||||
/obj/effect/spider/spiderling/process()
|
||||
healthcheck()
|
||||
if(travelling_in_vent)
|
||||
if(istype(src.loc, /turf))
|
||||
travelling_in_vent = 0
|
||||
entry_vent = null
|
||||
else if(entry_vent)
|
||||
if(get_dist(src, entry_vent) <= 1)
|
||||
//VOREStation Edit Start
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = get_safe_ventcrawl_target(entry_vent)
|
||||
if(!exit_vent)
|
||||
return
|
||||
spawn(rand(20,60))
|
||||
loc = exit_vent
|
||||
var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
|
||||
spawn(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
|
||||
if(prob(50))
|
||||
src.visible_message("<span class='notice'>You hear something squeezing through the ventilation ducts.</span>",2)
|
||||
sleep(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
entry_vent = null
|
||||
return
|
||||
loc = exit_vent.loc
|
||||
entry_vent = null
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
//VOREStation Edit End
|
||||
//=================
|
||||
|
||||
if(isturf(loc))
|
||||
skitter()
|
||||
|
||||
else if(isorgan(loc))
|
||||
if(amount_grown < 0) amount_grown = 1
|
||||
var/obj/item/organ/external/O = loc
|
||||
if(!O.owner || O.owner.stat == DEAD || amount_grown > 80)
|
||||
O.implants -= src
|
||||
src.loc = O.owner ? O.owner.loc : O.loc
|
||||
src.visible_message("<span class='warning'>\A [src] makes its way out of [O.owner ? "[O.owner]'s [O.name]" : "\the [O]"]!</span>")
|
||||
if(O.owner)
|
||||
O.owner.apply_damage(1, BRUTE, O.organ_tag)
|
||||
else if(prob(1))
|
||||
O.owner.apply_damage(1, TOX, O.organ_tag)
|
||||
if(world.time > last_itch + 30 SECONDS)
|
||||
last_itch = world.time
|
||||
to_chat(O.owner, "<span class='notice'>Your [O.name] itches...</span>")
|
||||
else if(prob(1))
|
||||
src.visible_message("<b>\The [src]</b> skitters.")
|
||||
|
||||
if(amount_grown >= 0)
|
||||
amount_grown += rand(0,2)
|
||||
|
||||
/obj/effect/spider/spiderling/proc/skitter()
|
||||
if(isturf(loc))
|
||||
if(prob(25))
|
||||
var/list/nearby = trange(5, src) - loc
|
||||
if(nearby.len)
|
||||
var/target_atom = pick(nearby)
|
||||
walk_to(src, target_atom, 5)
|
||||
if(prob(25))
|
||||
src.visible_message("<span class='notice'>\The [src] skitters[pick(" away"," around","")].</span>")
|
||||
else if(amount_grown < 75 && prob(5))
|
||||
//vent crawl!
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
|
||||
if(!v.welded)
|
||||
entry_vent = v
|
||||
walk_to(src, entry_vent, 5)
|
||||
break
|
||||
if(amount_grown >= 100)
|
||||
var/spawn_type = pick(grow_as)
|
||||
var/mob/living/simple_mob/animal/giant_spider/GS = new spawn_type(src.loc, src)
|
||||
GS.faction = faction
|
||||
if(stunted)
|
||||
spawn(2)
|
||||
GS.make_spiderling()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling/stunted
|
||||
stunted = TRUE
|
||||
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
|
||||
/obj/effect/spider/spiderling/non_growing
|
||||
amount_grown = -1
|
||||
|
||||
/obj/effect/spider/spiderling/princess
|
||||
name = "royal spiderling"
|
||||
desc = "There's a special aura about this one."
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/nurse/queen)
|
||||
|
||||
/obj/effect/spider/spiderling/princess/New(var/location, var/atom/parent)
|
||||
..()
|
||||
amount_grown = 50
|
||||
|
||||
/obj/effect/decal/cleanable/spiderling_remains
|
||||
name = "spiderling remains"
|
||||
desc = "Green squishy mess."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "greenshatter"
|
||||
|
||||
/obj/effect/spider/cocoon
|
||||
name = "cocoon"
|
||||
desc = "Something wrapped in silky spider web"
|
||||
icon_state = "cocoon1"
|
||||
health = 60
|
||||
|
||||
/obj/effect/spider/cocoon/New()
|
||||
icon_state = pick("cocoon1","cocoon2","cocoon3")
|
||||
|
||||
/obj/effect/spider/cocoon/Destroy()
|
||||
src.visible_message("<span class='warning'>\The [src] splits open.</span>")
|
||||
for(var/atom/movable/A in contents)
|
||||
A.loc = src.loc
|
||||
return ..()
|
||||
|
||||
Reference in New Issue
Block a user