mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
Merge branch 'master' into 3/4th-closet
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/// Ion trails for spacepods and other space-flying things
|
||||
/// Ion trails for jetpacks, ion thrusters and other space-flying things
|
||||
/obj/effect/particle_effect/ion_trails
|
||||
name = "ion trails"
|
||||
icon_state = "ion_trails"
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "x2"
|
||||
var/list/result = list(
|
||||
/turf/simulated/floor/plasteel = 1,
|
||||
/turf/simulated/floor/plating = 1,
|
||||
/datum/nothing = 1,
|
||||
/obj/effect/decal/cleanable/blood/splatter = 1,
|
||||
/obj/effect/decal/cleanable/blood/oil = 1,
|
||||
/obj/effect/decal/cleanable/fungus = 1)
|
||||
@@ -37,25 +36,25 @@
|
||||
/obj/effect/spawner/random_spawners/blood_maybe
|
||||
name = "blood maybe"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 20,
|
||||
/datum/nothing = 20,
|
||||
/obj/effect/decal/cleanable/blood/splatter = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/blood_often
|
||||
name = "blood often"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 5,
|
||||
/datum/nothing = 5,
|
||||
/obj/effect/decal/cleanable/blood/splatter = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/oil_maybe
|
||||
name = "oil maybe"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 20,
|
||||
/datum/nothing = 20,
|
||||
/obj/effect/decal/cleanable/blood/oil = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/oil_maybe
|
||||
name = "oil often"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 5,
|
||||
/datum/nothing = 5,
|
||||
/obj/effect/decal/cleanable/blood/oil = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/wall_rusted_probably
|
||||
@@ -73,37 +72,37 @@
|
||||
/obj/effect/spawner/random_spawners/cobweb_left_frequent
|
||||
name = "cobweb left frequent"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 1,
|
||||
/datum/nothing = 1,
|
||||
/obj/effect/decal/cleanable/cobweb = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/cobweb_right_frequent
|
||||
name = "cobweb right frequent"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 1,
|
||||
/datum/nothing = 1,
|
||||
/obj/effect/decal/cleanable/cobweb2 = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/cobweb_left_rare
|
||||
name = "cobweb left rare"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 10,
|
||||
/datum/nothing = 10,
|
||||
/obj/effect/decal/cleanable/cobweb = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/cobweb_right_rare
|
||||
name = "cobweb right rare"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 10,
|
||||
/datum/nothing = 10,
|
||||
/obj/effect/decal/cleanable/cobweb2 = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/dirt_frequent
|
||||
name = "dirt frequent"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 1,
|
||||
/datum/nothing = 1,
|
||||
/obj/effect/decal/cleanable/dirt = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/dirt_rare
|
||||
name = "dirt rare"
|
||||
result = list(
|
||||
/turf/simulated/floor/plating = 10,
|
||||
/datum/nothing = 10,
|
||||
/obj/effect/decal/cleanable/dirt = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/fungus_maybe
|
||||
@@ -307,9 +306,3 @@
|
||||
name = "80pc vaultdoor 20pc wall"
|
||||
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4,
|
||||
/turf/simulated/wall/mineral/plastitanium/nodiagonal = 1)
|
||||
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/layout/spacepod
|
||||
name = "50pc loot spacepod"
|
||||
result = list(/obj/spacepod/syndi = 1,
|
||||
/obj/spacepod/syndi/unlocked = 1)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
/obj/effect/spawner/window/reinforced/polarized
|
||||
name = "electrochromic reinforced window spawner"
|
||||
icon_state = "pwindow_spawner"
|
||||
icon_state = "ewindow_spawner"
|
||||
window_to_spawn_regular = /obj/structure/window/reinforced/polarized
|
||||
window_to_spawn_full = /obj/structure/window/full/reinforced/polarized
|
||||
|
||||
|
||||
@@ -5,8 +5,6 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
|
||||
|
||||
move_resist = null // Set in the Initialise depending on the item size. Unless it's overriden by a specific item
|
||||
var/discrete = 0 // used in item_attack.dm to make an item not show an attack message to viewers
|
||||
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
|
||||
var/blood_overlay_color = null
|
||||
var/item_state = null
|
||||
var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
/obj/item/toy/crayon/New()
|
||||
..()
|
||||
name = "[colourName] crayon" //Makes crayons identifiable in things like grinders
|
||||
drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1, 8)]")
|
||||
|
||||
/obj/item/toy/crayon/attack_self(mob/living/user as mob)
|
||||
@@ -122,31 +121,37 @@
|
||||
|
||||
|
||||
/obj/item/toy/crayon/red
|
||||
name = "red crayon"
|
||||
icon_state = "crayonred"
|
||||
colour = COLOR_RED
|
||||
colourName = "red"
|
||||
|
||||
/obj/item/toy/crayon/orange
|
||||
name = "orange crayon"
|
||||
icon_state = "crayonorange"
|
||||
colour = COLOR_ORANGE
|
||||
colourName = "orange"
|
||||
|
||||
/obj/item/toy/crayon/yellow
|
||||
name = "yellow crayon"
|
||||
icon_state = "crayonyellow"
|
||||
colour = COLOR_YELLOW
|
||||
colourName = "yellow"
|
||||
|
||||
/obj/item/toy/crayon/green
|
||||
name = "green crayon"
|
||||
icon_state = "crayongreen"
|
||||
colour = COLOR_GREEN
|
||||
colourName = "green"
|
||||
|
||||
/obj/item/toy/crayon/blue
|
||||
name = "blue crayon"
|
||||
icon_state = "crayonblue"
|
||||
colour = COLOR_BLUE
|
||||
colourName = "blue"
|
||||
|
||||
/obj/item/toy/crayon/purple
|
||||
name = "purple crayon"
|
||||
icon_state = "crayonpurple"
|
||||
colour = COLOR_PURPLE
|
||||
colourName = "purple"
|
||||
@@ -155,38 +160,47 @@
|
||||
icon_state = pick(list("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple"))
|
||||
switch(icon_state)
|
||||
if("crayonred")
|
||||
name = "red crayon"
|
||||
colour = COLOR_RED
|
||||
colourName = "red"
|
||||
if("crayonorange")
|
||||
name = "orange crayon"
|
||||
colour = COLOR_ORANGE
|
||||
colourName = "orange"
|
||||
if("crayonyellow")
|
||||
name = "yellow crayon"
|
||||
colour = COLOR_YELLOW
|
||||
colourName = "yellow"
|
||||
if("crayongreen")
|
||||
name = "green crayon"
|
||||
colour =COLOR_GREEN
|
||||
colourName = "green"
|
||||
if("crayonblue")
|
||||
name = "blue crayon"
|
||||
colour = COLOR_BLUE
|
||||
colourName = "blue"
|
||||
if("crayonpurple")
|
||||
name = "purple crayon"
|
||||
colour = COLOR_PURPLE
|
||||
colourName = "purple"
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/black
|
||||
name = "black crayon"
|
||||
icon_state = "crayonblack"
|
||||
colour = "#000000"
|
||||
colourName = "black"
|
||||
|
||||
/obj/item/toy/crayon/white
|
||||
name = "white crayon"
|
||||
icon_state = "crayonwhite"
|
||||
colour = "#FFFFFF"
|
||||
colourName = "white"
|
||||
|
||||
/obj/item/toy/crayon/mime
|
||||
icon_state = "crayonmime"
|
||||
name = "mime crayon"
|
||||
desc = "A very sad-looking crayon."
|
||||
icon_state = "crayonmime"
|
||||
colour = "#FFFFFF"
|
||||
colourName = "mime"
|
||||
uses = 0
|
||||
@@ -211,6 +225,7 @@
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/rainbow
|
||||
name = "rainbow crayon"
|
||||
icon_state = "crayonrainbow"
|
||||
colour = "#FFF000"
|
||||
colourName = "rainbow"
|
||||
|
||||
@@ -71,8 +71,6 @@
|
||||
laser_act(target, user, params)
|
||||
|
||||
/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
|
||||
if( !(user in (viewers(7,target))) )
|
||||
return
|
||||
if(!diode)
|
||||
to_chat(user, "<span class='notice'>You point [src] at [target], but nothing happens!</span>")
|
||||
return
|
||||
@@ -82,6 +80,9 @@
|
||||
if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS))
|
||||
to_chat(user, "<span class='warning'>Your fingers can't press the button!</span>")
|
||||
return
|
||||
if(!(target in view(7, get_turf(src)))) // Use the turf as center so it won't use the potential xray of the user
|
||||
to_chat(user, "<span class='warning'>There is something in the way!</span>")
|
||||
return
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
|
||||
@@ -133,12 +133,18 @@
|
||||
ks1type = /obj/item/encryptionkey/headset_med
|
||||
|
||||
/obj/item/radio/headset/headset_iaa
|
||||
name = "internal affairs radio headset"
|
||||
desc = "This is used by your elite legal team."
|
||||
icon_state = "sec_headset"
|
||||
item_state = "sec_headset"
|
||||
ks2type = /obj/item/encryptionkey/headset_iaa
|
||||
|
||||
/obj/item/radio/headset/headset_iaa/alt
|
||||
name = "internal affairs bowman headset"
|
||||
desc = "This is used by your elite legal team. Protects ears from flashbangs."
|
||||
flags = EARBANGPROTECT
|
||||
icon_state = "sec_headset_alt"
|
||||
item_state = "sec_headset_alt"
|
||||
ks2type = /obj/item/encryptionkey/headset_iaa
|
||||
|
||||
/obj/item/radio/headset/headset_eng
|
||||
name = "engineering radio headset"
|
||||
|
||||
@@ -170,7 +170,7 @@ effective or pretty fucking useless.
|
||||
GLOB.active_jammers -= src
|
||||
|
||||
/obj/item/teleporter
|
||||
name = "\improper Syndicate teleporter"
|
||||
name = "syndicate teleporter"
|
||||
desc = "A strange syndicate version of a cult veil shifter. Warrenty voided if exposed to EMP."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "syndi-tele"
|
||||
@@ -208,24 +208,32 @@ effective or pretty fucking useless.
|
||||
charges++
|
||||
|
||||
/obj/item/teleporter/emp_act(severity)
|
||||
var/teleported_something = FALSE
|
||||
if(prob(50 / severity))
|
||||
if(istype(loc, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/user = loc
|
||||
to_chat(user, "<span class='userdanger'>[src] buzzes and activates!</span>")
|
||||
attempt_teleport(user, TRUE)
|
||||
else
|
||||
visible_message("<span class='danger'>[src] activates and blinks out of existence!</span>")
|
||||
do_sparks(2, 1, src)
|
||||
qdel(src)
|
||||
else //Well, it either is on a floor / locker, and won't teleport someone, OR it's in someones bag. As such, we need to check the turf to see if people are there.
|
||||
var/turf/teleport_turf = get_turf(src)
|
||||
for(var/mob/living/user in teleport_turf)
|
||||
if(!teleported_something)
|
||||
teleport_turf.visible_message("<span class='danger'>[src] activates sporadically, teleporting everyone around it!</span>")
|
||||
teleported_something = TRUE
|
||||
attempt_teleport(user, TRUE)
|
||||
if(!teleported_something)
|
||||
visible_message("<span class='danger'>[src] activates and blinks out of existence!</span>")
|
||||
do_sparks(2, 1, src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/teleporter/proc/attempt_teleport(mob/user, EMP_D = FALSE)
|
||||
dir_correction(user)
|
||||
if(!charges)
|
||||
if(!charges && !EMP_D) //If it's empd, you are moving no matter what.
|
||||
to_chat(user, "<span class='warning'>[src] is still recharging.</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = user
|
||||
var/turf/mobloc = get_turf(C)
|
||||
var/mob/living/M = user
|
||||
var/turf/mobloc = get_turf(M)
|
||||
var/list/turfs = new/list()
|
||||
var/found_turf = FALSE
|
||||
var/list/bagholding = user.search_contents_for(/obj/item/storage/backpack/holding)
|
||||
@@ -233,7 +241,7 @@ effective or pretty fucking useless.
|
||||
if(!is_teleport_allowed(T.z))
|
||||
break
|
||||
if(!(length(bagholding) && !flawless)) //Chaos if you have a bag of holding
|
||||
if(get_dir(C, T) != C.dir)
|
||||
if(get_dir(M, T) != M.dir)
|
||||
continue
|
||||
if(T in range(user, inner_tp_range))
|
||||
continue
|
||||
@@ -247,13 +255,14 @@ effective or pretty fucking useless.
|
||||
|
||||
if(found_turf)
|
||||
if(user.loc != mobloc) // No locker / mech / sleeper teleporting, that breaks stuff
|
||||
to_chat(C, "<span class='danger'>[src] will not work here!</span>")
|
||||
charges--
|
||||
to_chat(M, "<span class='danger'>[src] will not work here!</span>")
|
||||
if(charges > 0) //While we want EMP triggered teleports to drain charge, we also do not want it to go negative charge, as such we need this check here
|
||||
charges--
|
||||
var/turf/destination = pick(turfs)
|
||||
if(tile_check(destination) || flawless) // Why is there so many bloody floor types
|
||||
var/turf/fragging_location = destination
|
||||
telefrag(fragging_location, user)
|
||||
C.forceMove(destination)
|
||||
M.forceMove(destination)
|
||||
playsound(mobloc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
new/obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
|
||||
playsound(destination, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
@@ -264,7 +273,7 @@ effective or pretty fucking useless.
|
||||
else // Emp activated? Bag of holding? No saving throw for you
|
||||
get_fragged(user, destination)
|
||||
else
|
||||
to_chat(C, "<span class='danger'>[src] will not work here!</span>")
|
||||
to_chat(M, "<span class='danger'>[src] will not work here!</span>")
|
||||
|
||||
/obj/item/teleporter/proc/tile_check(turf/T)
|
||||
if(istype(T, /turf/simulated/floor) || istype(T, /turf/space))
|
||||
@@ -294,8 +303,8 @@ effective or pretty fucking useless.
|
||||
else
|
||||
saving_throw = NORTH // just in case
|
||||
|
||||
var/mob/living/carbon/C = user
|
||||
var/turf/mobloc = get_turf(C)
|
||||
var/mob/living/M = user
|
||||
var/turf/mobloc = get_turf(M)
|
||||
var/list/turfs = list()
|
||||
var/found_turf = FALSE
|
||||
for(var/turf/T in range(destination, saving_throw_distance))
|
||||
@@ -314,7 +323,7 @@ effective or pretty fucking useless.
|
||||
var/turf/new_destination = pick(turfs)
|
||||
var/turf/fragging_location = new_destination
|
||||
telefrag(fragging_location, user)
|
||||
C.forceMove(new_destination)
|
||||
M.forceMove(new_destination)
|
||||
playsound(mobloc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
|
||||
new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(new_destination)
|
||||
@@ -332,11 +341,12 @@ effective or pretty fucking useless.
|
||||
playsound(destination, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
playsound(destination, "sound/magic/disintegrate.ogg", 50, TRUE)
|
||||
destination.ex_act(rand(1,2))
|
||||
for(var/obj/item/W in user)
|
||||
if(istype(W, /obj/item/implant))
|
||||
continue
|
||||
if(!user.unEquip(W))
|
||||
qdel(W)
|
||||
if(iscarbon(user)) //don't want cyborgs dropping their stuff
|
||||
for(var/obj/item/W in user)
|
||||
if(istype(W, /obj/item/implant))
|
||||
continue
|
||||
if(!user.unEquip(W))
|
||||
qdel(W)
|
||||
to_chat(user, "<span class='biggerdanger'>You teleport into the wall, the teleporter tries to save you, but--</span>")
|
||||
user.gib()
|
||||
|
||||
|
||||
@@ -88,6 +88,70 @@
|
||||
/obj/item/stack/tile/carpet/black/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/blue
|
||||
name = "blue carpet"
|
||||
icon_state = "tile-carpet-blue"
|
||||
turf_type = /turf/simulated/floor/carpet/blue
|
||||
|
||||
/obj/item/stack/tile/carpet/blue/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/cyan
|
||||
name = "cyan carpet"
|
||||
icon_state = "tile-carpet-cyan"
|
||||
turf_type = /turf/simulated/floor/carpet/cyan
|
||||
|
||||
/obj/item/stack/tile/carpet/cyan/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/green
|
||||
name = "green carpet"
|
||||
icon_state = "tile-carpet-green"
|
||||
turf_type = /turf/simulated/floor/carpet/green
|
||||
|
||||
/obj/item/stack/tile/carpet/green/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/orange
|
||||
name = "orange carpet"
|
||||
icon_state = "tile-carpet-orange"
|
||||
turf_type = /turf/simulated/floor/carpet/orange
|
||||
|
||||
/obj/item/stack/tile/carpet/orange/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/purple
|
||||
name = "purple carpet"
|
||||
icon_state = "tile-carpet-purple"
|
||||
turf_type = /turf/simulated/floor/carpet/purple
|
||||
|
||||
/obj/item/stack/tile/carpet/purple/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/red
|
||||
name = "red carpet"
|
||||
icon_state = "tile-carpet-red"
|
||||
turf_type = /turf/simulated/floor/carpet/red
|
||||
|
||||
/obj/item/stack/tile/carpet/red/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/royalblack
|
||||
name = "royal black carpet"
|
||||
icon_state = "tile-carpet-royalblack"
|
||||
turf_type = /turf/simulated/floor/carpet/royalblack
|
||||
|
||||
/obj/item/stack/tile/carpet/royalblack/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/tile/carpet/royalblue
|
||||
name = "royal blue carpet"
|
||||
icon_state = "tile-carpet-royalblue"
|
||||
turf_type = /turf/simulated/floor/carpet/royalblue
|
||||
|
||||
/obj/item/stack/tile/carpet/royalblue/twenty
|
||||
amount = 20
|
||||
|
||||
//Plasteel
|
||||
/obj/item/stack/tile/plasteel
|
||||
name = "floor tiles"
|
||||
|
||||
@@ -187,28 +187,5 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.update_inv_l_hand()
|
||||
H.update_inv_r_hand()
|
||||
// Update blood splatter
|
||||
if(blood_overlay)
|
||||
cut_overlay(blood_overlay)
|
||||
qdel(blood_overlay)
|
||||
add_blood_overlay(blood_overlay_color)
|
||||
playsound(loc, extend_sound, 50, TRUE)
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/blood_splatter_index()
|
||||
return "\ref[icon]-[icon_state]"
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/add_blood_overlay(color)
|
||||
var/index = blood_splatter_index()
|
||||
var/icon/blood_splatter_icon = GLOB.blood_splatter_icons[index]
|
||||
if(!blood_splatter_icon)
|
||||
blood_splatter_icon = icon(icon, icon_state)
|
||||
blood_splatter_icon.Blend("#ffffff", ICON_ADD)
|
||||
blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY)
|
||||
blood_splatter_icon = fcopy_rsc(blood_splatter_icon)
|
||||
GLOB.blood_splatter_icons[index] = blood_splatter_icon
|
||||
|
||||
blood_overlay = image(blood_splatter_icon)
|
||||
blood_overlay.color = color
|
||||
blood_overlay_color = color
|
||||
add_overlay(blood_overlay)
|
||||
|
||||
@@ -734,7 +734,7 @@
|
||||
registered_name = "HoS"
|
||||
icon_state = "HoS"
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT,
|
||||
ACCESS_FORENSICS_LOCKERS, ACCESS_PILOT, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
|
||||
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
|
||||
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
|
||||
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS)
|
||||
|
||||
@@ -762,7 +762,7 @@
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_TELEPORTER, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EMERGENCY_STORAGE, ACCESS_EVA,
|
||||
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS,
|
||||
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MECHANIC, ACCESS_MINERAL_STOREROOM)
|
||||
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/obj/item/card/id/clown
|
||||
name = "Pink ID"
|
||||
|
||||
@@ -170,6 +170,10 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
if(flavor_text)
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message(flavor_text)
|
||||
if(iscarbon(loc))
|
||||
var/mob/living/carbon/C = loc
|
||||
if(C.wear_mask == src) // Don't update if it's just in their hand
|
||||
C.wear_mask_update(src)
|
||||
set_light(2, 0.25, "#E38F46")
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -262,6 +266,9 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/clothing/mask/cigarette/rollie/nicotine
|
||||
list_reagents = list("nicotine" = 40)
|
||||
|
||||
|
||||
/obj/item/cigbutt/roach
|
||||
name = "roach"
|
||||
|
||||
@@ -371,6 +371,7 @@
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "tray"
|
||||
desc = "A metal tray to lay food on."
|
||||
storage_slots = 8
|
||||
force = 5
|
||||
throwforce = 10
|
||||
throw_speed = 3
|
||||
|
||||
@@ -231,8 +231,7 @@
|
||||
/obj/item/holosign_creator/security,
|
||||
/obj/item/melee/classic_baton/telescopic,
|
||||
/obj/item/restraints/legcuffs/bola,
|
||||
/obj/item/clothing/mask/gas/sechailer,
|
||||
/obj/item/spacepod_key)
|
||||
/obj/item/clothing/mask/gas/sechailer)
|
||||
|
||||
/obj/item/storage/belt/security/sec/populate_contents()
|
||||
new /obj/item/flashlight/seclite(src)
|
||||
|
||||
@@ -293,6 +293,7 @@
|
||||
desc = "You can't understand the runes, but the packet smells funny."
|
||||
icon_state = "midoripacket"
|
||||
item_state = "midoripacket"
|
||||
cigarette_type = /obj/item/clothing/mask/cigarette/rollie/nicotine
|
||||
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims
|
||||
name ="\improper Shady Jim's Super Slims"
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
deductcharge(hitcost)
|
||||
return
|
||||
|
||||
if(isrobot(M)) // Can't stunbaton borgs
|
||||
if(issilicon(M)) // Can't stunbaton borgs and AIs
|
||||
return ..()
|
||||
|
||||
if(!isliving(M))
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
if(istype(W, /obj/item/pen))
|
||||
var/decalselection = input("Please select a decal") as null|anything in list("Atmospherics", "Bartender", "Barber", "Blueshield", "Brig Physician", "Captain",
|
||||
"Cargo", "Chief Engineer", "Chaplain", "Chef", "Chemist", "Civilian", "Clown", "CMO", "Coroner", "Detective", "Engineering", "Genetics", "HOP",
|
||||
"HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Mechanic", "Medical", "Mime", "Mining", "NT Representative", "Paramedic", "Pod Pilot",
|
||||
"HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Medical", "Mime", "Mining", "NT Representative", "Paramedic",
|
||||
"Prisoner", "Research Director", "Security", "Syndicate", "Therapist", "Virology", "Warden", "Xenobiology")
|
||||
if(!decalselection)
|
||||
return
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/obj/structure/closet/fireaxecabinet
|
||||
name = "fire axe cabinet"
|
||||
desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
|
||||
var/obj/item/twohanded/fireaxe/fireaxe = new/obj/item/twohanded/fireaxe
|
||||
var/obj/item/twohanded/fireaxe/fireaxe
|
||||
icon_state = "fireaxe1000"
|
||||
icon_closed = "fireaxe1000"
|
||||
icon_opened = "fireaxe1100"
|
||||
@@ -16,6 +16,10 @@
|
||||
locked = TRUE
|
||||
var/smashed = FALSE
|
||||
|
||||
/obj/structure/closet/fireaxecabinet/populate_contents()
|
||||
fireaxe = new/obj/item/twohanded/fireaxe(src)
|
||||
update_icon() // So its initial icon doesn't show it without the fireaxe
|
||||
|
||||
/obj/structure/closet/fireaxecabinet/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Use a multitool to lock/unlock it.</span>"
|
||||
|
||||
@@ -113,8 +113,6 @@
|
||||
open_door_sprite = "generic_door"
|
||||
|
||||
/obj/structure/closet/lawcloset/populate_contents()
|
||||
new /obj/item/storage/box/tapes(src)
|
||||
new /obj/item/book/manual/faxes(src)
|
||||
new /obj/item/clothing/under/lawyer/female(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
@@ -124,10 +122,6 @@
|
||||
new /obj/item/clothing/suit/storage/lawyer/purpjacket(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
|
||||
//Paramedic
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
new /obj/item/organ/internal/eyes/cybernetic/meson(src)
|
||||
new /obj/item/clothing/accessory/medal/engineering(src)
|
||||
new /obj/item/holosign_creator/atmos(src)
|
||||
new /obj/item/rcd/preloaded(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
|
||||
@@ -121,6 +121,7 @@
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ether(src)
|
||||
new /obj/item/clipboard(src)
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_med(src)
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_med(src)
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_med(src)
|
||||
@@ -170,6 +171,8 @@
|
||||
new /obj/item/door_remote/chief_medical_officer(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/cmo(src)
|
||||
new /obj/item/clothing/accessory/medal/medical(src)
|
||||
new /obj/item/storage/briefcase(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/animal
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
new /obj/item/reagent_containers/food/drinks/mug/hos(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/security(src)
|
||||
new /obj/item/clothing/accessory/medal/security(src)
|
||||
new /obj/item/reagent_containers/food/drinks/flask/barflask(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/warden
|
||||
name = "warden's locker"
|
||||
@@ -367,8 +368,33 @@
|
||||
new /obj/item/clothing/under/rank/centcom/magistrate(src)
|
||||
new /obj/item/clothing/suit/judgerobe(src)
|
||||
new /obj/item/clothing/head/powdered_wig(src)
|
||||
new /obj/item/clothing/head/justice_wig(src)
|
||||
new /obj/item/radio/headset/heads/magistrate(src)
|
||||
new /obj/item/gavelblock(src)
|
||||
new /obj/item/gavelhammer(src)
|
||||
new /obj/item/clothing/head/justice_wig(src)
|
||||
new /obj/item/clothing/accessory/medal/legal(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/iaa
|
||||
name = "internal affairs locker"
|
||||
req_access = list(ACCESS_LAWYER)
|
||||
icon_state = "iaasecure1"
|
||||
icon_closed = "iaasecure"
|
||||
icon_locked = "iaasecure1"
|
||||
icon_opened = "iaasecureopen"
|
||||
icon_broken = "iaasecurebroken"
|
||||
icon_off = "iaasecureoff"
|
||||
|
||||
/obj/structure/closet/secure_closet/iaa/populate_contents()
|
||||
new /obj/item/book/manual/faxes(src)
|
||||
new /obj/item/storage/box/tapes(src)
|
||||
new /obj/item/storage/secure/briefcase(src)
|
||||
new /obj/item/storage/briefcase(src)
|
||||
new /obj/item/storage/briefcase(src)
|
||||
new /obj/item/radio/headset/headset_iaa(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs(src)
|
||||
new /obj/item/clothing/suit/storage/internalaffairs(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
if(NO_EXTINGUISHER)
|
||||
return
|
||||
if(MINI_EXTINGUISHER)
|
||||
has_extinguisher = new/obj/item/extinguisher/mini
|
||||
has_extinguisher = new /obj/item/extinguisher/mini(src)
|
||||
else
|
||||
has_extinguisher = new/obj/item/extinguisher
|
||||
has_extinguisher = new /obj/item/extinguisher(src)
|
||||
|
||||
/obj/structure/extinguisher_cabinet/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -94,9 +94,9 @@
|
||||
if(density)
|
||||
smooth = SMOOTH_FALSE
|
||||
clear_smooth_overlays()
|
||||
icon_state = "fwall_opening"
|
||||
flick("fwall_opening", src)
|
||||
else
|
||||
icon_state = "fwall_closing"
|
||||
flick("fwall_closing", src)
|
||||
|
||||
/obj/structure/falsewall/update_icon()
|
||||
if(density)
|
||||
@@ -297,6 +297,7 @@
|
||||
/obj/structure/falsewall/sandstone
|
||||
name = "sandstone wall"
|
||||
desc = "A wall with sandstone plating."
|
||||
icon = 'icons/turf/walls/sandstone_wall.dmi'
|
||||
icon_state = "sandstone"
|
||||
mineral = /obj/item/stack/sheet/mineral/sandstone
|
||||
walltype = /turf/simulated/wall/mineral/sandstone
|
||||
|
||||
@@ -1,180 +0,0 @@
|
||||
/obj/structure/foodcart
|
||||
name = "food cart"
|
||||
desc = "A cart for transporting food and drinks."
|
||||
icon = 'icons/obj/foodcart.dmi'
|
||||
icon_state = "cart"
|
||||
face_while_pulling = FALSE
|
||||
anchored = 0
|
||||
density = 1
|
||||
//Food slots
|
||||
var/list/food_slots[6]
|
||||
//var/obj/item/reagent_containers/food/snacks/food1 = null
|
||||
//var/obj/item/reagent_containers/food/snacks/food2 = null
|
||||
//var/obj/item/reagent_containers/food/snacks/food3 = null
|
||||
//var/obj/item/reagent_containers/food/snacks/food4 = null
|
||||
//var/obj/item/reagent_containers/food/snacks/food5 = null
|
||||
//var/obj/item/reagent_containers/food/snacks/food6 = null
|
||||
//Drink slots
|
||||
var/list/drink_slots[6]
|
||||
//var/obj/item/reagent_containers/food/drinks/drink1 = null
|
||||
//var/obj/item/reagent_containers/food/drinks/drink2 = null
|
||||
//var/obj/item/reagent_containers/food/drinks/drink3 = null
|
||||
//var/obj/item/reagent_containers/food/drinks/drink4 = null
|
||||
//var/obj/item/reagent_containers/food/drinks/drink5 = null
|
||||
//var/obj/item/reagent_containers/food/drinks/drink6 = null
|
||||
|
||||
/obj/structure/foodcart/proc/put_in_cart(obj/item/I, mob/user)
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
updateUsrDialog()
|
||||
to_chat(user, "<span class='notice'>You put [I] into [src].</span>")
|
||||
return
|
||||
|
||||
/obj/structure/foodcart/attackby(obj/item/I, mob/user, params)
|
||||
var/fail_msg = "<span class='notice'>There are no open spaces for this in [src].</span>"
|
||||
if(!I.is_robot_module())
|
||||
if(istype(I, /obj/item/reagent_containers/food/snacks))
|
||||
var/success = 0
|
||||
for(var/s=1,s<=6,s++)
|
||||
if(!food_slots[s])
|
||||
put_in_cart(I, user)
|
||||
food_slots[s]=I
|
||||
update_icon()
|
||||
success = 1
|
||||
break
|
||||
if(!success)
|
||||
to_chat(user, fail_msg)
|
||||
else if(istype(I, /obj/item/reagent_containers/food/drinks))
|
||||
var/success = 0
|
||||
for(var/s=1,s<=6,s++)
|
||||
if(!drink_slots[s])
|
||||
put_in_cart(I, user)
|
||||
drink_slots[s]=I
|
||||
update_icon()
|
||||
success = 1
|
||||
break
|
||||
if(!success)
|
||||
to_chat(user, fail_msg)
|
||||
else if(istype(I, /obj/item/wrench))
|
||||
if(!anchored && !isinspace())
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
user.visible_message( \
|
||||
"[user] tightens \the [src]'s casters.", \
|
||||
"<span class='notice'> You have tightened \the [src]'s casters.</span>", \
|
||||
"You hear ratchet.")
|
||||
anchored = 1
|
||||
else if(anchored)
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
user.visible_message( \
|
||||
"[user] loosens \the [src]'s casters.", \
|
||||
"<span class='notice'> You have loosened \the [src]'s casters.</span>", \
|
||||
"You hear ratchet.")
|
||||
anchored = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You cannot interface your modules [src]!</span>")
|
||||
|
||||
/obj/structure/foodcart/attack_hand(mob/user)
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
if(food_slots[1])
|
||||
dat += "<a href='?src=[UID()];f1=1'>[food_slots[1]]</a><br>"
|
||||
if(food_slots[2])
|
||||
dat += "<a href='?src=[UID()];f2=1'>[food_slots[2]]</a><br>"
|
||||
if(food_slots[3])
|
||||
dat += "<a href='?src=[UID()];f3=1'>[food_slots[3]]</a><br>"
|
||||
if(food_slots[4])
|
||||
dat += "<a href='?src=[UID()];f4=1'>[food_slots[4]]</a><br>"
|
||||
if(food_slots[5])
|
||||
dat += "<a href='?src=[UID()];f5=1'>[food_slots[5]]</a><br>"
|
||||
if(food_slots[6])
|
||||
dat += "<a href='?src=[UID()];f6=1'>[food_slots[6]]</a><br>"
|
||||
if(drink_slots[1])
|
||||
dat += "<a href='?src=[UID()];d1=1'>[drink_slots[1]]</a><br>"
|
||||
if(drink_slots[2])
|
||||
dat += "<a href='?src=[UID()];d2=1'>[drink_slots[2]]</a><br>"
|
||||
if(drink_slots[3])
|
||||
dat += "<a href='?src=[UID()];d3=1'>[drink_slots[3]]</a><br>"
|
||||
if(drink_slots[4])
|
||||
dat += "<a href='?src=[UID()];d4=1'>[drink_slots[4]]</a><br>"
|
||||
if(drink_slots[5])
|
||||
dat += "<a href='?src=[UID()];d5=1'>[drink_slots[5]]</a><br>"
|
||||
if(drink_slots[6])
|
||||
dat += "<a href='?src=[UID()];d6=1'>[drink_slots[6]]</a><br>"
|
||||
var/datum/browser/popup = new(user, "foodcart", name, 240, 160)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/structure/foodcart/Topic(href, href_list)
|
||||
if(!in_range(src, usr))
|
||||
return
|
||||
if(!isliving(usr))
|
||||
return
|
||||
var/mob/living/user = usr
|
||||
if(href_list["f1"])
|
||||
if(food_slots[1])
|
||||
user.put_in_hands(food_slots[1])
|
||||
to_chat(user, "<span class='notice'>You take [food_slots[1]] from [src].</span>")
|
||||
food_slots[1] = null
|
||||
if(href_list["f2"])
|
||||
if(food_slots[2])
|
||||
user.put_in_hands(food_slots[2])
|
||||
to_chat(user, "<span class='notice'>You take [food_slots[2]] from [src].</span>")
|
||||
food_slots[2] = null
|
||||
if(href_list["f3"])
|
||||
if(food_slots[3])
|
||||
user.put_in_hands(food_slots[3])
|
||||
to_chat(user, "<span class='notice'>You take [food_slots[3]] from [src].</span>")
|
||||
food_slots[3] = null
|
||||
if(href_list["f4"])
|
||||
if(food_slots[4])
|
||||
user.put_in_hands(food_slots[4])
|
||||
to_chat(user, "<span class='notice'>You take [food_slots[4]] from [src].</span>")
|
||||
food_slots[4] = null
|
||||
if(href_list["f5"])
|
||||
if(food_slots[5])
|
||||
user.put_in_hands(food_slots[5])
|
||||
to_chat(user, "<span class='notice'>You take [food_slots[5]] from [src].</span>")
|
||||
food_slots[5] = null
|
||||
if(href_list["f6"])
|
||||
if(food_slots[6])
|
||||
user.put_in_hands(food_slots[6])
|
||||
to_chat(user, "<span class='notice'>You take [food_slots[6]] from [src].</span>")
|
||||
food_slots[6] = null
|
||||
if(href_list["d1"])
|
||||
if(drink_slots[1])
|
||||
user.put_in_hands(drink_slots[1])
|
||||
to_chat(user, "<span class='notice'>You take [drink_slots[1]] from [src].</span>")
|
||||
drink_slots[1] = null
|
||||
if(href_list["d2"])
|
||||
if(drink_slots[2])
|
||||
user.put_in_hands(drink_slots[2])
|
||||
to_chat(user, "<span class='notice'>You take [drink_slots[2]] from [src].</span>")
|
||||
drink_slots[2] = null
|
||||
if(href_list["d3"])
|
||||
if(drink_slots[3])
|
||||
user.put_in_hands(drink_slots[3])
|
||||
to_chat(user, "<span class='notice'>You take [drink_slots[3]] from [src].</span>")
|
||||
drink_slots[3] = null
|
||||
if(href_list["d4"])
|
||||
if(drink_slots[4])
|
||||
user.put_in_hands(drink_slots[4])
|
||||
to_chat(user, "<span class='notice'>You take [drink_slots[4]] from [src].</span>")
|
||||
drink_slots[4] = null
|
||||
if(href_list["d5"])
|
||||
if(drink_slots[5])
|
||||
user.put_in_hands(drink_slots[5])
|
||||
to_chat(user, "<span class='notice'>You take [drink_slots[5]] from [src].</span>")
|
||||
drink_slots[5] = null
|
||||
if(href_list["d6"])
|
||||
if(drink_slots[6])
|
||||
user.put_in_hands(drink_slots[6])
|
||||
to_chat(user, "<span class='notice'>You take [drink_slots[6]] from [src].</span>")
|
||||
drink_slots[6] = null
|
||||
|
||||
update_icon() //Not really needed without overlays, but keeping just in case
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/structure/foodcart/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
new /obj/item/stack/sheet/metal(loc, 4)
|
||||
qdel(src)
|
||||
@@ -175,6 +175,8 @@ GLOBAL_LIST_EMPTY(safes)
|
||||
|
||||
/obj/structure/safe/attackby(obj/item/I, mob/user, params)
|
||||
if(open)
|
||||
if(I.flags && ABSTRACT)
|
||||
return
|
||||
if(broken && istype(I, /obj/item/safe_internals) && do_after(user, 2 SECONDS, target = src))
|
||||
to_chat(user, "<span class='notice'>You replace the broken mechanism.</span>")
|
||||
qdel(I)
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
if(!has_buckled_mobs())
|
||||
return
|
||||
var/mob/living/buckled_mob = buckled_mobs[1]
|
||||
if(istype(A, /obj/machinery/door))
|
||||
if(istype(A, /obj/machinery/door) || istype(A, /obj/machinery/gateway))
|
||||
A.Bumped(buckled_mob)
|
||||
|
||||
if(propelled)
|
||||
|
||||
@@ -508,6 +508,7 @@
|
||||
/obj/structure/window/reinforced/polarized
|
||||
name = "electrochromic window"
|
||||
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
|
||||
glass_amount = 2
|
||||
var/id
|
||||
|
||||
/obj/machinery/button/windowtint
|
||||
@@ -674,8 +675,9 @@
|
||||
/obj/structure/window/full/reinforced/polarized
|
||||
name = "electrochromic window"
|
||||
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
|
||||
glass_amount = 4
|
||||
var/id
|
||||
|
||||
|
||||
/obj/structure/window/full/reinforced/tinted
|
||||
name = "tinted window"
|
||||
desc = "It looks rather strong and opaque. Might take a few good hits to shatter it."
|
||||
|
||||
Reference in New Issue
Block a user