Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync

This commit is contained in:
xPokee
2025-10-04 05:28:09 -04:00
67 changed files with 1444 additions and 796 deletions
@@ -1,12 +1,15 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/template_noop,
/area/template_noop)
"l" = (
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters)
"L" = (
/obj/structure/ore_vent/random/icebox,
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters)
@@ -1,12 +1,16 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/template_noop,
/area/template_noop)
"l" = (
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored)
"L" = (
/obj/structure/ore_vent/random/icebox/lower,
/obj/effect/mapping_helpers/no_atoms_ontop,
/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored)
@@ -11439,7 +11439,7 @@
"dpT" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/lasertag/blue,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
@@ -12424,7 +12424,7 @@
"dFT" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/lasertag/red,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"dFY" = (
@@ -19945,7 +19945,7 @@
/area/station/maintenance/port)
"fNv" = (
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/west,
/obj/machinery/camera/autoname/directional/west,
/turf/open/floor/iron,
@@ -27903,7 +27903,7 @@
"ibc" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/boxinggloves,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
@@ -37229,7 +37229,7 @@
/area/station/maintenance/starboard/central)
"kFP" = (
/obj/structure/closet/toolcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/wood,
/area/station/commons/storage/tools)
"kFQ" = (
@@ -45082,7 +45082,7 @@
/area/station/maintenance/starboard/lesser)
"mUi" = (
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/sepia,
/area/station/hallway/secondary/construction)
"mUm" = (
@@ -45380,7 +45380,7 @@
/area/station/maintenance/starboard/fore)
"mYN" = (
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"mYV" = (
@@ -55678,7 +55678,7 @@
/area/station/maintenance/department/medical)
"pUr" = (
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"pUE" = (
@@ -60284,7 +60284,7 @@
"rnC" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/trimline/green/filled/line,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
"rnP" = (
@@ -67251,7 +67251,7 @@
/area/station/ai_monitored/command/storage/eva)
"twv" = (
/obj/structure/closet,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -69170,7 +69170,7 @@
"tYb" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/masks,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"tYh" = (
@@ -72129,7 +72129,7 @@
dir = 1
},
/obj/effect/turf_decal/trimline/red/line,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
@@ -76597,7 +76597,7 @@
"wcL" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/athletic_mixed,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"wcN" = (
@@ -81025,7 +81025,7 @@
},
/obj/effect/turf_decal/trimline/red/corner,
/obj/machinery/airalarm/directional/west,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
"xrP" = (
+37 -37
View File
@@ -63,7 +63,7 @@
/turf/open/floor/wood,
/area/station/service/abandoned_gambling_den)
"aaY" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/sign/nanotrasen{
pixel_y = 32
},
@@ -1140,7 +1140,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/gravity_generator)
"anV" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -2523,7 +2523,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
"aEV" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/suit/toggle/lawyer/black,
/obj/item/clothing/under/rank/civilian/lawyer/black,
@@ -5494,7 +5494,7 @@
pixel_x = -32
},
/obj/machinery/airalarm/directional/south,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/suit/jacket/letterman_nanotrasen,
/obj/item/clothing/under/pants/track,
@@ -6753,7 +6753,7 @@
/area/station/engineering/atmos/project)
"bGN" = (
/obj/structure/closet/secure_closet/personal,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/item/storage/wallet,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -8462,7 +8462,7 @@
/obj/effect/spawner/random/food_or_drink/donkpockets,
/obj/effect/spawner/random/food_or_drink/condiment,
/obj/effect/turf_decal/bot_white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/port)
"cbh" = (
@@ -11162,7 +11162,7 @@
/turf/open/floor/iron,
/area/station/engineering/hallway)
"cIE" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -14776,7 +14776,7 @@
/obj/structure/closet,
/obj/effect/spawner/random/entertainment/wallet_storage,
/obj/effect/turf_decal/bot_white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/port)
"dGS" = (
@@ -15463,7 +15463,7 @@
/area/station/cargo/storage)
"dNX" = (
/obj/structure/closet/boxinggloves,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
@@ -15509,7 +15509,7 @@
/obj/effect/turf_decal/bot,
/obj/structure/mirror/directional/north,
/obj/machinery/light/small/directional/north,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/medical/cryo)
@@ -15906,7 +15906,7 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay)
"dUH" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/clothing/wardrobe_closet_colored,
/obj/structure/sign/poster/random/directional/north,
/turf/open/floor/iron/dark,
@@ -17035,7 +17035,7 @@
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/maintenance,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
@@ -20428,7 +20428,7 @@
/turf/open/floor/iron,
/area/station/engineering/atmos/project)
"fdn" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/crate,
/obj/effect/turf_decal/bot,
/obj/item/airlock_painter/decal,
@@ -21240,7 +21240,7 @@
"fmO" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -24347,7 +24347,7 @@
/turf/open/floor/wood/large,
/area/station/service/library/lounge)
"fZV" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
@@ -29737,7 +29737,7 @@
req_access = list("medical");
specialfunctions = 4
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/medical/cryo)
@@ -30213,7 +30213,7 @@
/turf/open/floor/iron,
/area/station/maintenance/fore)
"hvq" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
@@ -31763,7 +31763,7 @@
dir = 8
},
/obj/machinery/airalarm/directional/east,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/dark_blue/fourcorners,
/turf/open/floor/iron,
/area/station/commons/dorms/laundry)
@@ -34237,7 +34237,7 @@
pixel_y = -32
},
/obj/effect/spawner/random/structure/closet_private,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/item/clothing/suit/toggle/lawyer,
/obj/item/clothing/under/rank/civilian/lawyer/beige,
/obj/item/clothing/under/rank/civilian/lawyer/beige/skirt,
@@ -35526,7 +35526,7 @@
/turf/open/floor/iron,
/area/station/service/kitchen/abandoned)
"iNg" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
@@ -41386,7 +41386,7 @@
/obj/effect/turf_decal/siding/dark_blue{
dir = 8
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/dark_blue/fourcorners,
/obj/machinery/light/cold/directional/east,
/turf/open/floor/iron,
@@ -43244,7 +43244,7 @@
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
"kGK" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -44514,7 +44514,7 @@
c_tag = "Departures Hallway - Access";
name = "hallway camera"
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -48267,7 +48267,7 @@
/area/station/medical/treatment_center)
"lSw" = (
/obj/structure/closet/secure_closet/personal,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -53770,7 +53770,7 @@
/area/station/commons/storage/primary)
"nph" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/siding/wood,
/obj/structure/closet/secure_closet/personal/cabinet{
name = "mime's closet"
@@ -56136,7 +56136,7 @@
/turf/open/floor/iron/dark,
/area/station/service/chapel/funeral)
"nUo" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/secure_closet/personal,
/obj/effect/spawner/random/food_or_drink/cups,
@@ -60567,7 +60567,7 @@
/turf/open/floor/iron/white,
/area/station/science/research)
"pca" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -61699,7 +61699,7 @@
/turf/open/floor/iron,
/area/station/commons/lounge)
"prl" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/crate,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
@@ -62101,7 +62101,7 @@
/area/station/service/kitchen)
"pwC" = (
/obj/item/radio/intercom/directional/north,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/under/rank/civilian/curator,
/obj/item/clothing/under/rank/civilian/curator/skirt,
@@ -69293,7 +69293,7 @@
/turf/open/floor/iron,
/area/station/maintenance/department/crew_quarters/bar)
"riv" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
@@ -75042,7 +75042,7 @@
/turf/open/floor/iron,
/area/station/service/hydroponics)
"sAY" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/machinery/firealarm/directional/west,
@@ -80146,7 +80146,7 @@
/area/station/security/range)
"tOs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/siding/wood,
/obj/structure/closet/secure_closet/personal/cabinet{
name = "clown's closet"
@@ -80686,7 +80686,7 @@
/area/station/ai_monitored/security/armory)
"tVC" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/closet/secure_closet/personal/cabinet{
name = "clown's closet"
},
@@ -84590,7 +84590,7 @@
/turf/open/floor/iron,
/area/station/commons/storage/tools)
"uPj" = (
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/delivery,
/obj/structure/closet/emcloset,
/turf/open/floor/iron,
@@ -85498,7 +85498,7 @@
/obj/machinery/firealarm/directional/south,
/obj/effect/turf_decal/delivery,
/obj/machinery/airalarm/directional/west,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -89055,7 +89055,7 @@
/area/station/service/abandoned_gambling_den/gaming)
"vXT" = (
/obj/structure/closet/wardrobe/pjs,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -96501,7 +96501,7 @@
/area/station/medical/storage)
"xQZ" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/head/costume/kitty,
/obj/item/clothing/under/costume/maid,
+83 -69
View File
@@ -5774,6 +5774,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"bzT" = (
/obj/machinery/computer/station_alert{
dir = 4
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/computer/security/telescreen/ce/directional/west,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
"bzW" = (
/turf/open/floor/engine/plasma,
/area/station/engineering/atmos)
@@ -9631,6 +9639,11 @@
/obj/structure/flora/tree/pine/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"cCq" = (
/obj/machinery/computer/station_alert,
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/turf/open/floor/iron,
/area/station/command/bridge)
"cCu" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -11487,7 +11500,7 @@
/obj/machinery/airalarm/directional/north,
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/wood,
/area/station/commons/dorms)
"ddu" = (
@@ -14462,7 +14475,7 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/status_display/evac/directional/north,
/obj/effect/turf_decal/siding/white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
"dWn" = (
@@ -18005,7 +18018,7 @@
c_tag = "Fitness Room North"
},
/obj/structure/closet/masks,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -19185,7 +19198,7 @@
/area/station/maintenance/starboard/aft)
"fpa" = (
/obj/structure/closet/wardrobe/pjs,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/commons/dorms)
@@ -24685,6 +24698,18 @@
"gTK" = (
/turf/closed/wall,
/area/station/engineering/engine_smes)
"gTQ" = (
/obj/machinery/computer/station_alert{
dir = 8
},
/obj/machinery/button/door/directional/south{
id = "atmos"
},
/obj/machinery/light_switch/directional/south{
pixel_x = -10
},
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/storage/gas)
"gTW" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -25091,6 +25116,14 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"gYM" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/mining_center,
/turf/open/floor/iron,
/area/mine/eva/lower)
"gYT" = (
/obj/machinery/light/cold/directional/east,
/obj/machinery/status_display/ai/directional/east,
@@ -26131,7 +26164,7 @@
name = "Genetics Requests Console"
},
/obj/effect/mapping_helpers/requests_console/supplies,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"hqi" = (
@@ -27167,12 +27200,6 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/work)
"hFJ" = (
/obj/machinery/computer/station_alert,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/computer/security/telescreen/engine/directional/north,
/turf/open/floor/iron/dark,
/area/station/engineering/engine_smes)
"hFL" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 4
@@ -28451,7 +28478,7 @@
/area/station/cargo/sorting)
"hYL" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -38828,6 +38855,13 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"kXm" = (
/obj/effect/turf_decal/loading_area{
dir = 1
},
/obj/effect/landmark/mining_center,
/turf/open/floor/iron,
/area/station/cargo/storage)
"kXq" = (
/obj/machinery/air_sensor/plasma_tank,
/turf/open/floor/engine/plasma,
@@ -40650,6 +40684,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/storage/tools)
"lxj" = (
/obj/machinery/airalarm/directional/west,
/obj/machinery/computer/station_alert{
dir = 4
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/aisat_interior)
"lxu" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
dir = 4
@@ -50667,7 +50709,7 @@
/area/station/maintenance/starboard/upper)
"opt" = (
/obj/structure/closet/athletic_mixed,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -50912,7 +50954,7 @@
"orV" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"osd" = (
@@ -51916,8 +51958,8 @@
"oDV" = (
/obj/structure/closet,
/obj/item/radio/intercom/directional/east,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
@@ -54319,7 +54361,7 @@
/area/station/maintenance/department/medical/morgue)
"pnj" = (
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/stripes/corner,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron,
@@ -55723,7 +55765,7 @@
/obj/effect/turf_decal/siding/white{
dir = 1
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
"pGG" = (
@@ -56230,7 +56272,7 @@
"pOo" = (
/obj/machinery/airalarm/directional/north,
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/carpet,
/area/station/commons/dorms)
"pOq" = (
@@ -59141,14 +59183,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/station/science/explab)
"qFu" = (
/obj/machinery/airalarm/directional/west,
/obj/machinery/computer/station_alert{
dir = 4
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/aisat_interior)
"qFA" = (
/obj/machinery/door/airlock/hatch,
/obj/effect/mapping_helpers/airlock/access/any/security/maintenance,
@@ -60535,11 +60569,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/lobby)
"qXF" = (
/obj/machinery/computer/station_alert,
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/turf/open/floor/iron,
/area/station/command/bridge)
"qXO" = (
/obj/structure/flora/bush/jungle/c/style_random,
/turf/open/floor/grass,
@@ -66296,6 +66325,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/cytology)
"sDJ" = (
/obj/machinery/computer/station_alert,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/computer/security/telescreen/engine/directional/north,
/turf/open/floor/iron/dark,
/area/station/engineering/engine_smes)
"sDQ" = (
/obj/item/radio/intercom/prison/directional/north,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -66502,6 +66537,11 @@
dir = 1
},
/area/station/ai_monitored/command/storage/eva)
"sFY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/landmark/mining_center,
/turf/open/floor/iron,
/area/station/commons/storage/mining)
"sGk" = (
/obj/effect/turf_decal/trimline/yellow/filled/line,
/obj/structure/sign/poster/random/directional/south,
@@ -71510,7 +71550,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"udA" = (
@@ -72194,14 +72234,6 @@
/obj/machinery/gulag_teleporter,
/turf/open/floor/iron/showroomfloor,
/area/station/security/processing)
"unG" = (
/obj/machinery/computer/station_alert{
dir = 4
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/computer/security/telescreen/ce/directional/west,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
"unH" = (
/obj/structure/table,
/obj/item/analyzer{
@@ -75341,12 +75373,6 @@
/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
"vmn" = (
/obj/effect/turf_decal/loading_area{
dir = 1
},
/turf/open/floor/iron,
/area/station/cargo/storage)
"vmr" = (
/obj/structure/musician/piano,
/turf/open/floor/wood,
@@ -75482,18 +75508,6 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
"vnt" = (
/obj/machinery/computer/station_alert{
dir = 8
},
/obj/machinery/button/door/directional/south{
id = "atmos"
},
/obj/machinery/light_switch/directional/south{
pixel_x = -10
},
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/storage/gas)
"vnw" = (
/obj/machinery/camera/directional/south{
c_tag = "Fitness Room South"
@@ -84436,7 +84450,7 @@
/area/station/security/brig)
"xSv" = (
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/engineering/lobby)
"xSx" = (
@@ -84528,7 +84542,7 @@
/area/station/maintenance/aft/greater)
"xTU" = (
/obj/structure/closet/wardrobe/pjs,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
@@ -105620,7 +105634,7 @@ qmt
pVg
ubG
xlA
eVa
gYM
gSO
uPt
qmt
@@ -178857,7 +178871,7 @@ iiX
jIC
twr
wzY
jQy
sFY
jQy
nqx
pls
@@ -236936,7 +236950,7 @@ ajw
mmi
wiz
mmi
vmn
kXm
wam
wam
wam
@@ -244882,7 +244896,7 @@ ljx
nxW
utR
tmQ
qXF
cCq
dMX
gER
nOH
@@ -245196,7 +245210,7 @@ xtQ
hIH
kCn
mNY
hFJ
sDJ
tMD
ehJ
fMt
@@ -246226,7 +246240,7 @@ vkz
aom
pcg
deD
unG
bzT
qnC
isX
eBI
@@ -248262,7 +248276,7 @@ kRP
fiT
kQf
hDh
vnt
gTQ
keP
qTa
ctr
@@ -254478,7 +254492,7 @@ tWy
dZX
swF
swF
qFu
lxj
gzz
uCg
mfD
+18 -18
View File
@@ -907,7 +907,7 @@
/area/space/nearstation)
"aqu" = (
/obj/structure/closet/wardrobe/green,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -5424,7 +5424,7 @@
/area/station/ai_monitored/turret_protected/ai_upload)
"bTv" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/sign/poster/official/random/directional/south,
/turf/open/floor/iron/dark,
@@ -6948,7 +6948,7 @@
/area/station/commons/toilet/restrooms)
"cwK" = (
/obj/structure/closet/wardrobe/grey,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
@@ -13144,7 +13144,7 @@
/area/station/service/bar)
"eAq" = (
/obj/structure/closet/wardrobe/white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron/dark,
@@ -22680,7 +22680,7 @@
/area/station/command/heads_quarters/ce)
"hSG" = (
/obj/structure/closet/lasertag/red,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
@@ -23759,7 +23759,7 @@
/area/station/command/teleporter)
"ilx" = (
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
@@ -25893,7 +25893,7 @@
/area/station/commons/dorms)
"iVO" = (
/obj/structure/closet/masks,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
@@ -28075,7 +28075,7 @@
/area/station/security/prison)
"jFO" = (
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
"jFZ" = (
@@ -33233,7 +33233,7 @@
/area/station/ai_monitored/turret_protected/ai)
"lus" = (
/obj/structure/closet/athletic_mixed,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -33604,7 +33604,7 @@
/area/station/maintenance/aft/lesser)
"lDA" = (
/obj/structure/closet/wardrobe/black,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -37103,7 +37103,7 @@
/area/station/maintenance/port/aft)
"mOl" = (
/obj/structure/closet/boxinggloves,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/east,
/turf/open/floor/iron/dark,
@@ -38786,7 +38786,7 @@
/obj/structure/sign/warning/pods{
pixel_y = 30
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/dark,
@@ -39189,7 +39189,7 @@
/area/station/hallway/primary/central)
"nwa" = (
/obj/structure/closet/wardrobe/pjs,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/south,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -63978,7 +63978,7 @@
/obj/item/clothing/under/misc/assistantformal,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/south,
/turf/open/floor/iron/dark,
@@ -64974,7 +64974,7 @@
"wiF" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"wiS" = (
@@ -66524,7 +66524,7 @@
/area/station/maintenance/department/engine)
"wLx" = (
/obj/structure/closet/wardrobe/mixed,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -68517,7 +68517,7 @@
"xvd" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"xvf" = (
@@ -69880,7 +69880,7 @@
/area/station/medical/medbay/central)
"xUh" = (
/obj/structure/closet/wardrobe/pjs,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/dorms)
File diff suppressed because it is too large Load Diff
+31 -31
View File
@@ -2131,7 +2131,7 @@
},
/obj/structure/closet/emcloset,
/obj/machinery/camera/autoname/directional/west,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/port)
"apU" = (
@@ -3582,7 +3582,7 @@
"aBG" = (
/obj/effect/turf_decal/delivery,
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/sign/warning/vacuum/directional/west,
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/dark,
@@ -7018,7 +7018,7 @@
"bcd" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/small,
/area/station/hallway/primary/port)
"bcf" = (
@@ -17651,7 +17651,7 @@
},
/obj/item/radio/intercom/directional/south,
/obj/machinery/camera/autoname/directional/south,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness)
"cGz" = (
@@ -20759,7 +20759,7 @@
dir = 5
},
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/camera/autoname/directional/east,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/port)
@@ -42387,7 +42387,7 @@
desc = "A very fashionable pair of flip flops.";
name = "flip-flops"
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/white/small,
/area/station/commons/toilet/shower)
@@ -49698,7 +49698,7 @@
/obj/effect/turf_decal/trimline/dark_red/mid_joiner{
dir = 8
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness)
@@ -51655,7 +51655,7 @@
dir = 4
},
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"hFV" = (
@@ -51915,7 +51915,7 @@
/obj/machinery/camera/autoname/directional/south{
dir = 5
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
"hIe" = (
@@ -63750,7 +63750,7 @@
"jwy" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/south,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/dark/small,
@@ -65731,7 +65731,7 @@
/obj/structure/sign/warning/vacuum/external/directional/south,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/bot_white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"jKq" = (
@@ -66022,7 +66022,7 @@
},
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/structure/sign/poster/random/directional/west,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/wood/large,
/area/station/commons/dorms)
"jMG" = (
@@ -67436,7 +67436,7 @@
/obj/structure/closet/wardrobe/white,
/obj/effect/turf_decal/trimline/white,
/obj/item/clothing/gloves/color/white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
"jYb" = (
@@ -74151,7 +74151,7 @@
/obj/effect/turf_decal/delivery,
/obj/structure/closet/emcloset,
/obj/structure/sign/poster/random/directional/north,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
"kTG" = (
@@ -85345,7 +85345,7 @@
dir = 8
},
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"mIB" = (
@@ -91009,7 +91009,7 @@
/obj/structure/sign/departments/medbay/alt/directional/north,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/siding/thinplating_new/light/corner,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white,
/area/station/hallway/primary/fore)
"nAX" = (
@@ -91103,7 +91103,7 @@
/obj/structure/sign/warning/vacuum/external/directional/south,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot_white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"nBv" = (
@@ -92582,7 +92582,7 @@
},
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/structure/sign/poster/random/directional/west,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/firealarm/directional/south,
/turf/open/floor/wood/large,
/area/station/commons/dorms)
@@ -92942,7 +92942,7 @@
/obj/item/clothing/under/misc/assistantformal,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
@@ -94958,7 +94958,7 @@
/obj/effect/turf_decal/trimline/dark,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/gloves/color/black,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/airalarm/directional/south,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
@@ -100601,7 +100601,7 @@
/obj/structure/sign/warning/vacuum/directional/north,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/bot_white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"oTH" = (
@@ -107792,7 +107792,7 @@
dir = 8
},
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/wood/large,
/area/station/commons/dorms)
"pTC" = (
@@ -114600,7 +114600,7 @@
},
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/small,
/area/station/commons/toilet/shower)
"qWF" = (
@@ -123248,7 +123248,7 @@
dir = 4
},
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"skV" = (
@@ -123594,7 +123594,7 @@
/obj/effect/turf_decal/trimline/dark_red,
/obj/machinery/light/small/directional/east,
/obj/effect/spawner/random/clothing/gloves,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
"soc" = (
@@ -127203,7 +127203,7 @@
/obj/structure/sign/warning/vacuum/directional/north,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot_white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"sRX" = (
@@ -134637,7 +134637,7 @@
dir = 8
},
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"tUa" = (
@@ -138738,7 +138738,7 @@
"uCd" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/south,
/turf/open/floor/iron/dark/small,
/area/station/hallway/secondary/command)
@@ -139333,7 +139333,7 @@
/area/station/hallway/primary/port)
"uHw" = (
/obj/structure/closet,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/newscaster/directional/north,
/obj/effect/turf_decal/tile/dark_blue/opposingcorners{
dir = 1
@@ -146936,7 +146936,7 @@
/obj/effect/turf_decal/siding/thinplating_new/light/corner{
dir = 8
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white,
/area/station/hallway/primary/fore)
"vMd" = (
@@ -153186,7 +153186,7 @@
"wLa" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/small,
/area/station/hallway/primary/port)
"wLd" = (
+15 -15
View File
@@ -546,7 +546,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/station/escapepodbay)
@@ -1107,7 +1107,7 @@
dir = 4
},
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/escapepodbay)
@@ -7025,7 +7025,7 @@
/area/station/service/kitchen/coldroom)
"btC" = (
/obj/structure/closet/wardrobe/green,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
@@ -8130,7 +8130,7 @@
dir = 6
},
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/service)
"bNa" = (
@@ -12687,7 +12687,7 @@
/area/station/maintenance/tram/left)
"dml" = (
/obj/structure/closet/lasertag/red,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/east,
/obj/effect/turf_decal/tile/red/full,
/turf/open/floor/iron/dark/smooth_large,
@@ -15788,7 +15788,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 5
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/tram/right)
@@ -19625,7 +19625,7 @@
/area/station/maintenance/solars/port)
"fNR" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/east,
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/dark/smooth_large,
@@ -24166,7 +24166,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 9
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit)
@@ -38960,7 +38960,7 @@
dir = 10
},
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/service)
"mya" = (
@@ -39775,7 +39775,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"mMn" = (
@@ -41942,7 +41942,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"nBy" = (
@@ -55674,7 +55674,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 9
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/tram/right)
@@ -63574,7 +63574,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 10
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit)
@@ -68023,7 +68023,7 @@
dir = 6
},
/obj/structure/closet/toolcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/machinery/camera/directional/east{
c_tag = "Civilian - Aux Tool Storage"
},
@@ -71954,7 +71954,7 @@
dir = 4
},
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/camera/autoname/directional/east,
/turf/open/floor/iron/dark,
+20 -20
View File
@@ -2840,7 +2840,7 @@
/area/station/hallway/primary/central)
"aUB" = (
/obj/structure/closet/wardrobe/black,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -8725,7 +8725,7 @@
"des" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"deY" = (
@@ -12657,7 +12657,7 @@
/area/station/maintenance/solars/port/aft)
"euF" = (
/obj/structure/closet/wardrobe/white,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -13267,7 +13267,7 @@
},
/obj/structure/closet/emcloset,
/obj/structure/window/spawner/directional/east,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"eEG" = (
@@ -14884,7 +14884,7 @@
/area/space/nearstation)
"flH" = (
/obj/structure/closet/boxinggloves,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness/recreation)
"flN" = (
@@ -17445,7 +17445,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/primary/central)
"gdf" = (
@@ -18068,7 +18068,7 @@
"gpR" = (
/obj/machinery/light/dim/directional/south,
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/textured,
/area/station/hallway/primary/central)
"gpV" = (
@@ -21434,7 +21434,7 @@
/obj/structure/closet/masks,
/obj/structure/window/spawner/directional/west,
/obj/machinery/light/directional/north,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"huj" = (
@@ -26196,7 +26196,7 @@
/area/station/science/xenobiology)
"jgB" = (
/obj/structure/closet/emcloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/textured,
/area/station/hallway/primary/central)
@@ -39900,7 +39900,7 @@
/area/station/science/xenobiology)
"nLb" = (
/obj/structure/closet/wardrobe/grey,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -42704,7 +42704,7 @@
/obj/structure/window/spawner/directional/west,
/obj/structure/window/spawner/directional/east,
/obj/machinery/camera/autoname/directional/north,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"oOe" = (
@@ -45691,7 +45691,7 @@
dir = 1
},
/obj/machinery/camera/autoname/directional/south,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/primary/central)
"pMG" = (
@@ -54974,7 +54974,7 @@
/area/station/science/genetics)
"sPi" = (
/obj/structure/closet/firecloset,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/textured,
/area/station/hallway/primary/central)
"sPv" = (
@@ -55504,7 +55504,7 @@
/area/station/service/bar)
"sYu" = (
/obj/structure/closet/crate/wooden/toy,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners,
/obj/effect/turf_decal/tile/red/opposingcorners{
dir = 1
@@ -57440,7 +57440,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/primary/central)
"tGR" = (
@@ -58661,7 +58661,7 @@
/obj/structure/closet/lasertag/red,
/obj/structure/window/spawner/directional/east,
/obj/effect/turf_decal/tile/red/fourcorners,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"ubV" = (
@@ -62687,7 +62687,7 @@
/area/station/commons/locker)
"vAE" = (
/obj/structure/closet/wardrobe/green,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -62740,7 +62740,7 @@
dir = 1
},
/obj/structure/closet/boxinggloves,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"vCy" = (
@@ -65860,7 +65860,7 @@
/area/station/science/lobby)
"wED" = (
/obj/structure/closet/masks,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness/recreation)
"wEF" = (
@@ -70128,7 +70128,7 @@
/area/station/ai_monitored/turret_protected/aisat/foyer)
"yeS" = (
/obj/structure/closet/crate/grave,
/obj/effect/landmark/start/hangover/closet,
/obj/effect/landmark/start/hangover,
/turf/open/misc/asteroid,
/area/station/asteroid)
"yfl" = (
+35
View File
@@ -21,6 +21,15 @@
#define CARNIVORY_POTENCY_MIN 30
/// Fungle megabolism plants have a min yield of 1.
#define FUNGAL_METAB_YIELD_MIN 1
/// Semiaquatic plants gets 50% more weeds in soil.
#define SEMIAQUATIC_SOIL_WEED_MALUS 1.5
/// Soil loving plants get worse yield when grown in a medium that isn't soil.
#define SOIL_LOVER_HYDRO_YIELD_MALUS 0.7
/// Upper bound of produce size mod for soil lowers grown without soil.
#define SOIL_LOVER_HYDRO_POTENCY_MAX 0.8
/// Lower bound of produce size mod for soil lowers grown without soil
#define SOIL_LOVER_HYDRO_POTENCY_MIN 0.5
/// -- Hydroponics tray defines. --
/// Base amount of nutrients a tray can old.
@@ -91,3 +100,29 @@
/// Used as a baseline plant rarity for more uncommon plants, usually requiring mutation
#define PLANT_MODERATELY_RARE 20
/// How much water drain is reduced for trays with the SUPERWATER modifier such as superabsorbent hydrogel beads.
#define SUPER_WATER_MODIFIER 0.5
// How much faster our mushrooms mature on a good mushroom growing soil such as korta coir.
#define FAST_MUSH_MODIFIER 1.4
// How many grafts we harvest from one plant if planted in a tray with the MULTI_GRAFT flag.
#define MULTI_GRAFT_MAX_COUNT 3
/// TRAY BITFLAGS
/// For watery trays, capable of growing aquatic plants.
#define HYDROPONIC (1 << 0)
/// For soil type trays that provide structure for soil loving plants.
#define SOIL (1 << 1)
/// Allows you to take up to 3 grafts from the same plant.
#define MULTIGRAFT (1 << 2)
/// Allows you to plant grafts into this tray to propagate them vegetativley.
#define GRAFT_MEDIUM (1 << 3)
/// Musrooms mature faster in this type of tray.
#define FAST_MUSHROOMS (1 << 4)
/// Extra slimy worms can be created by composting greens in this soil.
#define WORM_HABITAT (1 << 5)
/// Water drains at a slower rate from this soil.
#define SUPERWATER (1 << 6)
/// If this tray runs out of nutrients, add a little nitrogen from the breakdown of natural fertilizers or nitrogen fixating bacteria.
#define SLOW_RELEASE (1 << 7)
+1
View File
@@ -135,6 +135,7 @@ GLOBAL_LIST_EMPTY(deathsquadspawn)
GLOBAL_LIST_EMPTY(emergencyresponseteamspawn)
GLOBAL_LIST_EMPTY(ruin_landmarks)
GLOBAL_LIST_EMPTY(bar_areas)
GLOBAL_LIST_EMPTY(mining_center) // For determining vent size ranked lists, epicenters for comparison goes here.
/// List of all the maps that have been cached for /proc/load_map
GLOBAL_LIST_EMPTY(cached_maps)
+4 -3
View File
@@ -755,10 +755,11 @@ SUBSYSTEM_DEF(job)
return joining_mob
/obj/structure/chair/JoinPlayerHere(mob/joining_mob, buckle)
. = ..()
var/mob/created_joining_mob = ..()
// Placing a mob in a chair will attempt to buckle it, or else fall back to default.
if(buckle && isliving(joining_mob))
buckle_mob(joining_mob, FALSE, FALSE)
if(buckle && isliving(created_joining_mob))
buckle_mob(created_joining_mob, FALSE, FALSE)
return created_joining_mob
/datum/controller/subsystem/job/proc/send_to_late_join(mob/M, buckle = TRUE)
var/atom/destination
@@ -22,12 +22,49 @@ SUBSYSTEM_DEF(ore_generation)
var/list/ore_vent_minerals = list()
/datum/controller/subsystem/ore_generation/Initialize()
/// First, lets sort each ore_vent here based on their distance to the landmark, then we'll assign sizes.
var/list/sort_vents = list()
for(var/obj/structure/ore_vent/vent as anything in possible_vents)
var/obj/landmark_anchor //We need to find the mining epicenter to gather distance from.
for(var/obj/possible_landmark as anything in GLOB.mining_center) // have to check multiple due to icebox
if(possible_landmark.z == vent.z)
landmark_anchor = possible_landmark
break
if(!landmark_anchor) //We're missing a mining epicenter landmark, but it's not crash-worthy.
vent.vent_size_setup(random = TRUE, force_size = null, map_loading = TRUE)
continue
sort_vents.Insert(length(sort_vents), vent)
sort_vents[vent] = get_dist(get_turf(vent),get_turf(landmark_anchor))
sortTim(sort_vents, GLOBAL_PROC_REF(cmp_numeric_asc), associative = TRUE) // Should sort list from closest to farthest.
possible_vents = sort_vents // Now we can work with the main list
var/cutoff = round((length(possible_vents) / 3))
var/vent_size_level = SMALL_VENT_TYPE
for(var/obj/structure/ore_vent/vent as anything in possible_vents)
vent.vent_size_setup(random = FALSE, force_size = vent_size_level, map_loading = TRUE)
cutoff--
if(cutoff > 0 || vent_size_level == LARGE_VENT_TYPE)
continue
cutoff = round((length(possible_vents) / 3))
switch(vent_size_level)
if(SMALL_VENT_TYPE)
vent_size_level = MEDIUM_VENT_TYPE
if(MEDIUM_VENT_TYPE)
vent_size_level = LARGE_VENT_TYPE
//Finally, we're going to round robin through the list of ore vents and assign a mineral to them until complete.
//Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete.
for(var/obj/structure/ore_vent/vent as anything in possible_vents)
if(vent.unique_vent)
continue //Ya'll already got your minerals.
vent.generate_mineral_breakdown(map_loading = TRUE)
/// Handles roundstart logging
logger.Log(
LOG_CATEGORY_CAVE_GENERATION,
@@ -19,6 +19,9 @@ PROCESSING_SUBSYSTEM_DEF(personalities)
/// Initialized personality singletons
/datum/controller/subsystem/processing/personalities/proc/init_personalities()
if(length(personalities_by_type))
return // Already initialized
personalities_by_type = list()
personalities_by_key = list()
incompatibilities_by_group = list()
@@ -41,11 +41,13 @@
*
* Returns the given overlay, which can be deleted to stop displaying it. Will return null if no bodypart matching the overlay's attached_body_zone field can be found.
*/
/mob/living/carbon/human/proc/give_emote_overlay(overlay_typepath)
var/datum/bodypart_overlay/simple/emote/overlay = new overlay_typepath()
var/obj/item/bodypart/bodypart = src.get_bodypart(overlay.attached_body_zone)
/mob/living/carbon/human/proc/give_emote_overlay(datum/bodypart_overlay/simple/emote/overlay_typepath)
var/obj/item/bodypart/bodypart = get_bodypart(overlay_typepath::attached_body_zone)
if(!bodypart)
return null
if(locate(overlay_typepath) in bodypart.bodypart_overlays)
return null
var/datum/bodypart_overlay/simple/emote/overlay = new overlay_typepath()
bodypart.add_bodypart_overlay(overlay)
return overlay
@@ -720,7 +720,7 @@
continue
//now we can merge since we are done with it
for(var/obj/item/stack/item_stack in target)
if(item_stack == new_stack || new_stack.type != type_to_retrieve) //don't merge with self or different type
if(item_stack == new_stack || item_stack.type != type_to_retrieve) //don't merge with self or different type
continue
//speed merge
var/merge_amount = min(item_stack.amount, new_stack.max_amount - new_stack.get_amount())
@@ -40,8 +40,6 @@
targets -= movable
moving_targets -= movable
UnregisterSignal(movable, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, COMSIG_QDELETING))
if(!length(moving_targets) && length(targets))
call_check()
return ..()
/datum/component/shuttle_move_deferred_checks/proc/call_check()
+56 -6
View File
@@ -68,10 +68,12 @@
if (!owner)
return
ADD_TRAIT(grant_to, TRAIT_MIND_READER, GENETIC_MUTATION)
RegisterSignal(grant_to, COMSIG_MOB_EXAMINATE, PROC_REF(on_examining))
/datum/action/cooldown/spell/pointed/mindread/Remove(mob/remove_from)
. = ..()
REMOVE_TRAIT(remove_from, TRAIT_MIND_READER, GENETIC_MUTATION)
UnregisterSignal(remove_from, COMSIG_MOB_EXAMINATE)
/datum/action/cooldown/spell/pointed/mindread/is_valid_target(atom/cast_on)
if(!isliving(cast_on))
@@ -83,12 +85,15 @@
if(living_cast_on.stat == DEAD)
to_chat(owner, span_warning("[cast_on] is dead!"))
return FALSE
if(living_cast_on.mob_biotypes & MOB_ROBOTIC)
to_chat(owner, span_warning("[cast_on] is robotic, you can't read [cast_on.p_their()] mind!"))
return FALSE
return TRUE
/datum/action/cooldown/spell/pointed/mindread/cast(mob/living/cast_on)
. = ..()
if(cast_on.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0))
if(cast_on.can_block_magic(antimagic_flags, charge_cost = 0))
to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \
you are stopped by a mental blockage. It seems you've been foiled."))
return
@@ -102,21 +107,66 @@
you feel the overwhelming emptiness within. A truly evil being. \
[HAS_TRAIT(owner, TRAIT_EVIL) ? "It's nice to find someone who is like-minded." : "What is wrong with this person?"]"))
to_chat(owner, span_boldnotice("You plunge into [cast_on]'s mind..."))
var/list/log_info = list()
var/list/discovered_info = list("<i>You plunge into [cast_on]'s mind and discover...</i>")
if(prob(20))
// chance to alert the read-ee
to_chat(cast_on, span_danger("You feel something foreign enter your mind."))
log_info += "Target alerted!"
var/list/recent_speech = cast_on.copy_recent_speech(copy_amount = 3, line_chance = 50)
if(length(recent_speech))
to_chat(owner, span_boldnotice("You catch some drifting memories of their past conversations..."))
discovered_info += "...Drifting memories of past conversations:"
var/list/speech_block = list()
for(var/spoken_memory in recent_speech)
to_chat(owner, span_notice("[spoken_memory]"))
speech_block += "&emsp;\"[spoken_memory]\"..."
log_info += "Recent speech: \"[spoken_memory]\""
discovered_info += jointext(speech_block, "<br>")
if(iscarbon(cast_on))
var/mob/living/carbon/carbon_cast_on = cast_on
to_chat(owner, span_boldnotice("You find that their intent is to [carbon_cast_on.combat_mode ? "harm" : "help"]..."))
to_chat(owner, span_boldnotice("You uncover that [carbon_cast_on.p_their()] true identity is [carbon_cast_on.mind.name]."))
discovered_info += "...Intent to <b>[carbon_cast_on.combat_mode ? "harm" : "help"]</b>."
discovered_info += "...True identity of <b>[carbon_cast_on.mind.name]</b>."
log_info += "Intent: \"[carbon_cast_on.combat_mode ? "harm" : "help"]\""
log_info += "Identity: \"[carbon_cast_on.mind.name]\""
to_chat(owner, boxed_message(span_notice(jointext(discovered_info, "<br>"))))
log_combat(owner, cast_on, "mind read (cast intentionally)", null, "info: [english_list(log_info, and_text = ", ")]")
/datum/action/cooldown/spell/pointed/mindread/proc/on_examining(mob/examiner, atom/examining)
SIGNAL_HANDLER
if(!isliving(examining) || examiner == examining)
return
INVOKE_ASYNC(src, PROC_REF(read_mind), examiner, examining)
/datum/action/cooldown/spell/pointed/mindread/proc/read_mind(mob/living/examiner, mob/living/examined)
if(examined.stat >= UNCONSCIOUS || isnull(examined.mind) || (examined.mob_biotypes & MOB_ROBOTIC))
return
var/antimagic = examined.can_block_magic(antimagic_flags, charge_cost = 0)
var/read_text = ""
if(!antimagic)
read_text = examined.get_typing_text()
if(!read_text)
return
sleep(0.5 SECONDS) // small pause so it comes after all examine text and effects
if(QDELETED(examiner))
return
if(antimagic)
to_chat(examiner, boxed_message(span_warning("You attempt to analyze [examined]'s current thoughts, but fail to penetrate [examined.p_their()] mind - It seems you've been foiled.")))
return
var/list/log_info = list()
if(prob(10))
to_chat(examined, span_danger("You feel something foreign enter your mind."))
log_info += "Target alerted!"
to_chat(examiner, boxed_message(span_notice("<i>You analyze [examined]'s current thoughts...</i><br>&emsp;\"[read_text]\"...")))
log_info += "Current thought: \"[read_text]\""
log_combat(examiner, examined, "mind read (triggered on examine)", null, "info: [english_list(log_info, and_text = ", ")]")
/datum/mutation/mindreader/New(datum/mutation/copymut)
..()
@@ -20,6 +20,9 @@
if(!LAZYLEN(input))
return null
if(!SSpersonalities.initialized)
SSpersonalities.init_personalities()
var/list/input_sanitized
for(var/personality_key in input)
var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key]
@@ -31,7 +31,7 @@
if(!istype(new_area, /area/station/service))
return TRUE
// Service workers don't slack in service
if(who.mind?.assigned_role.departments_bitflags & DEPARTMENT_SERVICE)
if(who.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SERVICE)
return FALSE
return TRUE
@@ -42,7 +42,7 @@
desc = "I don't really feel like working today."
pos_gameplay_desc = "Happy in the bar or recreation areas"
mood_event_type = /datum/mood_event/slacking_off_lazy
groups = list(PERSONALITY_GROUP_INTERACTION, PERSONALITY_GROUP_WORK, PERSONALITY_GROUP_ATHLETICS)
groups = list(PERSONALITY_GROUP_RECREATION, PERSONALITY_GROUP_WORK, PERSONALITY_GROUP_ATHLETICS)
/datum/personality/slacking/diligent
savefile_key = "diligent"
@@ -51,7 +51,7 @@
pos_gameplay_desc = "Happy when in their department"
neg_gameplay_desc = "Unhappy when slacking off in the bar or recreation areas"
mood_event_type = /datum/mood_event/slacking_off_diligent
groups = list(PERSONALITY_GROUP_INTERACTION)
groups = list(PERSONALITY_GROUP_RECREATION)
/datum/personality/slacking/diligent/apply_to_mob(mob/living/who)
. = ..()
+5 -11
View File
@@ -566,20 +566,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
return
/obj/effect/landmark/start/hangover/JoinPlayerHere(mob/joining_mob, buckle)
. = ..()
make_hungover(joining_mob)
/obj/effect/landmark/start/hangover/closet
name = "hangover spawn closet"
icon_state = "hangover_spawn_closet"
/obj/effect/landmark/start/hangover/closet/JoinPlayerHere(mob/joining_mob, buckle)
. = ..()
var/mob/created_joining_mob = ..()
make_hungover(created_joining_mob)
for(var/obj/structure/closet/closet in get_turf(src))
if(closet.opened)
continue
joining_mob.forceMove(closet)
return
created_joining_mob.forceMove(closet)
return created_joining_mob
return created_joining_mob
//Landmark that creates destinations for the navigate verb to path to
/obj/effect/landmark/navigate_destination
@@ -262,16 +262,16 @@
if(graft)
last_scan_data["graft_data"] = list(
"name" = graft.parent_name,
"name" = graft.plant_dna.name,
"icon" = graft.icon,
"icon_state" = graft.icon_state,
"yield" = graft.yield,
"production" = graft.production,
"lifespan" = graft.lifespan,
"endurance" = graft.endurance,
"weed_rate" = graft.weed_rate,
"weed_chance" = graft.weed_chance,
"graft_gene" = graft.stored_trait.type,
"yield" = graft.plant_dna.yield,
"production" = graft.plant_dna.production,
"lifespan" = graft.plant_dna.lifespan,
"endurance" = graft.plant_dna.endurance,
"weed_rate" = graft.plant_dna.weed_rate,
"weed_chance" = graft.plant_dna.weed_chance,
"graft_gene" = graft.plant_dna.graft_gene.type
)
if(user)
@@ -496,6 +496,42 @@
log_game("Vent-spawned mob [key_name_and_tag(killed)] was killed")
SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, killed.type)
/**
* The part of initialization and the ore_generation subsystem's setup that assigns the size of an ore_vent and it's boulders.
* @param random: Used for random sized boulders, and the standard (pre 9-6-2025) behavior.
* @param force_size: An override we use for map_generation, when we know what size boulder we need from this ore vent already. Use the standard ore_vent size defines.
*/
/obj/structure/ore_vent/proc/vent_size_setup(random = FALSE, force_size, map_loading)
var/string_boulder_size
if(force_size)
string_boulder_size = force_size
else if(random)
string_boulder_size = pick_weight(ore_vent_options)
name = "[string_boulder_size] ore vent"
switch(string_boulder_size)
if(LARGE_VENT_TYPE)
boulder_size = BOULDER_SIZE_LARGE
wave_timer = WAVE_DURATION_LARGE
if(map_loading)
GLOB.ore_vent_sizes["large"] += 1
if(MEDIUM_VENT_TYPE)
boulder_size = BOULDER_SIZE_MEDIUM
wave_timer = WAVE_DURATION_MEDIUM
if(map_loading)
GLOB.ore_vent_sizes["medium"] += 1
if(SMALL_VENT_TYPE)
boulder_size = BOULDER_SIZE_SMALL
wave_timer = WAVE_DURATION_SMALL
if(map_loading)
GLOB.ore_vent_sizes["small"] += 1
else
boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value
wave_timer = WAVE_DURATION_SMALL
name = initial(name)
//comes with the station, and is already tapped.
/obj/structure/ore_vent/starter_resources
name = "active ore vent"
@@ -510,6 +546,7 @@
)
/obj/structure/ore_vent/random
// Todo: determine if we need a boulder_size default thats unique from the override performed in vent_size_setup.
/obj/structure/ore_vent/random/Initialize(mapload)
. = ..()
@@ -517,29 +554,8 @@
generate_mineral_breakdown(map_loading = mapload) //Default to random mineral breakdowns, unless this is a unique vent or we're still setting up default vent distribution.
generate_description()
artifact_chance = rand(0, MAX_ARTIFACT_ROLL_CHANCE)
var/string_boulder_size = pick_weight(ore_vent_options)
name = "[string_boulder_size] ore vent"
switch(string_boulder_size)
if(LARGE_VENT_TYPE)
boulder_size = BOULDER_SIZE_LARGE
wave_timer = WAVE_DURATION_LARGE
if(mapload)
GLOB.ore_vent_sizes["large"] += 1
if(MEDIUM_VENT_TYPE)
boulder_size = BOULDER_SIZE_MEDIUM
wave_timer = WAVE_DURATION_MEDIUM
if(mapload)
GLOB.ore_vent_sizes["medium"] += 1
if(SMALL_VENT_TYPE)
boulder_size = BOULDER_SIZE_SMALL
wave_timer = WAVE_DURATION_SMALL
if(mapload)
GLOB.ore_vent_sizes["small"] += 1
else
boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value
wave_timer = WAVE_DURATION_SMALL
name = initial(name)
if(!mapload)
vent_size_setup(random = TRUE) // We only do this here specific to random distribution ore vents, and within mapload we handle this manually within SSore_generation.
/obj/structure/ore_vent/random/icebox //The one that shows up on the top level of icebox
@@ -642,6 +658,20 @@
/mob/living/simple_animal/hostile/megafauna/colossus,
)
/obj/effect/landmark/mining_center
name = "Mining Epicenter"
icon_state = "mining_epicenter"
/obj/effect/landmark/mining_center/Initialize(mapload)
..()
for(var/obj/mining_mark as anything in GLOB.mining_center)
if(src.z == mining_mark.z)
CRASH("\The [src] spawned on Z level [z] already exists! Maps should only have at most one mining epicenter for normal ore generation.")
GLOB.mining_center += loc
return INITIALIZE_HINT_QDEL
#undef MAX_ARTIFACT_ROLL_CHANCE
#undef MINERAL_TYPE_OPTIONS_RANDOM
#undef OVERLAY_OFFSET_START
@@ -20,6 +20,7 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pixel_y = 22
appearance_flags = KEEP_TOGETHER
vis_flags = VIS_INHERIT_PLANE
/// The current occupant being presented
var/mob/living/occupant
+49 -2
View File
@@ -4,6 +4,7 @@
/datum/supply_pack/organic/hydroponics
access_view = ACCESS_HYDROPONICS
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/beekeeping_suits
name = "Beekeeper Suit Crate"
@@ -125,7 +126,7 @@
crate_type = /obj/structure/closet/crate/secure
discountable = SUPPLY_PACK_RARE_DISCOUNTABLE
/datum/supply_pack/organic/hydroponics
/datum/supply_pack/organic/hydroponics/supplies
name = "Hydroponics Crate"
desc = "Supplies for growing a great garden! Contains two bottles of ammonia, \
two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, \
@@ -140,7 +141,6 @@
/obj/item/clothing/suit/apron,
)
crate_name = "hydroponics crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/hydrotank
name = "Hydroponics Backpack Crate"
@@ -396,3 +396,50 @@
contains = list(/obj/structure/reagent_dispensers/servingdish)
crate_name = "nutraslop serving dish crate"
/datum/supply_pack/organic/hydroponics/soil_normal
name = "NT-Ag Potting Soil Crate"
desc = "A crate containing sacks of regular, commercial soil."
cost = CARGO_CRATE_VALUE * 2
crate_name = "potting soil crate"
contains = list(
/obj/item/soil_sack = 5,
)
/datum/supply_pack/organic/hydroponics/soil_vermaculite
name = "NT-Ag Vermaculite Crate"
desc = "A crate containing sacks of NT-Ag vermaculite. Your favorite expanded mineral!"
cost = CARGO_CRATE_VALUE * 2
crate_name = "vermaculite crate"
contains = list(
/obj/item/soil_sack/vermaculite = 3,
)
/datum/supply_pack/organic/hydroponics/soil_gel
name = "NT-Ag Hydrogel Beads Crate"
desc = "A crate containing sacks of prehydrated superabsorbent gel beads. Everyone likes some nice beads."
cost = CARGO_CRATE_VALUE * 2
crate_name = "hydrogel beads crate"
contains = list(
/obj/item/soil_sack/gel = 3,
)
/datum/supply_pack/organic/hydroponics/soil_coir
name = "NT-Ag Korta Coir Crate"
desc = "A crate containing sacks of korta root coir. Good for starting a mushroom farm!"
cost = CARGO_CRATE_VALUE * 3
crate_name = "korta coir crate"
contains = list(
/obj/item/soil_sack/coir = 3,
)
/datum/supply_pack/organic/hydroponics/soil_worm
name = "NT-Ag Worm Castings Crate"
desc = "A crate containing sacks of vermicompost. Worms not included! Or?.."
cost = CARGO_CRATE_VALUE * 4
crate_name = "worm castings crate"
contains = list(
/obj/item/soil_sack/worm = 3,
)
+4 -3
View File
@@ -167,9 +167,10 @@
/obj/item/clothing/under/equipped(mob/living/user, slot)
..()
if((slot & ITEM_SLOT_ICLOTHING) && freshly_laundered)
freshly_laundered = FALSE
user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry)
if(slot & ITEM_SLOT_ICLOTHING)
if(freshly_laundered)
freshly_laundered = FALSE
user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry)
update_wearer_status()
/obj/item/clothing/under/dropped(mob/living/user)
+16 -29
View File
@@ -10,39 +10,30 @@
worn_icon_state = "graft"
attack_verb_continuous = list("plants", "vegitizes", "crops", "reaps", "farms")
attack_verb_simple = list("plant", "vegitize", "crop", "reap", "farm")
///The stored trait taken from the parent plant. Defaults to perenial growth.
var/datum/plant_gene/stored_trait
///Determines the appearance of the graft. Rudimentary right now so it just picks randomly.
var/graft_appearance
/// The name of the plant this was taken from.
var/parent_name = ""
///The lifespan stat of the parent seed when the graft was taken.
var/lifespan
///The endurance stat of the parent seed when the graft was taken.
var/endurance
///The production stat of the parent seed when the graft was taken.
var/production
///The weed_rate stat of the parent seed when the graft was taken.
var/weed_rate
///The weed_chance stat of the parent seed when the graft was taken.
var/weed_chance
///The yield stat of the parent seed when the graft was taken.
var/yield
/// Our internal seed used to modify stats or genes by grafting or passed as our seed when propagating vegetatively,
var/obj/item/seeds/plant_dna = /obj/item/seeds/apple
/obj/item/graft/Initialize(mapload, datum/plant_gene/trait/trait_path)
/obj/item/graft/Initialize(mapload, obj/item/seeds/mother_plant)
. = ..()
//Default gene is repeated harvest.
if(trait_path)
stored_trait = new trait_path
else
stored_trait = new /datum/plant_gene/trait/repeated_harvest
//create our "plant dna" internal seed from the plant the cuttings are taken from.
if(mother_plant)
if(ispath(mother_plant))
plant_dna = new mother_plant()
if(!istype(plant_dna))
CRASH("Tried to create a graft using a non-seed path.")
else if(istype(mother_plant))
plant_dna = mother_plant.Copy()
else
CRASH("Tried to create a graft using a non-seed reference.")
icon_state = pick(
10 ; "graft_plant" , \
5 ; "graft_flower" , \
4 ; "graft_mushroom" , \
1 ; "graft_doom" )
name += " ([plant_dna.plantname])"
var/static/list/hovering_item_typechecks = list(
/obj/item/plant_analyzer = list(
SCREENTIP_CONTEXT_LMB = "Scan graft",
@@ -50,7 +41,3 @@
)
AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
/obj/item/graft/Destroy()
QDEL_NULL(stored_trait)
return ..()
@@ -61,6 +61,8 @@
product = /obj/item/food/grown/rice
mutatelist = null
growthstages = 3
genes = list(/datum/plant_gene/trait/semiaquatic)
/obj/item/food/grown/rice
seed = /obj/item/seeds/wheat/rice
+1 -1
View File
@@ -14,7 +14,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_grow = "potato-grow"
icon_dead = "potato-dead"
genes = list(/datum/plant_gene/trait/battery, /datum/plant_gene/trait/one_bite)
genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/battery, /datum/plant_gene/trait/one_bite)
mutatelist = list(/obj/item/seeds/potato/sweet)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
graft_gene = /datum/plant_gene/trait/battery
+4 -2
View File
@@ -14,6 +14,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
mutatelist = list(/obj/item/seeds/carrot/parsnip, /obj/item/seeds/carrot/cahnroot)
reagents_add = list(/datum/reagent/medicine/oculine = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05)
genes = list(/datum/plant_gene/trait/soil_lover)
/obj/item/food/grown/carrot
seed = /obj/item/seeds/carrot
@@ -91,7 +92,7 @@
species = "cahn'root"
plantname = "Cahn'root"
product = /obj/item/food/grown/cahnroot
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/plant_type/weed_hardy)
endurance = 50
instability = 10
icon_dead = "cahn'root-dead"
@@ -142,6 +143,7 @@
instability = 10
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_dead = "whitebeet-dead"
genes = list(/datum/plant_gene/trait/soil_lover)
mutatelist = list(/obj/item/seeds/redbeet)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/sugar = 0.2, /datum/reagent/consumable/nutriment = 0.05)
@@ -168,7 +170,7 @@
instability = 15
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_dead = "whitebeet-dead"
genes = list(/datum/plant_gene/trait/maxchem)
genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/maxchem)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05)
graft_gene = /datum/plant_gene/trait/maxchem
+74 -89
View File
@@ -61,6 +61,11 @@
var/light_level = 0
///our snail overlay, if any
var/obj/effect/overlay/vis_effect/snail/our_snail
///Flags to indicate special tray type behaviours.
var/tray_flags = HYDROPONIC
///How many extra px to offset the plant sprite on the y axis, gets passed to the seed and added to the seeds offset
var/plant_offset_y = 0
/obj/machinery/hydroponics/Initialize(mapload)
//ALRIGHT YOU DEGENERATES. YOU HAD REAGENT HOLDERS FOR AT LEAST 4 YEARS AND NONE OF YOU MADE HYDROPONICS TRAYS HOLD NUTRIENT CHEMS INSTEAD OF USING "Points".
@@ -344,11 +349,11 @@
if(world.time > (lastcycle + cycledelay))
lastcycle = world.time
if(myseed && plant_status != HYDROTRAY_PLANT_DEAD)
// Advance age
age++
var/is_fungus = myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)
// Advance age, if planted in mushroom friendly soil and we are a mushroom we mature 40% faster.
age += 1 * (is_fungus && (tray_flags & FAST_MUSHROOMS)) ? FAST_MUSH_MODIFIER : 1
if(age < myseed.maturation)
lastproduce = age
needs_update = TRUE
@@ -360,22 +365,25 @@
else
reagents.remove_all(nutridrain)
// Lack of nutrients hurts non-weeds
if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
adjust_plant_health(-rand(1,3))
if(reagents.total_volume <= 0)
//The microbiome slowly create nutrients by fixing nitrogen from the air or metabolizing organic matter.
if(tray_flags & SLOW_RELEASE)
reagents.add_reagent(/datum/reagent/nitrogen, 1) // In reality the nitrogen is in the form of ammonia or nitrates but this might be too OP and boring.
// Lack of nutrients hurts non-weeds
else if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
adjust_plant_health(-rand(1,3))
//Photosynthesis/////////////////////////////////////////////////////////
// Lack of light hurts non-mushrooms
var/is_fungus = myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)
if(light_level < (is_fungus ? 0.2 : 0.4))
adjust_plant_health((is_fungus ? -1 : -2) / rating)
//Water//////////////////////////////////////////////////////////////////
// Drink random amount of water
adjust_waterlevel(-rand(1,6) / rating)
adjust_waterlevel(-rand(1,6) * ((tray_flags & SUPERWATER) ? SUPER_WATER_MODIFIER : 1) / rating )
// If the plant is dry, it loses health pretty fast, unless mushroom
if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
if(waterlevel <= 10 && !is_fungus)
adjust_plant_health(-rand(0,1) / rating)
if(waterlevel <= 0)
adjust_plant_health(-rand(0,2) / rating)
@@ -428,7 +436,7 @@
if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
if(myseed.yield >= 3)
myseed.adjust_yield(-rand(1,2)) //Weeds choke out the plant's ability to bear more fruit.
myseed.set_yield(min((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
myseed.set_yield(clamp((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
//This is the part with pollination
pollinate()
@@ -475,7 +483,7 @@
if(weedlevel >= 10 && prob(50) && !self_sustaining) // At this point the plant is kind of fucked. Weeds can overtake the plant spot.
if(myseed && myseed.yield >= 3)
myseed.adjust_yield(-rand(1,2)) //Loses even more yield per tick, quickly dropping to 3 minimum.
myseed.set_yield(min((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
myseed.set_yield(clamp((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
if(!myseed)
weedinvasion()
needs_update = 1
@@ -508,7 +516,7 @@
/obj/machinery/hydroponics/update_overlays()
. = ..()
if(myseed)
. += myseed.get_tray_overlay(age, plant_status)
. += myseed.get_tray_overlay(age, plant_status, plant_offset_y)
. += update_status_light_overlays()
if(self_sustaining && self_sustaining_overlay_icon_state)
@@ -667,8 +675,12 @@
* Raises the plant's weed level stat by a given amount.
* * adjustamt - Determines how much the weed level will be adjusted upwards or downwards.
*/
/obj/machinery/hydroponics/proc/adjust_weedlevel (amt)
set_weedlevel(clamp(weedlevel + amt, 0, MAX_TRAY_WEEDS), FALSE)
/obj/machinery/hydroponics/proc/adjust_weedlevel(amt)
var/weed_mod = 1
//If we are not a soil type tray and out plant is semiaquatic, increase weed.
if(!(tray_flags & SOIL) && myseed?.get_gene(/datum/plant_gene/trait/semiaquatic))
weed_mod *= SEMIAQUATIC_SOIL_WEED_MALUS
set_weedlevel(clamp(weedlevel + amt * weed_mod, 0, MAX_TRAY_WEEDS), FALSE)
/obj/machinery/hydroponics/examine(user)
. = ..()
@@ -793,13 +805,14 @@
* Plant Death Proc.
* Cleans up various stats for the plant upon death, including pests, harvestability, and plant health.
*/
/obj/machinery/hydroponics/proc/plantdies()
/obj/machinery/hydroponics/proc/plantdies(update_icon = TRUE)
set_plant_health(0, update_icon = FALSE, forced = TRUE)
set_plant_status(HYDROTRAY_PLANT_DEAD)
set_pestlevel(0, update_icon = FALSE) // Pests die
lastproduce = 0
update_appearance()
SEND_SIGNAL(src, COMSIG_HYDROTRAY_PLANT_DEATH)
if(update_icon)
update_appearance()
/**
* Plant Cross-Pollination.
@@ -879,6 +892,11 @@
visi_msg="[user] composts [reagent_source], spreading it through [target]"
transfer_amount = reagent_source.reagents.total_volume
SEND_SIGNAL(reagent_source, COMSIG_ITEM_ON_COMPOSTED, user)
if((tray_flags & WORM_HABITAT) && prob(transfer_amount / 2))
var/obj/item/food/bait/worm/premium/fat_worm = new(loc)
fat_worm.pixel_x = rand(-6,6)
fat_worm.pixel_y = rand(-6,6)
playsound(fat_worm, 'sound/items/eatfood.ogg', 20, TRUE)
else
transfer_amount = min(reagent_source.amount_per_transfer_from_this, reagent_source.reagents.total_volume)
if(istype(reagent_source, /obj/item/reagent_containers/syringe/))
@@ -919,21 +937,8 @@
return 1
else if(istype(O, /obj/item/seeds))
if(!myseed)
if(istype(O, /obj/item/seeds/kudzu))
investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY)
if(!user.transferItemToLoc(O, src))
return
SEND_SIGNAL(O, COMSIG_SEED_ON_PLANTED, src)
to_chat(user, span_notice("You plant [O]."))
set_seed(O)
set_plant_health(myseed.endurance)
lastcycle = world.time
return
else
to_chat(user, span_warning("[src] already has seeds in it!"))
return
propagate_plant(O, user)
return
else if(istype(O, /obj/item/cultivator))
if(weedlevel > 0)
user.visible_message(span_notice("[user] uproots the weeds."), span_notice("You remove the weeds from [src]."))
@@ -950,8 +955,8 @@
else if(plant_status != HYDROTRAY_PLANT_HARVESTABLE)
to_chat(user, span_notice("This plant must be harvestable in order to be grafted."))
return
else if(myseed.grafted)
to_chat(user, span_notice("This plant has already been grafted."))
else if(myseed.grafts_taken >= ((tray_flags & MULTIGRAFT) ? MULTI_GRAFT_MAX_COUNT : 1))
to_chat(user, span_notice("You can't take any more cuttings from this plant!"))
return
else
user.visible_message(span_notice("[user] grafts off a limb from [src]."), span_notice("You carefully graft off a portion of [src]."))
@@ -960,7 +965,7 @@
return // The plant did not return a graft.
snip.forceMove(drop_location())
myseed.grafted = TRUE
myseed.grafts_taken++
adjust_plant_health(-5)
return
@@ -1003,12 +1008,17 @@
else if(istype(O, /obj/item/graft))
var/obj/item/graft/snip = O
if(!myseed)
if(tray_flags & GRAFT_MEDIUM)
propagate_plant(snip.plant_dna, user)
qdel(snip)
return
to_chat(user, span_notice("The tray is empty."))
return
if(myseed.apply_graft(snip))
to_chat(user, span_notice("You carefully integrate the grafted plant limb onto [myseed.plantname], granting it [snip.stored_trait.get_name()]."))
var/datum/plant_gene/grafted_trait = myseed.apply_graft(snip)
if(grafted_trait)
to_chat(user, span_notice("You carefully integrate the grafted plant limb onto [myseed.plantname], granting it [grafted_trait.get_name()]."))
else
to_chat(user, span_notice("You integrate the grafted plant limb onto [myseed.plantname], but it does not accept the [snip.stored_trait.get_name()] trait from the [snip]."))
to_chat(user, span_notice("You try to integrate the grafted plant limb onto [myseed.plantname], but it rejects the trait from the [snip]."))
qdel(snip)
return
@@ -1030,11 +1040,7 @@
span_notice("You start digging out [src]'s plants..."))
if(O.use_tool(src, user, 50, volume=50) || (!myseed && !weedlevel))
user.visible_message(span_notice("[user] digs out the plants in [src]!"), span_notice("You dig out all of [src]'s plants!"))
if(myseed) //Could be that they're just using it as a de-weeder
set_plant_health(0, update_icon = FALSE, forced = TRUE)
lastproduce = 0
set_seed(null)
set_weedlevel(0) //Has a side effect of cleaning up those nasty weeds
remove_plant()
return
else if(istype(O, /obj/item/gun/energy/floragun))
var/obj/item/gun/energy/floragun/flowergun = O
@@ -1167,54 +1173,33 @@
var/mob/living/C = new chosen(get_turf(src))
C.faction = list(FACTION_PLANTS)
///////////////////////////////////////////////////////////////////////////////
/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk!
name = "soil"
desc = "A patch of dirt."
icon = 'icons/obj/service/hydroponics/equipment.dmi'
icon_state = "soil"
gender = PLURAL
circuit = null
density = FALSE
use_power = NO_POWER_USE
unwrenchable = FALSE
self_sustaining_overlay_icon_state = null
maxnutri = 15
/// Plants the seed / graft into the tray and resets growth related stats such as maturity on the tray.
/obj/machinery/hydroponics/proc/propagate_plant(obj/item/seeds/young_plant, mob/living/user)
if(!istype(young_plant))
return
if(myseed)
to_chat(user, span_warning("[src] already has a plant growing in it!"))
return
if(istype(young_plant, /obj/item/seeds/kudzu))
investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY)
if(!user.transferItemToLoc(young_plant, src))
return
SEND_SIGNAL(young_plant, COMSIG_SEED_ON_PLANTED, src)
to_chat(user, span_notice("You plant [young_plant]."))
set_seed(young_plant)
set_plant_health(myseed.endurance)
lastcycle = world.time
/obj/machinery/hydroponics/soil/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver)
return NONE
/obj/machinery/hydroponics/soil/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct)
return NONE
/obj/machinery/hydroponics/soil/update_icon(updates=ALL)
. = ..()
if(self_sustaining)
add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY)
/obj/machinery/hydroponics/soil/update_status_light_overlays()
return // Has no lights
/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
balloon_alert(user, "clearing up soil...")
if(weapon.use_tool(src, user, 1 SECONDS, volume=50))
balloon_alert(user, "cleared")
deconstruct(disassembled = TRUE)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/machinery/hydroponics/soil/click_ctrl(mob/user)
return CLICK_ACTION_BLOCKING //Soil has no electricity.
/obj/machinery/hydroponics/soil/on_deconstruction(disassembled)
new /obj/item/stack/ore/glass(drop_location(), 3)
/obj/machinery/hydroponics/soil/rich
name = "rich soil"
desc = "A rich patch of dirt, usually used in gardens."
icon_state = "rich_soil"
maxnutri = 20
/// Clears the plant from the tray, killing it in the process, optionally clearing weeds as well.
/obj/machinery/hydroponics/proc/remove_plant(clear_weeds = TRUE)
if(!myseed)
return
plantdies(FALSE)
if(clear_weeds)
set_weedlevel(0, FALSE)
if(self_sustaining) //No reason to pay for an empty tray.
set_self_sustaining(FALSE)
set_seed(null)
///The usb port circuit
+18
View File
@@ -988,3 +988,21 @@
/datum/plant_gene/trait/plant_type/alien_properties
name ="?????"
icon = FA_ICON_DISEASE
/datum/plant_gene/trait/carnivory
name = "Obligate Carnivory"
description = "Pests have positive effect on the plant health."
icon = FA_ICON_SPIDER
/datum/plant_gene/trait/semiaquatic
name = "Semiaquatic"
description = "A type of plant that thrives in flooded conditions due to less competion from weeds, but can also grow on land."
icon = FA_ICON_BOWL_RICE
mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
/datum/plant_gene/trait/soil_lover
name = "Soil Lover"
description = "A plant that needs the firm embrace of soil to develop properly, produces small irregular produce when grown hydroponically."
icon = FA_ICON_MOUND
mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
+32 -36
View File
@@ -58,10 +58,10 @@
var/weed_rate = 1
///Percentage chance per tray update to grow weeds
var/weed_chance = 5
///Determines if the plant has had a graft removed or not.
var/grafted = FALSE
///How many grafts or cuttings have been taken from this plant.
var/grafts_taken = 0
///Type-path of trait to be applied when grafting a plant.
var/graft_gene
var/datum/plant_gene/graft_gene = /datum/plant_gene/trait/repeated_harvest
///Determines if the plant should be allowed to mutate early at 30+ instability.
var/seed_flags = MUTATE_EARLY
@@ -198,19 +198,22 @@
// Harvest procs
/obj/item/seeds/proc/getYield()
var/return_yield = yield
var/obj/machinery/hydroponics/parent = loc
// Handle hydroponics malus for soil lovers like rootcrops.
if(!(parent.tray_flags & SOIL) && get_gene(/datum/plant_gene/trait/soil_lover))
return_yield *= SOIL_LOVER_HYDRO_YIELD_MALUS
// Determine if the plant should get a yield bonus from bee pollination.
for(var/datum/plant_gene/trait/trait in genes)
if(trait.trait_flags & TRAIT_NO_POLLINATION)
return return_yield
var/obj/machinery/hydroponics/parent = loc
if(istype(loc, /obj/machinery/hydroponics))
if(parent.yieldmod == 0)
return_yield = min(return_yield, 1)//1 if above zero, 0 otherwise
else
return_yield *= (parent.yieldmod)
return return_yield
return round(return_yield)
/obj/item/seeds/proc/harvest(mob/user)
@@ -247,7 +250,13 @@
t_prod.seed.set_instability(round(instability * 0.5))
continue
else
t_prod = new product(output_loc, new_seed = src)
// Create a descendent seed so we can modify our offspring before creating a grown from it.
var/obj/item/seeds/descendent_seed = Copy()
// Cuck potency if a soil lover such as a root crop is grown in water.
if(!(parent.tray_flags & SOIL) && get_gene(/datum/plant_gene/trait/soil_lover))
descendent_seed.set_potency(round(potency * RANDOM_DECIMAL(SOIL_LOVER_HYDRO_POTENCY_MIN, SOIL_LOVER_HYDRO_POTENCY_MAX)))
t_prod = new product(output_loc, new_seed = descendent_seed)
if(parent.myseed.plantname != initial(parent.myseed.plantname))
t_prod.name = LOWER_TEXT(parent.myseed.plantname)
if(productdesc)
@@ -564,24 +573,11 @@
* Creates a graft from this plant.
*
* Creates a new graft from this plant.
* Sets the grafts trait to this plants graftable trait.
* Gives the graft a reference to this plant.
* Copies all the relevant stats from this plant to the graft.
* Passes this plant to the new graft so it can make a copy.
* Returns the created graft.
*/
/obj/item/seeds/proc/create_graft()
var/obj/item/graft/snip = new(loc, graft_gene)
snip.parent_name = plantname
snip.name += " ([plantname])"
// Copy over stats so the graft can outlive its parent.
snip.lifespan = lifespan
snip.endurance = endurance
snip.production = production
snip.weed_rate = weed_rate
snip.weed_chance = weed_chance
snip.yield = yield
var/obj/item/graft/snip = new(loc, src)
return snip
/**
@@ -596,25 +592,25 @@
* - [snip][/obj/item/graft]: The graft being used applied to this plant.
*/
/obj/item/seeds/proc/apply_graft(obj/item/graft/snip)
. = TRUE
var/datum/plant_gene/new_trait = snip.stored_trait
var/datum/plant_gene/new_trait = snip.plant_dna.graft_gene || /datum/plant_gene/trait/repeated_harvest
new_trait = new new_trait()
if(new_trait?.can_add(src))
genes += new_trait.Copy()
genes += new_trait
else
. = FALSE
return
// Adjust stats based on graft stats
set_lifespan(round(max(lifespan, (lifespan + (2/3)*(snip.lifespan - lifespan)))))
set_endurance(round(max(endurance, (endurance + (2/3)*(snip.endurance - endurance)))))
set_production(round(max(production, (production + (2/3)*(snip.production - production)))))
set_weed_rate(round(max(weed_rate, (weed_rate + (2/3)*(snip.weed_rate - weed_rate)))))
set_weed_chance(round(max(weed_chance, (weed_chance+ (2/3)*(snip.weed_chance - weed_chance)))))
set_yield(round(max(yield, (yield + (2/3)*(snip.yield - yield)))))
set_lifespan(round(max(lifespan, (lifespan + (2/3)*(snip.plant_dna.lifespan - lifespan)))))
set_endurance(round(max(endurance, (endurance + (2/3)*(snip.plant_dna.endurance - endurance)))))
set_production(round(max(production, (production + (2/3)*(snip.plant_dna.production - production)))))
set_weed_rate(round(max(weed_rate, (weed_rate + (2/3)*(snip.plant_dna.weed_rate - weed_rate)))))
set_weed_chance(round(max(weed_chance, (weed_chance+ (2/3)*(snip.plant_dna.weed_chance - weed_chance)))))
set_yield(round(max(yield, (yield + (2/3)*(snip.plant_dna.yield - yield)))))
// Add in any reagents, too.
reagents_from_genes()
return
// Return the new trait so the tray can know we were successful and display its name.
return new_trait
/*
* Both `/item/food/grown` and `/item/grown` implement a seed variable which tracks
@@ -659,7 +655,7 @@
reagents_from_genes()
/// Returns a mutable appearance to be used as an overlay for the plant in hydro trays.
/obj/item/seeds/proc/get_tray_overlay(age, status)
/obj/item/seeds/proc/get_tray_overlay(age, status, tray_offset)
var/mutable_appearance/plant_overlay = mutable_appearance(growing_icon, layer = OBJ_LAYER + 0.01)
switch(status)
if(HYDROTRAY_PLANT_DEAD)
@@ -669,7 +665,7 @@
else
var/t_growthstate = clamp(round((age / maturation) * growthstages), 1, growthstages)
plant_overlay.icon_state = "[icon_grow][t_growthstate]"
plant_overlay.pixel_z = plant_icon_offset
plant_overlay.pixel_z = plant_icon_offset + tray_offset
return plant_overlay
/// Called when the seed is set in a tray
+235
View File
@@ -0,0 +1,235 @@
///////////////////////////////////////////////////////////////////////////////
/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk!
name = "soil"
desc = "A patch of dirt."
icon = 'icons/obj/service/hydroponics/equipment.dmi'
icon_state = "soil"
gender = PLURAL
circuit = null
density = FALSE
use_power = NO_POWER_USE
unwrenchable = FALSE
self_sustaining_overlay_icon_state = null
maxnutri = 15
tray_flags = SOIL
armor_type = /datum/armor/obj_soil
//which type of sack to create when shovled.
var/sack_type = /obj/item/soil_sack
/obj/machinery/hydroponics/soil/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver)
return NONE
/obj/machinery/hydroponics/soil/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct)
return NONE
/obj/machinery/hydroponics/soil/update_icon(updates=ALL)
. = ..()
if(self_sustaining)
add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY)
/obj/machinery/hydroponics/soil/update_status_light_overlays()
return // Has no lights
/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
balloon_alert(user, "digging up soil...")
if(weapon.use_tool(src, user, 3 SECONDS, volume=50))
balloon_alert(user, "bagged")
new sack_type(loc, src) //The bag handles sucking up the soil, stopping processing and setting relevants stats.
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/machinery/hydroponics/soil/click_ctrl(mob/user)
return CLICK_ACTION_BLOCKING //Soil has no electricity.
/obj/machinery/hydroponics/soil/on_deconstruction(disassembled)
new /obj/item/stack/ore/glass(drop_location(), 3)
///called when a soil is plopped down on the ground.
/obj/machinery/hydroponics/soil/proc/on_place()
return
/datum/armor/obj_soil
melee = 80
bullet = 100
laser = 90
fire = 70
acid = 30
bomb = 15
/////////////// Advanced Soils //////////////
/obj/machinery/hydroponics/soil/vermaculite
name = "vermaculite growing medium"
desc = "A plant bed made of light, expanded mineral granules.\n\nThe plant health benefits from the high degree of soil aeration is especially useful for when propagating grafts."
icon_state = "soil_verm"
maxnutri = 20
maxwater = 150
tray_flags = SOIL | MULTIGRAFT | GRAFT_MEDIUM
sack_type = /obj/item/soil_sack/vermaculite
/obj/machinery/hydroponics/soil/gel
name = "hydrogel beads"
desc = "A plant bed made of superabsorbent polymer beads.\n\nThese types of water gel beads can hold onto an incredible amount of water and reduces evaporative losses to almost nothing."
icon_state = "soil_gel"
maxwater = 300
tray_flags = SOIL | HYDROPONIC | SUPERWATER
plant_offset_y = 2
sack_type = /obj/item/soil_sack/gel
/obj/machinery/hydroponics/soil/coir
name = "korta root coir"
desc = "A type of traditional growing medium from Tizira.\n\nUsed by the natives as a resourceful way to cultivate seraka mushrooms using waste korta roots.\nMushrooms of all kinds thrive due to the high organic content enabling them to mature faster."
icon_state = "soil_coir"
maxnutri = 20
tray_flags = SOIL | FAST_MUSHROOMS
sack_type = /obj/item/soil_sack/coir
/obj/machinery/hydroponics/soil/worm
name = "worm castings"
desc = "A type of compost created when the humble worm dutifully works the soil.\n\nIt is packed with nutrients unlocked by said creatures digestive system. Give thanks to the worm!"
icon_state = "soil_worm"
maxnutri = 35
maxwater = 200
tray_flags = SOIL | WORM_HABITAT | SLOW_RELEASE
plant_offset_y = 4
sack_type = /obj/item/soil_sack/worm
/obj/machinery/hydroponics/soil/worm/on_place()
. = ..()
flick("soil_worm_wiggle", src)
/obj/machinery/hydroponics/soil/rich
name = "rich soil"
desc = "A rich patch of dirt, usually used in gardens."
icon_state = "rich_soil"
maxnutri = 20
sack_type = /obj/item/soil_sack/rich
/////////////////// Soil Sacks ///////////////////////
/// Holder items that store the soils until deployed.
/obj/item/soil_sack
name = "soil sack"
desc = "A large plastic bag containing commercial garden soil. It is packed with sand, peat and manure. While you might not care much for such mixture, the plants have strange tastes."
icon = 'icons/obj/service/hydroponics/equipment.dmi'
icon_state = "soil_sack"
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
base_icon_state = "soil_sack"
force = 7
throwforce = 17
attack_speed = 1.2 SECONDS
damtype = STAMINA
block_sound = 'sound/effects/bodyfall/bodyfall1.ogg'
w_class = WEIGHT_CLASS_HUGE
item_flags = SLOWS_WHILE_IN_HAND
resistance_flags = ACID_PROOF
hitsound = 'sound/items/pillow/pillow_hit.ogg'
drop_sound = 'sound/effects/footstep/woodbarefoot3.ogg' //could use better sounds in the future.
throw_drop_sound = 'sound/effects/bodyfall/bodyfall3.ogg'
custom_premium_price = PAYCHECK_CREW
throw_range = 3
throw_speed = 1
slowdown = 1
drag_slowdown = 1
var/obj/machinery/hydroponics/soil/stored_soil = /obj/machinery/hydroponics/soil
var/placement_sound = 'sound/effects/soil_plop.ogg'
/obj/item/soil_sack/Initialize(mapload, obj/machinery/hydroponics/soil/outside_soil)
. = ..()
AddComponent(/datum/component/two_handed, force_multiplier = 2, wield_callback = CALLBACK(src, PROC_REF(on_wield)), unwield_callback = CALLBACK(src, PROC_REF(on_unwield)))
if(outside_soil)
stored_soil = outside_soil
stored_soil.remove_plant()
stored_soil.forceMove(src)
STOP_PROCESSING(SSmachines, stored_soil)
animate(src, 100 MILLISECONDS, pixel_z = 4, easing = QUAD_EASING | EASE_OUT)
animate(time = 100 MILLISECONDS, pixel_z = 0, easing = QUAD_EASING | EASE_IN)
animate(time = 250 MILLISECONDS, pixel_x = rand(-6, 6), pixel_y = rand(-4, 4), flags = ANIMATION_PARALLEL)
/obj/item/soil_sack/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!isopenturf(interacting_with) || isgroundlessturf(interacting_with))
return ..()
if(locate(/obj/machinery/hydroponics/soil) in interacting_with)
to_chat(user, span_alert("There is already a bed of soil there!"))
return ITEM_INTERACT_BLOCKING
if(!do_after(user, 1 SECONDS, interacting_with))
return ITEM_INTERACT_BLOCKING
if(ispath(stored_soil))
stored_soil = new stored_soil(src)
stored_soil.reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, stored_soil.maxnutri / 2)
stored_soil.waterlevel = stored_soil.maxwater
else
START_PROCESSING(SSmachines, stored_soil)
stored_soil.forceMove(interacting_with)
playsound(stored_soil, placement_sound, 65, vary = TRUE)
stored_soil.on_place()
qdel(src)
return ITEM_INTERACT_SUCCESS
///Remove slowdown and add block chance when wielded.
/obj/item/soil_sack/proc/on_wield()
slowdown = 0
if(ismob(loc))
var/mob/wearer = loc
wearer.update_equipment_speed_mods()
block_chance = 25
inhand_icon_state = "[base_icon_state]_w"
///Reapply slowdown and remove block chance when unwielded.
/obj/item/soil_sack/proc/on_unwield()
slowdown = initial(slowdown)
if(ismob(loc))
var/mob/wearer = loc
wearer.update_equipment_speed_mods()
block_chance = initial(block_chance)
inhand_icon_state = base_icon_state
/obj/item/soil_sack/vermaculite
name = "NT vermaculite sack"
desc = "A sack of expanded mineral granules that can be used as soilless growing medium.\n\nYou like to think of it a bag of rocky popcorn that lets the roots breathe."
icon_state = "soil_sack_verm"
base_icon_state = "soil_sack_verm"
custom_premium_price = PAYCHECK_CREW * 2
stored_soil = /obj/machinery/hydroponics/soil/vermaculite
slowdown = 0
/obj/item/soil_sack/gel
name = "hydrogel bead sack"
desc = "A sack of space age superabsorbent gel beads! You wonder how shipping them prehydrated would ever make business sense..."
icon_state = "soil_sack_gel"
base_icon_state = "soil_sack_gel"
custom_premium_price = PAYCHECK_CREW * 2
placement_sound = 'sound/effects/meatslap.ogg'
stored_soil = /obj/machinery/hydroponics/soil/gel
/obj/item/soil_sack/coir
name = "#1™ korta coir sack"
desc = "A sack of Tiziran korta root coir. The fiberous roots are composted until they separate into individual fibres.\n\nProvides an excellent food source for saprotrophic mushrooms and helps hold onto water in the hot Tizirian climate."
icon_state = "soil_sack_coir"
base_icon_state = "soil_sack_coir"
custom_premium_price = PAYCHECK_CREW * 3
stored_soil = /obj/machinery/hydroponics/soil/coir
/obj/item/soil_sack/worm
name = "worm castings sack"
desc = "A sack of vermicompost, also known as worm castings.\n\nThis invertebrate manure not only contains plant nutrients and undigested organic matter, it also harbours a rich flora of beneficial microorganisms."
icon_state = "soil_sack_worm"
base_icon_state = "soil_sack_worm"
custom_premium_price = PAYCHECK_CREW * 4
stored_soil = /obj/machinery/hydroponics/soil/worm
/obj/item/soil_sack/rich
name = "rich soil sack"
desc = "A sack of rich black soil.\nAs your gaze falls upon it, you feel a bit more connected to the land."
custom_premium_price = PAYCHECK_CREW * 1.5
stored_soil = /obj/machinery/hydroponics/soil/rich
@@ -64,7 +64,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
//SKYRAT EDIT REMOVAL
/*
if(ishuman(spawning))
setup_department(spawning, player_client)
setup_department(spawning, player_client, move_to = TRUE)
*/
//SKYRAT EDIT END
@@ -82,7 +82,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
/// Returns the department this mob was assigned to, if any.
/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client)
/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client, move_to = FALSE)
var/department = player_client?.prefs?.read_preference(/datum/preference/choiced/security_department)
if (!isnull(department))
department = get_my_department(spawning, department)
@@ -140,15 +140,15 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
var/spawn_point = pick(LAZYACCESS(GLOB.department_security_spawns, department))
if(!CONFIG_GET(flag/sec_start_brig) && (destination || spawn_point))
if(!CONFIG_GET(flag/sec_start_brig) && move_to && (destination || spawn_point))
if(spawn_point)
spawning.Move(get_turf(spawn_point))
spawning.forceMove(get_turf(spawn_point))
else
var/list/possible_turfs = get_area_turfs(destination)
while (length(possible_turfs))
var/random_index = rand(1, length(possible_turfs))
var/turf/target = possible_turfs[random_index]
if (spawning.Move(target))
if (spawning.forceMove(target))
break
possible_turfs.Cut(random_index, random_index + 1)
@@ -12,7 +12,7 @@
max_ammo = 4
/obj/item/ammo_box/magazine/internal/shot/tube/fire
ammo_type = /obj/projectile/bullet/incendiary/shotgun/no_trail
ammo_type = /obj/item/ammo_casing/shotgun/incendiary/no_trail
/obj/item/ammo_box/magazine/internal/shot/tube/buckshot
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
@@ -50,13 +50,15 @@
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
can_be_sawn_off = TRUE
//component for seclight attachment
//component for seclight attachment
/obj/item/gun/ballistic/shotgun/riot/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \
light_overlay = "flight", \
overlay_x = 20, \
overlay_y = 11)
// Automatic Shotguns//
/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user)
@@ -71,6 +73,7 @@
projectile_damage_multiplier = 1.5
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
//component for seclight attachment
/obj/item/gun/ballistic/shotgun/automatic/combat/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
@@ -78,6 +81,7 @@
light_overlay = "flight", \
overlay_x = 20, \
overlay_y = 11)
/obj/item/gun/ballistic/shotgun/automatic/combat/compact
name = "compact combat shotgun"
desc = "A compact version of the semi automatic combat shotgun. Lower magazine capacity, but more easily carried."
@@ -85,6 +89,7 @@
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_MEDIUM
//component for seclight attachment
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
@@ -92,6 +97,7 @@
light_overlay = "flight", \
overlay_x = 16, \
overlay_y = 11)
//Dual Feed Shotgun
/obj/item/gun/ballistic/shotgun/automatic/dual_tube
@@ -105,7 +111,6 @@
inhand_y_dimension = 32
worn_icon_state = "cshotgun"
w_class = WEIGHT_CLASS_HUGE
semi_auto = TRUE
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/tube
interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING
/// If defined, the secondary tube is this type, if you want different shell loads
@@ -138,7 +143,7 @@
return ..()
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/attack_self(mob/living/user)
if(!chambered && magazine.contents.len)
if(!chambered && get_ammo())
rack()
else
toggle_tube(user)
@@ -278,6 +283,7 @@
/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
pin = /obj/item/firing_pin
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
/////////////////////////////
@@ -670,8 +670,8 @@ Basically, we fill the time between now and 2s from now with hands based off the
traumalist = shuffle(traumalist)
var/obj/item/organ/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN)
for(var/trauma in traumalist)
if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC))
temp_trauma = trauma
temp_trauma = brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC)
if(temp_trauma)
return
/datum/reagent/inverse/neurine/on_mob_delete(mob/living/carbon/affected_mob)
@@ -680,7 +680,8 @@ Basically, we fill the time between now and 2s from now with hands based off the
return
if(istype(temp_trauma, /datum/brain_trauma/special/imaginary_friend))//Good friends stay by you, no matter what
return
affected_mob.cure_trauma_type(temp_trauma, resilience = TRAUMA_RESILIENCE_MAGIC)
qdel(temp_trauma)
temp_trauma = null
/datum/reagent/inverse/corazargh
name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an homage to an older chem
+4 -2
View File
@@ -24,13 +24,15 @@
/// The user who opened the window
var/client/client
/// Injury phrases to blurt out
var/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!")
var/static/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!")
/// Max message length
var/max_length = MAX_MESSAGE_LEN
/// The modal window
var/datum/tgui_window/window
/// Boolean for whether the tgui_say was opened by the user.
var/window_open
/// What text was present in the say box the last time save_text was called
var/saved_text = ""
/** Creates the new input window to exist in the background. */
/datum/tgui_say/New(client/client, id)
@@ -128,7 +130,7 @@
if (type == "typing")
start_typing()
return TRUE
if (type == "entry" || type == "force")
if (type == "entry" || type == "force" || type == "save")
handle_entry(type, payload)
return TRUE
return FALSE
@@ -65,6 +65,13 @@
window.send_message("force")
stop_typing()
/**
* Exports whatever text is currently in the input box to this datum
*/
/datum/tgui_say/proc/save_text()
saved_text = null
window.send_message("save")
/**
* Makes the player force say what's in their current input box.
*/
@@ -78,6 +85,19 @@
log_speech_indicators("[key_name(client)] FORCED to stop typing, indicators DISABLED.")
SEND_SIGNAL(src, COMSIG_HUMAN_FORCESAY)
/**
* Gets whatever text is currently in this mob's say box and returns it.
*
* Note: Sleeps, due to waiting for say to respond.
*/
/mob/proc/get_typing_text()
if(!client?.tgui_say?.window_open)
return
client.tgui_say.save_text()
var/safety = world.time
UNTIL(istext(client?.tgui_say?.saved_text) || world.time - safety > 2 SECONDS)
return client?.tgui_say?.saved_text
/**
* Handles text entry and forced speech.
*
@@ -101,4 +121,10 @@
target_channel = SAY_CHANNEL // No ooc leaks
delegate_speech(alter_entry(payload), target_channel)
return TRUE
if(type == "save")
saved_text = "" // so we can differentiate null (nothing saved) and empty (nothing typed)
var/target_channel = payload["channel"]
if(target_channel == SAY_CHANNEL || target_channel == RADIO_CHANNEL)
saved_text = payload["entry"] // only save IC text
return TRUE
return FALSE
+1
View File
@@ -228,6 +228,7 @@
#include "movement_order_sanity.dm"
#include "mutant_hands_consistency.dm"
#include "mutant_organs.dm"
#include "neurine_trauma_cleanup.dm"
#include "novaflower_burn.dm"
#include "nuke_cinematic.dm"
#include "omnitools.dm"
@@ -20,14 +20,14 @@
* they aren't the same type so everything that works with one isn't guaranteed to work with the other.
*/
/datum/unit_test/hydroponics_harvest/Run()
var/obj/machinery/hydroponics/hydroponics_tray = allocate(/obj/machinery/hydroponics)
var/obj/machinery/hydroponics/soil/testing_soil = allocate(/obj/machinery/hydroponics/soil)
var/obj/item/seeds/planted_food_seed = allocate(/obj/item/seeds/apple) //grown food
var/obj/item/seeds/planted_not_food_seed = allocate(/obj/item/seeds/sunflower) //grown inedible
var/obj/item/seeds/planted_densified_seed = allocate(/obj/item/seeds/redbeet) //grown + densified chemicals
var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent)
hydroponics_tray.forceMove(run_loc_floor_bottom_left)
testing_soil.forceMove(run_loc_floor_bottom_left)
var/nearby_loc = locate((run_loc_floor_bottom_left.x + 1), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)
human.forceMove(nearby_loc)
@@ -38,11 +38,11 @@
planted_densified_seed.forceMove(seeds_loc)
// Apples should harvest 10 apples with 10u nutrients and 4u vitamins.
test_seed(hydroponics_tray, planted_food_seed, human)
test_seed(testing_soil, planted_food_seed, human)
// Sunflowers should harvest 10 sunflowers with 4u nutriment and 0u vitamins. It should also have 8u oil.
test_seed(hydroponics_tray, planted_not_food_seed, human)
test_seed(testing_soil, planted_not_food_seed, human)
// Redbeets should harvest 5 beets (10 / 2) with 10u nutriments (5 x 2) and 10u vitamins (5 x 2) thanks to densified chemicals.
test_seed(hydroponics_tray, planted_densified_seed, human)
test_seed(testing_soil, planted_densified_seed, human)
/datum/unit_test/hydroponics_harvest/proc/plant_and_update_seed(obj/machinery/hydroponics/tray, obj/item/seeds/seed)
seed.set_yield(10) // Sets the seed yield to 10. This gets clamped to 5 if the plant has traits to half the yield.
@@ -92,10 +92,11 @@
var/found_nutriments = all_harvested_items[1].reagents.get_reagent_amount(/datum/reagent/consumable/nutriment)
var/found_vitamins = all_harvested_items[1].reagents.get_reagent_amount(/datum/reagent/consumable/nutriment/vitamin)
QDEL_LIST(all_harvested_items) //We got everything we needed from our harvest, we can clean it up.
TEST_ASSERT_EQUAL(found_nutriments, expected_nutriments * max_volume, "Hydroponics harvest from [saved_name] has a [expected_nutriments] nutriment gene (expecting [expected_nutriments * max_volume]) but only had [found_nutriments] units of nutriment inside.")
TEST_ASSERT_EQUAL(found_vitamins, expected_vitamins * max_volume, "Hydroponics harvest from [saved_name] has a [expected_vitamins] vitamin gene (expecting [expected_nutriments * max_volume]) but only had [found_vitamins] units of vitamins inside.")
TEST_ASSERT_EQUAL(found_vitamins, expected_vitamins * max_volume, "Hydroponics harvest from [saved_name] has a [expected_vitamins] vitamin gene (expecting [expected_vitamins * max_volume]) but only had [found_vitamins] units of vitamins inside.")
if(tray.myseed)
tray.age = 0
@@ -0,0 +1,58 @@
/// Tests that neurine reagent properly creates and cleans up temporary traumas
/datum/unit_test/neurine_trauma_cleanup
/datum/unit_test/neurine_trauma_cleanup/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
dummy.mind_initialize()
// Create neurine reagent
var/datum/reagent/inverse/neurine/neurine_reagent = new()
// Ensure the dummy has a brain
var/obj/item/organ/brain/brain = dummy.get_organ_slot(ORGAN_SLOT_BRAIN)
TEST_ASSERT(brain, "Test dummy should have a brain")
// Get initial trauma count
var/initial_trauma_count = length(brain.traumas)
// Trigger neurine to add a trauma (simulate on_mob_life)
// We need to ensure it creates a trauma by setting high purity
neurine_reagent.creation_purity = 10 // This ensures SPT_PROB(creation_purity*10) will be 100%
neurine_reagent.on_mob_life(dummy, 1, 1)
// Check that a trauma was added
var/post_add_trauma_count = length(brain.traumas)
TEST_ASSERT(post_add_trauma_count == initial_trauma_count + 1, "Neurine should have added exactly one trauma")
TEST_ASSERT(neurine_reagent.temp_trauma, "Neurine should have stored a reference to the trauma it created")
// Verify the trauma is actually there and has the right resilience
var/datum/brain_trauma/added_trauma = neurine_reagent.temp_trauma
TEST_ASSERT(added_trauma in brain.traumas, "The trauma stored in temp_trauma should be in the brain's trauma list")
TEST_ASSERT(added_trauma.resilience == TRAUMA_RESILIENCE_MAGIC, "Neurine-created trauma should have TRAUMA_RESILIENCE_MAGIC")
// Now simulate the reagent being deleted (on_mob_delete)
neurine_reagent.on_mob_delete(dummy)
// Check that the trauma was properly removed
var/post_delete_trauma_count = length(brain.traumas)
TEST_ASSERT(post_delete_trauma_count == initial_trauma_count, "Neurine trauma should have been removed when reagent was deleted")
TEST_ASSERT(!neurine_reagent.temp_trauma, "Neurine should have cleared its temp_trauma reference")
TEST_ASSERT(!(added_trauma in brain.traumas), "The specific trauma should no longer be in the brain's trauma list")
// Test special case: imaginary friend should NOT be removed
var/datum/brain_trauma/special/imaginary_friend/friend_trauma = new()
brain.add_trauma_to_traumas(friend_trauma)
friend_trauma.owner = dummy
friend_trauma.resilience = TRAUMA_RESILIENCE_MAGIC
neurine_reagent.temp_trauma = friend_trauma
var/pre_friend_test_count = length(brain.traumas)
neurine_reagent.on_mob_delete(dummy)
// Imaginary friend should still be there
TEST_ASSERT(length(brain.traumas) == pre_friend_test_count, "Imaginary friend trauma should not be removed by neurine cleanup")
TEST_ASSERT(friend_trauma in brain.traumas, "Imaginary friend should still be in trauma list")
// Clean up for next test
qdel(friend_trauma)
qdel(neurine_reagent)
+7
View File
@@ -19,6 +19,13 @@
/obj/item/shovel/spade = 3,
/obj/item/storage/bag/plants = 5,
)
premium = list(
/obj/item/soil_sack = 8,
/obj/item/soil_sack/vermaculite = 3,
/obj/item/soil_sack/gel = 3,
)
contraband = list(
/obj/item/reagent_containers/cup/bottle/ammonia = 10,
/obj/item/reagent_containers/cup/bottle/diethylamine = 5,
@@ -0,0 +1,10 @@
author: "Krysonism"
delete-after: True
changes:
- rscadd: "Added 4 new types of soil"
- rscadd: "Added soils sacks to the nutrimax"
- rscadd: "Added soil sack crates to cargo."
- balance: "Soil now has higher armor values."
- balance: "Rice now gets more weeds if grown in soil."
- balance: "Carrots, potatoes, beets and their mutations now get reduced yield and potency if grown hydroponically."
- bugfix: "Weed overgrowth no longer instantly sets yield to 3."
@@ -0,0 +1,4 @@
author: "loganuk"
delete-after: True
changes:
- bugfix: "Fixes endless Neurine trauma farming & adds unit test to keep it safe"
@@ -0,0 +1,4 @@
author: "JohnFulpWillard"
delete-after: True
changes:
- bugfix: "Latejoiners are buckled in to their chairs & Hangover station trait now kicks their effects in again."
@@ -0,0 +1,4 @@
author: "Melbert"
delete-after: True
changes:
- bugfix: "Multi-z map cryo no longer makes locked fighting game characters"
@@ -0,0 +1,4 @@
author: "Melbert"
delete-after: True
changes:
- bugfix: "Latejoin officers no longer teleport"
@@ -0,0 +1,4 @@
author: "ArcaneMusic"
delete-after: True
changes:
- bugfix: "Sheets removed from the protolathe/techfab will properly remove the correct quantity and merge into the right material."
@@ -0,0 +1,6 @@
author: "paganiy"
delete-after: True
changes:
- bugfix: "fixed cycler shotgun double ammo consumption"
- bugfix: "fixed racking action on the cycler shotgun"
- bugfix: "bounty hunter cycler shotgun now properly fires incendiary rounds from secondary tube"
@@ -0,0 +1,4 @@
author: "Melbert"
delete-after: True
changes:
- bugfix: "Emotes with visuals can no longer cause errors if spammed to an extreme degree"
@@ -0,0 +1,4 @@
author: "Melbert"
delete-after: True
changes:
- bugfix: "Lazy/Diligent is not incompatible with Introvert/lazy"
@@ -0,0 +1,4 @@
author: "Melbert"
delete-after: True
changes:
- bugfix: "Equipping clothes adds you to suit sensors correctly if your clothes are unlaundered"
@@ -0,0 +1,4 @@
author: "Melbert"
delete-after: True
changes:
- bugfix: "Fixed personality wiping"
+12
View File
@@ -149,3 +149,15 @@
- map: Replace snow cabin gateway geothermal generator with real turbine
vinylspiders:
- qol: improves admin logging of forced dynamic events.
2025-10-04:
ArcaneMusic:
- balance: Ore vents on lavaland/icebox now scale their size, and therefore difficulty,
based on their distance from the mining station.
Melbert:
- rscadd: When a mind reader examines a mob, they'll get a glimpse into what that
mob is currently typing, before they even send the message.
- qol: Mind Reader now groups up all the information it gives you in a box
- admin: Mind Reader now logs everything the reader gleamed from the read-ee
Y0SH1M4S73R:
- bugfix: Snapping USB cables by dragging the attached objects too far away from
each other will no longer crash the server.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 44 KiB

+11 -1
View File
@@ -6,4 +6,14 @@ cartoon_pop.ogg by Tobiasz 'unfa' Karoń
It has been licensed under CC-BY 3.0, which can be found at http://creativecommons.org/licenses/by/3.0/
alert.ogg by bbrocer. Extended, looped, and reverbed
https://freesound.org/people/bbrocer/sounds/389511/
https://freesound.org/people/bbrocer/sounds/389511/
{
soil_plop.ogg is made using:
https://freesound.org/people/jorickhoofd/sounds/169551/ -- License: Attribution 4.0
https://freesound.org/people/Ali_6868/sounds/384361/, -- License: Creative Commons 0
https://freesound.org/people/lolamadeus/sounds/179341/, -- License: Creative Commons 0
https://freesound.org/people/fthrll/sounds/522200/, -- License: Creative Commons 0
https://freesound.org/people/Hankof/sounds/655630/, -- License: Creative Commons 0
}
Binary file not shown.
+1
View File
@@ -4620,6 +4620,7 @@
#include "code\modules\hydroponics\seed_extractor.dm"
#include "code\modules\hydroponics\seeds.dm"
#include "code\modules\hydroponics\snail_overlay.dm"
#include "code\modules\hydroponics\soil.dm"
#include "code\modules\hydroponics\unique_plant_genes.dm"
#include "code\modules\hydroponics\beekeeping\bee_smoker.dm"
#include "code\modules\hydroponics\beekeeping\beebox.dm"
+15 -1
View File
@@ -82,7 +82,11 @@ export function TguiSay() {
setButtonContent(currentPrefix.current ?? iterator.current());
// Empty input, resets the channel
} else if (currentPrefix.current && iterator.isSay() && value?.length === 0) {
} else if (
currentPrefix.current &&
iterator.isSay() &&
value?.length === 0
) {
setCurrentPrefix(null);
setButtonContent(iterator.current());
}
@@ -152,6 +156,15 @@ export function TguiSay() {
handleClose();
}
function handleSaveText(): void {
const iterator = channelIterator.current;
const currentValue = innerRef.current?.value;
if (!currentValue || !iterator.isVisible()) return;
messages.current.saveText(currentValue, iterator.current());
}
function handleIncrementChannel(): void {
const iterator = channelIterator.current;
@@ -248,6 +261,7 @@ export function TguiSay() {
Byond.subscribeTo('props', handleProps);
Byond.subscribeTo('force', handleForceSay);
Byond.subscribeTo('open', handleOpen);
Byond.subscribeTo('save', handleSaveText);
}, []);
/** Value has changed, we need to check if the size of the window is ok */
+6
View File
@@ -17,6 +17,12 @@ export const byondMessages = {
1 * SECONDS,
true,
),
saveText: debounce(
(entry: string, channel: Channel) =>
Byond.sendMessage('save', { entry, channel }),
1 * SECONDS,
true,
),
// Throttle: Prevents spamming the server
typingMsg: throttle(() => Byond.sendMessage('typing'), 4 * SECONDS),
} as const;
@@ -1 +1,2 @@
/obj/machinery/computer/station_alert/station_only : /obj/machinery/computer/station_alert{@OLD}
/obj/effect/landmark/start/hangover/closet : /obj/effect/landmark/start/hangover{@OLD}