Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-23-10-2025

This commit is contained in:
Roxy
2025-10-23 17:38:23 -04:00
453 changed files with 20635 additions and 15897 deletions
@@ -463,7 +463,9 @@
/obj/item/reagent_containers/condiment/rice,
/obj/item/reagent_containers/condiment/milk,
/obj/item/reagent_containers/condiment/flour,
/obj/item/reagent_containers/condiment/sugar,
/obj/structure/closet/secure_closet/freezer/empty,
/obj/item/knife/kitchen,
/obj/item/storage/box/donkpockets,
/obj/item/coffee_cartridge,
/obj/item/coffee_cartridge/decaf,
@@ -496,6 +498,7 @@
/obj/structure/closet/crate/freezer,
/obj/item/food/grown/potato,
/obj/item/food/grown/potato,
/obj/item/food/grown/carrot,
/obj/item/food/grown/onion,
/obj/item/food/grown/garlic,
/turf/open/floor/iron/white,
@@ -834,7 +834,7 @@ a
a
a
a
b
a
a
a
a
@@ -1244,7 +1244,7 @@ a
a
a
a
a
b
a
a
a
File diff suppressed because it is too large Load Diff
+89 -83
View File
@@ -2166,6 +2166,15 @@
dir = 9
},
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/chair/sofa/bench/left{
dir = 1
},
/obj/effect/turf_decal/box/corners{
dir = 8
},
/obj/effect/turf_decal/box/corners{
dir = 1
},
/turf/open/floor/iron/white,
/area/station/medical/medbay)
"azy" = (
@@ -5137,7 +5146,6 @@
/area/station/command/gateway)
"bmw" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/medical/general,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
@@ -5153,6 +5161,7 @@
/obj/machinery/door/airlock/medical{
name = "Paramedic Dispatch"
},
/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic,
/turf/open/floor/iron,
/area/station/medical/paramedic)
"bmC" = (
@@ -6531,7 +6540,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral/full,
/turf/open/floor/iron/large,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/paramedic)
"bFe" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -8202,11 +8211,13 @@
/turf/open/floor/iron,
/area/station/medical/abandoned)
"bYc" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/status_display/ai/directional/east,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/machinery/computer/crew{
dir = 8
},
/turf/open/floor/iron/white,
/area/station/medical/paramedic)
"bYe" = (
@@ -9124,15 +9135,16 @@
/turf/open/floor/iron,
/area/station/maintenance/port/fore)
"ckd" = (
/obj/structure/chair/sofa/bench/left{
dir = 8
},
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
},
/obj/machinery/light/small/directional/south,
/obj/structure/chair/sofa/bench/right{
dir = 1
},
/obj/effect/turf_decal/box/corners,
/obj/effect/turf_decal/box/corners{
dir = 8
dir = 4
},
/turf/open/floor/iron/white,
/area/station/medical/medbay)
@@ -10079,7 +10091,7 @@
dir = 8
},
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"cvu" = (
/obj/structure/disposalpipe/segment,
@@ -10129,6 +10141,19 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/hop)
"cvX" = (
/obj/machinery/door/airlock/medical{
name = "Medbay Desk"
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/effect/mapping_helpers/airlock/access/all/medical/general,
/turf/open/floor/iron,
/area/station/medical/paramedic)
"cwe" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -11787,6 +11812,17 @@
dir = 8
},
/obj/machinery/light/small/directional/south,
/obj/structure/table/glass,
/obj/item/emergency_bed,
/obj/item/emergency_bed{
pixel_y = 3
},
/obj/item/emergency_bed{
pixel_y = 3
},
/obj/item/wheelchair{
pixel_y = 15
},
/turf/open/floor/iron/white,
/area/station/medical/paramedic)
"cSi" = (
@@ -12584,7 +12620,6 @@
},
/obj/machinery/digital_clock/directional/south,
/obj/item/mod/module/signlang_radio,
/obj/structure/fireaxecabinet/jawsofrecovery/directional/east,
/turf/open/floor/iron,
/area/station/medical/storage)
"dds" = (
@@ -16001,7 +16036,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"dWd" = (
/obj/structure/cable,
@@ -25209,7 +25244,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"gjI" = (
/obj/structure/window/reinforced/spawner/directional/west,
@@ -28519,9 +28554,11 @@
/area/station/hallway/secondary/exit)
"gXm" = (
/obj/item/kirbyplants/random,
/obj/machinery/firealarm/directional/south,
/obj/effect/turf_decal/tile/blue/half/contrasted,
/turf/open/floor/iron/white,
/obj/structure/fireaxecabinet/jawsofrecovery/directional/south{
pixel_y = -26
},
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"gXn" = (
/obj/structure/table,
@@ -34176,7 +34213,9 @@
dir = 4
},
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron/white,
/obj/item/toy/figure/paramedic,
/obj/item/surgicaldrill,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"ivz" = (
/obj/structure/window/reinforced/spawner/directional/south,
@@ -37239,7 +37278,6 @@
/area/station/security/lockers)
"jhs" = (
/obj/structure/cable,
/obj/effect/landmark/start/paramedic,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 4
},
@@ -38195,17 +38233,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
"jtz" = (
/obj/structure/chair/sofa/bench{
dir = 8
},
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
},
/obj/machinery/light/small/directional/east,
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/medbay)
"jtB" = (
/obj/structure/table/wood,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -41212,18 +41239,9 @@
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
"keH" = (
/obj/structure/chair/sofa/bench/right{
dir = 8
},
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 5
},
/obj/effect/turf_decal/box/corners{
dir = 1
},
/obj/effect/turf_decal/box/corners{
dir = 4
},
/turf/open/floor/iron/white,
/area/station/medical/medbay)
"keO" = (
@@ -46750,6 +46768,17 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
/obj/structure/reagent_dispensers/water_cooler,
/obj/machinery/button/door/directional/east{
pixel_y = -4;
id = "paramed_dispatch_desk";
name = "Desk Shutter Control"
},
/obj/machinery/button/door/directional/east{
pixel_y = 6;
name = "Medbay Doors Control";
id = "MedbayFoyer"
},
/turf/open/floor/iron/white,
/area/station/medical/paramedic)
"lAs" = (
@@ -46783,7 +46812,6 @@
"lAV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/duct,
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron,
/area/station/medical/cryo)
"lAW" = (
@@ -52399,22 +52427,6 @@
/turf/open/floor/iron/grimy,
/area/station/service/abandoned_gambling_den)
"mVr" = (
/obj/machinery/computer/crew{
dir = 4
},
/obj/machinery/button/door/directional/west{
id = "MedbayFoyer";
name = "Medbay Doors Control";
normaldoorcontrol = 1;
pixel_y = 6;
req_access = list("medical")
},
/obj/machinery/button/door/directional/west{
id = "paramed_dispatch_desk";
name = "Desk Shutter Control";
pixel_y = -4;
req_access = list("medical")
},
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
@@ -56768,15 +56780,15 @@
/turf/open/floor/plating,
/area/station/hallway/secondary/entry)
"odc" = (
/obj/structure/reagent_dispensers/water_cooler,
/obj/machinery/newscaster/directional/south,
/obj/machinery/camera/directional/east{
c_tag = "Medbay - Paramedic Dispatch";
name = "medbay camera";
network = list("ss13","medbay")
},
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron/white,
/obj/machinery/suit_storage_unit/medical,
/obj/effect/turf_decal/bot_red,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"odd" = (
/obj/docking_port/stationary/random{
@@ -60096,7 +60108,7 @@
},
/obj/effect/landmark/start/paramedic,
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"oUM" = (
/obj/effect/decal/cleanable/blood/oil,
@@ -65133,13 +65145,11 @@
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"qdT" = (
/obj/structure/table/wood,
/obj/item/storage/medkit/emergency,
/obj/item/toy/figure/paramedic,
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 1
},
/turf/open/floor/iron/white,
/obj/structure/closet/secure_closet/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"qdV" = (
/obj/machinery/flasher/directional/south{
@@ -74774,7 +74784,6 @@
/area/station/science/ordnance/office)
"sxG" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/medical/general,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -74784,7 +74793,8 @@
/obj/machinery/door/airlock/medical{
name = "Medbay Desk"
},
/turf/open/floor/iron,
/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"sxK" = (
/obj/effect/turf_decal/siding/wood,
@@ -80706,7 +80716,6 @@
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/landmark/start/paramedic,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/medbay)
@@ -80763,7 +80772,6 @@
/obj/effect/turf_decal/tile/red/diagonal_centre,
/obj/effect/turf_decal/tile/blue/diagonal_edge,
/obj/machinery/duct,
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron/diagonal,
/area/station/medical/break_room)
"tWD" = (
@@ -81392,7 +81400,7 @@
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 4
},
/obj/structure/sign/warning/no_smoking/directional/north,
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/medbay)
"udf" = (
@@ -82142,7 +82150,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"umN" = (
/turf/closed/wall,
@@ -83442,7 +83450,8 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/iron/white,
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"uCp" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -84742,12 +84751,17 @@
/area/station/command/bridge)
"uQF" = (
/obj/machinery/computer/security/telescreen/entertainment/directional/west,
/obj/effect/turf_decal/bot_red,
/obj/machinery/suit_storage_unit/medical,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
/obj/machinery/light/cold/directional/west,
/obj/structure/table/reinforced,
/obj/item/toy/figure/md{
pixel_y = 4
},
/obj/item/reagent_containers/hypospray/medipen{
pixel_y = -4
},
/turf/open/floor/iron/textured,
/area/station/medical/storage)
"uQN" = (
@@ -85741,18 +85755,11 @@
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"vfA" = (
/obj/structure/table/glass,
/obj/item/radio/intercom/directional/south,
/obj/item/clipboard,
/obj/item/toy/figure/md{
pixel_y = 4
},
/obj/item/reagent_containers/hypospray/medipen{
pixel_y = -4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/structure/filingcabinet/chestdrawer,
/turf/open/floor/iron/white,
/area/station/medical/paramedic)
"vfN" = (
@@ -91298,7 +91305,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"wAt" = (
/obj/machinery/hydroponics/soil,
@@ -94973,9 +94980,8 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
/obj/effect/landmark/start/medical_doctor,
/obj/effect/turf_decal/tile/neutral/full,
/turf/open/floor/iron/large,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/paramedic)
"xxX" = (
/obj/effect/decal/cleanable/dirt,
@@ -139405,7 +139411,7 @@ fNm
qeB
uNY
keH
jtz
yfM
ckd
veM
hJn
@@ -139662,7 +139668,7 @@ rmo
lnz
uNY
eQC
gQl
cvX
eQC
gQl
ltz
@@ -141204,7 +141210,7 @@ xuI
uNY
uNY
gQl
gpq
gQl
gQl
gQl
gQl
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+53 -72
View File
@@ -3890,7 +3890,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"bqT" = (
/obj/structure/cable,
@@ -4791,7 +4791,8 @@
dir = 5
},
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/white,
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"bGu" = (
/obj/structure/chair/sofa/bench/right{
@@ -7288,7 +7289,7 @@
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"cEG" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -8110,7 +8111,7 @@
network = list("ss13","medbay")
},
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"cUe" = (
/obj/machinery/rnd/production/protolathe/department/science,
@@ -9125,7 +9126,7 @@
/obj/item/storage/toolbox/emergency,
/obj/structure/table,
/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"dla" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -10213,7 +10214,7 @@
/obj/structure/disposalpipe/trunk/multiz{
dir = 1
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"dCI" = (
/obj/structure/disposalpipe/segment{
@@ -10443,11 +10444,10 @@
/area/station/science/auxlab/firing_range)
"dHk" = (
/obj/structure/cable,
/obj/effect/landmark/start/paramedic,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"dHy" = (
/obj/machinery/light/small/directional/north,
@@ -11612,12 +11612,6 @@
/obj/effect/mapping_helpers/requests_console/supplies,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"ebo" = (
/obj/effect/landmark/start/paramedic,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/paramedic)
"ebs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/landmark/event_spawn,
@@ -12344,7 +12338,6 @@
/obj/machinery/door/airlock/medical{
name = "Medical Breakroom and Paramedic Dispatch"
},
/obj/effect/mapping_helpers/airlock/access/any/medical/general,
/obj/structure/cable,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -12352,7 +12345,8 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/iron/white,
/obj/effect/mapping_helpers/airlock/access/any/medical/paramedic,
/turf/open/floor/holofloor/dark,
/area/station/medical/exam_room)
"epr" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -14660,7 +14654,7 @@
},
/obj/structure/table,
/obj/machinery/requests_console/auto_name/directional/west,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"fhu" = (
/turf/open/floor/engine/n2,
@@ -17209,7 +17203,7 @@
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"fZc" = (
/obj/structure/cable,
@@ -19828,7 +19822,7 @@
},
/obj/item/radio/intercom/directional/east,
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"gTM" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -21741,7 +21735,8 @@
dir = 1
},
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron/white,
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"hAL" = (
/obj/structure/cable,
@@ -22200,7 +22195,6 @@
name = "Reception"
},
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/any/medical/general,
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -22208,7 +22202,8 @@
/obj/structure/disposalpipe/segment{
dir = 8
},
/turf/open/floor/iron/white,
/obj/effect/mapping_helpers/airlock/access/any/medical/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"hIv" = (
/obj/effect/turf_decal/tile/neutral{
@@ -22814,7 +22809,7 @@
dir = 10
},
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"hTQ" = (
/obj/machinery/atmospherics/components/unary/passive_vent{
@@ -24264,7 +24259,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"ivh" = (
/obj/machinery/atmospherics/pipe/smart/manifold/cyan/hidden{
@@ -24299,7 +24294,7 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"ivR" = (
/obj/effect/turf_decal/tile/neutral{
@@ -25151,7 +25146,7 @@
/obj/structure/disposalpipe/segment{
dir = 6
},
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"iLb" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -25959,7 +25954,8 @@
/obj/machinery/light/warm/directional/west,
/obj/item/storage/fancy/coffee_condi_display,
/obj/structure/table,
/turf/open/floor/iron/white,
/obj/item/surgicaldrill,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"jbV" = (
/obj/structure/plasticflaps,
@@ -27078,13 +27074,6 @@
},
/turf/open/floor/carpet/purple,
/area/station/service/library)
"jvd" = (
/obj/structure/cable,
/obj/effect/landmark/start/paramedic,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/paramedic)
"jvt" = (
/obj/structure/closet/secure_closet/chemical,
/obj/effect/turf_decal/stripes/line{
@@ -27227,12 +27216,9 @@
/area/station/command/meeting_room)
"jyg" = (
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/suit_storage_unit/medical,
/obj/effect/turf_decal/box/white{
color = "#52B4E9"
},
/obj/item/radio/intercom/directional/north,
/obj/machinery/light_switch/directional/west,
/obj/structure/closet/l3closet,
/turf/open/floor/iron/white,
/area/station/medical/storage)
"jyu" = (
@@ -27248,7 +27234,8 @@
"jyx" = (
/obj/structure/chair/office,
/obj/structure/cable,
/turf/open/floor/iron/white,
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"jyM" = (
/obj/structure/ladder{
@@ -33092,7 +33079,7 @@
dir = 4
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"ltF" = (
/obj/structure/cable,
@@ -37961,7 +37948,7 @@
"naZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"nbf" = (
/obj/structure/cable,
@@ -38162,7 +38149,11 @@
dir = 8
},
/obj/machinery/digital_clock/directional/west,
/turf/open/floor/iron/white,
/obj/machinery/suit_storage_unit/medical,
/obj/effect/turf_decal/box/white{
color = "#52B4E9"
},
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"neb" = (
/obj/structure/table,
@@ -38698,11 +38689,13 @@
/turf/open/floor/iron,
/area/station/engineering/atmos/project)
"nnF" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 8
},
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron/white,
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 1
},
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"nnL" = (
/obj/effect/turf_decal/tile/brown/half/contrasted{
@@ -39815,13 +39808,13 @@
name = "Medical Breakroom and Paramedic Dispatch"
},
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/any/medical/general,
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/obj/effect/mapping_helpers/airlock/access/any/medical/paramedic,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"nKi" = (
/obj/effect/landmark/start/cargo_technician,
@@ -40126,7 +40119,7 @@
/obj/effect/spawner/random/vending/colavend,
/obj/machinery/airalarm/directional/east,
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"nOZ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -42101,7 +42094,6 @@
color = "#52B4E9"
},
/obj/effect/turf_decal/tile/blue/full,
/obj/effect/landmark/start/paramedic,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/storage)
"oDZ" = (
@@ -43202,23 +43194,11 @@
/turf/open/floor/engine/xenobio,
/area/station/science/xenobiology)
"oVX" = (
/obj/structure/table,
/obj/structure/window/spawner/directional/east,
/obj/item/clothing/suit/jacket/straight_jacket,
/obj/item/clothing/glasses/blindfold{
pixel_y = 3
/obj/structure/closet/secure_closet/paramedic,
/obj/effect/turf_decal/trimline/blue/filled/end{
dir = 4
},
/obj/item/clothing/glasses/blindfold{
pixel_y = 3
},
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/ears/earmuffs{
pixel_y = 3
},
/obj/item/clothing/ears/earmuffs{
pixel_y = 3
},
/turf/open/floor/iron/white/textured,
/turf/open/floor/holofloor/dark,
/area/station/medical/paramedic)
"oWd" = (
/obj/structure/cable,
@@ -52781,7 +52761,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
/turf/open/floor/iron/white/smooth_large,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"set" = (
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
@@ -53741,7 +53721,8 @@
pixel_y = 3
},
/obj/structure/fireaxecabinet/jawsofrecovery/directional/west,
/turf/open/floor/iron/white/textured,
/obj/structure/window/spawner/directional/north,
/turf/open/floor/holofloor/dark,
/area/station/medical/paramedic)
"stw" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -54621,7 +54602,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"sIx" = (
/obj/structure/cable,
@@ -58468,7 +58449,7 @@
/obj/item/emergency_bed{
pixel_y = 11
},
/turf/open/floor/iron/white/textured,
/turf/open/floor/holofloor/dark,
/area/station/medical/paramedic)
"tYI" = (
/obj/effect/landmark/start/head_of_security,
@@ -85924,9 +85905,9 @@ cBb
hAA
naZ
sep
ebo
ebo
jvd
naZ
naZ
iuV
sIv
rnk
bAr
+4
View File
@@ -89,6 +89,8 @@
#define ACCESS_PSYCHOLOGY "psychology"
/// Access for the Chief Medical Officer's personal quarters in mapping, as well as some other CMO-related things.
#define ACCESS_CMO "cmo"
/// Access to the Paramedic dispatch.
#define ACCESS_PARAMEDIC "paramedic"
/// General access for Cargo, allows for entry to Cargo Bay and Cargo's Office.
#define ACCESS_CARGO "cargo"
@@ -325,6 +327,7 @@
ACCESS_NETWORK, \
ACCESS_ORDNANCE, \
ACCESS_ORDNANCE_STORAGE, \
ACCESS_PARAMEDIC, \
ACCESS_PHARMACY, \
ACCESS_PLUMBING, \
ACCESS_PSYCHOLOGY, \
@@ -461,6 +464,7 @@
ACCESS_MEDICAL, \
ACCESS_MORGUE, \
ACCESS_MORGUE_SECURE, \
ACCESS_PARAMEDIC, \
ACCESS_PHARMACY, \
ACCESS_PLUMBING, \
ACCESS_PSYCHOLOGY, \
@@ -132,9 +132,6 @@
///cancel clean
#define COMSIG_ATOM_CANCEL_CLEAN (1<<0)
/// From /obj/item/stack/make_item()
#define COMSIG_ATOM_CONSTRUCTED "atom_constructed"
/// From /obj/effect/particle_effect/sparks/proc/sparks_touched(datum/source, atom/movable/singed)
#define COMSIG_ATOM_TOUCHED_SPARKS "atom_touched_sparks"
#define COMSIG_ATOM_TOUCHED_HAZARDOUS_SPARKS "atom_touched_hazardous_sparks"
@@ -24,8 +24,8 @@
#define COMPONENT_BULLET_PIERCED (1<<2)
///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit, blocked)
#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
///from base of atom/on_craft_completion(): (components, datum/crafting_recipe/current_recipe)
#define COMSIG_ATOM_ON_CRAFT "atom_checkparts"
///from base of atom/on_craft_completion(): (components, datum/crafting_recipe/current_recipe, atom/crafter)
#define COMSIG_ATOM_ON_CRAFT "atom_on_craft_completion"
///from base of atom/used_in_craft(): (atom/result)
#define COMSIG_ATOM_USED_IN_CRAFT "atom_used_in_craft"
///from base of atom/blob_act(): (/obj/structure/blob)
@@ -0,0 +1,4 @@
// /datum/component/lockable_storage signals
///from base of /datum/component/lockable_storage/proc/set_lock_code(new_code): (obj/source, new_code)
#define COMSIG_LOCKABLE_STORAGE_SET_CODE "lockable_storage_set_code"
+3 -3
View File
@@ -182,9 +182,9 @@
#define GET_FISH_WEIGHT_RANK(weighty) max(round(1 + log(2, max(weighty/FISH_WEIGHT_FORCE_DIVISOR, 1)), 1), 1)
///The breeding timeout for newly instantiated fish is multiplied by this.
#define NEW_FISH_BREEDING_TIMEOUT_MULT 2
///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry.
#define NEW_FISH_LAST_FEEDING_MULT 0.33
#define NEW_FISH_BREEDING_TIMEOUT_MULT 0.6
///The last feeding timestamp of newly instantiated fish is multiplied by this.
#define NEW_FISH_LAST_FEEDING_MULT 0.33 //Their hunger meter starts at 33%
///If get_hunger is above this value, the fish is considered to be starving and will slowly lose health because of it
#define FISH_STARVING_THRESHOLD 1
+3
View File
@@ -201,6 +201,9 @@
#define ui_ghost_language_menu "SOUTH: 6, CENTER+4:22"
#define ui_ghost_floor_changer "SOUTH: 6, CENTER+4:7"
//Voidwalker
#define ui_voidwalker_left_of_hands "CENTER+-2:16,SOUTH+0:5"
//Blobbernauts
#define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19"
+15 -10
View File
@@ -5,16 +5,17 @@
#define CAN_BE_HIT (1<<1) //can this be bludgeoned by items?
#define DANGEROUS_POSSESSION (1<<2) //Admin possession yes/no
#define UNIQUE_RENAME (1<<3) // can you customize the description/name of the thing?
#define BLOCK_Z_OUT_DOWN (1<<4) // Should this object block z falling from loc?
#define BLOCK_Z_OUT_UP (1<<5) // Should this object block z uprise from loc?
#define BLOCK_Z_IN_DOWN (1<<6) // Should this object block z falling from above?
#define BLOCK_Z_IN_UP (1<<7) // Should this object block z uprise from below?
#define BLOCKS_CONSTRUCTION (1<<8) //! Does this object prevent things from being built on it?
#define BLOCKS_CONSTRUCTION_DIR (1<<9) //! Does this object prevent same-direction things from being built on it?
#define IGNORE_DENSITY (1<<10) //! Can we ignore density when building on this object? (for example, directional windows and grilles)
#define INFINITE_RESKIN (1<<11) // We can reskin this item infinitely
#define CONDUCTS_ELECTRICITY (1<<12) //! Can this object conduct electricity?
#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<13) //! Atoms don't spawn anything when deconstructed. They just vanish
#define RENAME_NO_DESC (1<<4) // if it can be renamed, is its description excluded?
#define BLOCK_Z_OUT_DOWN (1<<5) // Should this object block z falling from loc?
#define BLOCK_Z_OUT_UP (1<<6) // Should this object block z uprise from loc?
#define BLOCK_Z_IN_DOWN (1<<7) // Should this object block z falling from above?
#define BLOCK_Z_IN_UP (1<<8) // Should this object block z uprise from below?
#define BLOCKS_CONSTRUCTION (1<<9) //! Does this object prevent things from being built on it?
#define BLOCKS_CONSTRUCTION_DIR (1<<10) //! Does this object prevent same-direction things from being built on it?
#define IGNORE_DENSITY (1<<11) //! Can we ignore density when building on this object? (for example, directional windows and grilles)
#define INFINITE_RESKIN (1<<12) // We can reskin this item infinitely
#define CONDUCTS_ELECTRICITY (1<<13) //! Can this object conduct electricity?
#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<14) //! Atoms don't spawn anything when deconstructed. They just vanish
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
@@ -118,3 +119,7 @@
#define INCLUDE_POCKETS (1<<0)
#define INCLUDE_ACCESSORIES (1<<1)
#define INCLUDE_HELD (1<<2)
/// Include prosthetic item limbs (which are not flavoured as being equipped items)
#define INCLUDE_PROSTHETICS (1<<3)
/// Include items that are not "real" items, such as hand items
#define INCLUDE_ABSTRACT (1<<4)
+29 -2
View File
@@ -157,8 +157,17 @@
#define SPRITE_ACCESSORY_NONE "None"
// Loadout
/// Used to make something not recolorable even if it's capable
#define DONT_GREYSCALE -1
/// When equipped, applies a job specific palette to the item. Only applicable to GAGS items.
#define LOADOUT_FLAG_JOB_GREYSCALING (1<<0)
/// Prevents GAGS items from being player customizable.
#define LOADOUT_FLAG_BLOCK_GREYSCALING (1<<1)
/// Allows the item to be greyscaled by the player, if it's a GAGS item. Automatically set if the item is innately recolorable.
#define LOADOUT_FLAG_GREYSCALING_ALLOWED (1<<2)
/// Allows the item to be renamed by the player.
#define LOADOUT_FLAG_ALLOW_NAMING (1<<3)
/// Allows the item to be reskinned by the player. Only applicable to items with unique_reskin defined.
#define LOADOUT_FLAG_ALLOW_RESKIN (1<<4)
// Loadout item info keys
// Changing these will break existing loadouts
/// Tracks GAGS color information
@@ -174,3 +183,21 @@
#define UPPER_LIP "Upper"
#define MIDDLE_LIP "Middle"
#define LOWER_LIP "Lower"
// Job greyscale colors for loadout items
#define COLOR_JOB_ASSISTANT /obj/item/clothing/under/color/grey::greyscale_colors
#define COLOR_JOB_BOTANIST "#33cc33"
#define COLOR_JOB_CARGO_GENERIC "#824b32"
#define COLOR_JOB_CE "#d0d0d0"
#define COLOR_JOB_CHEF "#d0d0d0"
#define COLOR_JOB_CHEMIST "#ff6600"
#define COLOR_JOB_CLOWN "#ffbeff"
#define COLOR_JOB_CMO "#009999"
#define COLOR_JOB_DEFAULT "#303030"
#define COLOR_JOB_ENGI_GENERIC "#ff6600"
#define COLOR_JOB_JANITOR /obj/item/clothing/gloves/color/purple::greyscale_colors
#define COLOR_JOB_LAWYER "#003399"
#define COLOR_JOB_SCI_GENERIC "#800080"
#define COLOR_JOB_SEC_GENERIC "#A53228"
#define COLOR_JOB_MED_GENERIC "#5B97BC"
#define COLOR_JOB_COMMAND_GENERIC "#3C5A96"
+1
View File
@@ -1,3 +1,4 @@
#define TOOL_PROCESSING_RESULT "result"
#define TOOL_PROCESSING_AMOUNT "amount"
#define TOOL_PROCESSING_TIME "time"
#define TOOL_PROCESSING_SOUND "sound"
+29
View File
@@ -356,6 +356,35 @@ GLOBAL_LIST_EMPTY(sfx_datum_by_key)
#define SFX_CIG_PACK_RUSTLE "cig_pack_rustle"
#define SFX_CIG_PACK_THROW_DROP "cig_pack_throw_drop"
#define SFX_RORO_WARBLE "roro_warble"
#define SFX_POTTED_PLANT_PICKUP "potted_plant_pickup"
#define SFX_POTTED_PLANT_DROP "potted_plant_drop"
#define SFX_GOGGLES_PICKUP "goggles_pickup"
#define SFX_GOGGLES_DROP "goggles_drop"
#define SFX_GOGGLES_EQUIP "goggles_equip"
#define SFX_GLASSES_PICKUP "glasses_pickup"
#define SFX_GLASSES_DROP "glasses_drop"
#define SFX_GLASSES_EQUIP "glasses_equip"
#define SFX_FOOD_PLATE_PICKUP "food_plate_pickup"
#define SFX_FOOD_PLATE_DROP "food_plate_drop"
#define SFX_TRAY_PICKUP "tray_pickup"
#define SFX_TRAY_DROP "tray_drop"
#define SFX_TRAY_INSERT "tray_insert"
#define SFX_CUTLERY_PICKUP "generic_cutlery_pickup"
#define SFX_CUTLERY_DROP "generic_cutlery_drop"
#define SFX_KNIFE_PICKUP "knife_pickup"
#define SFX_KNIFE_DROP "knife_drop"
#define SFX_KNIFE_SLICE "knife_slice"
#define SFX_POT_PICKUP "pot_pickup"
#define SFX_POT_DROP "pot_drop"
#define SFX_ROLLING_PIN_PICKUP "rolling_pin_pickup"
#define SFX_ROLLING_PIN_DROP "rolling_pin_drop"
#define SFX_ROLLING_PIN_ROLLING "rolling_pin_rolling"
#define SFX_FIRE_MODE_SWITCH "fire_mode_switch"
#define SFX_REMOTE_MODE_SWITCH "remote_mode_switch"
#define SFX_REMOTE_ACTION "remote_action"
#define SFX_GAS_MASK_PICKUP "gas_mask_pickup"
#define SFX_GAS_MASK_DROP "gas_mask_drop"
#define SFX_GAS_MASK_EQUIP "gas_mask_equip"
// Standard is 44.1khz
#define MIN_EMOTE_PITCH 40000
+4
View File
@@ -552,6 +552,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_CULT_HALO "cult_halo"
/// Their eyes glow an unnatural red colour. Currently used to set special examine text on humans. Does not guarantee the mob's eyes are coloured red, nor that there is any visible glow on their character sprite.
#define TRAIT_UNNATURAL_RED_GLOWY_EYES "unnatural_red_glowy_eyes"
/// Their eyes glow in the dark (aka emissive appearance)
#define TRAIT_LUMINESCENT_EYES "luminescent_eyes"
/// Their eyes reflect light, making them shine faintly in dim, shadowy areas. Kinda like nocturnal animals.
#define TRAIT_REFLECTIVE_EYES "reflective_eyes"
/// Their eyes are bloodshot. Currently used to set special examine text on humans. Examine text is overridden by TRAIT_UNNATURAL_RED_GLOWY_EYES.
#define TRAIT_BLOODSHOT_EYES "bloodshot_eyes"
/// This mob should never close UI even if it doesn't have a client
+1
View File
@@ -136,6 +136,7 @@
#define VV_HK_VIEW_PLANES "view_planes"
#define VV_HK_GIVE_AI "give_ai"
#define VV_HK_GIVE_AI_SPEECH "give_ai_speech"
#define VV_HK_GIVE_ACCESS "give_access"
// /mob/living
#define VV_HK_GIVE_SPEECH_IMPEDIMENT "impede_speech"
+3 -6
View File
@@ -23,8 +23,7 @@
victim.Stun(100)
victim.adjust_stutter(30 SECONDS)
victim.set_jitter_if_lower(1000 SECONDS)
var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(10, 15)
victim.sound_damage(10, 30 SECONDS)
to_chat(victim, "<font color='red' size='8'>HONK</font>")
var/obj/item/clothing/shoes/victim_shoes = victim.get_item_by_slot(ITEM_SLOT_FEET)
if(!victim_shoes || victim_shoes.fastening_type == SHOES_SLIPON)
@@ -35,13 +34,11 @@
victim.Paralyze(20)
victim.Stun(50)
victim.set_jitter_if_lower(500 SECONDS)
var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(7, 10)
victim.sound_damage(7, 20 SECONDS)
to_chat(victim, "<font color='red' size='5'>HONK</font>")
for(var/mob/living/carbon/victim in lightly_honked)
victim.Knockdown(20)
victim.set_jitter_if_lower(200 SECONDS)
var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(4, 5)
victim.sound_damage(4, 10 SECONDS)
to_chat(victim, "<font color='red' size='2'>HONK</font>")
+4
View File
@@ -279,6 +279,10 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
var/holding = user.get_active_held_item()
#ifdef UNIT_TESTS
timed_action_flags &= ~IGNORE_SLOWDOWNS //it shouldn't stop unit test dummies from being fast as hell
#endif
if(!(timed_action_flags & IGNORE_SLOWDOWNS))
delay *= user.cached_multiplicative_actions_slowdown
+18 -7
View File
@@ -1,12 +1,6 @@
GLOBAL_LIST_INIT(discountable_packs, init_discountable_packs())
/proc/init_discountable_packs()
var/list/packs = list()
for(var/datum/supply_pack/prototype as anything in subtypesof(/datum/supply_pack))
var/discountable = initial(prototype.discountable)
if(discountable)
LAZYADD(packs[discountable], prototype)
return packs
GLOBAL_LIST_INIT(exports_list, init_Exports())
GLOBAL_LIST_INIT(pack_discount_odds, list(
SUPPLY_PACK_STD_DISCOUNTABLE = 45,
@@ -15,3 +9,20 @@ GLOBAL_LIST_INIT(pack_discount_odds, list(
))
GLOBAL_LIST_EMPTY(supplypod_loading_bays)
/// Caled when the global discount pack list is initialized
/proc/init_discountable_packs()
var/list/packs = list()
for(var/datum/supply_pack/prototype as anything in subtypesof(/datum/supply_pack))
var/discountable = initial(prototype.discountable)
if(discountable)
LAZYADD(packs[discountable], prototype)
return packs
/// Called when the global exports_list is empty, and sets it up.
/proc/init_Exports()
var/list/exports = list()
for(var/datum/export/subtype as anything in subtypesof(/datum/export))
if(subtype::abstract_type != subtype)
exports += new subtype
return exports
+8
View File
@@ -12,3 +12,11 @@ GLOBAL_LIST_INIT(backpacklist, list(
FSATCHEL,
FMESSENGER, // BUBBER EDIT END
))
GLOBAL_LIST_INIT(suit_sensor_mode_to_defines, list(
"Off" = SENSOR_OFF,
"Binary vitals" = SENSOR_LIVING,
"Exact vitals" = SENSOR_VITALS,
"Tracking beacon" = SENSOR_COORDS,
))
+42
View File
@@ -0,0 +1,42 @@
/// List of language prototypes to reference, assoc [type] = prototype
GLOBAL_LIST_INIT_TYPED(language_datum_instances, /datum/language, init_language_prototypes())
/// List if all language typepaths learnable, IE, those with keys
GLOBAL_LIST_INIT(all_languages, init_all_languages())
/// /List of language prototypes to reference, assoc "name" = typepath
GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name())
/// 1000 element long list containing the 1000 most common words in the English language.
/// Indexed by word, value is the rank of the word in the list. So accessing it is fasta.
GLOBAL_LIST_INIT(most_common_words, init_common_words())
/proc/init_language_prototypes()
var/list/lang_list = list()
for(var/datum/language/lang_type as anything in typesof(/datum/language))
if(!initial(lang_type.key))
continue
lang_list[lang_type] = new lang_type()
return lang_list
/proc/init_all_languages()
var/list/lang_list = list()
for(var/datum/language/lang_type as anything in typesof(/datum/language))
if(!initial(lang_type.key))
continue
lang_list += lang_type
return lang_list
/proc/init_language_types_by_name()
var/list/lang_list = list()
for(var/datum/language/lang_type as anything in typesof(/datum/language))
if(!initial(lang_type.key))
continue
lang_list[initial(lang_type.name)] = lang_type
return lang_list
/proc/init_common_words()
var/list/word_to_commonness_list = list()
var/i = 1
for(var/word in world.file2list("strings/1000_most_common.txt"))
word_to_commonness_list[word] = i
i += 1
return word_to_commonness_list
-31
View File
@@ -82,37 +82,6 @@ GLOBAL_LIST_EMPTY(revenant_relay_mobs)
///underages who have been reported to security for trying to buy things they shouldn't, so they can't spam
GLOBAL_LIST_EMPTY(narcd_underages)
/// List of language prototypes to reference, assoc [type] = prototype
GLOBAL_LIST_INIT_TYPED(language_datum_instances, /datum/language, init_language_prototypes())
/// List if all language typepaths learnable, IE, those with keys
GLOBAL_LIST_INIT(all_languages, init_all_languages())
/// /List of language prototypes to reference, assoc "name" = typepath
GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name())
/proc/init_language_prototypes()
var/list/lang_list = list()
for(var/datum/language/lang_type as anything in typesof(/datum/language))
if(!initial(lang_type.key))
continue
lang_list[lang_type] = new lang_type()
return lang_list
/proc/init_all_languages()
var/list/lang_list = list()
for(var/datum/language/lang_type as anything in typesof(/datum/language))
if(!initial(lang_type.key))
continue
lang_list += lang_type
return lang_list
/proc/init_language_types_by_name()
var/list/lang_list = list()
for(var/datum/language/lang_type as anything in typesof(/datum/language))
if(!initial(lang_type.key))
continue
lang_list[initial(lang_type.name)] = lang_type
return lang_list
/// A list of all the possible blood types, keyed by id (which is just the name in most cases)
GLOBAL_LIST_INIT(blood_types, init_blood_types())
-1
View File
@@ -6,7 +6,6 @@ GLOBAL_LIST_INIT(greek_letters, world.file2list("strings/greek_letters.txt"))
GLOBAL_LIST_INIT(gross_adjectives, world.file2list("strings/names/gross_adjectives.txt"))
GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt"))
GLOBAL_LIST_INIT(junkmail_messages, world.file2list("strings/junkmail.txt"))
GLOBAL_LIST_INIT(most_common_words, world.file2list("strings/1000_most_common.txt"))
GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt"))
GLOBAL_LIST_INIT(phonetic_alphabet, world.file2list("strings/phonetic_alphabet.txt"))
GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt"))
+2
View File
@@ -381,6 +381,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LITERATE" = TRAIT_LITERATE,
"TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM,
"TRAIT_LOUD_BINARY" = TRAIT_LOUD_BINARY,
"TRAIT_LUMINESCENT_EYES" = TRAIT_LUMINESCENT_EYES,
"TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE,
"TRAIT_MAFIAINITIATE" = TRAIT_MAFIAINITIATE,
"TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED,
@@ -510,6 +511,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER,
"TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC,
"TRAIT_RECENTLY_TREATED" = TRAIT_RECENTLY_TREATED,
"TRAIT_REFLECTIVE_EYES" = TRAIT_REFLECTIVE_EYES,
"TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD,
"TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER,
"TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING,
+2
View File
@@ -171,6 +171,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT,
"TRAIT_LITERATE" = TRAIT_LITERATE,
"TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM,
"TRAIT_LUMINESCENT_EYES" = TRAIT_LUMINESCENT_EYES,
"TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE,
"TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED,
"TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE,
@@ -259,6 +260,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY,
"TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE,
"TRAIT_RAD_RESISTANCE" = TRAIT_RAD_RESISTANCE, // BUBBER EDIT
"TRAIT_REFLECTIVE_EYES" = TRAIT_REFLECTIVE_EYES,
"TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING,
"TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD,
"TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT,
+2 -2
View File
@@ -127,8 +127,8 @@
return FALSE
/// No loot panel if it's on our person
if(isobj(target) && (target in get_all_gear()))
to_chat(src, span_warning("You can't search for this item, it's already in your inventory! Take it off first."))
if(isobj(target) && (target in get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES)))
to_chat(src, span_warning("You can't search for this item, it's already in your inventory![!HAS_TRAIT(target, TRAIT_NODROP) ? " Take it off first." : ""]"))
return FALSE
client.loot_panel.open(get_turf(target))
+2 -1
View File
@@ -380,7 +380,8 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
screenmob.client.screen += infodisplay
if(always_visible_inventory.len)
screenmob.client.screen += always_visible_inventory
if(open_containers.len)
if(open_containers.len && screenmob == mymob) // Don't show open inventories to ghosts
list_clear_nulls(open_containers)
screenmob.client.screen += open_containers
screenmob.client.screen += toggle_palette
+6 -1
View File
@@ -8,6 +8,11 @@
floor_change.screen_loc = ui_rest
static_inventory += floor_change
resist_icon = new /atom/movable/screen/resist(null, src)
resist_icon.icon = ui_style
resist_icon.screen_loc = ui_voidwalker_left_of_hands
resist_icon.update_appearance()
action_intent = new /atom/movable/screen/combattoggle/flashy/voidwalker(null, src)
action_intent.icon = ui_style
static_inventory += action_intent
@@ -51,7 +56,7 @@
/atom/movable/screen/vomit_jump
name = "vomit tracker"
icon = 'icons/hud/screen_voidwalker.dmi'
icon_state = "vomitjump"
icon_state = "template"
/// So we can sort of loop through it
var/index = 1
@@ -43,6 +43,9 @@
/// Ruleset can be configured by admins (implements /proc/configure_ruleset)
/// Only implemented for midrounds currently
#define RULESET_ADMIN_CONFIGURABLE (1<<2)
/// Applied to rulesets which intentionally share a pref_flag with another rulesets
/// Denotes multiple rulesets which abide by the same preference, but are each a variation of some base ruleset
#define RULESET_VARIATION (1<<3)
/// Href for cancelling midround rulesets before execution
#define MIDROUND_CANCEL_HREF(...) "(<a href='byond://?src=[REF(src)];admin_cancel_midround=[REF(picked_ruleset)]'>CANCEL</a>)"
@@ -10,9 +10,12 @@
/// Don't change this unless you know what you're doing.
var/config_tag
/// What flag to check for jobbans? Optional, if unset, uses pref_flag
/// What flag to check for jobbans?
/// Optional, if unset, uses pref_flag for jobbans instead
var/jobban_flag
/// What flag to check for prefs? Required if the antag has an associated preference
/// What flag to check for prefs?
/// Required if the antag has an associated preference, and must be unique
/// (unless RULESET_VARIATION is set in ruleset_flags)
var/pref_flag
/// Flags for this ruleset
var/ruleset_flags = NONE
@@ -658,7 +658,7 @@
candidate_role = "Changeling"
pref_flag = ROLE_CHANGELING_MIDROUND
jobban_flag = ROLE_CHANGELING
ruleset_flags = RULESET_INVADER
ruleset_flags = RULESET_INVADER|RULESET_VARIATION
weight = 5
min_pop = 15
max_antag_cap = 1
@@ -670,6 +670,21 @@
/datum/dynamic_ruleset/midround/from_ghosts/space_changeling/assign_role(datum/mind/candidate)
generate_changeling_meteor(candidate)
/datum/dynamic_ruleset/midround/from_ghosts/space_changeling/mass
name = "Mass Space Changelings"
config_tag = "Mass Changelings"
midround_type = HEAVY_MIDROUND
min_pop = 25
min_antag_cap = 2
max_antag_cap = 3
repeatable_weight_decrease = 4
weight = list(
DYNAMIC_TIER_LOW = 0,
DYNAMIC_TIER_LOWMEDIUM = 3,
DYNAMIC_TIER_MEDIUMHIGH = 4,
DYNAMIC_TIER_HIGH = 5,
)
/datum/dynamic_ruleset/midround/from_ghosts/paradox_clone
name = "Paradox Clone"
config_tag = "Paradox Clone"
@@ -1064,6 +1079,7 @@
false_alarm_able = TRUE
pref_flag = ROLE_SLEEPER_AGENT
jobban_flag = ROLE_TRAITOR
ruleset_flags = RULESET_VARIATION
weight = 10
min_pop = 3
blacklisted_roles = list(
@@ -1079,6 +1095,22 @@
"[command_name()] High-Priority Update",
)
/datum/dynamic_ruleset/midround/from_living/traitor/mass
name = "Mass Traitors"
config_tag = "Mass Traitors"
midround_type = HEAVY_MIDROUND
min_pop = 15
min_antag_cap = 2
max_antag_cap = 4
repeatable_weight_decrease = 8
blacklisted_roles = list()
weight = list(
DYNAMIC_TIER_LOW = 0,
DYNAMIC_TIER_LOWMEDIUM = 3,
DYNAMIC_TIER_MEDIUMHIGH = 8,
DYNAMIC_TIER_HIGH = 10,
)
/datum/dynamic_ruleset/midround/from_living/malf_ai
name = "Malfunctioning AI"
config_tag = "Midround Malfunctioning AI"
@@ -290,6 +290,7 @@ SUBSYSTEM_DEF(id_access)
desc_by_access["[ACCESS_VIROLOGY]"] = "Virology"
desc_by_access["[ACCESS_PSYCHOLOGY]"] = "Psychology"
desc_by_access["[ACCESS_CMO]"] = "CMO Office"
desc_by_access["[ACCESS_PARAMEDIC]"] = "Paramedic Office"
desc_by_access["[ACCESS_QM]"] = "QM Office"
desc_by_access["[ACCESS_SURGERY]"] = "Surgery"
desc_by_access["[ACCESS_THEATRE]"] = "Theatre"
@@ -20,16 +20,9 @@ SUBSYSTEM_DEF(stock_market)
/datum/controller/subsystem/stock_market/Initialize()
for(var/datum/material/possible_market as anything in subtypesof(/datum/material)) // I need to make this work like this, but lets hardcode it for now
if(possible_market.tradable)
materials_prices += possible_market
materials_prices[possible_market] = possible_market.value_per_unit * SHEET_MATERIAL_AMOUNT
materials_trends += possible_market
materials_trends[possible_market] = rand(MARKET_TREND_DOWNWARD,MARKET_TREND_UPWARD) //aka -1 to 1
materials_trend_life += possible_market
materials_trend_life[possible_market] = rand(1,3)
materials_quantity += possible_market
materials_quantity[possible_market] = possible_market.tradable_base_quantity + (rand(-(possible_market.tradable_base_quantity) * 0.5, possible_market.tradable_base_quantity * 0.5))
return SS_INIT_SUCCESS
+1 -1
View File
@@ -388,7 +388,7 @@
for(var/obj/item/fish/fish_type as anything in types_to_mate_with)
var/list/type_fishes = tracked_fish_by_type[fish_type]
if(length(type_fishes) >= initial(fish_type.stable_population))
if(length(type_fishes) >= fish_type::stable_population)
continue
candidates += type_fishes
+2 -2
View File
@@ -32,7 +32,7 @@
/datum/component/connect_inventory/proc/update_signals()
unregister_signals()
for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD))
for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT))
if(!(allowed_slots & tracked.get_slot_by_item(item)))
continue
RegisterSignal(item, COMSIG_ITEM_DROPPED, PROC_REF(on_unequipped_item))
@@ -40,7 +40,7 @@
parent.RegisterSignal(item, signal, connections[signal])
/datum/component/connect_inventory/proc/unregister_signals()
for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD))
for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT))
UnregisterSignal(item, COMSIG_ITEM_DROPPED)
parent.UnregisterSignal(item, connections)
+1 -1
View File
@@ -382,8 +382,8 @@
if(recipe.structures)
requirements += recipe.structures
var/list/surroundings
for(var/path_key in requirements)
var/list/surroundings
var/amount = recipe.reqs?[path_key] || recipe.machinery?[path_key] || recipe.structures?[path_key]
if(!amount)//since machinery & structures can have 0 aka CRAFTING_MACHINERY_USE - i.e. use it, don't consume it!
continue
@@ -105,3 +105,46 @@
/obj/item/stack/sheet/iron = 30,
)
category = CAT_STRUCTURE
/datum/crafting_recipe/secure_safe
name = "Secure safe"
result = /obj/item/wallframe/secure_safe
reqs = list(
/obj/item/stack/sheet/plasteel = 10,
/obj/item/stack/sheet/mineral/titanium = 5,
/obj/item/stack/cable_coil = 5,
/obj/item/stack/rods = 5,
/obj/item/wallframe/button = 1,
)
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_DRILL)
time = 30 SECONDS
category = CAT_STRUCTURE
/datum/crafting_recipe/vault
name = "Vault"
result = /obj/structure/safe/open
reqs = list(
/obj/item/stack/sheet/mineral/metal_hydrogen = 20,
/obj/item/stack/sheet/mineral/plastitanium = 10,
/obj/item/stack/cable_coil = 5,
/obj/item/stack/rods = 5,
/obj/item/wallframe/secure_safe = 1,
)
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_DRILL)
time = 90 SECONDS
category = CAT_STRUCTURE
crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND
/datum/crafting_recipe/vault_floor
name = "Floor Vault"
result = /obj/structure/safe/floor/open
reqs = list(
/obj/item/stack/sheet/mineral/metal_hydrogen = 20,
/obj/item/stack/sheet/mineral/plastitanium = 10,
/obj/item/stack/cable_coil = 5,
/obj/item/stack/rods = 5,
)
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_DRILL)
time = 90 SECONDS
category = CAT_STRUCTURE
crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND
+11
View File
@@ -118,3 +118,14 @@
)
category = CAT_TOOLS
/datum/crafting_recipe/jaws_of_recovery
name = "Modified Jaws of Life"
time = 10 SECONDS
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER)
result = /obj/item/crowbar/power/paramedic/silent
reqs = list(
/obj/item/crowbar/power = 1,
/obj/item/bonesetter = 1,
)
category = CAT_TOOLS
+36 -12
View File
@@ -34,13 +34,8 @@
canthold = list(/obj/item/storage/briefcase/secure),
)
src.lock_code = lock_code
if(!isnull(lock_code))
atom_parent.atom_storage.set_locked(STORAGE_FULLY_LOCKED)
src.can_hack_open = can_hack_open
atom_parent.update_appearance()
set_lock_code(lock_code)
/datum/component/lockable_storage/RegisterWithParent()
. = ..()
@@ -144,8 +139,18 @@
if(!tool.use_tool(parent, user, 40 SECONDS, volume = 50))
return
source.balloon_alert(user, "hacked")
set_lock_code(null)
/datum/component/lockable_storage/proc/break_lock()
can_hack_open = FALSE // since it's broken for good
lock_code = null
var/obj/source = parent
source.obj_flags |= EMAGGED
source.atom_storage.locked = STORAGE_NOT_LOCKED
SEND_SIGNAL(source, COMSIG_LOCKABLE_STORAGE_SET_CODE, lock_code)
source.update_appearance()
/datum/component/lockable_storage/proc/on_emag(obj/source, mob/user, obj/item/card/emag/emag_card)
SIGNAL_HANDLER
@@ -154,17 +159,36 @@
if(source.obj_flags & EMAGGED)
return FALSE
source.obj_flags |= EMAGGED
can_hack_open = FALSE // since it's broken for good
source.visible_message(span_warning("Sparks fly from [source]!"), blind_message = span_hear("You hear a faint electrical spark."))
source.balloon_alert(user, "lock destroyed")
playsound(source, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
lock_code = null
source.atom_storage.locked = STORAGE_NOT_LOCKED
source.update_appearance()
break_lock()
return ITEM_INTERACT_SUCCESS
/**
* Sets the lock code for this storage and updates the locked state accordingly
* Arguments:
* * new_code - The new lock code to set, can be null to remove the code
*/
/datum/component/lockable_storage/proc/set_lock_code(new_code, mob/living/user)
var/obj/source = parent
// Can't set lock code if the electronics are emagged
if(source.obj_flags & EMAGGED)
return FALSE
lock_code = new_code
SEND_SIGNAL(source, COMSIG_LOCKABLE_STORAGE_SET_CODE, new_code)
var/lock_state = lock_code ? STORAGE_FULLY_LOCKED : STORAGE_NOT_LOCKED
source.atom_storage.set_locked(lock_state)
source.update_appearance()
if(istype(user) && new_code)
to_chat(user, span_notice("You set the [source] pincode to [lock_code]."))
return TRUE
///Updates the icon state depending on if we're locked or not.
/datum/component/lockable_storage/proc/on_update_icon_state(obj/source)
SIGNAL_HANDLER
@@ -219,7 +243,7 @@
if(!lock_code)
if(length(numeric_input) != 5)
return TRUE
lock_code = numeric_input
set_lock_code(numeric_input, usr)
numeric_input = ""
return TRUE
//unlocking the current code.
@@ -475,3 +475,60 @@
var/obj/vehicle/ridden/wheelchair/motorized/our_chair = parent
if(istype(our_chair) && our_chair.power_cell)
our_chair.power_cell.use(our_chair.energy_usage / max(our_chair.power_efficiency, 1) * 0.05)
/datum/component/riding/vehicle/golfcart
ride_check_flags = RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
vehicle_move_delay = 1.5
keytype = /obj/item/key/golfcart
/datum/component/riding/vehicle/golfcart/restore_parent_layer_and_offsets()
// just don't restore anything.
// restoring layers fucks stuff to do with the rear part
return
/datum/component/riding/vehicle/golfcart/driver_move(atom/movable/movable_parent, mob/living/user, direction)
if (!istype(parent, /obj/vehicle/ridden/golfcart))
return ..()
var/obj/vehicle/ridden/golfcart/cart = parent
if (!cart.cell && !cart.is_hotrod())
return COMPONENT_DRIVER_BLOCK_MOVE
if (cart.cell)
if (cart.cell.charge <= 0)
return COMPONENT_DRIVER_BLOCK_MOVE
if (get_turf(cart.child) == get_step(cart, direction))
cart.set_movedelay_effect(2)
else
cart.set_movedelay_effect(1)
vehicle_move_delay = cart.movedelay
return ..()
/datum/component/riding/vehicle/golfcart/handle_ride(mob/user, direction)
if (!istype(parent, /obj/vehicle/ridden/golfcart))
return ..()
var/obj/vehicle/ridden/golfcart/cart = parent
if (cart.cell)
var/charge_to_use = min(cart.charge_per_move, cart.cell.charge)
cart.cell.use(charge_to_use)
return ..()
/datum/component/riding/vehicle/golfcart/update_parent_layer_and_offsets(dir, animate)
. = ..()
if (istype(parent, /obj))
var/obj/objectified = parent
objectified.update_appearance(UPDATE_ICON)
/datum/component/riding/vehicle/golfcart/get_rider_offsets_and_layers(pass_index, mob/offsetter)
return list(
TEXT_NORTH = list(0, -16),
TEXT_SOUTH = list(0, 10),
TEXT_EAST = list(-8, 2),
TEXT_WEST = list(8, 2),
)
/datum/component/riding/vehicle/golfcart/get_parent_offsets_and_layers()
return list(
TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER),
TEXT_EAST = list(0, 0, VEHICLE_LAYER),
TEXT_WEST = list(0, 0, VEHICLE_LAYER),
)
@@ -45,13 +45,17 @@
start_windup()
/datum/component/throwbonus_on_windup/proc/start_windup()
if(!QDELETED(our_bar))
CRASH("throwbonus_on_windup component attempted to start windup while already winding up a throw!")
throwforce_bonus = initial(throwforce_bonus)
var/mob/living/our_holder = holder?.resolve()
if(isnull(holder))
return
if(throw_text)
to_chat(our_holder, span_warning(throw_text))
var/x_position = CEILING(our_holder.get_visual_width() * 0.5, 1)
our_bar = new()
our_bar.maximum_count = maximum_bonus
@@ -76,9 +80,12 @@
holder = null
return ..()
/datum/component/throwbonus_on_windup/proc/throw_change(datum/source, throw_mode)
/datum/component/throwbonus_on_windup/proc/throw_change(mob/living/source, throw_mode)
SIGNAL_HANDLER
if (source.get_active_held_item() != parent)
return
if(throw_mode)
start_windup()
else
+16 -42
View File
@@ -2,40 +2,26 @@
/datum/component/wall_mounted
dupe_mode = COMPONENT_DUPE_ALLOWED
/// The wall our object is currently linked to.
var/turf/hanging_wall_turf
/// Callback to the parent's proc to call on the linked object when the wall disappear's or changes.
var/datum/callback/on_drop
var/turf/closed/wall/hanging_wall_turf
/datum/component/wall_mounted/Initialize(target_wall, on_drop_callback)
. = ..()
if(!isobj(parent))
return COMPONENT_INCOMPATIBLE
if(!isturf(target_wall))
if(!isobj(parent) || !iswallturf(target_wall))
return COMPONENT_INCOMPATIBLE
hanging_wall_turf = target_wall
on_drop = on_drop_callback
/datum/component/wall_mounted/RegisterWithParent()
ADD_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src))
RegisterSignal(hanging_wall_turf, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(hanging_wall_turf, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changing))
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_linked_destroyed))
/datum/component/wall_mounted/UnregisterFromParent()
REMOVE_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src))
UnregisterSignal(hanging_wall_turf, list(COMSIG_ATOM_EXAMINE, COMSIG_TURF_CHANGE))
UnregisterSignal(parent, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED))
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
hanging_wall_turf = null
/**
* Basic reference handling if the hanging/linked object is destroyed first.
*/
/datum/component/wall_mounted/proc/on_linked_destroyed()
SIGNAL_HANDLER
if(!QDELING(src))
qdel(src)
/**
* When the wall is examined, explains that it's supporting the linked object.
*/
@@ -49,7 +35,8 @@
*/
/datum/component/wall_mounted/proc/on_turf_changing(datum/source, path, new_baseturfs, flags, post_change_callbacks)
SIGNAL_HANDLER
if (ispath(path, /turf/open))
if(ispath(path, /turf/open))
drop_wallmount()
@@ -69,34 +56,21 @@
* Except for intercoms, which are handled by creating a new wallframe intercom, as they're apparently items.
*/
/datum/component/wall_mounted/proc/drop_wallmount()
SIGNAL_HANDLER
PRIVATE_PROC(TRUE)
var/obj/hanging_parent = parent
hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls apart!"), vision_distance = 5)
hanging_parent.deconstruct(FALSE)
if(on_drop)
hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls off the wall!"), vision_distance = 5)
on_drop.Invoke(hanging_parent)
else
hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls apart!"), vision_distance = 5)
hanging_parent.deconstruct()
if(!QDELING(src))
qdel(src) //Well, we fell off the wall, so we're done here.
/**
* Checks object direction and then verifies if there's a wall in that direction. Finally, applies a wall_mounted component to the object.
*
* @param directional If TRUE, will use the direction of the object to determine the wall to attach to. If FALSE, will use the object's loc.
* @param custom_drop_callback If set, will use this callback instead of the default deconstruct callback.
*/
/obj/proc/find_and_hang_on_wall(directional = TRUE, custom_drop_callback)
///Checks object direction and then verifies if there's a wall in that direction. Finally, applies a wall_mounted component to the object.
/obj/proc/find_and_hang_on_wall()
if(istype(get_area(src), /area/shuttle))
return FALSE //For now, we're going to keep the component off of shuttles to avoid the turf changing issue. We'll hit that later really;
var/turf/attachable_wall
if(directional)
attachable_wall = get_step(src, dir)
else
attachable_wall = loc ///Pull from the curent object loc
var/turf/attachable_wall = loc //first attempt to locate a wall in our current turf
if(!iswallturf(attachable_wall))
return FALSE//Nothing to latch onto, or not the right thing.
src.AddComponent(/datum/component/wall_mounted, attachable_wall, custom_drop_callback)
attachable_wall = get_step(src, dir) //if no then attempt to locate it in our direction
if(!iswallturf(attachable_wall))
return FALSE //Nothing to latch onto, or not the right thing.
AddComponent(/datum/component/wall_mounted, attachable_wall)
return TRUE
@@ -45,7 +45,6 @@
return
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
switch(advanced_disease.stage)
if(3, 4)
@@ -53,15 +52,18 @@
to_chat(infected_mob, span_warning("[pick("You hear a ringing in your ear.", "Your ears pop.")]"))
if(5)
if(causes_permanent_deafness)
if(ears.damage < ears.maxHealth)
if(!HAS_TRAIT_FROM(infected_mob, TRAIT_DEAF, DISEASE_TRAIT))
to_chat(infected_mob, span_userdanger("Your ears pop painfully and start bleeding!"))
// Just absolutely murder me man
ears.apply_organ_damage(ears.maxHealth)
infected_mob.adjustOrganLoss(ORGAN_SLOT_EARS, INFINITY)
infected_mob.emote("scream")
ADD_TRAIT(infected_mob, TRAIT_DEAF, DISEASE_TRAIT)
else
to_chat(infected_mob, span_userdanger("Your ears pop and begin ringing loudly!"))
ears.deaf = min(20, ears.deaf + 15)
var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
var/deafness_to_add = min(40 SECONDS - ears.temporary_deafness, 30 SECONDS)
if(deafness_to_add > 0)
ears.adjust_temporary_deafness(deafness_to_add)
/datum/symptom/deafness/on_stage_change(datum/disease/advance/advanced_disease)
. = ..()
@@ -96,7 +96,8 @@
if(4, 5)
if(advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EARS))
var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
ears.adjustEarDamage(-4, -4)
ears?.apply_organ_damage(-4)
ears?.adjust_temporary_deafness(-8 SECONDS)
if(!advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EYES))
return
+1 -1
View File
@@ -20,7 +20,7 @@
if(length(user.held_items) < 0 || iscyborg(user) || source.anchored)
return
examine_list += span_smallnotice("You could bind [source.p_they()] to your wrist with a pair of handcuffs...")
examine_list += span_smallnotice("You could bind [source.p_them()] to your wrist with a pair of handcuffs...")
///Give context to players holding a pair of handcuffs when hovering the item
/datum/element/cuffable_item/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user)
+3 -2
View File
@@ -27,8 +27,9 @@
for(var/i in user_by_item)
var/mob/living/carbon/user = user_by_item[i]
var/obj/item/organ/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS)
if(!ears || !ears.damage || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears))
if(!ears || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears))
continue
ears.deaf = max(ears.deaf - 0.25 * seconds_per_tick, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged
ears.adjust_temporary_deafness(-0.5 SECONDS * seconds_per_tick)
ears.apply_organ_damage(-0.025 * seconds_per_tick)
CHECK_TICK
+5 -2
View File
@@ -14,8 +14,10 @@
var/table_required
///Verb used in processing food (such as slice, flatten), defaults to process
var/screentip_verb
///Sound to play when the do_after begins
var/sound_to_play
/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 2 SECONDS, table_required = FALSE, screentip_verb = "Process")
/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 2 SECONDS, table_required = FALSE, screentip_verb = "Process", sound_to_play = null)
. = ..()
if(!isatom(target))
return ELEMENT_INCOMPATIBLE
@@ -26,6 +28,7 @@
src.result_atom_type = result_atom_type
src.table_required = table_required
src.screentip_verb = screentip_verb
src.sound_to_play = sound_to_play
var/atom/atom_target = target
atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
@@ -67,7 +70,7 @@
to_chat(user, span_notice("You cannot make [initial(result_atom_type.name)] here! You need a table or at least a tray."))
return
mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process))
mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process, TOOL_PROCESSING_SOUND = sound_to_play))
///So people know what the frick they're doing without reading from a wiki page (I mean they will inevitably but i'm trying to help, ok?)
/datum/element/processable/proc/OnExamine(atom/source, mob/user, list/examine_list)
+11 -8
View File
@@ -28,15 +28,17 @@
return NONE
var/obj/renamed_obj = interacting_with
var/obj/item/tool = source
if(!(renamed_obj.obj_flags & UNIQUE_RENAME))
if(!(renamed_obj.obj_flags & UNIQUE_RENAME) || !user.can_write(tool))
return NONE
INVOKE_ASYNC(src, PROC_REF(async_rename), user, renamed_obj)
INVOKE_ASYNC(src, PROC_REF(async_rename), user, renamed_obj, !(renamed_obj.obj_flags & RENAME_NO_DESC))
return ITEM_INTERACT_SUCCESS
/datum/element/tool_renaming/proc/async_rename(mob/living/user, obj/renamed_obj)
var/custom_choice = tgui_input_list(user, "What would you like to edit?", "Customization", list(OPTION_RENAME, OPTION_DESCRIPTION, OPTION_RESET))
/datum/element/tool_renaming/proc/async_rename(mob/living/user, obj/renamed_obj, description_option)
if(!renamed_obj.rename_checks(user))
return
var/custom_choice = tgui_input_list(user, "What would you like to edit?", "Customization", list(OPTION_RENAME, description_option? OPTION_DESCRIPTION : null, OPTION_RESET))
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj) || isnull(custom_choice))
return
@@ -49,7 +51,7 @@
if(input == old_name || !input)
to_chat(user, span_notice("You changed [renamed_obj] to... well... [renamed_obj]."))
return
renamed_obj.AddComponent(/datum/component/rename, input, renamed_obj.desc)
renamed_obj.AddComponent(/datum/component/rename, renamed_obj.nameformat(input, user), renamed_obj.desc)
to_chat(user, span_notice("You have successfully renamed \the [old_name] to [renamed_obj]."))
renamed_obj.update_appearance(UPDATE_NAME)
@@ -61,13 +63,14 @@
if(input == old_desc || !input)
to_chat(user, span_notice("You decide against changing [renamed_obj]'s description."))
return
renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, input)
renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, renamed_obj.descformat(input, user))
to_chat(user, span_notice("You have successfully changed [renamed_obj]'s description."))
renamed_obj.update_appearance(UPDATE_DESC)
if(OPTION_RESET)
qdel(renamed_obj.GetComponent(/datum/component/rename))
to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name and description."))
to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name[renamed_obj.obj_flags & RENAME_NO_DESC? "." : " and description."]"))
renamed_obj.rename_reset()
renamed_obj.update_appearance(UPDATE_NAME | UPDATE_DESC)
#undef OPTION_RENAME
+6
View File
@@ -353,6 +353,7 @@
ACCESS_MORGUE,
ACCESS_SURGERY,
ACCESS_VIROLOGY,
ACCESS_PARAMEDIC,
)
template_access = list(
ACCESS_CAPTAIN,
@@ -432,6 +433,7 @@
ACCESS_RC_ANNOUNCE,
ACCESS_SURGERY,
ACCESS_VIROLOGY,
ACCESS_PARAMEDIC,
)
minimal_wildcard_access = list(
ACCESS_CMO,
@@ -519,6 +521,7 @@
ACCESS_PSYCHOLOGY,
ACCESS_PHARMACY,
ACCESS_VIROLOGY,
ACCESS_PARAMEDIC,
)
template_access = list(
ACCESS_CAPTAIN,
@@ -797,6 +800,7 @@
ACCESS_PHARMACY,
ACCESS_SURGERY,
ACCESS_VIROLOGY,
ACCESS_PARAMEDIC,
)
template_access = list(
ACCESS_CAPTAIN,
@@ -840,6 +844,7 @@
ACCESS_MAINT_TUNNELS,
ACCESS_MORGUE,
ACCESS_MECH_MEDICAL,
ACCESS_PARAMEDIC,
)
extra_access = list(
ACCESS_BIT_DEN,
@@ -1194,6 +1199,7 @@
ACCESS_PLUMBING,
ACCESS_SURGERY,
ACCESS_VIROLOGY,
ACCESS_PARAMEDIC,
)
honorifics = list("Orderly", "Officer")
+10 -8
View File
@@ -26,11 +26,12 @@
///Note that this spawn list is also in the lavaland generator
weighted_feature_spawn_list = list(
/obj/structure/geyser/hollowwater = 10,
/obj/structure/geyser/plasma_oxide = 10,
/obj/structure/geyser/protozine = 10,
/obj/structure/geyser/hollowwater = 8,
/obj/structure/geyser/plasma_oxide = 8,
/obj/structure/geyser/protozine = 8,
/obj/structure/geyser/random = 2,
/obj/structure/geyser/wittel = 10,
/obj/structure/geyser/wittel = 8,
/obj/structure/geyser/chiral_buffer = 8,
/obj/structure/ore_vent/boss/icebox = 1,
)
@@ -45,11 +46,12 @@
feature_spawn_chance = 0.15
weighted_feature_spawn_list = list(
/obj/structure/geyser/hollowwater = 10,
/obj/structure/geyser/plasma_oxide = 10,
/obj/structure/geyser/protozine = 10,
/obj/structure/geyser/hollowwater = 8,
/obj/structure/geyser/plasma_oxide = 8,
/obj/structure/geyser/protozine = 8,
/obj/structure/geyser/random = 2,
/obj/structure/geyser/wittel = 10,
/obj/structure/geyser/wittel = 8,
/obj/structure/geyser/chiral_buffer = 8,
)
weighted_flora_spawn_list = list(
@@ -29,11 +29,12 @@
///Note that this spawn list is also in the icemoon generator
weighted_feature_spawn_list = list(
/obj/structure/geyser/hollowwater = 10,
/obj/structure/geyser/plasma_oxide = 10,
/obj/structure/geyser/protozine = 10,
/obj/structure/geyser/hollowwater = 8,
/obj/structure/geyser/plasma_oxide = 8,
/obj/structure/geyser/protozine = 8,
/obj/structure/geyser/random = 2,
/obj/structure/geyser/wittel = 10,
/obj/structure/geyser/wittel = 8,
/obj/structure/geyser/chiral_buffer = 8,
/obj/structure/ore_vent/boss = 1,
)
@@ -565,11 +565,19 @@
var/pet_message = "%DEAD_MOB% just died!!"
/// Message variant for desensitized people (security, medical, cult with halo, etc)
var/desensitized_message = "I saw %DEAD_MOB% die."
/// Standard message variant
var/normal_message = "I just saw %DEAD_MOB% die. How horrible..."
/// Naive mobs are immune to the effect
var/naive_immune = TRUE
/datum/mood_event/see_death/add_effects(mob/dead_mob)
if(isnull(dead_mob))
return
if(HAS_TRAIT(owner, TRAIT_NAIVE) && naive_immune)
description = "Have a good nap, [dead_mob.name]."
mood_change = 0
timeout *= 0.2
return
if(HAS_TRAIT(dead_mob, TRAIT_SPAWNED_MOB))
mood_change *= 0.25
timeout *= 0.2
@@ -637,6 +645,7 @@
pet_message = "%DEAD_MOB% just exploded!!"
desensitized_message = "I saw %DEAD_MOB% explode."
normal_message = "%DEAD_MOB% just exploded in front of me!!"
naive_immune = FALSE
/datum/mood_event/see_death/dusted
description = "Someone was just vaporized in front of me!! I don't feel so good..."
@@ -646,6 +655,7 @@
pet_message = "%DEAD_MOB% just vaporized!!"
desensitized_message = "I saw %DEAD_MOB% get vaporized."
normal_message = "%DEAD_MOB% was just vaporized in front of me!!"
naive_immune = FALSE
/datum/mood_event/slots/loss
description = "Aww dang it!"
+6 -6
View File
@@ -24,20 +24,20 @@
var/id_trim = null
/// Type path of item to go in uniform slot
var/uniform = null
var/obj/item/uniform = null
/// Type path of item to go in suit slot
var/suit = null
var/obj/item/suit = null
/**
* Type path of item to go in suit storage slot
*
* (make sure it's valid for that suit)
*/
var/suit_store = null
var/obj/item/suit_store = null
/// Type path of item to go in back slot
var/back = null
var/obj/item/back = null
/**
* list of items that should go in the backpack of the user
@@ -47,7 +47,7 @@
var/list/backpack_contents = null
/// Type path of item to go in belt slot
var/belt = null
var/obj/item/belt = null
/**
* list of items that should go in the belt of the user
@@ -513,7 +513,7 @@
for(var/item in beltpack)
var/itype = text2path(item)
if(itype)
belt_contents[itype] = belt[item]
belt_contents[itype] = beltpack[item]
box = text2path(outfit_data["box"])
var/list/impl = outfit_data["implants"]
implants = list()
+5 -47
View File
@@ -3,19 +3,16 @@
desc = "You got caught up in the skillchip craze a few years back, and had one of the commercially available chips implanted into yourself."
icon = FA_ICON_MICROCHIP
value = 2
gain_text = span_notice("The chip in your head itches a bit.")
lose_text = span_danger("You don't feel so chipped anymore..")
medical_record_text = "Patient explained how they got caught up in 'the skillchip chase' recently, and now the chip in their head itches every so often. Dumbass."
gain_text = span_notice("You suddenly feels chipped.")
lose_text = span_danger("You don't feel so chipped anymore.")
medical_record_text = "Patient explained how they got caught up in 'the skillchip chase' recently, and now they have some useless chip in their head. Dumbass."
mail_goodies = list(
/obj/item/skillchip/matrix_taunt,
/obj/item/skillchip/big_pointer,
/obj/item/skillchip/acrobatics,
/obj/item/storage/pill_bottle/mannitol/braintumor,
)
/// Variable that holds the chip, used on removal.
var/obj/item/skillchip/installed_chip
///itchy status effect we give our owner
var/datum/itchy_effect
/datum/quirk_constant_data/chipped
associated_typepath = /datum/quirk/chipped
@@ -27,8 +24,8 @@
if(isnull(chip_pref))
return ..()
installed_chip = GLOB.quirk_chipped_choice[chip_pref] || GLOB.quirk_chipped_choice[pick(GLOB.quirk_chipped_choice)]
gain_text = span_notice("The [installed_chip::name] in your head itches a bit.")
lose_text = span_notice("Your head stops itching so much.")
gain_text = span_notice("The [installed_chip::name] in your head buzzes with knowledge.")
lose_text = span_notice("You stop feeling the chip inside your head.")
return ..()
/datum/quirk/chipped/add_unique(client/client_source)
@@ -37,48 +34,9 @@
var/mob/living/carbon/quirk_holder_carbon = quirk_holder
installed_chip = new installed_chip()
RegisterSignals(installed_chip, list(COMSIG_QDELETING, COMSIG_SKILLCHIP_REMOVED), PROC_REF(remove_effect))
RegisterSignal(installed_chip, COMSIG_SKILLCHIP_IMPLANTED, PROC_REF(apply_effect))
quirk_holder_carbon.implant_skillchip(installed_chip, force = TRUE)
installed_chip.try_activate_skillchip(silent = FALSE, force = TRUE)
/datum/quirk/chipped/proc/apply_effect(datum/source, obj/item/brain_applied)
SIGNAL_HANDLER
var/mob/living/carbon/quirk_holder_carbon = quirk_holder
if(brain_applied == quirk_holder_carbon.get_organ_slot(ORGAN_SLOT_BRAIN))
itchy_effect = quirk_holder.apply_status_effect(/datum/status_effect/itchy_skillchip_quirk)
/datum/quirk/chipped/proc/remove_effect(datum/source, obj/item/brain_removed)
SIGNAL_HANDLER
var/mob/living/carbon/quirk_holder_carbon = quirk_holder
if(QDELING(source) || brain_removed == quirk_holder_carbon.get_organ_slot(ORGAN_SLOT_BRAIN))
quirk_holder.remove_status_effect(itchy_effect)
itchy_effect = null
/datum/quirk/chipped/remove()
QDEL_NULL(installed_chip)
if(itchy_effect)
quirk_holder.remove_status_effect(itchy_effect)
itchy_effect = null
return ..()
/datum/status_effect/itchy_skillchip_quirk
id = "itchy skillchip"
tick_interval_lowerbound = 5 SECONDS
tick_interval_upperbound = 10 MINUTES
alert_type = null
///lower damage we apply to our itchy owner
var/minimum_damage = 1
///upper damage we apply to our itchy owner
var/maximum_damage = 5
/datum/status_effect/itchy_skillchip_quirk/tick(seconds_between_ticks)
var/mob/living/carbon/carbon_owner = owner
var/obj/item/organ/brain/itchy_brain = carbon_owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(isnull(itchy_brain))
return
itchy_brain.apply_organ_damage(rand(minimum_damage, maximum_damage), maximum = itchy_brain.maxHealth * 0.3)
if(owner.stat == CONSCIOUS && !owner.incapacitated && owner.get_empty_held_indexes())
to_chat(owner, span_warning("You scratch the itch in your head."))
@@ -289,7 +289,7 @@
owner.clear_mood_event("on_fire")
SEND_SIGNAL(owner, COMSIG_LIVING_EXTINGUISHED, owner)
cache_stacks()
for(var/obj/item/equipped in (owner.get_equipped_items(INCLUDE_HELD)))
for(var/obj/item/equipped as anything in owner.get_equipped_items(INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT))
equipped.extinguish()
/datum/status_effect/fire_handler/fire_stacks/on_remove()
+15 -11
View File
@@ -336,11 +336,12 @@
return FALSE
/**
* Ensure a list of atoms/reagents exists inside this atom
* Called whenever an item is crafted, either via stack recipes or crafting recipes from the crafting menu
*
* Cycles through the list of movables used up in the recipe and calls used_in_craft() for each of them
* then it either moves them inside the object or deletes
* them depending on whether they're in the list of parts for the recipe or not
* By default, it just cycles through the list of movables used in the recipe and calls used_in_craft() for each of them,
* then it either moves them inside the object if they're in the list of parts for the recipe
* or deletes them if they're not.
* The proc can be overriden by subtypes, as long as it always call parent.
*/
/atom/proc/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter)
SHOULD_CALL_PARENT(TRUE)
@@ -349,17 +350,17 @@
var/list/parts_by_type = remaining_parts?.Copy()
for(var/parttype in parts_by_type) //necessary for our is_type_in_list() call with the zebra arg set to true
parts_by_type[parttype] = parttype
for(var/obj/item/item in components) // machinery or structure objects in the list are guaranteed to be used up. We only check items.
item.used_in_craft(src, current_recipe)
var/matched_type = is_type_in_list(item, parts_by_type, zebra = TRUE)
for(var/atom/movable/movable as anything in components) // machinery or structure objects in the list are guaranteed to be used up. We only check items.
movable.used_in_craft(src, current_recipe)
var/matched_type = is_type_in_list(movable, parts_by_type, zebra = TRUE)
if(!matched_type)
continue
if(isliving(item.loc))
var/mob/living/living = item.loc
living.transferItemToLoc(item, src)
if(isliving(movable.loc) && isitem(movable))
var/mob/living/living = movable.loc
living.transferItemToLoc(movable, src)
else
item.forceMove(src)
movable.forceMove(src)
if(matched_type)
remaining_parts[matched_type] -= 1
@@ -653,7 +654,10 @@
/atom/proc/StartProcessingAtom(mob/living/user, obj/item/process_item, list/chosen_option)
var/processing_time = chosen_option[TOOL_PROCESSING_TIME]
var/sound_to_play = chosen_option[TOOL_PROCESSING_SOUND]
to_chat(user, span_notice("You start working on [src]."))
if(sound_to_play)
playsound(src, sound_to_play, 50, TRUE)
if(!process_item.use_tool(src, user, processing_time, volume=50))
return
var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT]
+2 -1
View File
@@ -30,7 +30,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32)
//Roundstart/map specific barsigns "belong" in their area and should be renaming it, signs created from wallmounts will not.
change_area_name = mapload
set_sign(new /datum/barsign/hiddensigns/signoff)
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/barsign/proc/set_sign(datum/barsign/sign)
if(!istype(sign))
+23 -23
View File
@@ -44,16 +44,12 @@
* INITIALIZATION
*/
/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
/obj/machinery/button/Initialize(mapload)
. = ..()
if(built)
setDir(ndir)
if(!mapload)
set_panel_open(TRUE)
update_appearance()
if(!built && !device && device_type)
device = new device_type(src)
check_access(null)
if(length(req_access) || length(req_one_access))
@@ -64,8 +60,9 @@
board.one_access = 1
board.accesses = req_one_access
setup_device()
find_and_hang_on_wall()
setup_device(mapload)
if(mapload)
find_and_hang_on_wall()
register_context()
/obj/machinery/button/Destroy()
@@ -73,7 +70,9 @@
QDEL_NULL(board)
return ..()
/obj/machinery/button/proc/setup_device()
/obj/machinery/button/proc/setup_device(mapload)
if(mapload && !device && device_type)
device = new device_type(src)
if(id && istype(device, /obj/item/assembly/control))
var/obj/item/assembly/control/control_device = device
control_device.id = id
@@ -401,17 +400,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24)
/obj/machinery/button/door/indestructible
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/button/door/setup_device()
if(!device)
if(normaldoorcontrol)
var/obj/item/assembly/control/airlock/airlock_device = new(src)
airlock_device.specialfunctions = specialfunctions
device = airlock_device
else
var/obj/item/assembly/control/control_device = new(src)
control_device.sync_doors = sync_doors
device = control_device
..()
/obj/machinery/button/door/setup_device(mapload)
if(mapload)
device = normaldoorcontrol ? new /obj/item/assembly/control/airlock(src) : new /obj/item/assembly/control(src)
if(istype(device, /obj/item/assembly/control/airlock))
var/obj/item/assembly/control/airlock/airlock_device = device
airlock_device.specialfunctions = specialfunctions
else if(istype(device, /obj/item/assembly/control))
var/obj/item/assembly/control/control_device = device
control_device.sync_doors = sync_doors
return ..()
/obj/machinery/button/door/incinerator_vent_ordmix
name = "combustion chamber vent control"
@@ -499,10 +498,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24)
device_type = /obj/item/assembly/control/curtain
var/sync_doors = TRUE
/obj/machinery/button/curtain/setup_device()
/obj/machinery/button/curtain/setup_device(mapload)
. = ..()
var/obj/item/assembly/control/curtain = device
curtain.sync_doors = sync_doors
return ..()
if(istype(curtain))
curtain.sync_doors = sync_doors
/obj/machinery/button/crematorium
name = "crematorium igniter"
+3 -6
View File
@@ -103,12 +103,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0)
fire = 90
acid = 50
/obj/machinery/camera/Initialize(mapload, ndir, building)
/obj/machinery/camera/Initialize(mapload)
. = ..()
if(building)
setDir(ndir)
for(var/network_name in network)
network -= network_name
network += LOWER_TEXT(network_name)
@@ -130,8 +127,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0)
#endif
alarm_manager = new(src)
find_and_hang_on_wall(directional = TRUE, \
custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), FALSE))
if(mapload)
find_and_hang_on_wall()
/obj/machinery/camera/Destroy(force)
if(can_use())
+2 -1
View File
@@ -70,7 +70,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai
/obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload)
. = ..()
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
register_context()
RegisterSignal(SSdcs, COMSIG_GLOB_NETWORK_BROADCAST_UPDATED, PROC_REF(on_network_broadcast_updated))
speakers = new(src)
+2 -1
View File
@@ -24,7 +24,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28)
/obj/machinery/defibrillator_mount/loaded/Initialize(mapload) //loaded subtype for mapping use
. = ..()
defib = new/obj/item/defibrillator/loaded(src)
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/defibrillator_mount/Destroy()
QDEL_NULL(defib)
+2 -1
View File
@@ -80,7 +80,8 @@
/obj/machinery/digital_clock/Initialize(mapload)
. = ..()
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
AddElement(/datum/element/beauty, 200)
/obj/machinery/digital_clock/process(seconds_per_tick)
+2 -2
View File
@@ -1177,7 +1177,7 @@
return
if(atom_integrity < max_integrity)
if(!W.tool_start_check(user, amount=1))
if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED))
return
user.visible_message(span_notice("[user] begins welding the airlock."), \
span_notice("You begin repairing the airlock..."), \
@@ -1192,7 +1192,7 @@
to_chat(user, span_notice("The airlock doesn't need repairing."))
/obj/machinery/door/airlock/try_to_weld_secondary(obj/item/weldingtool/tool, mob/user)
if(!tool.tool_start_check(user, amount=1))
if(!tool.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED))
return
user.visible_message(span_notice("[user] begins [welded ? "unwelding":"welding"] the airlock."), \
span_notice("You begin [welded ? "unwelding":"welding"] the airlock..."), \
+4 -4
View File
@@ -49,10 +49,10 @@
fire = 90
acid = 30
/obj/machinery/firealarm/Initialize(mapload, dir, building)
/obj/machinery/firealarm/Initialize(mapload)
. = ..()
id_tag = assign_random_name()
if(building)
if(!mapload)
buildstage = FIRE_ALARM_BUILD_NO_CIRCUIT
set_panel_open(TRUE)
if(name == initial(name))
@@ -78,10 +78,10 @@
)
register_context()
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
update_appearance()
/obj/machinery/firealarm/Destroy()
if(my_area)
LAZYREMOVE(my_area.firealarms, src)
+4 -4
View File
@@ -24,11 +24,11 @@
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26)
/obj/machinery/flasher/Initialize(mapload, ndir = 0, built = 0)
. = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it
if(!built)
/obj/machinery/flasher/Initialize(mapload)
. = ..()
if(mapload)
bulb = new(src)
find_and_hang_on_wall()
find_and_hang_on_wall()
/obj/machinery/flasher/vv_edit_var(vname, vval)
. = ..()
+2 -1
View File
@@ -163,7 +163,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26)
spark_system.set_up(2, 1, src)
spark_system.attach(src)
register_context()
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/sparker/Destroy()
QDEL_NULL(spark_system)
+2 -1
View File
@@ -34,7 +34,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26)
area = get_area(src)
if(autoname)
name = "light switch ([area.name])"
find_and_hang_on_wall(custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), TRUE))
if(mapload)
find_and_hang_on_wall()
register_context()
update_appearance()
@@ -72,12 +72,13 @@
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30)
/obj/machinery/newscaster/Initialize(mapload, ndir, building)
/obj/machinery/newscaster/Initialize(mapload)
. = ..()
GLOB.allCasters += src
GLOB.allbountyboards += src
update_appearance()
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/newscaster/Destroy()
GLOB.allCasters -= src
@@ -957,12 +957,13 @@ DEFINE_BITFIELD(turret_flags, list(
/// List of weakrefs to all turrets
var/list/turrets = list()
/obj/machinery/turretid/Initialize(mapload, ndir = 0, built = 0)
/obj/machinery/turretid/Initialize(mapload)
. = ..()
if(built)
if(!mapload)
locked = FALSE
else
find_and_hang_on_wall()
power_change() //Checks power and initial settings
find_and_hang_on_wall()
/obj/machinery/turretid/Destroy()
turrets.Cut()
@@ -15,6 +15,7 @@
desc = "An unfinished covered turret frame."
anchored = FALSE
density = TRUE
obj_flags = UNIQUE_RENAME | RENAME_NO_DESC
use_power = NO_POWER_USE
var/build_step = PTURRET_UNSECURED //the current step in the building process
var/finish_name = "turret" //the name applied to the product turret
@@ -192,6 +193,12 @@
return
return ..()
/obj/machinery/porta_turret_construct/nameformat(input, user)
finish_name = input
return input
/obj/machinery/porta_turret_construct/rename_reset()
finish_name = initial(finish_name)
/obj/machinery/porta_turret_construct/attack_hand(mob/user, list/modifiers)
. = ..()
+2 -1
View File
@@ -128,7 +128,8 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
if(dept_key)
LAZYADD(GLOB.reta_consoles_by_origin[dept_key], src)
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/requests_console/Destroy()
QDEL_LIST(messages)
+4 -3
View File
@@ -51,7 +51,7 @@ GLOBAL_DATUM_INIT(status_font, /datum/font, new /datum/font/tiny_unicode/size_12
pixel_shift = 32
//makes it go on the wall when built
/obj/machinery/status_display/Initialize(mapload, ndir, building)
/obj/machinery/status_display/Initialize(mapload)
. = ..()
update_appearance()
@@ -407,7 +407,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32)
/obj/item/circuit_component/status_display,
))
RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(on_sec_level_change))
find_and_hang_on_wall()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/status_display/evac/Destroy()
SSradio.remove_object(src,frequency)
@@ -846,7 +847,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32)
/// list to pick the first line from
var/list/firstline_to_secondline = list()
/obj/machinery/status_display/random_message/Initialize(mapload, ndir, building)
/obj/machinery/status_display/random_message/Initialize(mapload)
if(firstline_to_secondline?.len)
message1 = pick(firstline_to_secondline)
message2 = firstline_to_secondline[message1]
+11 -29
View File
@@ -7,8 +7,8 @@
icon_state = "classic"
base_icon_state = "classic"
power_channel = AREA_USAGE_EQUIP
density = TRUE
obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION // Becomes undense when the unit is open
density = TRUE // Becomes undense when the unit is open
obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION | UNIQUE_RENAME | RENAME_NO_DESC
interaction_flags_mouse_drop = NEED_DEXTERITY
max_integrity = 250
req_access = list()
@@ -697,33 +697,6 @@
balloon_alert(user, "set to [choice]")
return ITEM_INTERACT_SUCCESS
if(!state_open && IS_WRITING_UTENSIL(tool))
if(locked)
balloon_alert(user, "unlock first!")
return ITEM_INTERACT_BLOCKING
if(isnull(id_card))
balloon_alert(user, "not yours to rename!")
return ITEM_INTERACT_BLOCKING
var/name_set = FALSE
var/desc_set = FALSE
var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name", max_length = MAX_NAME_LEN)
if(!isnull(str))
name = str
name_set = TRUE
str = tgui_input_text(user, "Personal Unit Description", "Unit Description", max_length = MAX_DESC_LEN)
if(!isnull(str))
desc = str
desc_set = TRUE
var/bit_flag = NONE
if(name_set)
bit_flag |= UPDATE_NAME
if(desc_set)
bit_flag |= UPDATE_DESC
if(bit_flag)
update_appearance(bit_flag)
return ITEM_INTERACT_SUCCESS
if(state_open && is_operational)
if(istype(tool, /obj/item/clothing/suit))
if(suit)
@@ -804,6 +777,15 @@
if(.)
return ..()
/obj/machinery/suit_storage_unit/rename_checks(mob/living/user)
. = TRUE
if(locked)
balloon_alert(user, "unlock first!")
return FALSE
if(!access_check(user))
balloon_alert(user, "not yours to rename!")
return FALSE
/// If the SSU needs to have any communications wires cut.
/obj/machinery/suit_storage_unit/proc/disable_modlink()
if(isnull(mod))
+2
View File
@@ -69,6 +69,8 @@
update_appearance()
init_payment()
register_context()
if(mapload)
find_and_hang_on_wall()
/obj/machinery/wall_healer/Destroy()
clear_using_mob()
@@ -194,7 +194,8 @@
if(. || !ishuman(user))
return
var/mob/living/carbon/human/as_human = user
if(!isflyperson(as_human))
var/obj/item/organ/tongue/user_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!istype(user_tongue, /obj/item/organ/tongue/fly))
return
playsound(get_turf(src), 'sound/items/drink.ogg', 50, TRUE) //slurp
as_human.visible_message(span_alert("[as_human] extends a small proboscis into the vomit pool, sucking it with a slurping sound."))
+20 -3
View File
@@ -421,16 +421,29 @@ CIGARETTE PACKETS ARE IN FANCY.DM
damtype = BURN
force = 4
if(reagents && reagents.has_reagent(/datum/reagent/drug/methamphetamine))
if(reagents?.has_reagent(/datum/reagent/flash_powder))
if(!isliving(loc))
loc.visible_message(span_hear("\The [src] burns up!"))
qdel(src)
return
var/mob/living/user = loc
loc.visible_message(span_hear("[user]'s [name] burns up as [p_they(user)] fall to the ground!"), span_danger("The solution violently explodes!"))
user.flash_act(INFINITY, visual = TRUE, length = 5 SECONDS)
user.playsound_local(get_turf(user), SFX_EXPLOSION, 50, TRUE)
user.cause_hallucination(/datum/hallucination/death, "trick trick [name]")
qdel(src)
return
if(reagents?.has_reagent(/datum/reagent/drug/methamphetamine))
reagents.flags |= NO_REACT
if(reagents.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire
if(reagents?.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(round(reagents.get_reagent_amount(/datum/reagent/toxin/plasma) / 2.5, 1), get_turf(src), 0, 0)
e.start(src)
qdel(src)
return
if(reagents.get_reagent_amount(/datum/reagent/fuel)) // the fuel explodes, too, but much less violently
if(reagents?.get_reagent_amount(/datum/reagent/fuel)) // the fuel explodes, too, but much less violently
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(round(reagents.get_reagent_amount(/datum/reagent/fuel) / 5, 1), get_turf(src), 0, 0)
e.start(src)
@@ -709,6 +722,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
lung_harm = 2
list_reagents = list (/datum/reagent/drug/nicotine = 20, /datum/reagent/medicine/regen_jelly = 15, /datum/reagent/drug/krokodil = 4)
/obj/item/cigarette/flash_powder
desc = /obj/item/cigarette/space_cigarette::desc
list_reagents = list (/datum/reagent/drug/nicotine = 9, /datum/reagent/flash_powder = 5)
// Rollies.
/obj/item/cigarette/rollie
+10
View File
@@ -14,6 +14,8 @@
name = "control wand"
desc = "A remote for controlling a set of airlocks."
w_class = WEIGHT_CLASS_TINY
drop_sound = 'sound/items/door_remote/door_remote_drop1.ogg'
pickup_sound = 'sound/items/door_remote/door_remote_pick_up1.ogg'
var/department = "civilian"
var/mode = WAND_OPEN
@@ -34,6 +36,10 @@
/area/station/ai_monitored/turret_protected/ai_upload, // their doors with our several dozen access helpers
)
COOLDOWN_DECLARE(shock_cooldown)
/// sound played when mode is switched
var/mode_switch_sound = SFX_REMOTE_MODE_SWITCH
/// sound played when an action is done
var/action_sound = SFX_REMOTE_ACTION
/obj/item/door_remote/Initialize(mapload)
. = ..()
@@ -80,6 +86,8 @@
mode = WAND_OPEN
update_icon_state()
balloon_alert(user, "mode: [ops[mode]]")
if(mode_switch_sound)
playsound(src, mode_switch_sound, 50, TRUE)
/obj/item/door_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!istype(interacting_with, /obj/machinery/door) && !isturf(interacting_with))
@@ -159,6 +167,8 @@
/obj/item/door_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
var/obj/machinery/door/door
if(action_sound)
playsound(src, action_sound, 50, TRUE)
if (istype(interacting_with, /obj/machinery/door))
door = interacting_with
+1
View File
@@ -215,6 +215,7 @@
drawtype = pick(all_drawables)
AddElement(/datum/element/venue_price, FOOD_PRICE_EXOTIC)
AddElement(/datum/element/tool_renaming)
if(can_change_colour)
AddComponent(/datum/component/palette, AVAILABLE_SPRAYCAN_SPACE, paint_color)
+1 -12
View File
@@ -6,6 +6,7 @@
inhand_icon_state = "beacon"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
obj_flags = UNIQUE_RENAME
var/enabled = TRUE
var/renamed = FALSE
@@ -46,15 +47,3 @@
/obj/item/beacon/attack_hand_secondary(mob/user, list/modifiers)
attack_self(user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/beacon/attackby(obj/item/W, mob/user)
if(IS_WRITING_UTENSIL(W)) // needed for things that use custom names like the locator
var/new_name = tgui_input_text(user, "What would you like the name to be?", "Beacon", max_length = MAX_NAME_LEN)
if(!user.can_perform_action(src))
return
if(new_name)
name = new_name
renamed = TRUE
return
else
return ..()
@@ -323,15 +323,63 @@
icon_state = "lightreplacer_high"
max_uses = 50
#define BLIGHTREPLACER_SPOT_COOLDOWN (BLIGHTREPLACER_SPOT_LIFE + 1 SECONDS)
#define BLIGHTREPLACER_SPOT_RANGE 7
#define BLIGHTREPLACER_SPOT_LIFE (5 SECONDS)
/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
actions_types = list(/datum/action/item_action/lightreplacer_scan)
action_slots = ALL
COOLDOWN_DECLARE(lightreplacer_spot_cooldown)
/obj/item/lightreplacer/blue/emag_act()
return FALSE // balancing against longrange explosions
/obj/item/lightreplacer/blue/ui_action_click(mob/user, actiontype)
if(!COOLDOWN_FINISHED(src, lightreplacer_spot_cooldown))
balloon_alert(user, "on cooldown!")
return
COOLDOWN_START(src, lightreplacer_spot_cooldown, BLIGHTREPLACER_SPOT_COOLDOWN)
lightreplacer_scan()
/// Scans the area in search of fixtures with broken bulbs in the BLIGHTREPLACER_SPOT_RANGE range, and also marks them with the blue_firefly effect.
/obj/item/lightreplacer/blue/proc/lightreplacer_scan()
var/turf/source_turf = get_turf(src)
for(var/obj/machinery/light/broken_light in dview(BLIGHTREPLACER_SPOT_RANGE, source_turf))
if(broken_light.status == LIGHT_OK)
continue
var/obj/effect/temp_visual/blue_firefly/firefly = new(get_turf(broken_light))
animate(firefly, alpha = 0, time = BLIGHTREPLACER_SPOT_LIFE, easing = CIRCULAR_EASING | EASE_IN)
/datum/action/item_action/lightreplacer_scan
name = "Scan for broken lamps"
desc = "Scans the surrounding area for fixtures with broken light bulbs and marks them."
/obj/effect/temp_visual/blue_firefly
name = "bluespace firefly"
icon = 'icons/effects/effects.dmi'
icon_state = "bluespace_firefly"
light_power = 1
light_range = 2
light_color = LIGHT_COLOR_DARK_BLUE
duration = BLIGHTREPLACER_SPOT_LIFE
/obj/effect/temp_visual/blue_firefly/Initialize(mapload)
. = ..()
update_appearance(UPDATE_OVERLAYS)
/obj/effect/temp_visual/blue_firefly/update_overlays()
. = ..()
. += emissive_appearance(icon, icon_state, src, alpha = src.alpha)
#undef BLIGHTREPLACER_SPOT_COOLDOWN
#undef BLIGHTREPLACER_SPOT_RANGE
#undef BLIGHTREPLACER_SPOT_LIFE
#undef GLASS_SHEET_USES
#undef LIGHTBULB_COST
#undef BULB_SHARDS_REQUIRED
@@ -28,24 +28,27 @@
icon_state = "intercom_prison"
icon_off = "intercom_prison-p"
/obj/item/radio/intercom/prison/Initialize(mapload, ndir, building)
/obj/item/radio/intercom/prison/Initialize(mapload)
. = ..()
wires?.cut(WIRE_TX)
/obj/item/radio/intercom/Initialize(mapload, ndir, building)
/obj/item/radio/intercom/Initialize(mapload)
. = ..()
var/area/current_area = get_area(src)
if(!current_area)
return
RegisterSignal(current_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(AreaPowerCheck))
if(mapload)
find_and_hang_on_wall()
GLOB.intercoms_list += src
/obj/item/radio/intercom/find_and_hang_on_wall()
if(!unscrewed)
find_and_hang_on_wall(directional = TRUE, \
custom_drop_callback = CALLBACK(src, PROC_REF(knock_down)))
return ..()
/obj/item/radio/intercom/Destroy()
. = ..()
GLOB.intercoms_list -= src
return ..()
/obj/item/radio/intercom/examine(mob/user)
. = ..()
@@ -87,7 +90,7 @@
if(tool.use_tool(src, user, 80))
user.visible_message(span_notice("[user] unsecures [src]!"), span_notice("You detach [src] from the wall."))
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
knock_down()
deconstruct(TRUE)
/**
* Override attack_tk_grab instead of attack_tk because we actually want attack_tk's
@@ -187,9 +190,8 @@
/**
* Called by the wall mount component and reused during the tool deconstruction proc.
*/
/obj/item/radio/intercom/proc/knock_down()
/obj/item/radio/intercom/atom_deconstruct(disassembled)
new/obj/item/wallframe/intercom(get_turf(src))
qdel(src)
//Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it!
/obj/item/wallframe/intercom
@@ -209,7 +211,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27)
anonymize = TRUE
freqlock = RADIO_FREQENCY_EMAGGABLE_LOCK
/obj/item/radio/intercom/chapel/Initialize(mapload, ndir, building)
/obj/item/radio/intercom/chapel/Initialize(mapload)
. = ..()
set_frequency(1481)
set_broadcasting(TRUE)
@@ -109,8 +109,8 @@
update_appearance()
/obj/item/taperecorder/fire_act(exposed_temperature, exposed_volume)
mytape.unspool() //Fires unspool the tape, which makes sense if you don't think about it
..()
mytape?.unspool() //Fires unspool the tape, which makes sense if you don't think about it
return ..()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/item/taperecorder/attack_hand(mob/user, list/modifiers)
+1 -1
View File
@@ -355,7 +355,7 @@
if(4)
//Destroy Equipment
selected_turf.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!"))
var/list/belongings = user.get_all_gear()
var/list/belongings = user.get_all_gear(NONE) //don't delete prosthetics or abstract items.
QDEL_LIST(belongings)
if(5)
//Monkeying
+2 -2
View File
@@ -358,7 +358,7 @@
/obj/item/extinguisher/click_alt(mob/user)
if(!user.is_holding(src))
to_chat(user, span_notice("You must be holding the [src] in your hands do this!"))
to_chat(user, span_notice("You must be holding [src] in your hands to do this!"))
return CLICK_ACTION_BLOCKING
EmptyExtinguisher(user)
return CLICK_ACTION_SUCCESS
@@ -367,7 +367,7 @@
if(loc == user && reagents.total_volume)
reagents.expose(user.loc, TOUCH)
reagents.clear_reagents()
user.visible_message(span_notice("[user] empties out \the [src] onto the floor using the release valve."), span_info("You quietly empty out \the [src] using its release valve."))
user.visible_message(span_notice("[user] empties out [src] onto the floor using the release valve."), span_info("You quietly empty out [src] using its release valve."))
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers)
+1 -1
View File
@@ -22,7 +22,7 @@
/obj/item/food/bread/make_processable()
if (slice_type)
AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
AddElement(/datum/element/processable, TOOL_SAW, slice_type, yield, 4 SECONDS, table_required = TRUE, screentip_verb = "Slice")
// Abstract parent object for sliced bread items. Should not be made obtainable in game.
+1 -1
View File
@@ -21,7 +21,7 @@
/obj/item/food/cake/make_processable()
if (slice_type)
AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/cakeslice
icon = 'icons/obj/food/piecake.dmi'
+2 -2
View File
@@ -59,7 +59,7 @@
AddComponent(/datum/component/food_storage)
/obj/item/food/cheese/wheel/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/wedge, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/wedge, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/cheese/wheel/make_bakeable()
AddComponent(/datum/component/bakeable, /obj/item/food/baked_cheese, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE)
@@ -131,7 +131,7 @@
crafting_complexity = FOOD_COMPLEXITY_3
/obj/item/food/cheese/firm_cheese/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/firm_cheese_slice, 3, 3 SECONDS, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/firm_cheese_slice, 3, 3 SECONDS, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/cheese/firm_cheese_slice
name = "firm cheese slice"
+5 -5
View File
@@ -15,7 +15,7 @@
// Dough + rolling pin = flat dough
/obj/item/food/dough/make_processable()
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatdough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten")
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatdough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING)
/obj/item/food/flatdough
name = "flat dough"
@@ -32,7 +32,7 @@
// sliceable into 3xdoughslices
/obj/item/food/flatdough/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/doughslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/doughslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/pizzabread
name = "pizza bread"
@@ -63,7 +63,7 @@
AddComponent(/datum/component/bakeable, /obj/item/food/bun, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE)
/obj/item/food/doughslice/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/bait/doughball, 5, 3 SECONDS, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/bait/doughball, 5, 3 SECONDS, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/bun
name = "bun"
@@ -94,7 +94,7 @@
AddComponent(/datum/component/bakeable, /obj/item/food/cake/plain, rand(70 SECONDS, 90 SECONDS), TRUE, TRUE)
/obj/item/food/cakebatter/make_processable()
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/piedough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten")
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/piedough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING)
/obj/item/food/piedough
name = "pie dough"
@@ -110,7 +110,7 @@
AddComponent(/datum/component/bakeable, /obj/item/food/pie/plain, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE)
/obj/item/food/piedough/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rawpastrybase, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rawpastrybase, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/rawpastrybase
name = "raw pastry base"
+4 -4
View File
@@ -73,7 +73,7 @@
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT)
/obj/item/food/headcheese/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/headcheese_slice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/headcheese_slice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/headcheese_slice
name = "headcheese slice"
@@ -451,7 +451,7 @@
AddComponent(/datum/component/bakeable, bread_type, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE)
/obj/item/food/rootdough/make_processable()
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, flat_type, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten")
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, flat_type, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING)
/obj/item/food/rootdough/egg
desc = "A root based dough, made with nuts, tubers and eggs. Used in a wide range of Tiziran cooking."
@@ -472,7 +472,7 @@
var/grill_type = /obj/item/food/root_flatbread
/obj/item/food/flatrootdough/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, process_type, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, process_type, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/flatrootdough/make_grillable()
AddComponent(/datum/component/grillable, grill_type, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE)
@@ -499,7 +499,7 @@
foodtypes = parent_type::foodtypes | MEAT
/obj/item/food/rootdoughslice/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/nizaya, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/nizaya, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/rootdoughslice/make_bakeable()
AddComponent(/datum/component/bakeable, /obj/item/food/rootroll, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE)
+4 -4
View File
@@ -359,7 +359,7 @@
// sliceable into 4xtempehslices
/obj/item/food/tempeh/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/tempehslice, 4, 5 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/tempehslice, 4, 5 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
//add an icon for slices
/obj/item/food/tempehslice
@@ -466,7 +466,7 @@
AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE)
/obj/item/food/raw_meatball/make_processable()
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE, screentip_verb = "Flatten")
AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING)
/obj/item/food/raw_meatball/human
name = "strange raw meatball"
@@ -638,8 +638,8 @@
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT)
/obj/item/food/sausage/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/sausage/american
name = "american sausage"
+9 -9
View File
@@ -52,7 +52,7 @@
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/slab/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, MEATSLAB_PROCESSED_AMOUNT, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, MEATSLAB_PROCESSED_AMOUNT, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
///////////////////////////////////// HUMAN MEATS //////////////////////////////////////////////////////
@@ -66,7 +66,7 @@
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/slab/human/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/human/mutant
abstract_type = /obj/item/food/meat/slab/human/mutant
@@ -262,7 +262,7 @@
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE)
/obj/item/food/meat/slab/killertomato/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/bear
name = "bear meat"
@@ -278,7 +278,7 @@
foodtypes = RAW | MEAT
/obj/item/food/meat/slab/bear/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/bear/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
@@ -301,7 +301,7 @@
blood_decal_type = /obj/effect/decal/cleanable/blood/xeno
/obj/item/food/meat/slab/xeno/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/xeno/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
@@ -320,7 +320,7 @@
blood_decal_type = /obj/effect/decal/cleanable/insectguts
/obj/item/food/meat/slab/spider/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/spider/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
@@ -403,7 +403,7 @@
foodtypes = RAW | MEAT | GORE
/obj/item/food/meat/slab/gondola/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/gondola/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
@@ -420,7 +420,7 @@
/obj/item/food/meat/slab/penguin/make_processable()
. = ..()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/penguin/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
@@ -463,7 +463,7 @@
starting_reagent_purity = 1
/obj/item/food/meat/slab/chicken/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/meat/slab/chicken/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken)
+1 -1
View File
@@ -405,7 +405,7 @@
can_stick = FALSE
/obj/item/food/butter/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/butterslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/butterslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/butterslice
name = "butter slice"
+1 -1
View File
@@ -194,7 +194,7 @@
crafting_complexity = FOOD_COMPLEXITY_5
/obj/item/food/green_lasagne/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/green_lasagne_slice, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/green_lasagne_slice, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/green_lasagne_slice
name = "green lasagne al forno slice"
+2 -2
View File
@@ -470,7 +470,7 @@
crafting_complexity = FOOD_COMPLEXITY_2
/obj/item/food/brownie_sheet/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/brownie
name = "brownie"
@@ -519,7 +519,7 @@
crafting_complexity = FOOD_COMPLEXITY_3
/obj/item/food/peanut_butter_brownie_sheet/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/peanut_butter_brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/peanut_butter_brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/peanut_butter_brownie
name = "peanut butter brownie"
+1 -1
View File
@@ -16,7 +16,7 @@
/obj/item/food/pie/make_processable()
if (slice_type)
AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, table_required = TRUE, screentip_verb = "Slice")
AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE)
/obj/item/food/pieslice
name = "pie slice"

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