mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-19 02:56:14 +01:00
Merge remote-tracking branch 'upstream/master' into kk-rings
This commit is contained in:
@@ -112,6 +112,10 @@ var/global/list/image/splatter_cache=list()
|
||||
var/obj/structure/bed/chair/wheelchair/W = perp.buckled
|
||||
W.bloodiness = 4
|
||||
|
||||
if(viruses)
|
||||
for(var/datum/disease/D in viruses)
|
||||
perp.ContractDisease(D)
|
||||
|
||||
amount--
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/dry()
|
||||
@@ -124,6 +128,11 @@ var/global/list/image/splatter_cache=list()
|
||||
..()
|
||||
if (amount && istype(user))
|
||||
add_fingerprint(user)
|
||||
|
||||
if(viruses)
|
||||
for(var/datum/disease/D in viruses)
|
||||
user.ContractDisease(D)
|
||||
|
||||
if (user.gloves)
|
||||
return
|
||||
var/taken = rand(1,amount)
|
||||
@@ -258,4 +267,14 @@ var/global/list/image/splatter_cache=list()
|
||||
viruses.Cut()
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/mucus/Crossed(mob/living/carbon/human/perp)
|
||||
if(viruses)
|
||||
for(var/datum/disease/D in viruses)
|
||||
perp.ContractDisease(D)
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/Crossed(mob/living/carbon/human/perp)
|
||||
if(viruses)
|
||||
for(var/datum/disease/D in viruses)
|
||||
perp.ContractDisease(D)
|
||||
|
||||
#undef DRYING_TIME
|
||||
|
||||
@@ -28,10 +28,10 @@
|
||||
disrupt()
|
||||
..()
|
||||
|
||||
/obj/item/chameleon/attack_self()
|
||||
toggle()
|
||||
/obj/item/chameleon/attack_self(mob/user)
|
||||
toggle(user)
|
||||
|
||||
/obj/item/chameleon/afterattack(atom/target, mob/user , proximity)
|
||||
/obj/item/chameleon/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
if(!active_dummy)
|
||||
if(istype(target,/obj/item) && !istype(target, /obj/item/disk/nuclear))
|
||||
@@ -42,30 +42,32 @@
|
||||
saved_icon_state = target.icon_state
|
||||
saved_overlays = target.overlays
|
||||
|
||||
/obj/item/chameleon/proc/toggle()
|
||||
/obj/item/chameleon/proc/toggle(mob/user)
|
||||
if(!can_use || !saved_item) return
|
||||
if(active_dummy)
|
||||
eject_all()
|
||||
playsound(src, 'sound/effects/pop.ogg', 100, 1, -6)
|
||||
qdel(active_dummy)
|
||||
active_dummy = null
|
||||
to_chat(usr, span_notice("You deactivate the [src]."))
|
||||
to_chat(user, span_notice("You deactivate the [src]."))
|
||||
var/obj/effect/overlay/T = new /obj/effect/overlay(get_turf(src))
|
||||
T.icon = 'icons/effects/effects.dmi'
|
||||
flick("emppulse",T)
|
||||
spawn(8) qdel(T)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), T), 0.8 SECONDS, TIMER_DELETE_ME)
|
||||
else
|
||||
playsound(src, 'sound/effects/pop.ogg', 100, 1, -6)
|
||||
var/obj/O = new saved_item(src)
|
||||
if(!O) return
|
||||
var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc)
|
||||
C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src)
|
||||
if(istype(user.loc, /obj/item/holder)) // This doesn't go well...
|
||||
return
|
||||
var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(user.loc)
|
||||
C.activate(O, user, saved_icon, saved_icon_state, saved_overlays, src)
|
||||
qdel(O)
|
||||
to_chat(usr, span_notice("You activate the [src]."))
|
||||
to_chat(user, span_notice("You activate the [src]."))
|
||||
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
|
||||
T.icon = 'icons/effects/effects.dmi'
|
||||
flick("emppulse",T)
|
||||
spawn(8) qdel(T)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), T), 0.8 SECONDS, TIMER_DELETE_ME)
|
||||
|
||||
/obj/item/chameleon/proc/disrupt(var/delete_dummy = 1)
|
||||
if(active_dummy)
|
||||
@@ -78,7 +80,10 @@
|
||||
qdel(active_dummy)
|
||||
active_dummy = null
|
||||
can_use = 0
|
||||
spawn(50) can_use = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(allow_use)), 5 SECONDS, TIMER_DELETE_ME)
|
||||
|
||||
/obj/item/chameleon/proc/allow_use()
|
||||
can_use = 1
|
||||
|
||||
/obj/item/chameleon/proc/eject_all()
|
||||
for(var/atom/movable/A in active_dummy)
|
||||
@@ -127,6 +132,9 @@
|
||||
..()
|
||||
master.disrupt()
|
||||
|
||||
/obj/effect/dummy/chameleon/proc/allow_move()
|
||||
can_move = 1
|
||||
|
||||
/obj/effect/dummy/chameleon/relaymove(var/mob/user, direction)
|
||||
if(istype(loc, /turf/space)) return //No magical space movement!
|
||||
|
||||
@@ -134,15 +142,15 @@
|
||||
can_move = 0
|
||||
switch(user.bodytemperature)
|
||||
if(300 to INFINITY)
|
||||
spawn(10) can_move = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(allow_move)), 1 SECOND, TIMER_DELETE_ME)
|
||||
if(295 to 300)
|
||||
spawn(13) can_move = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(allow_move)), 1.3 SECONDS, TIMER_DELETE_ME)
|
||||
if(280 to 295)
|
||||
spawn(16) can_move = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(allow_move)), 1.6 SECONDS, TIMER_DELETE_ME)
|
||||
if(260 to 280)
|
||||
spawn(20) can_move = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(allow_move)), 2 SECONDS, TIMER_DELETE_ME)
|
||||
else
|
||||
spawn(25) can_move = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(allow_move)), 2.5 SECONDS, TIMER_DELETE_ME)
|
||||
step(src, direction)
|
||||
return
|
||||
|
||||
|
||||
@@ -572,21 +572,25 @@
|
||||
|
||||
/obj/item/radio/headset/syndicate
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
icon_state = "syndie_headset"
|
||||
syndie = 1
|
||||
ks1type = /obj/item/encryptionkey/syndicate
|
||||
|
||||
/obj/item/radio/headset/alt/syndicate
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
icon_state = "syndie_headset_alt"
|
||||
syndie = 1
|
||||
ks1type = /obj/item/encryptionkey/syndicate
|
||||
|
||||
/obj/item/radio/headset/earbud/syndicate
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
icon_state = "syndie_earbud"
|
||||
syndie = 1
|
||||
ks1type = /obj/item/encryptionkey/syndicate
|
||||
|
||||
/obj/item/radio/headset/raider
|
||||
origin_tech = list(TECH_ILLEGAL = 2)
|
||||
icon_state = "syndie_headset"
|
||||
syndie = 1
|
||||
ks1type = /obj/item/encryptionkey/raider
|
||||
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
else
|
||||
dat += span_warning("Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.")
|
||||
dat += "<br>"
|
||||
if(C.resistances.len)
|
||||
if(LAZYLEN(C.resistances))
|
||||
for (var/datum/disease/virus in C.GetViruses())
|
||||
if(virus.visibility_flags & HIDDEN_SCANNER || virus.visibility_flags & HIDDEN_PANDEMIC)
|
||||
continue
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
//For bypassing locked /obj/structure/simple_doors
|
||||
|
||||
/obj/item/lockpick
|
||||
name = "set of lockpicks"
|
||||
desc = "A set of picks and tension wrenches, ideal for picking old-style mechanical locks... not that any of those exist on most NT facilities these days. Still, it might be useful elsewhere?"
|
||||
icon = 'icons/obj/lockpicks.dmi'
|
||||
icon_state = "lockpicks"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/pick_type = "simple"
|
||||
var/pick_time = 10 SECONDS
|
||||
var/pick_verb = "pick"
|
||||
|
||||
/obj/item/lockpick/afterattack(atom/A, mob/user)
|
||||
if(!user.IsAdvancedToolUser()) //no lockpicking for monkeys
|
||||
return
|
||||
if(istype(A, /obj/structure/simple_door))
|
||||
var/obj/structure/simple_door/D = A
|
||||
if(!D.locked) //you can pick your nose, but you can't pick an unlocked door
|
||||
to_chat(user, span_notice("\The [D] isn't locked."))
|
||||
return
|
||||
else if(D.lock_type != pick_type) //make sure our types match
|
||||
to_chat(user, span_warning("\The [src] can't pick \the [D]. Another tool might work?"))
|
||||
return
|
||||
else if(!D.can_pick) //make sure we're actually allowed to bypass it at all
|
||||
to_chat(user, span_warning("\The [D] can't be [pick_verb]ed."))
|
||||
return
|
||||
else //finally, we can assume that they do match
|
||||
to_chat(user, span_notice("You start to [pick_verb] the lock on \the [D]..."))
|
||||
playsound(src, D.keysound,100, 1)
|
||||
if(do_after(user, pick_time * D.lock_difficulty))
|
||||
to_chat(user, span_notice("Success!"))
|
||||
D.locked = FALSE
|
||||
else if(istype(A,/mob/living/carbon/human)) //you can pick your friends, and you can pick your nose, but you can't pick your friend's nose
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(user.zone_sel.selecting == BP_HEAD)
|
||||
if(H == user)
|
||||
to_chat(user, span_notice("Your nose isn't locked. If you're feeling stuffy, maybe you should talk to a doctor..?"))
|
||||
else
|
||||
user.visible_message(span_notice("[user] tries to [pick_verb] [H]'s nose with \the [src]! They don't seem to be having much success."),span_notice("You try to [pick_verb] [H]'s nose. It doesn't seem to be working."))
|
||||
return
|
||||
|
||||
/obj/item/lockpick/pick_gun
|
||||
name = "pick gun"
|
||||
desc = "A more sophisticated and automated alternative to traditional lockpicking methods. Contains a dazzling array of tools in a simple-to-use housing: just press the face plate against the lock face and hold the trigger down until it goes click."
|
||||
icon_state = "pick_gun"
|
||||
pick_time = 3 SECONDS
|
||||
|
||||
/obj/item/lockpick/mag_sequencer
|
||||
name = "magnetic sequencer"
|
||||
desc = "A deceptively simple gadget that brute-forces magnetic locks using a small electromagnet. A predecessor to the cryptographic sequencer, a more complicated device that is considered contraband in most jurisdictions. Not that these aren't illegal either, mind you!"
|
||||
icon_state = "mag_sequencer"
|
||||
pick_type = "maglock"
|
||||
pick_time = 5 SECONDS
|
||||
pick_verb = "bypass"
|
||||
@@ -16,4 +16,24 @@
|
||||
else
|
||||
M.ClearTransform()
|
||||
M.update_transform()
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
// Do not ever just leave this laying about, it will go horribly wrong!
|
||||
/obj/item/squishhammer/dark
|
||||
name = "The Dark Short Stacker"
|
||||
desc = "Wield the power of this weapon with responsibility (God knows you won't)."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "dark_hammer"
|
||||
attack_verb = list("stacked")
|
||||
force = 0
|
||||
throwforce = 0
|
||||
|
||||
/obj/item/squishhammer/dark/attack(mob/M as mob, mob/user as mob)
|
||||
..()
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H))
|
||||
for(var/obj/item/organ/external/E in H.organs)
|
||||
E.fracture() // Oof, ouch, owie
|
||||
var/turf/T = M.loc
|
||||
if(isturf(T))
|
||||
new /obj/effect/gibspawner/generic(T)
|
||||
|
||||
@@ -108,12 +108,12 @@
|
||||
if(M == user)
|
||||
if(!M.can_eat(loaded))
|
||||
return
|
||||
M.visible_message(span_bold("\The [user]") + "eats some of [loaded] with \the [src].")
|
||||
M.visible_message(span_bold("\The [user]") + " eats some of [loaded] with \the [src].")
|
||||
else
|
||||
user.visible_message(span_warning("\The [user] begins to feed \the [M]!"))
|
||||
if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS)))
|
||||
return
|
||||
M.visible_message(span_bold("\The [user]") + "feeds some of [loaded] to \the [M] with \the [src].")
|
||||
M.visible_message(span_bold("\The [user]") + " feeds some of [loaded] to \the [M] with \the [src].")
|
||||
playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1)
|
||||
loaded = null
|
||||
update_icon()
|
||||
|
||||
@@ -13,4 +13,42 @@
|
||||
sharp = TRUE
|
||||
edge = FALSE
|
||||
attack_verb = list("stabbed", "lunged at", "dextrously struck", "sliced", "lacerated", "impaled", "diced", "charioted")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/melee/hammer
|
||||
name = "claw hammer"
|
||||
desc = "A simple claw hammer for hitting things or people with, and the claw part probably does something too."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "claw_hammer"
|
||||
force = 15
|
||||
throwforce = 10
|
||||
w_class = ITEMSIZE_SMALL
|
||||
attack_verb = list("smashed", "swung at", "pummelled", "nailed", "crushed", "bonked", "hammered", "cracked")
|
||||
defend_chance = 0
|
||||
|
||||
/obj/item/melee/hammer/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone, var/attack_modifier)
|
||||
if(istype(target,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(prob(50))
|
||||
var/obj/item/organ/external/affecting = H.get_organ(hit_zone)
|
||||
affecting.fracture()
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/hammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
..()
|
||||
if(A)
|
||||
if(istype(A,/obj/structure/window))
|
||||
var/obj/structure/window/W = A
|
||||
if(prob(50))
|
||||
W.visible_message(span_warning("\The [W] shatters under the force of the impact!"))
|
||||
W.shatter()
|
||||
else if(istype(A,/obj/structure/barricade))
|
||||
var/obj/structure/barricade/B = A
|
||||
if(prob(50))
|
||||
B.visible_message(span_warning("\The [B] is broken apart with ease!"))
|
||||
B.dismantle()
|
||||
else if(istype(A,/obj/structure/grille))
|
||||
if(prob(50))
|
||||
A.visible_message(span_warning("\The [A] is smashed open!"))
|
||||
qdel(A)
|
||||
|
||||
@@ -556,9 +556,9 @@
|
||||
* This one is a bit more fancy than others. Anything in the contents (PLEASE LIMIT TO ONE THING)
|
||||
* will show up inside it! Also if you map in an item on it, it will grab that at mapload and start
|
||||
* in the 'closed, full of fluid' state, so you can put a body on it or whatever.
|
||||
*
|
||||
*
|
||||
* As an aghost you can also dragdrop something into it (you have to be ghosted next to it)
|
||||
*
|
||||
*
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* open: Open, no fluid or anything. At the end the contents are ejected.
|
||||
* closed: Closed, full of liquid
|
||||
@@ -582,7 +582,7 @@
|
||||
/obj/structure/prop/machine/nt_pod/Initialize(mapload)
|
||||
// Our non-map-preview state
|
||||
icon_state = "nt_pod"
|
||||
|
||||
|
||||
// Alpha mask to make sure things don't sneak out
|
||||
var/obj/effect/overlay/vis/mask = new
|
||||
mask.icon = icon
|
||||
@@ -607,7 +607,7 @@
|
||||
// Save old settings
|
||||
contents_vis_flags = AM.vis_flags
|
||||
contents_original_pixel_y = AM.pixel_y
|
||||
|
||||
|
||||
// Arrange
|
||||
AM.add_filter("podmask", 1, alpha_mask_filter(render_source = "nt_podmask[REF(src)]", flags = MASK_INVERSE))
|
||||
AM.pixel_y = 12
|
||||
@@ -616,7 +616,7 @@
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
buckle_mob(M, TRUE, FALSE)
|
||||
|
||||
|
||||
// TRAP THEM
|
||||
change_state("closed")
|
||||
|
||||
@@ -639,7 +639,7 @@
|
||||
return
|
||||
if(!user.client?.holder)
|
||||
return
|
||||
|
||||
|
||||
AM.forceMove(src)
|
||||
|
||||
/obj/structure/prop/machine/nt_pod/change_state(state)
|
||||
@@ -648,17 +648,17 @@
|
||||
if("open")
|
||||
cut_overlay("nt_pod_top_on")
|
||||
cut_overlay("nt_pod_under")
|
||||
|
||||
|
||||
// Fluid drains
|
||||
fluid.icon_state = "nothing"
|
||||
flick("nt_pod_emptying", fluid) // 8ds
|
||||
sleep(8)
|
||||
|
||||
|
||||
// Door opens
|
||||
door.icon_state = "nothing"
|
||||
flick("nt_pod_opening", door) // 9ds
|
||||
sleep(9)
|
||||
|
||||
|
||||
// GET OUT
|
||||
outside.layer = BELOW_MOB_LAYER
|
||||
if(contents.len)
|
||||
@@ -670,7 +670,7 @@
|
||||
cut_overlay("nt_pod_top_on")
|
||||
add_overlay("nt_pod_top_on")
|
||||
add_overlay("nt_pod_under")
|
||||
|
||||
|
||||
// Door closes
|
||||
door.icon_state = "nt_pod_glass"
|
||||
flick("nt_pod_closing", door) // 9ds
|
||||
@@ -683,4 +683,90 @@
|
||||
cut_overlay("nt_pod_panel")
|
||||
add_overlay("nt_pod_panel")
|
||||
if("panel_closed")
|
||||
cut_overlay("nt_pod_panel")
|
||||
cut_overlay("nt_pod_panel")
|
||||
|
||||
// Old Virology stuff
|
||||
|
||||
/obj/structure/prop/machine/centrifuge
|
||||
name = "centrifuge"
|
||||
desc = "Used to separate things with different weight. Spin 'em round, round, right round."
|
||||
icon = 'icons/obj/virology_vr.dmi'
|
||||
icon_state = "centrifuge"
|
||||
var/on = FALSE
|
||||
|
||||
/obj/structure/prop/machine/centrifuge/attack_hand(mob/user as mob)
|
||||
..()
|
||||
|
||||
if(!on)
|
||||
on = TRUE
|
||||
user.visible_message("\The [user] turns on \the [src].")
|
||||
icon_state = "centrifuge_moving"
|
||||
else
|
||||
on = FALSE
|
||||
user.visible_message("\The [user] turns off \the [src].")
|
||||
icon_state = "centrifuge"
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/prop/machine/incubator
|
||||
name = "incubator"
|
||||
desc = "Encourages the growth of diseases. This model comes with a dispenser system and a small radiation generator."
|
||||
icon = 'icons/obj/virology_vr.dmi'
|
||||
icon_state = "incubator"
|
||||
var/on = FALSE
|
||||
|
||||
/obj/structure/prop/machine/incubator/attack_hand(mob/user as mob)
|
||||
..()
|
||||
|
||||
if(!on)
|
||||
on = TRUE
|
||||
user.visible_message("\The [user] turns on \the [src].")
|
||||
icon_state = "incubator_on"
|
||||
else
|
||||
on = FALSE
|
||||
user.visible_message("\The [user] turns off \the [src].")
|
||||
icon_state = "incubator"
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/prop/machine/disease_analyser
|
||||
name = "disease analyser"
|
||||
desc = "Analyzes diseases to find out information about them!"
|
||||
icon = 'icons/obj/virology_vr.dmi'
|
||||
icon_state = "analyser"
|
||||
var/on = FALSE
|
||||
|
||||
/obj/structure/prop/machine/disease_analyser/attack_hand(mob/user as mob)
|
||||
..()
|
||||
|
||||
if(!on)
|
||||
on = TRUE
|
||||
user.visible_message("\The [user] turns on \the [src].")
|
||||
icon_state = "analyser_"
|
||||
else
|
||||
on = FALSE
|
||||
user.visible_message("\The [user] turns off \the [src].")
|
||||
icon_state = "analyser"
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/prop/machine/isolator
|
||||
name = "disease isolator"
|
||||
desc = "Used to isolate and identify diseases, allowing for comparison with a remote database."
|
||||
icon = 'icons/obj/virology_vr.dmi'
|
||||
icon_state = "isolator_in"
|
||||
var/on = FALSE
|
||||
|
||||
/obj/structure/prop/machine/isolator/attack_hand(mob/user as mob)
|
||||
..()
|
||||
|
||||
if(!on)
|
||||
on = TRUE
|
||||
user.visible_message("\The [user] turns on \the [src].")
|
||||
icon_state = "isolator_"
|
||||
else
|
||||
on = FALSE
|
||||
user.visible_message("\The [user] turns off \the [src].")
|
||||
icon_state = "isolator_in"
|
||||
|
||||
update_icon()
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
|
||||
var/locked = FALSE //has the door been locked?
|
||||
var/lock_id = null //does the door have an associated key?
|
||||
var/lock_type = "simple" //string matched to "pick_type" on /obj/item/lockpick
|
||||
var/can_pick = TRUE //can it be picked/bypassed?
|
||||
var/lock_difficulty = 1 //multiplier to picking/bypassing time
|
||||
var/keysound = 'sound/items/toolbelt_equip.ogg'
|
||||
|
||||
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
|
||||
Reference in New Issue
Block a user