Merge branch 'master' into pr/600

This commit is contained in:
BongaTheProto
2023-01-16 02:31:47 -05:00
386 changed files with 4786 additions and 2514 deletions
+91 -132
View File
@@ -3953,7 +3953,6 @@
/area/service/bar)
"ann" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ano" = (
@@ -4154,12 +4153,17 @@
/obj/item/radio/intercom{
pixel_y = 25
},
/obj/structure/rack,
/obj/item/storage/briefcase,
/turf/open/floor/wood,
/area/service/lawoffice)
"aoc" = (
/obj/machinery/airalarm{
pixel_y = 23
},
/obj/structure/cable{
icon_state = "2-4"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"aod" = (
@@ -4859,6 +4863,9 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"aqa" = (
@@ -4866,9 +4873,16 @@
/turf/open/floor/carpet,
/area/commons/dorms)
"aqb" = (
/obj/structure/rack,
/obj/item/storage/briefcase,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/power/apc{
areastring = "/area/service/lawoffice";
dir = 1;
name = "Law Office APC";
pixel_y = 23
},
/obj/structure/cable{
icon_state = "0-8"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"aqc" = (
@@ -5175,15 +5189,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"aqO" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aqP" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -5503,9 +5508,6 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"asc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/cable{
icon_state = "2-8"
},
@@ -5543,15 +5545,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
"asi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ask" = (
/obj/item/flashlight/lamp/green{
pixel_x = -2;
@@ -5575,6 +5568,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plating,
/area/maintenance/fore)
"asq" = (
@@ -6378,19 +6374,6 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/maintenance/port/fore)
"avi" = (
/obj/machinery/power/apc{
areastring = "/area/service/lawoffice";
dir = 1;
name = "Law Office APC";
pixel_y = 23
},
/obj/structure/cable{
icon_state = "0-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/fore)
"avj" = (
/obj/machinery/firealarm{
dir = 4;
@@ -7190,16 +7173,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"ayh" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ayi" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -7525,7 +7498,6 @@
name = "Garden Maintenance";
req_access_txt = "12"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"azq" = (
@@ -8062,9 +8034,6 @@
/obj/item/seeds/watermelon,
/obj/structure/table/glass,
/obj/item/seeds/tower,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/service/hydroponics/garden)
"aBB" = (
@@ -8083,9 +8052,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aBG" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
/area/service/hydroponics/garden)
"aBH" = (
@@ -8892,6 +8859,9 @@
/obj/machinery/door/airlock{
name = "Garden"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/service/hydroponics/garden)
"aEM" = (
@@ -41348,12 +41318,12 @@
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
/obj/structure/cable{
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
"cwS" = (
@@ -42331,11 +42301,6 @@
},
/turf/open/floor/plasteel,
/area/medical/surgery)
"cCs" = (
/obj/structure/closet/emcloset,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"cCt" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance{
@@ -45161,6 +45126,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
/obj/structure/cable{
icon_state = "2-4"
},
/turf/open/floor/plating,
/area/maintenance/fore)
"eev" = (
@@ -45396,6 +45364,12 @@
"evR" = (
/turf/open/floor/plating,
/area/maintenance/bar)
"ewb" = (
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"ewu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -47758,6 +47732,9 @@
dir = 4
},
/obj/effect/landmark/navigate_destination/lawyer,
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"gtZ" = (
@@ -49027,11 +49004,6 @@
/obj/structure/lattice,
/turf/closed/wall,
/area/maintenance/fore)
"hCn" = (
/obj/structure/closet/firecloset,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"hCp" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -49476,9 +49448,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/port/fore)
@@ -52542,26 +52511,6 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
"kHw" = (
/obj/machinery/door/airlock/security/glass{
id_tag = "innerbrig";
name = "Brig";
req_access_txt = "1"
},
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel,
/area/security/brig)
"kHN" = (
/obj/structure/chair{
dir = 1
@@ -55546,6 +55495,12 @@
},
/turf/open/floor/wood/wood_large,
/area/service/chapel/office)
"nrS" = (
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"nsf" = (
/obj/structure/cable/white{
icon_state = "0-2"
@@ -57441,19 +57396,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/maintenance/aft)
"pbQ" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/plating,
/area/maintenance/fore)
"pcz" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -57860,6 +57802,15 @@
"pun" = (
/turf/open/floor/plasteel/freezer,
/area/security/prison/cells)
"puO" = (
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/commons/storage/primary)
"pvJ" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -62475,10 +62426,6 @@
/obj/structure/bookcase/random/religion,
/turf/open/floor/wood/wood_large,
/area/service/chapel/main)
"tGO" = (
/obj/machinery/power/apc/auto_name/west,
/turf/closed/wall,
/area/service/lawoffice)
"tHc" = (
/obj/machinery/door/airlock/grunge{
name = "Prison Visitation";
@@ -62737,6 +62684,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"tUc" = (
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/wood,
/area/service/lawoffice)
"tUd" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -64523,6 +64476,12 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
"vzY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/commons/storage/primary)
"vAI" = (
/obj/effect/turf_decal/siding/white{
dir = 1
@@ -81256,7 +81215,7 @@ alU
alU
alU
alU
aqO
auT
lPA
mUQ
kwY
@@ -81513,7 +81472,7 @@ alU
atM
atW
alU
aqO
auT
lPA
aCW
lPA
@@ -82027,7 +81986,7 @@ arO
amC
aom
ank
aqO
auT
alU
axf
ayu
@@ -82798,7 +82757,7 @@ alU
alU
alU
auY
aqO
auT
alU
alU
enJ
@@ -83312,17 +83271,17 @@ ali
aok
amC
anJ
asi
arH
cCs
auT
alU
aoX
ann
ann
hCn
cwS
ayh
avX
amC
asK
azi
aAx
aBm
aAQ
aAQ
aAQ
aAQ
aAQ
@@ -83836,7 +83795,7 @@ alU
asK
azF
aAS
aFP
aAQ
aAQ
aAQ
aAQ
@@ -84094,8 +84053,8 @@ asK
azF
aAU
aBG
aAQ
aAQ
aAx
aBm
aAQ
aAQ
aAQ
@@ -84352,7 +84311,7 @@ azF
aAP
aAP
aAP
aAQ
aFP
aFO
aHA
aIT
@@ -84866,7 +84825,7 @@ atN
aAV
aBQ
aDh
aDo
vzY
aFQ
aHe
aIN
@@ -85123,7 +85082,7 @@ cwS
aAN
aBL
aDd
aDd
puO
aFR
aDd
aDd
@@ -94881,8 +94840,8 @@ aph
arW
aso
auf
avi
pbQ
ayJ
auo
axy
ayS
jUT
@@ -95132,7 +95091,7 @@ aiX
anz
anz
aov
tGO
aph
aob
ara
arV
@@ -95391,9 +95350,9 @@ anz
aov
aph
aoc
ata
nrS
gtK
ata
ewb
auh
aph
awg
@@ -95647,7 +95606,7 @@ aqC
anz
aov
api
ata
tUc
dPR
arX
atc
@@ -96924,7 +96883,7 @@ jyO
ajC
akC
akX
kHw
alw
amJ
aoY
rCl
+40 -49
View File
@@ -53141,22 +53141,16 @@
/turf/closed/wall,
/area/medical/surgery)
"dsN" = (
/obj/item/clothing/gloves/color/latex,
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/surgical,
/obj/item/surgical_drapes,
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/structure/closet/secure_closet/medical2,
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dsO" = (
/obj/item/retractor,
/obj/item/hemostat,
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -53168,14 +53162,16 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/item/clothing/gloves/color/latex{
pixel_y = 10
},
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/surgical{
pixel_y = -6
},
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dsP" = (
/obj/item/circular_saw,
/obj/item/surgicaldrill{
pixel_y = 5
},
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
@@ -53189,11 +53185,10 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/machinery/limbgrower,
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dsQ" = (
/obj/item/scalpel,
/obj/item/cautery,
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -53207,6 +53202,13 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/item/clothing/gloves/color/latex{
pixel_y = 10
},
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/surgical{
pixel_y = -6
},
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dsR" = (
@@ -54364,9 +54366,6 @@
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dvF" = (
/obj/machinery/computer/operating{
dir = 4
},
/obj/structure/cable/white{
icon_state = "4-8"
},
@@ -54383,10 +54382,11 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/table/reinforced,
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel,
/area/medical/surgery)
"dvG" = (
/obj/structure/table/optable,
/obj/effect/decal/cleanable/blood/old,
/obj/structure/cable/white{
icon_state = "2-8"
@@ -54407,17 +54407,19 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/structure/table/reinforced,
/obj/item/reagent_containers/spray/cleaner,
/turf/open/floor/plasteel,
/area/medical/surgery)
"dvH" = (
/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/bot,
/obj/structure/table/reinforced,
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel,
/area/medical/surgery)
"dvI" = (
@@ -55091,21 +55093,21 @@
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dxm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dxn" = (
/obj/structure/cable/white{
icon_state = "1-2"
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/medical/surgery)
"dxo" = (
/obj/effect/turf_decal/tile/blue,
@@ -55704,7 +55706,6 @@
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dyG" = (
/obj/structure/closet/secure_closet/medical2,
/obj/structure/sign/poster/official/cleanliness{
pixel_x = -32
},
@@ -55718,25 +55719,12 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
"dyH" = (
/obj/machinery/computer/operating{
dir = 1
},
/obj/machinery/status_display/ai{
pixel_y = -32
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
"dyI" = (
@@ -55762,12 +55750,10 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/closet/crate/freezer/blood,
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
"dyJ" = (
/obj/machinery/status_display/evac{
pixel_y = -32
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -55778,7 +55764,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/closet/crate/freezer/blood,
/obj/structure/table/optable,
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
"dyK" = (
@@ -55797,7 +55783,12 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/limbgrower,
/obj/machinery/computer/operating{
dir = 1
},
/obj/machinery/status_display/evac{
pixel_y = -32
},
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
"dyL" = (
@@ -177579,7 +177570,7 @@ dsO
dtR
dvF
dxm
dyH
dyJ
dma
cPy
cPy
+155 -29
View File
@@ -3070,6 +3070,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"baV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/science)
"bbh" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/airalarm{
@@ -11271,6 +11277,7 @@
},
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/brig)
"dTD" = (
@@ -15587,6 +15594,18 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
"fsv" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"fsw" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -16469,12 +16488,10 @@
/turf/open/floor/plasteel/freezer,
/area/engineering/main)
"fHN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"fHP" = (
@@ -17771,6 +17788,16 @@
dir = 4
},
/area/service/theater)
"gdN" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/command/storage/eva)
"gdR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
@@ -18902,6 +18929,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"gBx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/turf/open/floor/plasteel/white,
/area/science)
"gBI" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
@@ -20199,6 +20232,7 @@
/area/hallway/primary/port)
"gWN" = (
/obj/effect/landmark/navigate_destination/eva,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/command/storage/eva)
"gWU" = (
@@ -20626,6 +20660,10 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
"hfV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/command/storage/eva)
"hgb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -21076,6 +21114,9 @@
/area/command/heads_quarters/captain/private)
"hlw" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/science)
"hlG" = (
@@ -29183,6 +29224,14 @@
/obj/machinery/door/poddoor/incinerator_atmos_aux,
/turf/open/floor/engine/vacuum,
/area/maintenance/disposal/incinerator)
"kkl" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"kks" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -32072,6 +32121,13 @@
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/main)
"ljB" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"ljD" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -34926,6 +34982,15 @@
},
/turf/open/floor/plasteel/dark,
/area/command/gateway)
"mgC" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"mgN" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -38489,6 +38554,12 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
"nnq" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"nnU" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -41729,12 +41800,12 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"owR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"owU" = (
@@ -44050,6 +44121,18 @@
"poG" = (
/turf/closed/wall/r_wall,
/area/command/heads_quarters/hop)
"poJ" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"poL" = (
/obj/structure/window/reinforced{
dir = 8
@@ -48055,6 +48138,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main)
"qKZ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/science)
"qLd" = (
/obj/structure/curtain,
/turf/open/floor/plasteel/white/side{
@@ -49896,6 +49985,15 @@
},
/turf/open/floor/plasteel,
/area/construction)
"rqA" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"rqE" = (
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plasteel/dark,
@@ -51363,6 +51461,7 @@
req_access_txt = "19"
},
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/command/storage/eva)
"rSV" = (
@@ -59779,6 +59878,12 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/commons/storage/primary)
"uKi" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
/turf/open/floor/plasteel/white,
/area/science)
"uKn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
@@ -62035,6 +62140,15 @@
initial_gas_mix = "o2=21.78;n2=82.36;TEMP=293"
},
/area/service/hydroponics/enclosure)
"vyE" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"vyF" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -62475,6 +62589,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"vEQ" = (
@@ -63879,6 +63996,15 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"weT" = (
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"wfa" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -101847,9 +101973,9 @@ snT
xmJ
tGd
gzq
gzq
gzq
gzq
rqA
ljB
kkl
fHN
tPs
xzv
@@ -102104,7 +102230,7 @@ xmJ
xmJ
tGd
xzv
xzv
nnq
xzv
xzv
sxj
@@ -102361,7 +102487,7 @@ nsR
xmJ
tGd
wVf
wVf
weT
wVf
wVf
wVf
@@ -102618,7 +102744,7 @@ wzB
xpx
tGO
tGO
uZn
brI
uZn
uZn
tGO
@@ -102875,7 +103001,7 @@ wzZ
pnq
tGO
xQm
xfq
baV
xfq
xfq
mcU
@@ -103132,7 +103258,7 @@ wzZ
mXv
tGO
xQA
xfq
baV
xfq
xfq
cfk
@@ -103646,7 +103772,7 @@ osB
tGO
xqj
xSI
xfq
baV
cqK
rWx
ejR
@@ -103897,13 +104023,13 @@ qBJ
unB
rkv
rLF
stQ
ygo
mgC
tnC
owR
kNN
xfq
xfq
xfq
gBx
uKi
mSt
xyJ
gzS
@@ -104154,12 +104280,12 @@ qUx
kXA
spt
rLF
stQ
vyE
ygo
bNF
brI
xfq
xfq
baV
uzk
mSt
hIM
@@ -104411,12 +104537,12 @@ qUx
qUx
uFH
rOu
stQ
vyE
vox
jpU
tpU
tHV
tHV
qKZ
rMv
mSt
hIM
@@ -104925,7 +105051,7 @@ qCy
qUj
rqE
rSV
suO
fsv
ygo
oDS
xNa
@@ -105176,13 +105302,13 @@ thT
nUe
rTi
qti
pmj
pSO
qUx
qUx
plH
gdN
hfV
hfV
gWN
rST
suO
poJ
ygo
ygo
vbA
+35 -32
View File
@@ -91,13 +91,13 @@
},
/area/holodeck/rec_center/lounge)
"ap" = (
/turf/open/floor/holofloor/plating,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/wildlife)
"aq" = (
/turf/open/floor/holofloor/plating,
/area/holodeck/rec_center/offline)
"ar" = (
/turf/open/floor/holofloor/plating/burnmix,
/turf/open/indestructible/binary,
/area/holodeck/rec_center/burn)
"as" = (
/obj/effect/turf_decal/tile/red{
@@ -178,12 +178,12 @@
},
/area/holodeck/rec_center/lounge)
"aB" = (
/obj/effect/holodeck_effect/mobspawner,
/turf/open/floor/holofloor/plating,
/obj/effect/holodeck_effect/mobspawner/funclaw,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/wildlife)
"aC" = (
/obj/effect/holodeck_effect/sparks,
/turf/open/floor/holofloor/plating/burnmix,
/turf/open/indestructible/binary,
/area/holodeck/rec_center/burn)
"aD" = (
/obj/effect/turf_decal/tile/red{
@@ -413,7 +413,7 @@
/turf/closed/indestructible/riveted,
/area/space)
"bk" = (
/obj/effect/holodeck_effect/mobspawner/bee,
/obj/effect/holodeck_effect/mobspawner/bumbles,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/anthophila)
"bl" = (
@@ -752,7 +752,7 @@
},
/area/holodeck/rec_center/medical)
"ce" = (
/obj/effect/holodeck_effect/mobspawner/bee,
/obj/effect/holodeck_effect/mobspawner/bumbles,
/obj/item/clothing/head/beekeeper_head,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/anthophila)
@@ -856,13 +856,13 @@
/turf/open/floor/holofloor,
/area/holodeck/rec_center/dodgeball)
"cq" = (
/obj/effect/holodeck_effect/mobspawner/bee,
/obj/effect/holodeck_effect/mobspawner/bumbles,
/obj/effect/decal/remains/human,
/obj/item/clothing/suit/beekeeper_suit,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/anthophila)
"cr" = (
/obj/effect/holodeck_effect/mobspawner/bee,
/obj/effect/holodeck_effect/mobspawner/bumbles,
/obj/item/melee/flyswatter,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/anthophila)
@@ -20270,6 +20270,9 @@
},
/turf/open/space,
/area/space)
"Vy" = (
/turf/open/chasm/lavaland,
/area/holodeck/rec_center/wildlife)
"Vz" = (
/obj/machinery/vending/wallmed{
name = "Emergency NanoMed";
@@ -80911,16 +80914,16 @@ aa
"}
(232,1,1) = {"
ac
Vy
Vy
Vy
ap
ap
ap
ap
ap
ap
ap
ap
ap
ap
Vy
Vy
Vy
bj
bt
bI
@@ -81168,7 +81171,7 @@ aa
"}
(233,1,1) = {"
ac
ap
Vy
aB
ap
ap
@@ -81177,7 +81180,7 @@ ap
ap
ap
aB
ap
Vy
bj
Xg
TF
@@ -81425,7 +81428,7 @@ aa
"}
(234,1,1) = {"
ac
ap
Vy
ap
ap
ap
@@ -81434,7 +81437,7 @@ aB
ap
ap
ap
ap
Vy
bj
bu
bJ
@@ -81682,16 +81685,16 @@ aa
"}
(235,1,1) = {"
ac
ap
aB
Vy
ap
ap
ap
ap
ap
ap
aB
ap
ap
Vy
bj
bv
bK
@@ -81939,16 +81942,16 @@ aa
"}
(236,1,1) = {"
ac
ap
ap
ap
ap
ap
ap
ap
ap
ap
ap
Vy
Vy
Vy
Vy
Vy
Vy
Vy
Vy
Vy
Vy
bj
RD
Va
+4
View File
@@ -51,6 +51,7 @@
id = "QMLoad";
name = "off ramp"
},
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/supply)
"j" = (
@@ -82,6 +83,7 @@
dir = 4;
dwidth = 4
},
/obj/structure/fans/tiny,
/turf/open/floor/mineral/plastitanium,
/area/shuttle/supply)
"n" = (
@@ -137,6 +139,7 @@
req_access_txt = "31"
},
/obj/effect/decal/cleanable/dirt,
/obj/structure/fans/tiny,
/turf/open/floor/mineral/plastitanium,
/area/shuttle/supply)
"t" = (
@@ -149,6 +152,7 @@
id = "QMLoad2";
name = "on ramp"
},
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/supply)
"u" = (
+1 -1
View File
@@ -51,4 +51,4 @@
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
#define ORGAN_EDIBLE (1<<7) //is a snack? :D
#define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time.
#define ORGAN_SYNTHETIC_EMP (1<<8) //Synthetic organ affected by an EMP. Deteriorates over time.
-1
View File
@@ -74,7 +74,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid))
#define isethereal(A) (is_species(A, /datum/species/ethereal))
#define isvampire(A) (is_species(A,/datum/species/vampire))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
#define ismush(A) (is_species(A, /datum/species/mush))
#define isshadow(A) (is_species(A, /datum/species/shadow))
+1
View File
@@ -7,6 +7,7 @@
//backpack
#define LOADOUT_CATEGORY_BACKPACK "In backpack"
#define LOADOUT_SUBCATEGORY_BACKPACK_GENERAL "General" //basically anything that there's not enough of to have its own subcategory
#define LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES "Accessories" //maybe one day someone will make loadouts have accessory compatibility
#define LOADOUT_SUBCATEGORY_BACKPACK_TOYS "Toys"
//neck
#define LOADOUT_CATEGORY_NECK "Neck"
+7 -3
View File
@@ -279,9 +279,13 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
#define PDA_SKIN_MODERN "Modern"
#define PDA_SKIN_MINIMAL "Minimal"
GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi',
PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi',
PDA_SKIN_MINIMAL = 'icons/obj/pda_minimal.dmi'))
GLOBAL_LIST_INIT(pda_reskins, list(
PDA_SKIN_CLASSIC = list("icon" = 'icons/obj/pda.dmi'),
PDA_SKIN_ALT = list("icon" = 'icons/obj/pda_alt.dmi'),
PDA_SKIN_RUGGED = list("icon" = 'icons/obj/pda_rugged.dmi'),
PDA_SKIN_MODERN = list("icon" = 'icons/obj/pda_modern.dmi'),
PDA_SKIN_MINIMAL = list("icon" = 'icons/obj/pda_minimal.dmi')
))
/////////////////////////////////////
// atom.appearence_flags shortcuts //
+2 -1
View File
@@ -295,7 +295,8 @@
// MINOR TWEAKS/MISC
#define AGE_MIN 18 // youngest a character can be // CITADEL EDIT - 17 --> 18
#define AGE_MAX 85 // oldest a character can be
#define AGE_MAX 85 // oldest a character can be randomly generated
#define AGE_MAX_INPUT 85 // oldest a character's age can be manually set
#define WIZARD_AGE_MIN 30 // youngest a wizard can be
#define APPRENTICE_AGE_MIN 29 // youngest an apprentice can be
#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up
-3
View File
@@ -114,6 +114,3 @@
#define span_warning(str) ("<span class='warning'>" + str + "</span>")
#define span_yell(str) ("<span class='yell'>" + str + "</span>")
#define span_yellowteamradio(str) ("<span class='yellowteamradio'>" + str + "</span>")
//SANDSTORM DEFINES
#define span_love(str) ("<span class='love'>" + str + "</span>")
+2
View File
@@ -235,6 +235,8 @@
#define TRAIT_BEING_CARRIED "being_carried"
#define TRAIT_GLASS_BONES "glass_bones"
#define TRAIT_PAPER_SKIN "paper_skin"
//used because it's more reliable than checking for the component
#define TRAIT_DULLAHAN "dullahan"
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
+2
View File
@@ -0,0 +1,2 @@
/// Checks if potential_weakref is a weakref of thing.
#define IS_WEAKREF_OF(thing, potential_weakref) (istype(thing, /datum) && !isnull(potential_weakref) && thing.weak_reference == potential_weakref)
@@ -1,2 +1,3 @@
#define span_userlove(str) ("<span class='userlove'>" + str + "</span>")
#define span_lewd(str) ("<span class='lewd'>" + str + "</span>")
#define span_love(str) ("<span class='love'>" + str + "</span>")
#define span_userlove(str) ("<span class='userlove'>" + str + "</span>")
+4
View File
@@ -2,3 +2,7 @@
#define PLAYER_READY_TO_OBSERVE 2
#define WENDIGO_BODYPART "wendigo"
// Increase max age
#undef AGE_MAX_INPUT
#define AGE_MAX_INPUT SHORT_REAL_LIMIT // Maximum safe number
@@ -7,5 +7,6 @@
#define TRAIT_IN_HEAT "in_heat"
#define TRAIT_HEAT_DETECT "heat_detect"
#define TRAIT_ILLITERATE "illiterate"
#define TRAIT_HIDE_BACKPACK "hide_backpack"
#define TRAIT_DUMB4CUM "dumb4cum"
+3 -2
View File
@@ -209,7 +209,8 @@ GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, //everything
"Grey Satchel" = /obj/item/storage/backpack/satchel,
"Grey Duffel Bag" = /obj/item/storage/backpack/duffelbag,
"Leather Satchel" = /obj/item/storage/backpack/satchel/leather,
"Snail Shell" = /obj/item/storage/backpack/snail))
"Snail Shell" = /obj/item/storage/backpack/snail,
"Sloog Shell" = /obj/item/storage/backpack/sloogshell))
//Suit/Skirt
#define PREF_SUIT "Jumpsuit"
@@ -378,7 +379,7 @@ GLOBAL_LIST_INIT(job_heirlooms, list(
GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem"))
//list of eye types, corresponding to a respective left and right icon state for the set of eyes
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin"))
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin", "none"))
//list linking bodypart bitflags to their actual names
GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm"))
+1 -1
View File
@@ -1,5 +1,5 @@
GLOBAL_LIST_INIT(loadout_categories, list(
LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_TOYS),
LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES, LOADOUT_SUBCATEGORY_BACKPACK_TOYS),
LOADOUT_CATEGORY_NECK = list(LOADOUT_SUBCATEGORY_NECK_GENERAL, LOADOUT_SUBCATEGORY_NECK_TIE, LOADOUT_SUBCATEGORY_NECK_SCARVES),
LOADOUT_CATEGORY_MASK = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_HANDS = LOADOUT_SUBCATEGORIES_NONE,
+1 -1
View File
@@ -405,7 +405,7 @@
return
/atom/proc/CtrlShiftClick(mob/user)
SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT)
SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user)
return
/*
+1
View File
@@ -18,6 +18,7 @@ SUBSYSTEM_DEF(statpanels)
"Map: [SSmapping.config?.map_name || "Loading..."]",
cached ? "Next Map: [cached.map_name]" : null,
"Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]",
"Game Mode: [GLOB.master_mode]",
"Connected Players: [GLOB.clients.len]",
" ",
"OOC: [GLOB.ooc_allowed ? "Enabled" : "Disabled"]",
+1
View File
@@ -87,6 +87,7 @@ SUBSYSTEM_DEF(throwing)
if(HAS_TRAIT_FROM(thrownthing, TRAIT_SPOOKY_THROW, "revenant"))
REMOVE_TRAIT(thrownthing, TRAIT_SPOOKY_THROW, "revenant")
SSthrowing.processing -= thrownthing
SSthrowing.currentrun -= thrownthing
thrownthing.throwing = null
thrownthing = null
target = null
+4 -5
View File
@@ -94,10 +94,9 @@
/datum/accent/dullahan/modify_speech(list/speech_args, datum/source, mob/living/carbon/owner)
if(owner)
if(isdullahan(owner))
var/datum/species/dullahan/D = owner.dna.species
if(isobj(D.myhead.loc))
var/obj/O = D.myhead.loc
O.say(speech_args[SPEECH_MESSAGE])
var/datum/component/dullahan/dullahan = owner.GetComponent(/datum/component/dullahan)
if(dullahan)
if(dullahan.dullahan_head)
dullahan.dullahan_head.say(speech_args[SPEECH_MESSAGE])
speech_args[SPEECH_MESSAGE] = ""
return speech_args
+1 -2
View File
@@ -43,8 +43,7 @@
if(owner)
Remove(owner)
target = null
qdel(button)
button = null
QDEL_NULL(button)
return ..()
/datum/action/proc/Grant(mob/M)
@@ -287,7 +287,7 @@
name = "Durathread Reinforcement Kit"
result = /obj/item/armorkit
reqs = list(/obj/item/stack/sheet/durathread = 4)
tools = list(/obj/item/stack/sheet/mineral/titanium, TOOL_WIRECUTTER) // tough needle for a tough fabric
tools = list(TOOL_WIRECUTTER)
time = 40
category = CAT_CLOTHING
+210
View File
@@ -0,0 +1,210 @@
/datum/component/dullahan
var/obj/item/dullahan_head/dullahan_head
/datum/component/dullahan/Initialize()
. = ..()
var/mob/living/carbon/human/H = parent
if(!H)
return .
ADD_TRAIT(H, TRAIT_DULLAHAN, "dullahan_component")
ADD_TRAIT(H, TRAIT_NOHUNGER, "dullahan_component_no_hunger")
ADD_TRAIT(H, TRAIT_NOBREATH, "dullahan_component_no_breath")
dullahan_head = new(get_turf(H))
update_name()
dullahan_head.owner = H
RegisterSignal(H, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head)
// make sure the brain can't decay or fall out
var/obj/item/organ/brain/B = H.getorganslot(ORGAN_SLOT_BRAIN)
if(B)
B.zone = "abstract" // it exists in the ethereal plain
B.organ_flags = ORGAN_NO_SPOIL | ORGAN_NO_DISMEMBERMENT | ORGAN_VITAL
dullahan_head.B = B
// the eyes get similar treatment
var/obj/item/organ/eyes/dullahan/new_eyes = new()
var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES)
if(E)
new_eyes.left_eye_color = E.left_eye_color
new_eyes.right_eye_color = E.right_eye_color
E.Remove()
qdel(E)
new_eyes.Insert(H)
// make sure you handle the tongue correctly, too!
var/obj/item/organ/tongue/T = H.getorganslot(ORGAN_SLOT_TONGUE)
T.Remove()
qdel(T)
var/obj/item/organ/tongue/dullahan/new_tongue = new()
new_tongue.Insert(H)
// uh, eyes!
var/obj/item/organ/ears/dullahan_ears = H.getorganslot(ORGAN_SLOT_EARS)
if(dullahan_ears)
dullahan_ears.zone = "abstract"
// moving the brain's zone means we don't need the head to survive
var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD)
if(head)
head.drop_limb()
qdel(head)
H.flags_1 &= ~(HEAR_1)
RegisterSignal(dullahan_head, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner)
dullahan_head.update_appearance()
/datum/component/dullahan/proc/update_name(retries = 0)
if(retries > 30)
return FALSE
var/mob/living/carbon/human/H = parent
if(length(H.name))
dullahan_head.name = "[H.name]'s head"
dullahan_head.desc = "the decapitated head of [H.name]"
return TRUE
addtimer(CALLBACK(src, .proc/update_name, retries + 1), 2 SECONDS)
/datum/component/dullahan/proc/include_owner(datum/source, list/processing_list, list/hearers)
if(!QDELETED(parent))
hearers += parent
/datum/component/dullahan/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs)
excluded_limbs |= BODY_ZONE_HEAD // So we don't gib when regenerating limbs.
/obj/item/organ/tongue/dullahan
zone = "abstract"
initial_accents = list(/datum/accent/dullahan)
organ_flags = ORGAN_NO_SPOIL | ORGAN_NO_DISMEMBERMENT
/obj/item/organ/eyes/dullahan
name = "head vision"
desc = "An abstraction."
actions_types = list(/datum/action/item_action/organ_action/dullahan)
zone = "abstract"
tint = INFINITY // used to switch the vision perspective to the head on species_gain().
organ_flags = ORGAN_NO_SPOIL | ORGAN_NO_DISMEMBERMENT
/obj/item/dullahan_head
name = "coders lament"
desc = "you shouldn't be reading this"
flags_1 = HEAR_1
var/mob/living/carbon/human/owner
// this is for keeping track of the overlays because you can't read the actual overlays list as it's a special byond var
var/list/overlays_standing
var/obj/item/organ/brain/B
w_class = WEIGHT_CLASS_BULKY
/obj/item/dullahan_head/Destroy()
if(owner)
B.Remove()
B.forceMove(get_turf(src))
owner.gib()
. = ..()
// update head sprite
/obj/item/dullahan_head/proc/remove_head_overlays()
overlays_standing = list()
cut_overlays()
/obj/item/dullahan_head/proc/add_head_overlay(var/overlay)
overlays_standing += overlay
add_overlay(overlay)
/obj/item/dullahan_head/update_appearance()
if(owner && !HAS_TRAIT(owner, TRAIT_HUMAN_NO_RENDER))
remove_head_overlays()
// to do this without duplicating large amounts of code
// it's best to regenerate the head, then remove it once we have the overlays we want
owner.regenerate_limb(BODY_ZONE_HEAD, TRUE) // don't heal them
owner.cut_overlays()
owner.regenerate_icons(TRUE) // yes i know it's expensive but do you want me to rewrite our entire overlay system, also block recursive calls here by passing in TRUE (it wont go back to call update_appearance this way)
var/obj/item/bodypart/head/head = owner.get_bodypart(BODY_ZONE_HEAD)
if(head)
add_overlay(head.get_limb_icon(FALSE, TRUE, TRUE))
for(var/overlay in owner.overlays_standing)
if(istype(overlay, /mutable_appearance))
var/mutable_appearance/mutable = overlay
if(mutable.category == "HEAD")
add_head_overlay(mutable)
else
if(islist(overlay))
var/list/list_appearances = overlay
for(var/overlay2 in list_appearances)
if(istype(overlay2, /mutable_appearance))
var/mutable_appearance/mutable = overlay2
if(mutable.category == "HEAD")
add_head_overlay(mutable)
head.drop_limb()
qdel(head)
/obj/item/dullahan_head/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs)
excluded_limbs |= BODY_ZONE_HEAD // So we don't gib when regenerating limbs.
/datum/action/item_action/organ_action/dullahan
name = "Toggle Perspective"
desc = "Switch between seeing normally from your head, or blindly from your body."
/datum/action/item_action/organ_action/dullahan/Trigger()
. = ..()
var/mob/living/carbon/human/H = owner
var/obj/item/organ/eyes/E = owner.getorganslot(ORGAN_SLOT_EYES)
if(E)
if(E.tint)
E.tint = 0
else
E.tint = INFINITY
var/datum/component/dullahan/D = H.GetComponent(/datum/component/dullahan)
if(D)
D.update_vision_perspective()
/datum/component/dullahan/proc/update_vision_perspective()
var/mob/living/carbon/human/H = parent
if(!H)
return .
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
H.update_tint()
if(eyes.tint)
H.reset_perspective(H)
else
H.reset_perspective(dullahan_head)
/datum/component/dullahan/Destroy()
UnregisterSignal(parent, COMSIG_LIVING_REGENERATE_LIMBS)
dullahan_head.owner = null
qdel(dullahan_head)
REMOVE_TRAIT(parent, TRAIT_DULLAHAN, "dullahan_component")
// work out what organs to give them based on their species
if(ishuman(parent))
var/mob/living/carbon/human/H = parent
var/obj/item/organ/eyes/new_eyes = new H.dna.species.mutanteyes()
var/obj/item/organ/brain/new_brain = new H.dna.species.mutant_brain()
var/obj/item/organ/tongue/new_tongue = new H.dna.species.mutanttongue()
var/obj/item/organ/eyes/old_eyes = H.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/brain/old_brain = H.getorganslot(ORGAN_SLOT_BRAIN)
var/obj/item/organ/tongue/old_tongue = H.getorganslot(ORGAN_SLOT_TONGUE)
H.regenerate_limb(BODY_ZONE_HEAD, TRUE)
H.reset_perspective(H)
old_brain.Remove(TRUE,TRUE)
QDEL_NULL(old_brain)
new_brain.Insert(H, TRUE, TRUE)
old_eyes.Remove(TRUE,TRUE)
QDEL_NULL(old_eyes)
new_eyes.Insert(H, TRUE, TRUE)
old_tongue.Remove(TRUE,TRUE)
QDEL_NULL(old_tongue)
new_tongue.Insert(H, TRUE, TRUE)
. = ..()
+2 -1
View File
@@ -34,6 +34,7 @@
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/stop_processing)
RegisterSignal(parent, COMSIG_VOID_MASK_ACT, .proc/direct_sanity_drain)
RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/update_beauty)
if(owner.hud_used)
@@ -355,7 +356,7 @@
if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
add_event(null, "charge", /datum/mood_event/supercharged)
/datum/component/mood/proc/update_beauty(area/A)
/datum/component/mood/proc/update_beauty(datum/source, area/A)
if(A.outdoors) //if we're outside, we don't care.
clear_event(null, "area_beauty")
return FALSE
+6 -9
View File
@@ -709,16 +709,13 @@
death()
petrify(INFINITY)
if(3)
if(prob(90))
var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD))
if(BP)
BP.dismember()
else
unequip_everything()
drop_all_held_items()
gib()
var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD))
if(BP)
BP.dismember()
else
set_species(/datum/species/dullahan)
unequip_everything()
drop_all_held_items()
gib()
/datum/dna/proc/update_body_size(old_size)
if(!holder || features["body_size"] == old_size)
+43
View File
@@ -0,0 +1,43 @@
/// This element hooks a signal onto the loc the current object is on.
/// When the object moves, it will unhook the signal and rehook it to the new object.
/datum/element/connect_loc
element_flags = ELEMENT_BESPOKE
id_arg_index = 2
/// An assoc list of signal -> procpath to register to the loc this object is on.
var/list/connections
/datum/element/connect_loc/Attach(atom/movable/listener, list/connections)
. = ..()
if (!istype(listener))
return ELEMENT_INCOMPATIBLE
src.connections = connections
RegisterSignal(listener, COMSIG_MOVABLE_MOVED, .proc/on_moved, override = TRUE)
update_signals(listener)
/datum/element/connect_loc/Detach(atom/movable/listener)
. = ..()
unregister_signals(listener, listener.loc)
UnregisterSignal(listener, COMSIG_MOVABLE_MOVED)
/datum/element/connect_loc/proc/update_signals(atom/movable/listener)
var/atom/listener_loc = listener.loc
if(isnull(listener_loc))
return
for (var/signal in connections)
//override=TRUE because more than one connect_loc element instance tracked object can be on the same loc
listener.RegisterSignal(listener_loc, signal, connections[signal], override=TRUE)
/datum/element/connect_loc/proc/unregister_signals(datum/listener, atom/old_loc)
if(isnull(old_loc))
return
listener.UnregisterSignal(old_loc, connections)
/datum/element/connect_loc/proc/on_moved(atom/movable/listener, atom/old_loc)
SIGNAL_HANDLER
unregister_signals(listener, old_loc)
update_signals(listener)
+104
View File
@@ -0,0 +1,104 @@
/*
* # Element: Object Reskinning
*
* Allows players to modify the appearance of their object (and other attributes if possible)
* PLEASE DO NOT HAVE INVALID VALUES IN unique_reskin I DON'T EVEN WANT TO KNOW WHAT HAPPENS.
* USAGE:
* unique_reskins = list(
* "skin 1" = list(
* "desc" = "very cool description",
* "icon" = 'very_cool_icon.dmi'
* ),
* "skin 2" = list(
* "desc" = "not as cool description",
* "icon" = 'the_boring_skin.dmi'
* )
* )
*/
/datum/element/object_reskinning
element_flags = ELEMENT_DETACH
/datum/element/object_reskinning/Attach(datum/target)
. = ..()
var/obj/the_obj = target
if(!istype(the_obj))
return ELEMENT_INCOMPATIBLE
if(!islist(the_obj.unique_reskin) || !length(the_obj.unique_reskin))
message_admins("[src] was given to an object without any unique reskins, if you really need to, give it a couple skins first.")
return ELEMENT_INCOMPATIBLE
RegisterSignal(the_obj, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(the_obj, the_obj.reskin_binding, .proc/reskin)
/datum/element/object_reskinning/Detach(datum/source, force)
var/obj/being_deleted = source
UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, being_deleted.reskin_binding))
return ..()
/datum/element/object_reskinning/proc/on_examine(obj/obj, mob/user, list/examine_list)
examine_list += span_notice("[capitalize(replacetext(obj.reskin_binding, "_", "-"))] to reskin it ([length(obj.unique_reskin)] possible styles).")
if(obj.always_reskinnable)
examine_list += span_notice("It has no limit to reskinning.")
/*
* Reskins an object according to user's choice.
* Will detach itself if there's no skins or if done successfully but not always reskinnable.
*
* Arguments:
* * to_reskin The object we will be reskinning
* * user The user who wants to choose a skin for the object
*/
/datum/element/object_reskinning/proc/reskin(obj/to_reskin, mob/user)
// Just stop early
if(!LAZYLEN(to_reskin.unique_reskin))
message_admins("[ADMIN_LOOKUPFLW(user)] attempted to reskin an object that has no skins!")
Detach(to_reskin)
return FALSE
// Can't use
if(!user.canUseTopic(to_reskin, BE_CLOSE, NO_DEXTERY, NO_TK))
return FALSE
// Get our choices
var/list/items = list()
for(var/reskin_option in to_reskin.unique_reskin)
var/image/item_image = image(
icon = to_reskin.unique_reskin[reskin_option]["icon"] ? to_reskin.unique_reskin[reskin_option]["icon"] : to_reskin.icon,
icon_state = to_reskin.unique_reskin[reskin_option]["icon_state"] ? to_reskin.unique_reskin[reskin_option]["icon_state"] : to_reskin.icon_state)
items += list("[reskin_option]" = item_image)
sortList(items)
// Display to the user
var/pick = show_radial_menu(user, to_reskin, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, user, to_reskin), radius = 38, require_near = TRUE)
if(!pick)
return FALSE
// Finish the work
to_reskin.current_skin = pick
for(var/reskin_var in to_reskin.unique_reskin[pick])
to_reskin.vars[reskin_var] = to_reskin.unique_reskin[pick][reskin_var]
to_chat(user, "[to_reskin] is now skinned as '[pick].'")
to_reskin.reskin_obj(user)
// Only once or always?
if(!to_reskin.always_reskinnable)
Detach(to_reskin)
return TRUE
/**
* Checks if we are allowed to interact with a radial menu for reskins
*
* Arguments:
* * user The mob interacting with the menu
* * obj The obj to be checking against
*/
/datum/element/object_reskinning/proc/check_reskin_menu(mob/user, obj/obj)
if(QDELETED(obj))
return FALSE
if(!obj.always_reskinnable && obj.current_skin)
return FALSE
if(!istype(user))
return FALSE
if(user.incapacitated())
return FALSE
return TRUE
+3
View File
@@ -4,6 +4,9 @@
// Mutable appearances are children of images, just so you know.
/mutable_appearance
var/category // listen i want to store some meta information on mutable appearances don't judge me
/mutable_appearance/New()
..()
plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE
+7 -4
View File
@@ -187,10 +187,13 @@
lose_text = "<span class='danger'>High-tech gizmos are a scam...</span>"
/datum/quirk/trandening/on_spawn()
var/mob/living/carbon/human/H = quirk_holder
var/obj/item/autosurgeon/gloweyes/gloweyes = new(get_turf(H))
H.equip_to_slot(gloweyes, ITEM_SLOT_BACKPACK)
H.regenerate_icons()
// Get targets
var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/eyes/robotic/glow/new_eyes = new
// Replace eyes
qdel(old_eyes)
new_eyes.Insert(quirk_holder)
/datum/quirk/bloodpressure
name = "Polycythemia vera"
+9
View File
@@ -188,3 +188,12 @@
value = 0
medical_record_text = "Patient should not come into contact with sodium."
mob_trait = TRAIT_SALT_SENSITIVE
/datum/quirk/dullahan
name = "Dullahan"
desc = "Your head is detached from your body."
value = 0
medical_record_text = "Patient seems to have some kind of spatial link with their decapitated head."
/datum/quirk/dullahan/post_add()
quirk_holder.AddComponent(/datum/component/dullahan)
+9
View File
@@ -28,6 +28,8 @@
LAZYREMOVE(limb.scars, src)
if(victim)
LAZYREMOVE(victim.all_scars, src)
limb = null
victim = null
. = ..()
/**
@@ -45,6 +47,8 @@
qdel(src)
return
limb = BP
RegisterSignal(limb, COMSIG_PARENT_QDELETING, .proc/limb_gone)
severity = W.severity
if(limb.owner)
victim = limb.owner
@@ -84,6 +88,7 @@
return
limb = BP
RegisterSignal(limb, COMSIG_PARENT_QDELETING, .proc/limb_gone)
src.severity = severity
LAZYADD(limb.scars, src)
if(BP.owner)
@@ -102,6 +107,10 @@
visibility = 7
return TRUE
/datum/scar/proc/limb_gone()
SIGNAL_HANDLER
qdel(src)
/// What will show up in examine_more() if this scar is visible
/datum/scar/proc/get_examine_description(mob/viewer)
if(!victim || !is_visible(viewer))
+10 -3
View File
@@ -73,8 +73,6 @@
/// What status effect we assign on application
var/status_effect_type
/// The status effect we're linked to
var/datum/status_effect/linked_status_effect
/// If we're operating on this wound and it gets healed, we'll nix the surgery too
var/datum/surgery/attached_surgery
/// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * 25 power
@@ -127,12 +125,13 @@
return
victim = L.owner
RegisterSignal(victim, COMSIG_PARENT_QDELETING, .proc/null_victim)
limb = L
LAZYADD(victim.all_wounds, src)
LAZYADD(limb.wounds, src)
limb.update_wounds()
if(status_effect_type)
linked_status_effect = victim.apply_status_effect(status_effect_type, src)
victim.apply_status_effect(status_effect_type, src)
SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb)
victim.emote("pain")
if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds
@@ -161,6 +160,14 @@
wound_injury(old_wound)
second_wind()
/datum/wound/proc/null_victim()
SIGNAL_HANDLER
victim = null
/datum/wound/proc/source_died()
SIGNAL_HANDLER
qdel(src)
/// Remove the wound from whatever it's afflicting, and cleans up whateverstatus effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim
/datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE)
//TODO: have better way to tell if we're getting removed without replacement (full heal) scar stuff
+1 -1
View File
@@ -177,7 +177,7 @@
if(isinsect(victim) || iscatperson(victim) || ismammal(victim) || isdwarf(victim) || ismonkey(victim)) // Yep you can lick monkeys.
user.reagents.add_reagent(/datum/reagent/hairball, 2)
else if(ishumanbasic(victim) || isflyperson(victim) || islizard(victim) || isdullahan(victim))
else if(ishumanbasic(victim) || isflyperson(victim) || islizard(victim) || HAS_TRAIT(victim, TRAIT_DULLAHAN))
user.reagents.add_reagent(/datum/reagent/hairball, 1)
if(blood_flow > minimum_flow)
+28 -2
View File
@@ -15,7 +15,10 @@
var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED
var/fire = null
///Do we have an active fire alarm?
var/fire = FALSE
///How many fire alarm sources do we have?
var/triggered_firealarms = 0
///Whether there is an atmos alarm in this area
var/atmosalm = FALSE
var/poweralm = FALSE
@@ -443,7 +446,18 @@ GLOBAL_LIST_EMPTY(teleportlocs)
START_PROCESSING(SSobj, src)
/area/proc/firereset(obj/source)
if (fire)
var/should_reset_alarms = fire
if(source)
if(istype(source, /obj/machinery/firealarm))
var/obj/machinery/firealarm/alarm = source
if(alarm.triggered)
alarm.triggered = FALSE
triggered_firealarms -= 1
if(triggered_firealarms > 0)
should_reset_alarms = FALSE
should_reset_alarms = should_reset_alarms & power_environ //No resetting if there's no power
if (should_reset_alarms) // if there's a source, make sure there's no fire alarms left
set_fire_alarm_effects(FALSE)
ModifyFiredoors(TRUE)
@@ -463,6 +477,18 @@ GLOBAL_LIST_EMPTY(teleportlocs)
STOP_PROCESSING(SSobj, src)
///Get rid of any dangling camera refs
/area/proc/clear_camera(obj/machinery/camera/cam)
LAZYREMOVE(cameras, cam)
for (var/mob/living/silicon/aiPlayer as anything in GLOB.silicon_mobs)
aiPlayer.freeCamera(src, cam)
for (var/obj/machinery/computer/station_alert/comp as anything in GLOB.alert_consoles)
comp.freeCamera(src, cam)
for (var/mob/living/simple_animal/drone/drone_on as anything in GLOB.drones_list)
drone_on.freeCamera(src, cam)
for(var/datum/computer_file/program/alarm_monitor/monitor as anything in GLOB.alarmdisplay)
monitor.freeCamera(src, cam)
/area/process()
if(firedoors_last_closed_on + 100 < world.time) //every 10 seconds
ModifyFiredoors(FALSE)
+3
View File
@@ -118,6 +118,9 @@
. = ..()
//We add ourselves to this list, best to clear it out
// LAZYCLEARLIST(area_sensitive_contents)
for(var/movable_content in contents)
qdel(movable_content)
+1 -1
View File
@@ -38,7 +38,7 @@
icon_state = "[state]"
/obj/machinery/bluespace_beacon/process()
if(!Beacon)
if(QDELETED(Beacon)) //Don't move it out of nullspace BACK INTO THE GAME for the love of god
var/turf/T = loc
Beacon = new(T)
Beacon.invisibility = INVISIBILITY_MAXIMUM
+5 -4
View File
@@ -149,10 +149,11 @@ Class Procs:
circuit = new circuit(src)
circuit.apply_default_parts(src)
if(!speed_process && init_process)
START_PROCESSING(SSmachines, src)
else
START_PROCESSING(SSfastprocess, src)
if(init_process) // Required to prevent non-speed non-init machines from running
if(speed_process)
START_PROCESSING(SSfastprocess, src)
else
START_PROCESSING(SSmachines, src)
RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change)
if (occupant_typecache)
+3 -3
View File
@@ -81,15 +81,15 @@
if(can_use())
toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks
GLOB.cameranet.cameras -= src
cancelCameraAlarm()
if(isarea(myarea))
LAZYREMOVE(myarea.cameras, src)
myarea.clear_camera(src)
QDEL_NULL(assembly)
if(bug)
bug.bugged_cameras -= src.c_tag
bug.bugged_cameras -= c_tag
if(bug.current == src)
bug.current = null
bug = null
cancelCameraAlarm()
return ..()
/obj/machinery/camera/emp_act(severity)
@@ -351,8 +351,9 @@
log_game("[key_name(usr)] enabled emergency maintenance access.")
message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.")
deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT)
if("toggleBought")
var/boughtID = params["id"]
for(var/tracked_slave in GLOB.tracked_slaves)
var/obj/item/electropack/shockcollar/slave/C = tracked_slave
if (REF(C) == boughtID) // Get collar
+31 -16
View File
@@ -33,31 +33,46 @@
return data
/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, O, obj/source)
/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/home, cameras, obj/source)
if(source.z != z)
return
if(stat & (BROKEN))
return
var/list/L = alarms[class]
for(var/I in L)
if (I == A.name)
var/list/alarm = L[I]
var/list/our_sort = alarms[class]
for(var/areaname in our_sort)
if (areaname == home.name)
var/list/alarm = our_sort[areaname]
var/list/sources = alarm[3]
if (!(source in sources))
sources += source
return 1
var/obj/machinery/camera/C = null
var/list/CL = null
if(O && islist(O))
CL = O
if (CL.len == 1)
C = CL[1]
else if(O && istype(O, /obj/machinery/camera))
C = O
L[A.name] = list(A, (C ? C : O), list(source))
return 1
return TRUE
var/obj/machinery/camera/cam = null
var/list/our_cams = null
if(cameras && islist(cameras))
our_cams = cameras
if (our_cams.len == 1)
cam = our_cams[1]
else if(cameras && istype(cameras, /obj/machinery/camera))
cam = cameras
our_sort[home.name] = list(home, (cam ? cam : cameras), list(source))
return TRUE
/obj/machinery/computer/station_alert/proc/freeCamera(area/home, obj/machinery/camera/cam)
for(var/class in alarms)
var/our_area = alarms[class][home.name]
if(!our_area)
continue
var/cams = our_area[2] //Get the cameras
if(!cams)
continue
if(islist(cams))
cams -= cam
if(length(cams) == 1)
our_area[2] = cams[1]
else
our_area[2] = null
/obj/machinery/computer/station_alert/proc/cancelAlarm(class, area/A, obj/origin)
if(stat & (BROKEN))
@@ -3,6 +3,10 @@
var/state
var/obj/machinery/embedded_controller/master
/datum/computer/file/embedded_program/Destroy()
master = null
. = ..()
/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line)
if(master)
master.post_signal(signal, comm_line)
@@ -25,6 +29,11 @@
var/on = TRUE
/obj/machinery/embedded_controller/Destroy()
if(program)
QDEL_NULL(program)
. = ..()
/obj/machinery/embedded_controller/ui_interact(mob/user)
. = ..()
user.set_machine(src)
+10 -7
View File
@@ -33,8 +33,10 @@
var/detecting = 1
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
var/last_alarm = 0
COOLDOWN_DECLARE(last_alarm)
var/area/myarea = null
//Has this firealarm been triggered by its enviroment?
var/triggered = FALSE
var/alarm_active = FALSE
var/wire_override = FALSE
@@ -56,6 +58,7 @@
wires = new /datum/wires/firealarm(src)
/obj/machinery/firealarm/Destroy()
myarea.firereset(src)
LAZYREMOVE(myarea.firealarms, src)
qdel(wires)
@@ -112,7 +115,7 @@
. += mutable_appearance(icon, "fire_on")
. += emissive_appearance(icon, "fire_on")
if(!panel_open && detecting) //It just looks horrible with the panel open
if(!panel_open && detecting && triggered) //It just looks horrible with the panel open
. += "fire_detected"
. += mutable_appearance(icon, "fire_detected")
. += emissive_appearance(icon, "fire_detected") //Pain
@@ -139,14 +142,14 @@
return TRUE
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && (last_alarm+FIREALARM_COOLDOWN < world.time) && !(obj_flags & EMAGGED) && detecting && !stat)
if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && COOLDOWN_FINISHED(src, last_alarm) && !(obj_flags & EMAGGED) && detecting && !stat)
alarm()
..()
return ..()
/obj/machinery/firealarm/proc/alarm(mob/user)
if(!is_operational() || (last_alarm+FIREALARM_COOLDOWN > world.time))
if(!is_operational() || !COOLDOWN_FINISHED(src, last_alarm))
return
last_alarm = world.time
COOLDOWN_START(src, last_alarm, FIREALARM_COOLDOWN)
var/area/A = get_base_area(src)
A.firealert(src)
playsound(loc, 'goon/sound/machinery/FireAlarm.ogg', 75)
@@ -159,7 +162,7 @@
if(!is_operational())
return
var/area/A = get_base_area(src)
A.firereset(src)
A.firereset()
if(user)
log_game("[user] reset a fire alarm at [COORD(src)]")
+1
View File
@@ -24,6 +24,7 @@
connected_console = null
for(var/obj/machinery/computer/mechpad/console in consoles)
console.mechpads -= src
GLOB.mechpad_list -= src
return ..()
/obj/machinery/mechpad/screwdriver_act(mob/user, obj/item/tool)
+1 -1
View File
@@ -119,7 +119,7 @@
if(istype(AM, /obj/item))
var/obj/item/bodypart/head/as_head = AM
var/obj/item/mmi/as_mmi = AM
if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay))
if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_head))
living_detected = living_detected ? living_detected : AM
nom += AM
else if(isliving(AM))
+97 -117
View File
@@ -61,12 +61,17 @@
/obj/machinery/suit_storage_unit/engine
suit_type = /obj/item/clothing/suit/space/hardsuit/engine
mask_type = /obj/item/clothing/mask/breath
shoes_type= /obj/item/clothing/shoes/magboots
shoes_type = /obj/item/clothing/shoes/magboots
/obj/machinery/suit_storage_unit/atmos
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/watertank/atmos
/obj/machinery/suit_storage_unit/ce
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite
mask_type = /obj/item/clothing/mask/breath
shoes_type= /obj/item/clothing/shoes/magboots/advance
shoes_type = /obj/item/clothing/shoes/magboots/advance
/obj/machinery/suit_storage_unit/security
suit_type = /obj/item/clothing/suit/space/hardsuit/security
@@ -165,7 +170,6 @@
/obj/machinery/suit_storage_unit/update_overlays()
. = ..()
if(uv)
if(uv_super)
. += "super"
@@ -182,7 +186,7 @@
. += "suit"
if(helmet)
. += "helm"
if(storage)
if(shoes || storage)
. += "storage"
else if(occupant)
. += "human"
@@ -199,7 +203,6 @@
helmet = null
suit = null
mask = null
shoes = null
storage = null
occupant = null
@@ -210,109 +213,8 @@
new /obj/item/stack/sheet/metal(loc, 2)
qdel(src)
/obj/machinery/suit_storage_unit/interact(mob/living/user)
var/static/list/items
if (!items)
items = list(
"suit" = create_silhouette_of(/obj/item/clothing/suit/space/eva),
"helmet" = create_silhouette_of(/obj/item/clothing/head/helmet/space/eva),
"mask" = create_silhouette_of(/obj/item/clothing/mask/breath),
"shoes" = create_silhouette_of(/obj/item/clothing/shoes/magboots),
"storage" = create_silhouette_of(/obj/item/tank/internals/oxygen),
)
. = ..()
if (.)
return
if (!check_interactable(user))
return
var/list/choices = list()
if (locked)
choices["unlock"] = icon('modular_sand/icons/hud/radial.dmi', "radial_unlock")
else if (state_open)
choices["close"] = icon('modular_sand/icons/hud/radial.dmi', "radial_close")
for (var/item_key in items)
var/item = vars[item_key]
if (item)
choices[item_key] = item
else
// If the item doesn't exist, put a silhouette in its place
choices[item_key] = items[item_key]
else
choices["open"] = icon('modular_sand/icons/hud/radial.dmi', "radial_open")
choices["disinfect"] = icon('modular_sand/icons/hud/radial.dmi', "radial_disinfect")
choices["lock"] = icon('modular_sand/icons/hud/radial.dmi', "radial_lock")
var/choice = show_radial_menu(
user,
src,
choices,
custom_check = CALLBACK(src, .proc/check_interactable, user),
require_near = !issilicon(user),
)
if (!choice)
return
switch (choice)
if ("open")
if (!state_open)
open_machine(drop = FALSE)
if (occupant)
dump_contents()
if ("close")
if (state_open)
close_machine()
if ("disinfect")
if (occupant && safeties)
return
else if (!helmet && !mask && !suit && !shoes && !storage && !occupant)
return
else
if (occupant)
var/mob/living/mob_occupant = occupant
to_chat(mob_occupant, "<span class='userdanger'>[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!</span>")
cook()
if ("lock", "unlock")
if (!state_open)
locked = !locked
else
var/obj/item/item_to_dispense = vars[choice]
if (item_to_dispense)
vars[choice] = null
user.put_in_hands(item_to_dispense)
else
var/obj/item/in_hands = user.get_active_held_item()
if (in_hands)
attackby(in_hands, user)
interact(user)
/obj/machinery/suit_storage_unit/proc/check_interactable(mob/user)
if (!state_open && !can_interact(user))
return FALSE
if (panel_open)
return FALSE
if (uv)
return FALSE
return TRUE
/obj/machinery/suit_storage_unit/proc/create_silhouette_of(atom/item)
var/image/image = image(initial(item.icon), initial(item.icon_state))
image.alpha = 128
image.color = COLOR_RED
return image
/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/living/user)
if(!istype(user) || user.stat || !Adjacent(user) || !Adjacent(A) || !isliving(A))
/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A))
return
var/mob/living/target = A
if(!state_open)
@@ -525,15 +427,93 @@
return ..()
/* ref tg-git issue #45036
screwdriving it open while it's running a decontamination sequence without closing the panel prior to finish
causes the SSU to break due to state_open being set to TRUE at the end, and the panel becoming inaccessible.
*/
/obj/machinery/suit_storage_unit/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_SCREWDRIVER && uv)
to_chat(user, "<span class='warning'>It might not be wise to fiddle with [src] while it's running...</span>")
return TRUE
return ..()
/obj/machinery/suit_storage_unit/ui_state(mob/user)
return GLOB.notcontained_state
/obj/machinery/suit_storage_unit/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "SuitStorageUnit", name)
ui.open()
/obj/machinery/suit_storage_unit/ui_data()
var/list/data = list()
data["locked"] = locked
data["open"] = state_open
data["safeties"] = safeties
data["uv_active"] = uv
data["uv_super"] = uv_super
if(helmet)
data["helmet"] = helmet.name
else
data["helmet"] = null
if(suit)
data["suit"] = suit.name
else
data["suit"] = null
if(mask)
data["mask"] = mask.name
else
data["mask"] = null
if(shoes)
data["shoes"] = shoes.name
else
data["shoes"] = null
if(storage)
data["storage"] = storage.name
else
data["storage"] = null
if(occupant)
data["occupied"] = TRUE
else
data["occupied"] = FALSE
return data
/obj/machinery/suit_storage_unit/ui_act(action, params)
if(..() || uv)
return
switch(action)
if("door")
if(state_open)
close_machine()
else
open_machine(0)
if(occupant)
dump_contents() // Dump out contents if someone is in there.
. = TRUE
if("lock")
if(state_open)
return
locked = !locked
. = TRUE
if("uv")
if(occupant && safeties)
return
else if(!helmet && !mask && !suit && !storage && !occupant)
return
else
if(occupant)
var/mob/living/mob_occupant = occupant
to_chat(mob_occupant, "<span class='userdanger'>[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!</span>")
cook()
. = TRUE
if("dispense")
if(!state_open)
return
var/static/list/valid_items = list("helmet", "suit", "mask", "shoes", "storage")
var/item_name = params["item"]
if(item_name in valid_items)
var/obj/item/I = vars[item_name]
vars[item_name] = null
if(I)
var/mob/living/living_person = usr
if(!istype(living_person))
return
if(!istype(living_person) || !Adjacent(living_person) || !living_person.put_in_active_hand(I))
I.forceMove(loc)
. = TRUE
update_icon()
/obj/machinery/suit_storage_unit/default_pry_open(obj/item/I)//needs to check if the storage is locked.
. = !(state_open || panel_open || is_operational() || locked || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
@@ -11,6 +11,7 @@
var/body_colors = "#e3ba84" //a default color just in case.
var/gibs_reagent_id = /datum/reagent/liquidgibs
var/gibs_bloodtype = "A+"
turf_loc_check = FALSE
/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases, list/blood_data)
. = ..()
@@ -22,6 +23,9 @@
add_blood_DNA(list("Non-human DNA" = gibs_bloodtype), diseases)
update_icon()
/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
return FALSE //Never fail to place us
/obj/effect/decal/cleanable/blood/gibs/update_icon()
add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
cut_overlays()
+2 -2
View File
@@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.temporarilyRemoveItemFromInventory(I = src))
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
return
. = FALSE
@@ -428,7 +428,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.temporarilyRemoveItemFromInventory(src))
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(I = src))
return
pickup(user)
@@ -725,6 +725,26 @@
def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high)
needs_anchored = FALSE
/obj/item/circuitboard/machine/chem_dispenser/fullupgrade
build_path = /obj/machinery/chem_dispenser/fullupgrade
req_components = list(
/obj/item/stock_parts/matter_bin/bluespace = 2,
/obj/item/stock_parts/capacitor/quadratic = 2,
/obj/item/stock_parts/manipulator/femto = 2,
/obj/item/stack/sheet/glass = 1,
/obj/item/stock_parts/cell/bluespace = 1,
)
/obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter
build_path = /obj/machinery/chem_dispenser/mutagensaltpeter
req_components = list(
/obj/item/stock_parts/matter_bin/bluespace = 2,
/obj/item/stock_parts/capacitor/quadratic = 2,
/obj/item/stock_parts/manipulator/femto = 2,
/obj/item/stack/sheet/glass = 1,
/obj/item/stock_parts/cell/bluespace = 1,
)
/obj/item/circuitboard/machine/chem_dispenser/apothecary
name = "Apotechary Chem Dispenser (Machine Board)"
build_path = /obj/machinery/chem_dispenser/apothecary
@@ -740,7 +760,13 @@
name = "Reagent Synthesizer (Abductor Machine Board)"
icon_state = "abductor_mod"
build_path = /obj/machinery/chem_dispenser/abductor
def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high)
req_components = list(
/obj/item/stock_parts/matter_bin/bluespace = 2,
/obj/item/stock_parts/capacitor/quadratic = 2,
/obj/item/stock_parts/manipulator/femto = 2,
/obj/item/stack/sheet/glass = 1,
/obj/item/stock_parts/cell/bluespace = 1,
)
needs_anchored = FALSE
/obj/item/circuitboard/machine/chem_heater
@@ -1175,11 +1201,31 @@
icon_state = "service"
build_path = /obj/machinery/chem_dispenser/drinks
/obj/item/circuitboard/machine/chem_dispenser/drinks/fullupgrade
build_path = /obj/machinery/chem_dispenser/drinks/fullupgrade
req_components = list(
/obj/item/stock_parts/matter_bin/bluespace = 2,
/obj/item/stock_parts/capacitor/quadratic = 2,
/obj/item/stock_parts/manipulator/femto = 2,
/obj/item/stack/sheet/glass = 1,
/obj/item/stock_parts/cell/bluespace = 1,
)
/obj/item/circuitboard/machine/chem_dispenser/drinks/beer
name = "Booze Dispenser (Machine Board)"
icon_state = "service"
build_path = /obj/machinery/chem_dispenser/drinks/beer
/obj/item/circuitboard/machine/chem_dispenser/drinks/beer/fullupgrade
build_path = /obj/machinery/chem_dispenser/drinks/beer/fullupgrade
req_components = list(
/obj/item/stock_parts/matter_bin/bluespace = 2,
/obj/item/stock_parts/capacitor/quadratic = 2,
/obj/item/stock_parts/manipulator/femto = 2,
/obj/item/stack/sheet/glass = 1,
/obj/item/stock_parts/cell/bluespace = 1,
)
/obj/item/circuitboard/machine/chem_master/condi
name = "CondiMaster 3000 (Machine Board)"
icon_state = "service"
+1 -1
View File
@@ -42,7 +42,7 @@
var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6")
var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED,
RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING)
var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint")
var/static/list/graffiti_large_h = list("yiffhell", "furrypride", "secborg", "paint")
var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h
+7 -22
View File
@@ -32,6 +32,9 @@ GLOBAL_LIST_EMPTY(PDAs)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
always_reskinnable = TRUE
reskin_binding = COMSIG_CLICK_CTRL_SHIFT
//Main variables
var/owner = null // String name of owner
var/default_cartridge = 0 // Access level defined by cartridge
@@ -112,10 +115,10 @@ GLOBAL_LIST_EMPTY(PDAs)
. += id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
if(inserted_item && (!isturf(loc)))
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
if(LAZYLEN(GLOB.pda_reskins))
. += "<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
/obj/item/pda/Initialize(mapload)
if(GLOB.pda_reskins)
unique_reskin = GLOB.pda_reskins
. = ..()
if(fon)
set_light(f_lum, f_pow, f_col)
@@ -130,28 +133,10 @@ GLOBAL_LIST_EMPTY(PDAs)
new_overlays = TRUE
update_icon()
/obj/item/pda/CtrlShiftClick(mob/living/user)
. = ..()
if(GLOB.pda_reskins && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
reskin_obj(user)
/obj/item/pda/reskin_obj(mob/M)
if(!LAZYLEN(GLOB.pda_reskins))
return
var/dat = "<b>Reskin options for [name]:</b>"
for(var/V in GLOB.pda_reskins)
var/output = icon2html(GLOB.pda_reskins[V], M, icon_state)
dat += "\n[V]: <span class='reallybig'>[output]</span>"
to_chat(M, dat)
var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins
var/new_icon = GLOB.pda_reskins[choice]
if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
icon = new_icon
. = ..()
new_overlays = TRUE
update_icon()
to_chat(M, "[src] is now skinned as '[choice]'.")
/obj/item/pda/proc/set_new_overlays()
if(!overlays_offsets || !(icon in overlays_offsets))
@@ -191,7 +176,7 @@ GLOBAL_LIST_EMPTY(PDAs)
else
font_index = MODE_MONO
font_mode = FONT_MONO
var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]
var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]["icon"]
if(icon != pref_skin)
icon = pref_skin
new_overlays = TRUE
+2 -2
View File
@@ -17,7 +17,7 @@
icon_state = "beacon-off"
/obj/item/beacon/Destroy()
GLOB.teleportbeacons.Remove(src)
GLOB.teleportbeacons -= src
return ..()
/obj/item/beacon/attack_self(mob/user)
@@ -27,7 +27,7 @@
GLOB.teleportbeacons += src
else
icon_state = "beacon-off"
GLOB.teleportbeacons.Remove(src)
GLOB.teleportbeacons -= src
to_chat(user, "<span class='notice'>You [enabled ? "enable" : "disable"] the beacon.</span>")
return
@@ -67,6 +67,9 @@
// when we get this many shards, we get a free bulb.
var/shards_required = 4
// whether it is "bluespace powered" (can be used at a range)
var/bluespace_toggle = FALSE
/obj/item/lightreplacer/New()
uses = max_uses / 2
failmsg = "The [name]'s refill light blinks red."
@@ -242,7 +245,7 @@
/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity)
. = ..()
if(!proximity)
if(!proximity && !bluespace_toggle)
return
if(!isturf(T))
return
@@ -253,6 +256,18 @@
break
used = TRUE
if(istype(A, /obj/machinery/light))
if(!proximity && bluespace_toggle)
// Set variable for target light
var/obj/machinery/light/target = A
// Check light status before playing effects
if(target.status != LIGHT_OK)
// Display RPED beam
U.Beam(A, icon_state = "rped_upgrade", time = 1 SECONDS)
// Play RPED sound
playsound(src, 'sound/items/pshoom.ogg', 40, 1)
ReplaceLight(A, U)
if(!used)
@@ -266,6 +281,15 @@
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
return
/obj/item/lightreplacer/blue
name = "bluespace light replacer"
desc = "A modified light replacer that zaps lights into place. Refill with broken or working lightbulbs, or sheets of glass."
icon_state = "lightreplacer_blue"
bluespace_toggle = TRUE
/obj/item/lightreplacer/blue/emag_act()
return // balancing against longrange explosions
#undef LIGHT_OK
#undef LIGHT_EMPTY
#undef LIGHT_BROKEN
@@ -30,6 +30,10 @@
mytape = new starting_tape_type(src)
update_icon()
/obj/item/taperecorder/Destroy()
// QDEL_NULL(soundloop)
QDEL_NULL(mytape)
return ..()
/obj/item/taperecorder/examine(mob/user)
. = ..()
+14 -19
View File
@@ -193,34 +193,29 @@
/obj/item/melee/transforming/energy/sword/saber
possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER)
unique_reskin = list("Sword" = "sword0", "Saber" = "esaber0")
unique_reskin = list(
"Sword" = list("icon_state" = "sword0"),
"Saber" = list("icon_state" = "esaber0")
)
var/hacked = FALSE
var/saber = FALSE
/obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text)
. = ..()
if(.)
if(active)
if(sword_color)
if(saber)
icon_state = "esaber[sword_color]"
else
icon_state = "sword[sword_color]"
else
if(saber)
icon_state = "esaber0"
switch(current_skin)
if("Saber")
icon_state = "esaber[active ? sword_color : "0"]"
// No skin
else
icon_state = "sword0"
icon_state = "sword[active ? sword_color : "0"]"
/obj/item/melee/transforming/energy/sword/saber/reskin_obj(mob/M)
. = ..()
if(icon_state == "esaber0")
saber = TRUE
if(active)
if(saber)
icon_state = "esaber[sword_color]"
else
icon_state = "sword[sword_color]"
switch(current_skin)
if("Sword")
icon_state = "sword[active ? sword_color : "0"]"
if("Saber")
icon_state = "esaber[active ? sword_color : "0"]"
/obj/item/melee/transforming/energy/sword/saber/set_sword_color(var/color_forced)
if(color_forced) // wow i really do not like this at fucking all holy SHIT
+1 -1
View File
@@ -91,7 +91,7 @@
name = "advanced mop"
mopcap = 10
icon_state = "advmop"
item_state = "mop"
item_state = "advmop"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
force = 6
+17 -45
View File
@@ -28,9 +28,17 @@
var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
var/current_skin //the item reskin
var/list/unique_reskin //List of options to reskin.
//Reskin variables
/// The item reskin
var/current_skin
/// List of options to reskin.
var/list/unique_reskin
/// Can always be modified
var/always_reskinnable = FALSE
/// How to bring up the reskinning menu
var/reskin_binding = COMSIG_CLICK_ALT
//
// Access levels, used in modules\jobs\access.dm
var/list/req_access
@@ -76,6 +84,10 @@
var/turf/T = loc
T.add_blueprints_preround(src)
/obj/ComponentInitialize()
. = ..()
if(islist(unique_reskin) && length(unique_reskin))
AddElement(/datum/element/object_reskinning)
/obj/Destroy(force=FALSE)
if(!ismachinery(src))
@@ -340,50 +352,10 @@
. = ..()
if(obj_flags & UNIQUE_RENAME)
. += "<span class='notice'>Use a pen on it to rename it or change its description.</span>"
if(unique_reskin && (!current_skin || always_reskinnable))
. += "<span class='notice'>Alt-click it to reskin it.</span>"
/obj/AltClick(mob/user)
. = ..()
if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
reskin_obj(user)
return TRUE
/obj/proc/reskin_obj(mob/M)
if(!LAZYLEN(unique_reskin))
return
var/list/items = list()
for(var/reskin_option in unique_reskin)
var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option])
items += list("[reskin_option]" = item_image)
sortList(items)
var/pick = show_radial_menu(M, src, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, M), radius = 38, require_near = TRUE)
if(!pick)
return
if(!unique_reskin[pick])
return
current_skin = pick
icon_state = unique_reskin[pick]
to_chat(M, "[src] is now skinned as '[pick].'")
/**
* Checks if we are allowed to interact with a radial menu for reskins
*
* Arguments:
* * user The mob interacting with the menu
*/
/obj/proc/check_reskin_menu(mob/user)
if(QDELETED(src))
return FALSE
if(current_skin)
return FALSE
if(!istype(user))
return FALSE
if(user.incapacitated())
return FALSE
return TRUE
/// Do you want to make overrides, of course you do! Will be called if an object was reskinned successfully
/obj/proc/reskin_obj(mob/user)
return
/obj/update_overlays()
. = ..()
@@ -139,7 +139,7 @@
/obj/structure/closet/crate/freezer/Destroy()
recursive_organ_check(src)
..()
return ..()
/obj/structure/closet/crate/freezer/Initialize(mapload)
. = ..()
+12 -3
View File
@@ -15,9 +15,12 @@
var/obj/structure/chair/C = new /obj/structure/chair(loc)
W.play_tool_sound(src)
C.setDir(dir)
part.forceMove(loc)
part.master = null
part = null
if (part)
part.forceMove(loc)
part.master = null
part = null
qdel(src)
/obj/structure/chair/e_chair/proc/shock()
@@ -44,3 +47,9 @@
to_chat(buckled_mob, "<span class='userdanger'>You feel a deep shock course through your body!</span>")
addtimer(CALLBACK(buckled_mob, /mob/living.proc/electrocute_act, 85, src, 1), 1)
visible_message("<span class='danger'>The electric chair went off!</span>", "<span class='italics'>You hear a deep sharp shock!</span>")
/obj/structure/chair/e_chair/Destroy()
if(part)
QDEL_NULL(part)
return ..()
+1
View File
@@ -41,6 +41,7 @@
if(new_style)
H.hair_style = new_style
H.update_mutant_bodyparts()
H.update_hair()
/obj/structure/mirror/examine_status(mob/user)
+2
View File
@@ -137,6 +137,8 @@ GLOBAL_LIST_EMPTY(station_turfs)
requires_activation = FALSE
..()
vis_contents.Cut()
/turf/on_attack_hand(mob/user)
user.Move_Pulled(src)
+10 -10
View File
@@ -99,10 +99,10 @@
to_chat(src,"<span class='userdanger'>Your [G.name] cannot cum.</span>")
return
if(mb_time) //as long as it's not instant, give a warning
to_chat(src,"<span class='userlove'>You feel yourself about to orgasm.</span>")
to_chat(src, span_userlove("You feel yourself about to orgasm."))
if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE))
return
to_chat(src,"<span class='userlove'>You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].</span>")
to_chat(src, span_userlove("You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name]."))
do_climax(fluid_source, loc, G)
/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30, obj/item/organ/genital/Lgen = null) //Used for climaxing with any living thing
@@ -110,16 +110,16 @@
if(!fluid_source)
return
if(mb_time) //Skip warning if this is an instant climax.
to_chat(src,"<span class='userlove'>You're about to climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"]!</span>")
to_chat(L,"<span class='userlove'>[src] is about to climax [(Lgen) ? "in your [Lgen.name]" : "with you"]!</span>")
to_chat(src, span_userlove("You're about to climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"]!"))
to_chat(L, span_userlove("[src] is about to climax [(Lgen) ? "in your [Lgen.name]" : "with you"]!"))
if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE))
return
if(spillage)
to_chat(src,"<span class='userlove'>You orgasm with [L], spilling out of [(Lgen) ? "[L.p_their()] [Lgen.name]" : "[L.p_them()]"], using your [G.name].</span>")
to_chat(L,"<span class='userlove'>[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [p_their()] [G.name]!</span>")
to_chat(src, span_userlove("You orgasm with [L], spilling out of [(Lgen) ? "[L.p_their()] [Lgen.name]" : "[L.p_them()]"], using your [G.name]."))
to_chat(L, span_userlove("[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [p_their()] [G.name]!"))
else //knots and other non-spilling orgasms
to_chat(src,"<span class='userlove'>You climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"], your [G.name] spilling nothing.</span>")
to_chat(L,"<span class='userlove'>[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!</span>")
to_chat(src, span_userlove("You climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"], your [G.name] spilling nothing."))
to_chat(L, span_userlove("[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!"))
//SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) //Sandstorm edit
do_climax(fluid_source, spillage ? loc : L, G, spillage,, Lgen)
//L.receive_climax(src, Lgen, G, spillage)
@@ -129,10 +129,10 @@
if(!fluid_source)
return
if(mb_time)
to_chat(src,"<span class='userlove'>You start to [G.masturbation_verb] your [G.name] over [container].</span>")
to_chat(src, span_userlove("You start to [G.masturbation_verb] your [G.name] over [container]."))
if(!do_after(src, mb_time, target = src) || !in_range(src, container) || !G.climaxable(src, TRUE))
return
to_chat(src,"<span class='userlove'>You used your [G.name] to fill [container].</span>")
to_chat(src, span_userlove("You used your [G.name] to fill [container]."))
message_admins("[ADMIN_LOOKUPFLW(src)] used [p_their()] [G.name] to fill [container] with [G.get_fluid_name()].")
log_consent("[key_name(src)] used their [G.name] to fill [container].")
do_climax(fluid_source, container, G, FALSE, cover = TRUE)
+2 -2
View File
@@ -167,9 +167,9 @@
var/original_state = picked_organ.aroused_state
picked_organ.set_aroused_state(!picked_organ.aroused_state)
if(original_state != picked_organ.aroused_state)
to_chat(src,"<span class='userlove'>[picked_organ.aroused_state ? picked_organ.arousal_verb : picked_organ.unarousal_verb].</span>")
to_chat(src, span_userlove("[picked_organ.aroused_state ? picked_organ.arousal_verb : picked_organ.unarousal_verb]."))
else
to_chat(src,"<span class='userlove'>You can't make that genital [picked_organ.aroused_state ? "unaroused" : "aroused"]!</span>")
to_chat(src, span_userlove("You can't make that genital [picked_organ.aroused_state ? "unaroused" : "aroused"]!"))
picked_organ.update_appearance()
if(ishuman(src))
var/mob/living/carbon/human/human = src
+4 -2
View File
@@ -27,8 +27,10 @@
return TRUE
/obj/item/assembly/shock_kit/attack_self(mob/user)
part1.attack_self(user)
part2.attack_self(user)
if (part1)
part1.attack_self(user)
if (part2)
part2.attack_self(user)
add_fingerprint(user)
return
@@ -760,6 +760,8 @@
/datum/gas_reaction/hagedorn/react(datum/gas_mixture/air, datum/holder)
var/initial_energy = air.thermal_energy()
if(air.get_moles(GAS_QCD))
return
for(var/g in air.get_gases())
air.set_moles(g, 0)
var/amount = initial_energy / (air.return_temperature() * GLOB.gas_data.specific_heats[GAS_QCD])
@@ -238,6 +238,8 @@
SSradio.remove_object(src, frequency)
qdel(wires)
wires = null
var/area/ourarea = get_area(src)
ourarea.atmosalert(FALSE, src)
return ..()
/obj/machinery/airalarm/examine(mob/user)
+1 -1
View File
@@ -8,7 +8,7 @@
name = "Trash Bag of Holding"
description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them."
reward = 3000
wanted_types = list(/obj/item/storage/backpack/holding)
wanted_types = list(/obj/item/storage/bag/trash/bluespace)
/datum/bounty/item/science/bluespace_syringe
name = "Bluespace Syringe"
+1 -1
View File
@@ -40,7 +40,7 @@
/obj/machinery/computer/cargo/Destroy()
QDEL_NULL(radio)
..()
return ..()
/obj/machinery/computer/cargo/proc/get_export_categories()
. = EXPORT_CARGO
+3 -3
View File
@@ -1004,7 +1004,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Belly Visibility:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=belly_visibility;task=input'>[features["belly_visibility"]]</a>"
dat += "<b>Egg Stuffing:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=belly_stuffing'>[features["belly_stuffing"] == TRUE ? "Yes" : "No"]</a>"
dat += "</td>"
if(pref_species.id == SPECIES_DULLAHAN)
if(all_quirks.Find("Dullahan"))
dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Neckfire</h3>"
@@ -2068,9 +2068,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
to_chat(user, "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>")
if("age")
var/new_age = tgui_input_number(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference", null, AGE_MAX, AGE_MIN)
var/new_age = tgui_input_number(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX_INPUT])", "Character Preference", null, AGE_MAX_INPUT, AGE_MIN)
if(new_age)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
age = max(min( round(text2num(new_age)), AGE_MAX_INPUT),AGE_MIN)
if("security_records")
var/rec = stripped_multiline_input(usr, "Set your security record note section. This should be IC!", "Security Records", html_decode(security_records), MAX_FLAVOR_LEN, TRUE)
+16 -1
View File
@@ -364,6 +364,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(length(old_flavor_text) && !length(features["feature_flavor_text"]))
features["feature_flavor_text"] = old_flavor_text
// hey what happened to 55
// dullahans as a species cease to exist
if(current_version < 56)
var/species_id = S["species"]
if(species_id == SPECIES_DULLAHAN)
S["species"] = SPECIES_HUMAN
if(islist(S["all_quirks"]))
S["all_quirks"] += "Dullahan"
else
S["all_quirks"] = list("Dullahan")
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -465,6 +477,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["preferred_chaos"] >> preferred_chaos
S["auto_ooc"] >> auto_ooc
S["no_tetris_storage"] >> no_tetris_storage
S["recoil_screenshake"] >> recoil_screenshake
// Splurt
S["be_victim"] >> be_victim
@@ -532,6 +545,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles))
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage))
recoil_screenshake = sanitize_integer(recoil_screenshake, 0, 800, initial(recoil_screenshake))
key_bindings = sanitize_islist(key_bindings, list())
modless_key_bindings = sanitize_islist(modless_key_bindings, list())
favorite_outfits = SANITIZE_LIST(favorite_outfits)
@@ -665,6 +679,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["preferred_chaos"], preferred_chaos)
WRITE_FILE(S["auto_ooc"], auto_ooc)
WRITE_FILE(S["no_tetris_storage"], no_tetris_storage)
WRITE_FILE(S["recoil_screenshake"], recoil_screenshake)
// Splurt
WRITE_FILE(S["be_victim"], be_victim)
@@ -1069,7 +1084,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color))
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
age = sanitize_integer(age, AGE_MIN, AGE_MAX_INPUT, initial(age))
hair_color = sanitize_hexcolor(hair_color, 6, FALSE)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE)
grad_style = sanitize_inlist(grad_style, GLOB.hair_gradients_list, "None")
+14 -4
View File
@@ -27,6 +27,11 @@
if(glass_colour_type && ishuman(user))
. += "<span class='notice'>Alt-click to toggle its colors.</span>"
/obj/item/clothing/glasses/proc/prescribe()
vision_correction = TRUE
name = "prescription [name]"
desc += " These have been fitted with a prescription overlay device, and thus correct some vision deficiencies."
/obj/item/clothing/glasses/visor_toggling()
..()
if(visor_vars_to_toggle & VISOR_VISIONFLAGS)
@@ -128,10 +133,9 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
/obj/item/clothing/glasses/night/prescription
name = "prescription night vision goggles"
desc = "NVGs but for those with nearsightedness."
vision_correction = 1
/obj/item/clothing/glasses/night/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/night/syndicate
name = "combat night vision goggles"
@@ -233,6 +237,12 @@
icon_state = "circle_glasses"
item_state = "circle_glasses"
/obj/item/clothing/glasses/regular/modern
name = "modern glasses"
desc = "A Dork. Co. revamp and/or revision of Nerd. Co.'s classic prescription glasses, with less opaque lenses."
icon_state = "glasses_alt"
item_state = "glasses_alt"
//Here lies green glasses, so ugly they died. RIP
/obj/item/clothing/glasses/sunglasses
+19 -30
View File
@@ -14,6 +14,7 @@
if(G.vision_correction)
vision_correction = TRUE
name = "prescription [name]"
desc += " These have been made with some form of vision-correcting eyewear, thus making them innately correct some vision deficiencies."
return
/obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot)
@@ -55,13 +56,9 @@
hud_type = DATA_HUD_MEDICAL_ADVANCED
glass_colour_type = /datum/client_colour/glass_colour/lightblue
/obj/item/clothing/glasses/hud/health/prescription
name = "prescription health scanner HUD"
desc = "A heads-up display, made with a prescription lens, that scans the humans in view and provides accurate data about their health status."
icon_state = "healthhud"
hud_type = DATA_HUD_MEDICAL_ADVANCED
vision_correction = 1
glass_colour_type = /datum/client_colour/glass_colour/lightblue
/obj/item/clothing/glasses/hud/health/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/hud/health/night
name = "night vision health scanner HUD"
@@ -88,9 +85,9 @@
tint = 1
glass_colour_type = /datum/client_colour/glass_colour/blue
/obj/item/clothing/glasses/hud/health/sunglasses/prescription
name = "prescription medical HUDSunglasses"
vision_correction = 1
/obj/item/clothing/glasses/hud/health/sunglasses/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/hud/health/eyepatch
name = "eyepatch medHUD"
@@ -117,17 +114,13 @@
flash_protect = 1
tint = 1
/obj/item/clothing/glasses/hud/diagnostic/prescription
name = "prescription diagnostic HUD"
desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits. This one has a prescription lens."
icon_state = "diagnostichud"
hud_type = DATA_HUD_DIAGNOSTIC_BASIC
vision_correction = 1
glass_colour_type = /datum/client_colour/glass_colour/lightorange
/obj/item/clothing/glasses/hud/diagnostic/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/hud/diagnostic/sunglasses/prescription
name = "prescription diagnostic HUDSunglasses"
vision_correction = 1
/obj/item/clothing/glasses/hud/diagnostic/sunglasses/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/hud/diagnostic/night
name = "night vision diagnostic HUD"
@@ -155,13 +148,9 @@
hud_type = DATA_HUD_SECURITY_ADVANCED
glass_colour_type = /datum/client_colour/glass_colour/red
/obj/item/clothing/glasses/hud/security/prescription
name = "prescription security HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records. This one has a prescription lens so you can see the banana peal that slipped you."
icon_state = "securityhud"
hud_type = DATA_HUD_SECURITY_ADVANCED
vision_correction = 1
glass_colour_type = /datum/client_colour/glass_colour/red
/obj/item/clothing/glasses/hud/security/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/hud/security/chameleon
name = "chameleon security HUD"
@@ -200,9 +189,9 @@
desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball."
icon_state = "hudpatch"
/obj/item/clothing/glasses/hud/security/sunglasses/prescription
name = "prescription security HUDSunglasses"
vision_correction = 1
/obj/item/clothing/glasses/hud/security/sunglasses/prescription/Initialize(mapload)
. = ..()
prescribe()
/obj/item/clothing/glasses/hud/security/night
name = "night vision security HUD"
@@ -0,0 +1,22 @@
// don't you love single purpose files? i do too.
/obj/item/prescription_kit
name = "prescription lens kit"
desc = "A disposable kit containing all the needed tools and parts to develop and apply a self-modifying prescription lens overlay device to any eyewear."
icon = 'icons/obj/device.dmi'
icon_state = "modkit"
/obj/item/prescription_kit/attack_obj(obj/O, mob/living/user)
if(!istype(O, /obj/item/clothing/glasses))
return ..()
if(istype(O, /obj/item/clothing/glasses))
var/obj/item/clothing/glasses/target_glasses = O
if(target_glasses.vision_correction)
to_chat(user, span_notice("These are already fitted with prescription lenses or otherwise already correct vision!"))
return
playsound(src, 'sound/items/screwdriver.ogg', 50, 1)
user.visible_message(span_notice("[user] fits \the [target_glasses] with a prescription overlay device."), span_notice("You fit \the [target_glasses] with a prescription overlay device."))
target_glasses.prescribe()
target_glasses.balloon_alert(user, "prescription fitted!")
qdel(src)
@@ -79,16 +79,18 @@
to_chat(user, "<span class='warning'>With [src] off of your arms, you feel less ready to punch things.</span>")
/obj/item/clothing/gloves/fingerless/pugilist/crafted
unique_reskin = list("Short" = "armwraps",
"Extended" = "armwraps_extended"
)
unique_reskin = list(
"Short" = list("icon_state" = "armwraps"),
"Extended" = list("icon_state" = "armwraps_extended")
)
/obj/item/clothing/gloves/fingerless/pugilist/crafted/reskin_obj(mob/M)
. = ..()
if(icon_state == "armwraps_extended")
item_state = "armwraps_extended"
else
return
switch(current_skin)
if("Short")
item_state = "armwraps"
if("Extended")
item_state = "armwraps_extended"
/obj/item/clothing/gloves/fingerless/pugilist/chaplain
name = "armwraps of unyielding resolve"
+6 -2
View File
@@ -25,6 +25,10 @@
/// See: [/datum/component/tackler/var/skill_mod]
var/skill_mod = 1
/obj/item/clothing/gloves/tackler/Destroy()
tackler = null
return ..()
/obj/item/clothing/gloves/tackler/equipped(mob/user, slot)
. = ..()
if(!ishuman(user))
@@ -34,12 +38,12 @@
var/mob/living/carbon/human/H = user
tackler = H.AddComponent(/datum/component/tackler, stamina_cost=tackle_stam_cost, base_knockdown = base_knockdown, range = tackle_range, speed = tackle_speed, skill_mod = skill_mod, min_distance = min_distance)
else
qdel(tackler) // Only wearing it!
QDEL_NULL(tackler) // Only wearing it!
/obj/item/clothing/gloves/tackler/dropped(mob/user)
. = ..()
if(tackler)
qdel(tackler)
QDEL_NULL(tackler)
/obj/item/clothing/gloves/tackler/dolphin
name = "dolphin gloves"
+4 -2
View File
@@ -275,8 +275,10 @@
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
actions_types = list(/datum/action/item_action/bhop)
permeability_coefficient = 0.05
unique_reskin = list("Explorer" = "miningjet",
"Jackboot" = "jetboots")
unique_reskin = list(
"Explorer" = list("icon_state" = "miningjet"),
"Jackboot" = list("icon_state" = "jetboots")
)
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
var/jumpspeed = 3
var/recharging_rate = 60 //default 6 seconds between each dash
+4 -3
View File
@@ -80,9 +80,10 @@
item_state = "hostrench"
flags_inv = 0
strip_delay = 80
unique_reskin = list("Coat" = "hostrench",
"Cloak" = "trenchcloak"
)
unique_reskin = list(
"Coat" = list("icon_state" = "hostrench"),
"Cloak" = list("icon_state" = "trenchcloak")
)
/obj/item/clothing/suit/armor/hos/platecarrier
name = "plate carrier"
+22 -2
View File
@@ -111,7 +111,7 @@
/obj/item/clothing/accessory/proc/on_uniform_dropped(obj/item/clothing/under/U, user)
return
/obj/item/clothing/accessory/AltClick(mob/user)
/obj/item/clothing/accessory/CtrlClick(mob/user)
. = ..()
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(initial(above_suit))
@@ -123,7 +123,7 @@
. = ..()
. += "<span class='notice'>\The [src] can be attached to [istype(src, /obj/item/clothing/accessory/ring) ? "gloves" : "a uniform"]. Alt-click to remove it once attached.</span>"
if(initial(above_suit))
. += "<span class='notice'>\The [src] can be worn above or below your suit. Alt-click to toggle.</span>"
. += "<span class='notice'>\The [src] can be worn above or below your suit. Ctrl-click to toggle.</span>"
//////////////
//Waistcoats//
@@ -603,3 +603,23 @@
obj_flags = UNIQUE_RENAME
custom_materials = list(/datum/material/iron=100)
resistance_flags = FIRE_PROOF
/obj/item/clothing/accessory/pride
name = "pride pin"
desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride of sexuality or gender identity, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!"
icon_state = "pride"
above_suit = TRUE
obj_flags = UNIQUE_RENAME
unique_reskin = list(
"Rainbow Pride" = list("icon_state" = "pride"),
"Bisexual Pride" = list("icon_state" = "pride_bi"),
"Pansexual Pride" = list("icon_state" = "pride_pan"),
"Asexual Pride" = list("icon_state" = "pride_ace"),
"Non-binary Pride" = list("icon_state" = "pride_enby"),
"Transgender Pride" = list("icon_state" = "pride_trans")
)
/obj/item/clothing/accessory/pride/reskin_obj(mob/M)
. = ..()
name = "[current_skin] pin"
+1 -19
View File
@@ -219,23 +219,11 @@
/mob/living/simple_animal/jacq/proc/treat(mob/living/carbon/C, gender)
visible_message("<b>[src]</b> gives off a glowing smile, <span class='spooky'>\"What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.\"</span>")
jacqrunes("What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.", C)
var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Jacqueline Tracker - 2 candies", "Plushie - 1 candy", "Can I get to know you instead?", "Become a pumpkinhead dullahan (perma) - 4 candies")
var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Jacqueline Tracker - 2 candies", "Plushie - 1 candy", "Can I get to know you instead?")
var/choice_reward = input(usr, "Trick or Treat?", "Trick or Treat?") in choices_reward
//rewards
switch(choice_reward)
if("Become a pumpkinhead dullahan (perma) - 4 candies")
if(!take_candies(C, 4))
visible_message("<b>[src]</b> raises an eyebrown, <span class='spooky'>\"It's 4 candies for that [gender]! Thems the rules!\"</span>")
jacqrunes("It's 4 candies for that [gender]! Thems the rules!", C)
return
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"Off comes your head, a pumpkin taking it's stead!\"</span>")
jacqrunes("Off comes your head, a pumpkin taking it's stead!", C)
C.reagents.add_reagent(/datum/reagent/mutationtoxin/pumpkinhead, 5)
sleep(20)
poof()
return
if("Object - 3 candies")
if(!take_candies(C, 3))
visible_message("<b>[src]</b> raises an eyebrown, <span class='spooky'>\"It's 3 candies per trinket [gender]! Thems the rules!\"</span>")
@@ -698,12 +686,6 @@
else
..()
/datum/reagent/mutationtoxin/pumpkinhead
name = "Pumpkin head mutation toxin"
race = /datum/species/dullahan/pumpkin
mutationtext = "<span class='spooky'>The pain subsides. You feel your head roll off your shoulders... and you smell pumpkin."
//I couldn't get the replace head sprite with a pumpkin to work so, it is what it is.
/mob/living/simple_animal/jacq/proc/check_candies(mob/living/carbon/C)
var/invs = C.get_contents()
var/candy_count = 0
+4
View File
@@ -63,6 +63,10 @@
if (needs_update)
GLOB.lighting_update_lights -= src
top_atom = null
source_atom = null
source_turf = null
pixel_turf = null
. = ..()
// Yes this doesn't align correctly on anything other than 4 width tabs.
@@ -253,8 +253,10 @@
sharpness = SHARP_NONE // use your survival dagger or smth
icon_state = "crusher-hands"
item_state = "crusher0-fist"
unique_reskin = list("Gauntlets" = "crusher-hands",
"Fingerless" = "crusher-hands-bare")
unique_reskin = list(
"Gauntlets" = list("icon_state" = "crusher-hands"),
"Fingerless" = list("icon_state" = "crusher-hands-bare")
)
detonation_damage = 45 // 60 on wield, compared to normal crusher's 70
backstab_bonus = 70 // 130 on backstab though
var/combo_on_anything = FALSE // @admins if you're varediting this you don't get to whine at me
@@ -121,6 +121,7 @@
icon_state = "furnace"
density = TRUE
needs_item_input = TRUE
init_process = TRUE
var/obj/machinery/mineral/CONSOLE = null
var/on = FALSE
var/datum/material/selected_material = null
@@ -11,6 +11,7 @@
output_dir = SOUTH
req_access = list(ACCESS_MINERAL_STOREROOM)
speed_process = TRUE
init_process = TRUE
circuit = /obj/item/circuitboard/machine/ore_redemption
layer = BELOW_OBJ_LAYER
var/points = 0
+1
View File
@@ -9,6 +9,7 @@
input_dir = WEST
output_dir = EAST
speed_process = TRUE
init_process = TRUE
/obj/machinery/mineral/unloading_machine/proc/horrible_quadratic_monster(var/turf/T)
set waitfor = FALSE
+5 -2
View File
@@ -11,7 +11,7 @@
var/obj/item/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
new /datum/data/mining_equipment("50 Point Transfer Card", /obj/item/card/mining_point_card, 50),
new /datum/data/mining_equipment("50 Point Transfer Card", /obj/item/card/mining_point_card/fifty, 50),
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
@@ -27,7 +27,7 @@
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500),
new /datum/data/mining_equipment("Mining Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750),
@@ -330,6 +330,9 @@
icon_state = "data_1"
var/points = 500
/obj/item/card/mining_point_card/fifty
points = 50
/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/card/id))
var/obj/item/card/id/id = I
+14 -4
View File
@@ -585,18 +585,28 @@
for(var/job in category)
var/datum/job/job_datum = SSjob.name_occupations[job]
if(job_datum && IsJobUnavailable(job_datum.title, TRUE) == JOB_AVAILABLE)
// Get currently occupied slots
var/num_positions_current = job_datum.current_positions
// Get total slots that can be occupied
var/num_positions_total = job_datum.total_positions
// Change to lemniscate for infinite-slot jobs
// This variable should only used to display text!
num_positions_total = (num_positions_total == -1 ? "∞" : num_positions_total)
var/command_bold = ""
if(job in GLOB.command_positions)
command_bold = " command"
//SKYRAT CHANGES
var/jobline = "[job_datum.title] ([job_datum.current_positions])"
//Sandstorm changes
var/jobline = "[job_datum.title]"
if(job_datum in SSjob.prioritized_jobs)
jobline = "<span class='priority'>[jobline]</span>"
if(client && client.prefs && client.prefs.alt_titles_preferences[job_datum.title])
jobline = "[jobline]<br><span style='color:#BBBBBB; font-style: italic;'>(as [client.prefs.alt_titles_preferences[job_datum.title]])</span>"
jobline = "<a class='job[command_bold]' style='display:block;width:170px' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'>[jobline]</a>"
jobline = "<a class='job[command_bold]' style='display:block;width:170px' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'>[jobline] ([num_positions_current]/[num_positions_total])</a>"
dept_dat += jobline
//END OF SKYRAT CHANGES
//End of Sandstorm changes
if(!dept_dat.len)
dept_dat += "<span class='nopositions'>No positions open.</span>"
dat += jointext(dept_dat, "")
@@ -77,6 +77,8 @@
//For soft-restricting markings to species IDs
var/list/recommended_species
var/mutable_category // simply do not worry about this value
/datum/sprite_accessory/proc/is_not_visible(var/mob/living/carbon/human/H, var/tauric) //return if the accessory shouldn't be shown
return FALSE
@@ -48,6 +48,7 @@
icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi'
mutant_part_string = "xhead"
relevant_layers = list(BODY_ADJ_LAYER)
mutable_category = "HEAD"
/datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
@@ -49,6 +49,7 @@
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
mutant_part_string = "mandibles"
color_src = 0
mutable_category = "HEAD"
/datum/sprite_accessory/arachnid_mandibles/none
name = "None"
@@ -2,6 +2,7 @@
icon = 'icons/mob/mutant_bodyparts.dmi'
color_src = HAIR
relevant_layers = list(BODY_ADJ_LAYER)
mutable_category = "HEAD"
/datum/sprite_accessory/caps/round
name = "Round"
@@ -2,6 +2,7 @@
icon = 'icons/mob/mutant_bodyparts.dmi'
mutant_part_string = "ears"
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
mutable_category = "HEAD"
/datum/sprite_accessory/ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
@@ -4,6 +4,7 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/hair.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
mutable_category = "HEAD"
// please make sure they're sorted alphabetically and categorized
/datum/sprite_accessory/facial_hair/shaved //this is exempt from the alphabetical sort
@@ -3,6 +3,7 @@
//////////////////////
/datum/sprite_accessory/hair
icon = 'icons/mob/hair.dmi' // default icon for all hairs
mutable_category = "HEAD"
// please make sure they're sorted alphabetically and, where needed, categorized
// try to capitalize the names please~
@@ -2,6 +2,7 @@
icon = 'icons/mob/mutant_bodyparts.dmi'
color_src = HORNCOLOR
relevant_layers = list(HORNS_LAYER)
mutable_category = "HEAD"
/datum/sprite_accessory/horns/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
@@ -6,6 +6,11 @@
icon = 'modular_citadel/icons/mob/ipc_screens.dmi'
color_src = null
relevant_layers = list(BODY_ADJ_LAYER)
mutable_category = "HEAD"
/datum/sprite_accessory/screen/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
return (HD == null) // it's not visible if head is null
/datum/sprite_accessory/screen/blank
name = "Blank"
@@ -133,6 +138,7 @@
relevant_layers = list(BODY_ADJ_LAYER)
recommended_species = list("ipc")
mutant_part_string = "ipc_antenna"
mutable_category = "HEAD"
/datum/sprite_accessory/antenna/none
name = "None"
@@ -2,6 +2,7 @@
icon = 'icons/mob/mutant_bodyparts.dmi'
mutant_part_string = "snout"
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
mutable_category = "HEAD"
/datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
@@ -5,6 +5,7 @@
color_src = MUTCOLORS
name = "Synthetic Lizard - Snout"
icon_state = "synthliz_basic"
mutable_category = "HEAD"
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_under
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
@@ -17,10 +17,6 @@ Doesn't work on other aliens/AI.*/
action_icon_state = "spell_default"
action_background_icon_state = "bg_alien"
/obj/effect/proc_holder/alien/Initialize(mapload)
. = ..()
action = new(src)
/obj/effect/proc_holder/alien/Trigger(mob/living/carbon/user, skip_cost_check = FALSE)
if(!istype(user))
return TRUE
@@ -964,9 +964,6 @@
/mob/living/carbon/human/species/corporate
race = /datum/species/corporate
/mob/living/carbon/human/species/dullahan
race = /datum/species/dullahan
/mob/living/carbon/human/species/felinid
race = /datum/species/human/felinid

Some files were not shown because too many files have changed in this diff Show More