diff --git a/.github/workflows/round_id_linker.yml b/.github/workflows/round_id_linker.yml
new file mode 100644
index 00000000000..cfb85052788
--- /dev/null
+++ b/.github/workflows/round_id_linker.yml
@@ -0,0 +1,12 @@
+name: "Round ID Linker"
+on:
+ issues:
+ types: [opened]
+
+jobs:
+ link_rounds:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: tgstation/round_linker@master
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 8208bbfab7d..40bf60febca 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -113598,6 +113598,21 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port)
+"kDh" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/displaycase/forsale,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
"kzm" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -114877,6 +114892,17 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/port)
+"qkz" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "kitchencounter";
+ name = "Kitchen Counter Shutters"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/displaycase/forsale,
+/turf/open/floor/plasteel,
+/area/crew_quarters/kitchen)
"qkG" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -153594,7 +153620,7 @@ aVr
aNh
aLL
aKz
-bcj
+qkz
bdJ
bfe
bgs
@@ -154610,7 +154636,7 @@ aDL
aFa
aGl
aHE
-aJa
+kDh
aKB
aLM
aLL
diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm
index a53be8f3526..19d45a9f889 100644
--- a/_maps/map_files/Donutstation/Donutstation.dmm
+++ b/_maps/map_files/Donutstation/Donutstation.dmm
@@ -32452,6 +32452,7 @@
/obj/structure/window/reinforced{
dir = 1
},
+/obj/structure/displaycase/forsale,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"bGZ" = (
@@ -38400,6 +38401,16 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/port)
+"bYB" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "kitchenshutter";
+ name = "privacy shutters"
+ },
+/obj/structure/displaycase/forsale,
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/kitchen)
"bYJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 4
@@ -83468,7 +83479,7 @@ akG
bZC
alu
alF
-anJ
+bYB
anJ
aoj
anJ
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 7e74fd5b366..30b5c21e553 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -31887,14 +31887,10 @@
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
-/obj/item/radio{
- desc = "An old handheld radio. You could use it, if you really wanted to.";
- icon_state = "radio";
- name = "old radio"
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/displaycase/forsale,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"aXn" = (
@@ -42996,6 +42992,7 @@
name = "Hallway Hatch"
},
/obj/structure/window/reinforced,
+/obj/item/reagent_containers/food/snacks/pie/cream,
/turf/open/floor/plating,
/area/crew_quarters/kitchen)
"bmT" = (
@@ -44087,11 +44084,11 @@
/obj/structure/table/reinforced,
/obj/effect/turf_decal/delivery,
/obj/machinery/door/firedoor,
-/obj/item/reagent_containers/food/snacks/pie/cream,
/obj/machinery/door/poddoor/shutters/preopen{
id = "kitchen";
name = "Serving Hatch"
},
+/obj/structure/displaycase/forsale,
/turf/open/floor/plating,
/area/crew_quarters/kitchen)
"box" = (
@@ -93733,6 +93730,19 @@
/obj/machinery/holopad/secure,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
+"gXk" = (
+/obj/structure/table/wood,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/item/radio{
+ desc = "An old handheld radio. You could use it, if you really wanted to.";
+ icon_state = "radio";
+ name = "old radio"
+ },
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
"llk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -119894,7 +119904,7 @@ aKK
cfa
btE
aXm
-btX
+gXk
bva
aYv
btX
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 1bd685297b6..e8d7bbf67bf 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -39299,6 +39299,7 @@
id = "kitchen";
name = "Serving Hatch"
},
+/obj/structure/displaycase/forsale,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
@@ -73871,6 +73872,15 @@
/obj/effect/turf_decal/tile/purple,
/turf/open/floor/plasteel/white,
/area/science/misc_lab/range)
+"pzW" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/displaycase/forsale,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"pCp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable,
@@ -109471,7 +109481,7 @@ bmO
aat
aaL
byy
-bAj
+pzW
bBT
bDD
bFl
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 54f60593d79..c51316269e9 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -34447,6 +34447,13 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
+"bHH" = (
+/obj/structure/bookcase/random/religion,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/lounge)
"bHI" = (
/obj/structure/grille/broken,
/turf/open/space/basic,
@@ -44772,12 +44779,6 @@
"ckH" = (
/turf/open/floor/plasteel/dark,
/area/library)
-"ckI" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/library/lounge)
"ckJ" = (
/obj/structure/sign/warning/securearea,
/turf/closed/wall/r_wall,
@@ -47638,9 +47639,6 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"cvy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -47651,6 +47649,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"cvA" = (
@@ -47763,12 +47762,8 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"cvM" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-10"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"cvR" = (
@@ -49126,6 +49121,22 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/disposal)
+"dbI" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/sign/painting/library{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"dci" = (
/obj/structure/rack,
/obj/item/gun/energy/laser/practice,
@@ -49353,6 +49364,13 @@
icon_state = "platingdmg1"
},
/area/maintenance/department/engine)
+"dCh" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/sign/painting/library_private{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"dJm" = (
/obj/machinery/door/airlock/research/glass{
name = "Research Pit";
@@ -49481,6 +49499,17 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"ebp" = (
+/obj/structure/sign/plaques/kiddie{
+ desc = "It reads: PRIVATE EXHIBIT - Please inquire with library staff for guided tours.";
+ name = "\improper Private Section Notice";
+ pixel_y = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"ebD" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -49557,6 +49586,12 @@
/obj/structure/chair/office,
/turf/open/floor/wood,
/area/lawoffice)
+"elH" = (
+/obj/structure/sign/painting/library{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"emV" = (
/turf/open/space,
/area/space/nearstation)
@@ -49626,6 +49661,9 @@
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating,
/area/engine/engineering)
+"ewV" = (
+/turf/open/floor/carpet,
+/area/library/artgallery)
"ezF" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -49845,6 +49883,12 @@
/obj/machinery/atmospherics/components/trinary/filter,
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
+"fdN" = (
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"fdQ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -49904,6 +49948,13 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"fgB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/library/artgallery)
"fhE" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -49980,6 +50031,10 @@
dir = 1
},
/area/hallway/secondary/exit/departure_lounge)
+"fnq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
+/area/library/artgallery)
"fon" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -50078,6 +50133,16 @@
},
/turf/closed/wall,
/area/science/mixing)
+"fwx" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -32
+ },
+/obj/structure/table/wood/fancy,
+/obj/item/stack/sheet/bone{
+ pixel_y = 6
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"fwI" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable,
@@ -50098,6 +50163,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
+"fAe" = (
+/obj/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"fBp" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/orange/visible/layer3,
@@ -50153,6 +50225,20 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"fGm" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"fIN" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -50180,6 +50266,23 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"fPk" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"fQf" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -50359,6 +50462,10 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"gkQ" = (
+/obj/structure/table/wood,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"gkR" = (
/obj/item/twohanded/required/kirbyplants/random,
/obj/structure/extinguisher_cabinet{
@@ -50474,6 +50581,30 @@
heat_capacity = 1e+006
},
/area/hallway/secondary/exit/departure_lounge)
+"gtl" = (
+/obj/item/toy/crayon/black,
+/obj/item/toy/crayon/white{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/toy/crayon/black,
+/obj/item/toy/crayon/white{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/structure/table/wood,
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Monastery Art Gallery APC";
+ pixel_y = 23
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"gue" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
@@ -50703,6 +50834,12 @@
},
/turf/closed/wall,
/area/science/mixing)
+"gMG" = (
+/obj/structure/table/wood,
+/obj/item/newspaper,
+/obj/item/reagent_containers/food/drinks/coffee,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"gMO" = (
/obj/structure/plasticflaps/opaque,
/obj/structure/window/reinforced,
@@ -50779,6 +50916,19 @@
},
/turf/open/floor/plasteel/dark,
/area/science/genetics)
+"gXh" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/structure/sign/painting/library_private{
+ pixel_x = 32
+ },
+/obj/machinery/newscaster{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"gXQ" = (
/obj/effect/turf_decal/tile/yellow,
/obj/structure/cable,
@@ -50940,6 +51090,14 @@
/obj/structure/cable,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"hwY" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"hxn" = (
/obj/structure/window/reinforced{
dir = 1
@@ -51127,6 +51285,10 @@
},
/turf/open/space/basic,
/area/engine/engineering)
+"hTS" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"hUt" = (
/obj/structure/closet/crate{
icon_state = "crateopen"
@@ -51195,6 +51357,25 @@
/obj/structure/chair/stool,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"hZf" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/sign/painting/library{
+ pixel_x = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"hZQ" = (
/obj/machinery/atmospherics/pipe/simple/general/hidden{
dir = 9
@@ -51232,6 +51413,15 @@
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/library)
+"icy" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Art Storage"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"idA" = (
/obj/structure/cable,
/obj/machinery/power/port_gen/pacman,
@@ -51285,6 +51475,16 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"iiJ" = (
+/obj/machinery/door/window/northright{
+ base_state = "left";
+ dir = 1;
+ icon_state = "left";
+ name = "Secure Art Exhibit";
+ req_access_txt = "37"
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"ijF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable,
@@ -51332,6 +51532,10 @@
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
+"ipj" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/mineral/iron,
+/area/library/artgallery)
"ipH" = (
/obj/effect/turf_decal/caution,
/obj/effect/turf_decal/stripes/line{
@@ -51354,6 +51558,10 @@
},
/turf/open/floor/plasteel,
/area/engine/lobby)
+"irO" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/carpet,
+/area/library/artgallery)
"itl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -51488,6 +51696,24 @@
},
/turf/open/floor/plasteel/white,
/area/storage/emergency/port)
+"iJb" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"iJi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -51605,6 +51831,9 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"iYT" = (
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"jcB" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -51926,6 +52155,17 @@
},
/turf/open/floor/engine,
/area/engine/supermatter)
+"jOw" = (
+/obj/structure/table/wood/fancy,
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -32
+ },
+/obj/machinery/light/dim,
+/obj/item/reagent_containers/food/drinks/trophy{
+ pixel_y = 10
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"jOB" = (
/turf/open/floor/plating,
/area/storage/emergency/starboard)
@@ -52196,6 +52436,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"kvv" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/carpet,
+/area/library/artgallery)
"kwm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -52254,6 +52500,24 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"kzj" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/structure/chair/wood,
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"kAa" = (
/obj/structure/chair{
dir = 8
@@ -52309,6 +52573,12 @@
},
/turf/open/floor/wood,
/area/maintenance/department/engine)
+"kEk" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"kEL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -52380,6 +52650,23 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"kFP" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/table/wood,
+/obj/machinery/newscaster{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"kIo" = (
/obj/structure/table,
/obj/item/paper_bin{
@@ -52530,6 +52817,13 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"kVM" = (
+/obj/structure/sign/painting/library_private{
+ pixel_x = 32
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"kVO" = (
/obj/structure/cable,
/turf/open/floor/plating,
@@ -52554,6 +52848,21 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"kZU" = (
+/obj/structure/table/wood/fancy,
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -32
+ },
+/obj/item/kitchen/knife/combat/bone{
+ desc = "An old bone sharpened into a blade. It's rather dull nowadays.";
+ force = 8;
+ name = "ancient bone dagger";
+ pixel_y = 6;
+ throwforce = 8
+ },
+/obj/machinery/light/dim,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"lbC" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
@@ -52672,6 +52981,14 @@
},
/turf/open/space,
/area/space/nearstation)
+"lto" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable,
+/obj/machinery/light/dim{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"ltu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/closed/wall/r_wall,
@@ -53196,6 +53513,12 @@
/obj/effect/mapping_helpers/airlock/abandoned,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"mFu" = (
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"mHy" = (
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims,
/turf/open/floor/wood,
@@ -53286,6 +53609,22 @@
/obj/item/reagent_containers/dropper,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
+"mTp" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"mTS" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -53414,6 +53753,32 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"niN" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/painting/library{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
+"njB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nku" = (
/obj/machinery/door/airlock/centcom{
name = "Crematorium";
@@ -53496,6 +53861,13 @@
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"nrg" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nsy" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -53601,6 +53973,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/explab)
+"nBO" = (
+/obj/machinery/light/dim{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nDo" = (
/obj/structure/bed,
/turf/open/floor/plating,
@@ -53672,6 +54050,18 @@
},
/turf/open/floor/engine,
/area/science/explab)
+"nKQ" = (
+/obj/structure/sign/painting/library_private{
+ pixel_x = 32
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ external_pressure_bound = 140;
+ name = "server vent";
+ pressure_checks = 0
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nLl" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -53744,10 +54134,45 @@
/obj/structure/cable,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"nPm" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/light/dim{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nPA" = (
/obj/item/chair,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"nQb" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nQc" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -53780,6 +54205,12 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/lawoffice)
+"nSJ" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/carpet,
+/area/library/artgallery)
"nUq" = (
/obj/machinery/atmospherics/pipe/layer_manifold/visible{
dir = 4
@@ -53794,10 +54225,28 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"nVN" = (
+/obj/item/storage/crayons{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/storage/crayons,
+/obj/structure/table/wood,
+/obj/structure/sign/poster/official/soft_cap_pop_art{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nVU" = (
/obj/item/twohanded/spear,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"nWF" = (
+/obj/structure/sign/painting/library_private{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"nWP" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
@@ -54056,6 +54505,11 @@
"ovX" = (
/turf/open/floor/plasteel,
/area/engine/lobby)
+"owx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"owS" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -54066,6 +54520,15 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
+"oya" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/camera{
+ c_tag = "Monastery Art Gallery";
+ dir = 8;
+ network = list("ss13","monastery")
+ },
+/turf/open/floor/carpet,
+/area/library/artgallery)
"oyF" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
@@ -54436,6 +54899,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"phR" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/structure/sign/painting/library{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"pkM" = (
/obj/machinery/door/airlock/external{
req_access_txt = "22"
@@ -54572,6 +55044,15 @@
},
/turf/open/floor/plating/airless,
/area/maintenance/disposal/incinerator)
+"pIy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/painting/library{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"pKd" = (
/obj/effect/spawner/lootdrop/maintenance/two,
/obj/structure/closet/crate,
@@ -54652,6 +55133,10 @@
},
/turf/closed/wall/r_wall,
/area/medical/virology)
+"pQA" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/carpet,
+/area/library/artgallery)
"pSc" = (
/obj/machinery/chem_heater,
/obj/item/radio/intercom{
@@ -54666,6 +55151,17 @@
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
+"pVr" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/displaycase/forsale,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
"pVD" = (
/obj/machinery/light/small{
dir = 1
@@ -54884,6 +55380,22 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
+"qtD" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"qtF" = (
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment{
@@ -55169,6 +55681,16 @@
},
/turf/open/floor/wood,
/area/maintenance/department/engine)
+"reR" = (
+/obj/structure/table/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
+/obj/effect/decal/cleanable/cobweb,
+/obj/item/camera,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"reV" = (
/obj/structure/table,
/obj/item/storage/toolbox/mechanical,
@@ -55203,6 +55725,12 @@
icon_state = "wood-broken4"
},
/area/maintenance/department/engine)
+"rie" = (
+/obj/structure/chair/wood{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"riF" = (
/obj/machinery/computer/arcade,
/obj/effect/turf_decal/tile/neutral{
@@ -55269,6 +55797,12 @@
luminosity = 2
},
/area/maintenance/department/science)
+"roy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"rrb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable,
@@ -55304,6 +55838,12 @@
},
/turf/open/floor/plasteel,
/area/tcommsat/computer)
+"rta" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/mineral/iron,
+/area/library/artgallery)
"rtG" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 10
@@ -55563,6 +56103,22 @@
/obj/structure/girder,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"sbI" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "kitchenshutters";
+ name = "kitchen shutters"
+ },
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/displaycase/forsale,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/kitchen)
"sbY" = (
/obj/machinery/vending/coffee,
/turf/open/floor/wood,
@@ -55808,6 +56364,15 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"sBW" = (
+/obj/structure/closet/crate/bin,
+/obj/item/reagent_containers/glass/rag,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"sDY" = (
/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -56130,6 +56695,14 @@
/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/engine,
/area/engine/engineering)
+"tqW" = (
+/obj/machinery/door/window/northright{
+ dir = 1;
+ name = "Secure Art Exhibit";
+ req_access_txt = "37"
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"tqX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -56193,6 +56766,11 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"txB" = (
+/obj/structure/bookcase/random/adult,
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/dark,
+/area/library/lounge)
"typ" = (
/obj/structure/table/glass,
/obj/item/hemostat,
@@ -56228,6 +56806,18 @@
/obj/item/pen,
/turf/open/floor/plasteel/dark,
/area/science/explab)
+"tBb" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/obj/machinery/camera{
+ c_tag = "Monastery Art Storage";
+ dir = 4;
+ network = list("ss13","monastery")
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"tCP" = (
/obj/docking_port/stationary/public_mining_dock,
/turf/open/floor/plating,
@@ -56236,6 +56826,14 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"tFt" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/sign/painting/library_private{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"tHk" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -56273,6 +56871,12 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"tJH" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"tJX" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -56280,6 +56884,25 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/engine,
/area/engine/engineering)
+"tKm" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
+"tNT" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"tPm" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -56391,6 +57014,17 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"tXV" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Art Gallery"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"tYF" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -56544,6 +57178,16 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"umO" = (
+/obj/machinery/door/morgue{
+ name = "Private Exhibit";
+ req_access_txt = "37"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"uoj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
@@ -56714,6 +57358,11 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"uIv" = (
+/obj/structure/bookcase/random/adult,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"uLi" = (
/obj/structure/chair/office/light,
/obj/structure/disposalpipe/segment,
@@ -56860,6 +57509,22 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"vek" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"veM" = (
/obj/machinery/suit_storage_unit/rd,
/obj/machinery/light{
@@ -57002,6 +57667,17 @@
/obj/item/clothing/mask/gas,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"vvY" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"vxp" = (
/obj/machinery/door/window/eastright{
base_state = "left";
@@ -57015,6 +57691,22 @@
/obj/item/assembly/mousetrap,
/turf/open/floor/engine,
/area/science/explab)
+"vzg" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"vzz" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -57114,6 +57806,12 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"vMn" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/closed/wall/mineral/iron,
+/area/library/artgallery)
"vMx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -57314,6 +58012,9 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
+"whJ" = (
+/turf/closed/wall/mineral/iron,
+/area/library/artgallery)
"wig" = (
/obj/machinery/vending/cigarette,
/turf/open/floor/plating{
@@ -57373,6 +58074,17 @@
/obj/structure/chair,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"woX" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_y = -32
+ },
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/glass/mortar{
+ pixel_y = 8
+ },
+/obj/item/pestle,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"wpI" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -57475,6 +58187,30 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
+"wBO" = (
+/obj/item/toy/crayon/spraycan{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/toy/crayon/spraycan,
+/obj/structure/table/wood,
+/obj/machinery/newscaster{
+ pixel_y = 32
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
+"wCj" = (
+/obj/item/paint/paint_remover{
+ pixel_y = 8
+ },
+/obj/structure/table/wood,
+/obj/item/soap/nanotrasen,
+/obj/structure/sign/poster/official/fruit_bowl{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"wDm" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
@@ -57546,6 +58282,26 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"wIX" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/library/artgallery)
+"wJL" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/sign/painting/library{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"wKa" = (
/obj/machinery/light/small,
/turf/open/floor/plating,
@@ -57597,6 +58353,12 @@
},
/turf/open/floor/plating,
/area/science/mixing)
+"wPj" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall/mineral/iron,
+/area/library/artgallery)
"wQU" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/general/hidden{
@@ -57821,6 +58583,24 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
+"xkB" = (
+/obj/structure/closet/crate,
+/obj/item/canvas/twentythreeXtwentythree,
+/obj/item/canvas/twentythreeXtwentythree,
+/obj/item/canvas/twentythreeXtwentythree,
+/obj/item/canvas/twentythreeXnineteen,
+/obj/item/canvas/twentythreeXnineteen,
+/obj/item/canvas/twentythreeXnineteen,
+/obj/item/canvas/nineteenXnineteen,
+/obj/item/canvas/nineteenXnineteen,
+/obj/item/canvas/nineteenXnineteen,
+/obj/item/wirecutters,
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"xlA" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/neutral{
@@ -58065,6 +58845,13 @@
/obj/machinery/navbeacon/wayfinding/lawyer,
/turf/open/floor/plasteel/dark,
/area/lawoffice)
+"xMQ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"xNx" = (
/obj/structure/lattice,
/obj/structure/disposalpipe/junction/flip,
@@ -58146,6 +58933,23 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"xXB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main/monastery)
"ybX" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance,
@@ -58206,6 +59010,19 @@
/obj/effect/spawner/lootdrop/maintenance/three,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"yii" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -28
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/artgallery)
"ylb" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -76661,7 +77478,7 @@ chn
cfE
cfE
cvy
-cfG
+ctL
cwe
cwe
fWv
@@ -76917,15 +77734,15 @@ cvc
cho
cvk
cdx
-cvc
+xXB
cvM
cfm
cwe
-fWv
+bHH
qOE
mKc
qOE
-cln
+txB
cwe
caS
aht
@@ -77174,14 +77991,14 @@ cfm
ciF
cuQ
cfm
-cfm
-cfm
-cfm
+wPj
+tXV
+whJ
cwe
ckp
-ckI
+qOE
ckX
-ckI
+qOE
cln
cwe
cfN
@@ -77431,9 +78248,9 @@ cio
chq
ciX
cfm
-cfN
-cfN
-cfN
+yii
+fPk
+fdN
cwe
cwe
cwe
@@ -77688,19 +78505,19 @@ cgM
chr
chL
cfm
+niN
+njB
+kFP
+whJ
+elH
+dbI
+nBO
+dbI
+elH
+whJ
+whJ
+whJ
cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
aaa
aaa
aaa
@@ -77945,18 +78762,18 @@ cip
chs
ciY
cfm
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
+pIy
+fPk
+rie
+whJ
+tNT
+mTp
+tNT
+tNT
+tNT
+fAe
+kZU
+whJ
cfN
aaa
aaa
@@ -78202,20 +79019,20 @@ cfm
cht
cfm
cfm
+nPm
+nrg
+fGm
+fnq
+fnq
+pQA
+ewV
+ewV
+ewV
+iiJ
+fwx
+whJ
cfN
cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
aaa
aaa
aht
@@ -78459,20 +79276,20 @@ ciq
chu
ciZ
cfm
+phR
+iJb
+hTS
+oya
+nSJ
+fgB
+irO
+kvv
+ewV
+tqW
+woX
+whJ
cfN
cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
aaa
aaa
aht
@@ -78716,20 +79533,20 @@ cfm
cfm
cfm
cfm
+niN
+njB
+qtD
+whJ
+vzg
+nQb
+tNT
+vek
+tNT
+fAe
+jOw
+whJ
cfN
cfN
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
aaa
aaa
aht
@@ -78964,28 +79781,28 @@ crO
crO
crO
crO
-crO
-crO
cfN
cfN
+whJ
+gtl
+tBb
+lto
+hwY
+owx
+icy
+vvY
+kzj
+gMG
+whJ
+ebp
+hZf
+mFu
+wJL
+iYT
+whJ
+whJ
+whJ
cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
-aaa
-aaa
-cfN
-cfN
-aaa
-aaa
aaa
aaa
aaa
@@ -79222,27 +80039,27 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+cfN
+whJ
+wCj
+tKm
+tNT
+tNT
+roy
+ipj
+vMn
+whJ
+whJ
+whJ
+umO
+rta
+whJ
+whJ
+whJ
+whJ
cfN
cfN
cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
cfN
@@ -79479,26 +80296,26 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cfN
+whJ
+wBO
+fdN
+qtD
+qtD
+kEk
+whJ
+reR
+tFt
+dCh
+dCh
+tJH
+sBW
+whJ
+cfN
cfN
cfN
cfN
cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -79736,22 +80553,22 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cfN
+whJ
+nVN
+gkQ
+gkQ
+gkQ
+xkB
+whJ
+uIv
+kVM
+nWF
+xMQ
+nKQ
+gXh
+whJ
+cfN
aaa
aaa
aaa
@@ -79994,20 +80811,20 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+whJ
+whJ
+wIX
+wIX
+wIX
+wIX
+whJ
+whJ
+whJ
+whJ
+whJ
+whJ
+whJ
+whJ
aaa
aaa
aaa
@@ -88673,7 +89490,7 @@ bad
bbl
bbl
bbl
-bbl
+sbI
aRN
bgo
bhd
@@ -90980,7 +91797,7 @@ aPE
cpb
bah
bah
-aYg
+pVr
cpi
bag
bbr
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index c922a86887e..8a90eb23255 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -124,7 +124,7 @@
/// Minimum amount of kelvin moved toward 310K per tick. So long as abs(310.15 - bodytemp) is more than 50.
#define BODYTEMP_AUTORECOVERY_MINIMUM 12
///Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
-#define BODYTEMP_COLD_DIVISOR 6
+#define BODYTEMP_COLD_DIVISOR 15
/// Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
#define BODYTEMP_HEAT_DIVISOR 15
/// The maximum number of degrees that your body can cool in 1 tick, due to the environment, when in a cold area.
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index d6648af5383..621375642fa 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -31,7 +31,7 @@
#define CLEAR_REAGENTS 4 // all reagents were cleared
#define MIMEDRINK_SILENCE_DURATION 30 //ends up being 60 seconds given 1 tick every 2 seconds
-#define TRESHOLD_UNHUSK 50 //Health treshold for instabitaluri and rezadone to unhusk someone
+#define THRESHOLD_UNHUSK 50 //Health treshold for instabitaluri and rezadone to unhusk someone
//used by chem masters and pill presses
#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 4d740a7ba20..956106c7ec1 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -124,3 +124,6 @@
// misc
#define VV_HK_SPACEVINE_PURGE "spacevine_purge"
+
+// paintings
+#define VV_HK_REMOVE_PAINTING "remove_painting"
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index 226af527400..cc31e273a4f 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -19,6 +19,7 @@ SUBSYSTEM_DEF(persistence)
var/list/picture_logging_information = list()
var/list/obj/structure/sign/picture_frame/photo_frames
var/list/obj/item/storage/photo_album/photo_albums
+ var/list/obj/structure/sign/painting/painting_frames
var/list/paintings = list()
/datum/controller/subsystem/persistence/Initialize()
@@ -377,11 +378,11 @@ SUBSYSTEM_DEF(persistence)
if(fexists(json_file))
paintings = json_decode(file2text(json_file))
- for(var/obj/structure/sign/painting/P in world)
+ for(var/obj/structure/sign/painting/P in painting_frames)
P.load_persistent()
/datum/controller/subsystem/persistence/proc/SavePaintings()
- for(var/obj/structure/sign/painting/P in world)
+ for(var/obj/structure/sign/painting/P in painting_frames)
P.save_persistent()
var/json_file = file("data/paintings.json")
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index 7b5f5d98b41..106d01c8d36 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -41,6 +41,7 @@ Bonus
unsafe = TRUE
if(A.properties["resistance"] >= 10)
power = 2.5
+ set_body_temp(A.affected_mob, A)
/datum/symptom/fever/Activate(datum/disease/advance/A)
if(!..())
@@ -50,13 +51,26 @@ Bonus
to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]")
else
to_chat(M, "[pick("You feel too hot.", "You feel like your blood is boiling.")]")
- if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || unsafe)
- Heat(M, A)
-/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
- var/get_heat = 6 * power
- if(!unsafe)
- M.adjust_bodytemperature(get_heat * A.stage, 0, BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
- else
- M.adjust_bodytemperature(get_heat * A.stage)
- return 1
+/**
+ * set_body_temp Sets the body temp change
+ *
+ * Sets the body temp change to the mob based on the stage and resistance of the disease
+ * arguments:
+ * * mob/living/M The mob to apply changes to
+ * * datum/disease/advance/A The disease applying the symptom
+ */
+/datum/symptom/fever/proc/set_body_temp(mob/living/M, datum/disease/advance/A)
+ M.add_body_temperature_change("fever", (6 * power) * A.stage)
+
+/// Update the body temp change based on the new stage
+/datum/symptom/fever/on_stage_change(datum/disease/advance/A)
+ . = ..()
+ if(.)
+ set_body_temp(A.affected_mob, A)
+
+/// remove the body temp change when removing symptom
+/datum/symptom/fever/End(datum/disease/advance/A)
+ var/mob/living/carbon/M = A.affected_mob
+ if(M)
+ M.remove_body_temperature_change("fever")
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 208b3456205..de5a5297348 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -415,12 +415,12 @@
if(prob(5))
to_chat(M, "You feel yourself absorbing plasma inside and around you...")
- if(M.bodytemperature > BODYTEMP_NORMAL)
- M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
+ if(M.bodytemperature > M.get_body_temp_normal())
+ M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
if(prob(5))
to_chat(M, "You feel less hot.")
- else if(M.bodytemperature < (BODYTEMP_NORMAL + 1))
- M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL)
+ else if(M.bodytemperature < (M.get_body_temp_normal() + 1))
+ M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0, M.get_body_temp_normal())
if(prob(5))
to_chat(M, "You feel warmer.")
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index e457e2fc6a8..6214685945c 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -40,6 +40,7 @@ Bonus
unsafe = TRUE
if(A.properties["stage_rate"] >= 10)
power = 2.5
+ set_body_temp(A.affected_mob, A)
/datum/symptom/shivering/Activate(datum/disease/advance/A)
if(!..())
@@ -49,13 +50,26 @@ Bonus
to_chat(M, "[pick("You feel cold.", "You shiver.")]")
else
to_chat(M, "[pick("You feel your blood run cold.", "You feel ice in your veins.", "You feel like you can't heat up.", "You shiver violently." )]")
- if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT || unsafe)
- Chill(M, A)
-/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
- var/get_cold = 6 * power
- var/limit = BODYTEMP_COLD_DAMAGE_LIMIT + 1
- if(unsafe)
- limit = 0
- M.adjust_bodytemperature(-get_cold * A.stage, limit)
- return 1
+/**
+ * set_body_temp Sets the body temp change
+ *
+ * Sets the body temp change to the mob based on the stage and resistance of the disease
+ * arguments:
+ * * mob/living/M The mob to apply changes to
+ * * datum/disease/advance/A The disease applying the symptom
+ */
+/datum/symptom/shivering/proc/set_body_temp(mob/living/M, datum/disease/advance/A)
+ M.add_body_temperature_change("shivering", -((6 * power) * A.stage))
+
+/// Update the body temp change based on the new stage
+/datum/symptom/shivering/on_stage_change(datum/disease/advance/A)
+ . = ..()
+ if(.)
+ set_body_temp(A.affected_mob, A)
+
+/// remove the body temp change when removing symptom
+/datum/symptom/shivering/End(datum/disease/advance/A)
+ var/mob/living/carbon/M = A.affected_mob
+ if(M)
+ M.remove_body_temperature_change("shivering")
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index c8f158285f7..00c6131b37b 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -1,151 +1,94 @@
-#define WRIST_WRENCH_COMBO "DD"
-#define BACK_KICK_COMBO "HG"
-#define STOMACH_KNEE_COMBO "GH"
-#define HEAD_KICK_COMBO "DHH"
-#define ELBOW_DROP_COMBO "HDHDH"
+#define STRONG_PUNCH_COMBO "HH"
+#define LAUNCH_KICK_COMBO "HD"
+#define DROP_KICK_COMBO "HG"
/datum/martial_art/the_sleeping_carp
name = "The Sleeping Carp"
id = MARTIALART_SLEEPINGCARP
allow_temp_override = FALSE
help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
- smashes_tables = TRUE
- var/old_grab_state = null
/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(findtext(streak,WRIST_WRENCH_COMBO))
+ if(findtext(streak,STRONG_PUNCH_COMBO))
streak = ""
- wristWrench(A,D)
+ strongPunch(A,D)
return TRUE
- if(findtext(streak,BACK_KICK_COMBO))
+ if(findtext(streak,LAUNCH_KICK_COMBO))
streak = ""
- backKick(A,D)
+ launchKick(A,D)
return TRUE
- if(findtext(streak,STOMACH_KNEE_COMBO))
+ if(findtext(streak,DROP_KICK_COMBO))
streak = ""
- kneeStomach(A,D)
- return TRUE
- if(findtext(streak,HEAD_KICK_COMBO))
- streak = ""
- headKick(A,D)
- return TRUE
- if(findtext(streak,ELBOW_DROP_COMBO))
- streak = ""
- elbowDrop(A,D)
+ dropKick(A,D)
return TRUE
return FALSE
-/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.IsStun() && !D.IsParalyzed())
- log_combat(A, D, "wrist wrenched (Sleeping Carp)")
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \
- "Your wrist is grabbed and simultaneously wrenched to the side by [A]!", "You hear aggressive shuffling!", null, A)
- to_chat(A, "You grab [D]'s wrist and wrench it sideways!")
- playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
- D.emote("scream")
- D.dropItemToGround(D.get_active_held_item())
- D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
- D.Stun(60)
- return TRUE
+/datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ var/atk_verb = pick("kick", "chop", "hit", "slam")
+ var/crit_damage = 0
+ D.visible_message("[A] [atk_verb]s [D]!", \
+ "[A] [atk_verb]s you!", null, null, A)
+ to_chat(A, "You [atk_verb] [D]!")
+ if(prob(10))
+ crit_damage += 20
+ playsound(get_turf(D), 'sound/weapons/bite.ogg', 50, TRUE, -1)
+ D.visible_message("[D] sputters blood as the blow strikes them with inhuman force!", "You are struck with incredible precision by [A]!")
+ else
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
+ D.apply_damage(20 + crit_damage, A.dna.species.attack_type, affecting)
+ log_combat(A, D, "strong punched (Sleeping Carp)")
+ return
- return FALSE
+/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ A.do_attack_animation(D, ATTACK_EFFECT_KICK)
+ D.visible_message("[A] kicks [D] square in the chest, sending them flying!", \
+ "You are kicked square in the chest by [A], sending you flying!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
+ playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
+ var/atom/throw_target = get_edge_target_turf(D, A.dir)
+ D.throw_at(throw_target, 7, 14, A)
+ D.apply_damage(15, A.dna.species.attack_type, BODY_ZONE_CHEST)
+ log_combat(A, D, "launch kicked (Sleeping Carp)")
+ return
-/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.IsParalyzed())
- if(A.dir != D.dir)
- log_combat(A, D, "missed a back-kick (Sleeping Carp) on")
- D.visible_message("[A] tries to kick [D] in the back, but misses!", \
- "You avoid a kick in the back by [A]!", "You hear a swoosh!", null, A)
- to_chat(A, "Your kick to [D]'s back misses!")
- return TRUE
- log_combat(A, D, "back-kicked (Sleeping Carp)")
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- D.visible_message("[A] kicks [D] in the back!", \
- "You're kicked in the back by [A]!", "You hear a sickening sound of flesh hitting flesh!", null, A)
- to_chat(A, "You kick [D] in the back!")
- step_to(D,get_step(D,D.dir),1)
- D.Paralyze(80)
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, TRUE, -1)
- return TRUE
- return FALSE
-
-/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.IsParalyzed())
- log_combat(A, D, "stomach kneed (Sleeping Carp)")
- A.do_attack_animation(D, ATTACK_EFFECT_KICK)
- D.visible_message("[A] knees [D] in the stomach!", \
- "Your stomach is kneed by [A], making you gag!", "You hear a sickening sound of flesh hitting flesh!", null, A)
- to_chat(A, "You knee [D] in the stomach, making [D.p_them()] gag!")
- D.losebreath += 3
- D.Stun(40)
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, TRUE, -1)
- return TRUE
- return FALSE
-
-/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(!D.stat && !D.IsParalyzed())
- log_combat(A, D, "head kicked (Sleeping Carp)")
- A.do_attack_animation(D, ATTACK_EFFECT_KICK)
- D.visible_message("[A] kicks [D] in the head!", \
- "Your jaw is kicked by [A]!", "You hear a sickening sound of flesh hitting flesh!", null, A)
- to_chat(A, "You kick [D] in the jaw!")
- D.apply_damage(20, A.dna.species.attack_type, BODY_ZONE_HEAD)
- D.drop_all_held_items()
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, TRUE, -1)
- D.Stun(80)
- return TRUE
- return FALSE
-
-/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D)
+/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ A.do_attack_animation(D, ATTACK_EFFECT_KICK)
+ playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
+ if((D.mobility_flags & MOBILITY_STAND))
+ D.apply_damage(10, A.dna.species.attack_type, BODY_ZONE_HEAD)
+ D.Knockdown(40)
+ D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \
+ "You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
if(!(D.mobility_flags & MOBILITY_STAND))
- log_combat(A, D, "elbow dropped (Sleeping Carp)")
- A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
- D.visible_message("[A] elbow drops [D]!", \
- "You're piledrived by [A] with [A.p_their()] elbow!", "You hear a sickening sound of flesh hitting flesh!", null, A)
- to_chat(A, "You piledrive [D] with your elbow!")
- if(D.stat)
- D.death() //FINISH HIM!
- D.apply_damage(50, A.dna.species.attack_type, BODY_ZONE_CHEST)
- playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, TRUE, -1)
- return TRUE
- return FALSE
+ D.apply_damage(5, A.dna.species.attack_type, BODY_ZONE_HEAD)
+ D.adjustStaminaLoss(40)
+ D.drop_all_held_items()
+ D.visible_message("[A] kicks [D] in the head!", \
+ "You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
+ return
/datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
- if(A.a_intent == INTENT_GRAB && A!=D) // A!=D prevents grabbing yourself
- add_to_streak("G",D)
- if(check_streak(A,D)) //if a combo is made no grab upgrade is done
- return TRUE
- old_grab_state = A.grab_state
- D.grabbedby(A, 1)
- if(old_grab_state == GRAB_PASSIVE)
- D.drop_all_held_items()
- A.setGrabState(GRAB_AGGRESSIVE) //Instant agressive grab if on grab intent
- log_combat(A, D, "grabbed", addition="aggressively")
- D.visible_message("[A] violently grabs [D]!", \
- "You're violently grabbed by [A]!", "You hear aggressive shuffling!", null, A)
- to_chat(A, "You violently grab [D]!")
+ add_to_streak("G",D)
+ if(check_streak(A,D))
return TRUE
- return FALSE
+ return ..()
/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
add_to_streak("H",D)
if(check_streak(A,D))
return TRUE
+ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
var/atk_verb = pick("kick", "chop", "hit", "slam")
D.visible_message("[A] [atk_verb]s [D]!", \
"[A] [atk_verb]s you!", null, null, A)
to_chat(A, "You [atk_verb] [D]!")
- D.apply_damage(rand(10,15), BRUTE)
+ D.apply_damage(rand(10,15), BRUTE, affecting)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
- if(prob(D.getBruteLoss()) && (D.mobility_flags & MOBILITY_STAND))
- D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!")
- D.Paralyze(80)
log_combat(A, D, "[atk_verb] (Sleeping Carp)")
return TRUE
-
/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
add_to_streak("D",D)
if(check_streak(A,D))
@@ -162,22 +105,45 @@
return BULLET_ACT_HIT
if(!isturf(A.loc)) //NO MOTHERFLIPPIN MECHS!
return BULLET_ACT_HIT
- A.visible_message("[A] deflects the projectile; [A.p_they()] can't be hit with ranged weapons!", "You deflect the projectile!")
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE)
- P.firer = A
- P.setAngle(rand(0, 360))//SHING
- return BULLET_ACT_FORCE_PIERCE
+ if(A.in_throw_mode)
+ A.visible_message("[A] effortlessly swats the projectile aside! They can block bullets with their bare hands!", "You deflect the projectile!")
+ playsound(get_turf(A), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE)
+ P.firer = A
+ P.setAngle(rand(0, 360))//SHING
+ return BULLET_ACT_FORCE_PIERCE
+ return BULLET_ACT_HIT
/datum/martial_art/the_sleeping_carp/teach(mob/living/carbon/human/H, make_temporary = FALSE)
. = ..()
if(!.)
return
ADD_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT)
+ ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
+ ADD_TRAIT(H, TRAIT_STUNRESISTANCE, SLEEPING_CARP_TRAIT)
+ ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
+ H.physiology.brute_mod *= 0.3
+ H.physiology.burn_mod *= 0.3
+ H.physiology.stamina_mod *= 0.3
+ H.physiology.stun_mod *= 0.3
+ H.physiology.pressure_mod *= 0.3 //go hang out with carp
+ H.physiology.cold_mod *= 0.3 //seriously go say hi
+
+ H.faction |= "carp" //:D
/datum/martial_art/the_sleeping_carp/on_remove(mob/living/carbon/human/H)
. = ..()
REMOVE_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_STUNRESISTANCE, SLEEPING_CARP_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
+ H.physiology.brute_mod = initial(H.physiology.brute_mod)
+ H.physiology.burn_mod = initial(H.physiology.burn_mod)
+ H.physiology.stamina_mod = initial(H.physiology.stamina_mod)
+ H.physiology.stun_mod = initial(H.physiology.stun_mod)
+ H.physiology.pressure_mod = initial(H.physiology.pressure_mod) //no more carpies
+ H.physiology.cold_mod = initial(H.physiology.cold_mod)
+ H.faction -= "carp" //:(
/mob/living/carbon/human/proc/sleeping_carp_help()
set name = "Recall Teachings"
@@ -186,11 +152,10 @@
to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...")
- to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.")
- to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.")
- to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.")
- to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.")
- to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.")
+ to_chat(usr, "Gnashing Teeth: Harm Harm. Deal additional damage every second punch, with a chance for even more damage!")
+ to_chat(usr, "Crashing Wave Kick: Harm Disarm. Launch people brutally across rooms, and away from you.")
+ to_chat(usr, "Keelhaul: Harm Grab. Kick opponents to the floor. Against prone targets, deal additional stamina damage and disarm them.")
+ to_chat(usr, "In addition, your body has become incredibly resilient to most forms of attack. Weapons cannot readily pierce your hardened skin, and you are highly resistant to stuns and knockdowns, and can block all projectiles in Throw Mode. However, you are not invincible, and sustained damage will take it's toll.")
/obj/item/twohanded/bostaff
name = "bo staff"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 6e8493f4be6..540875aeb1b 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -476,7 +476,7 @@
owner.adjustBruteLoss(-25)
owner.adjustFireLoss(-25)
owner.remove_CC()
- owner.bodytemperature = BODYTEMP_NORMAL
+ owner.bodytemperature = owner.get_body_temp_normal()
return TRUE
/datum/status_effect/regenerative_core/on_remove()
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index 659abb72506..454bdb395b6 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -22,7 +22,7 @@
/datum/status_effect/freon/tick()
owner.update_mobility()
- if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL)
+ if(can_melt && owner.bodytemperature >= owner.get_body_temp_normal())
qdel(src)
/datum/status_effect/freon/proc/owner_resist()
diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm
index 4c167356204..09b85eaca88 100644
--- a/code/game/area/Space_Station_13_areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -427,6 +427,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Library Lounge"
icon_state = "library"
+/area/library/artgallery
+ name = " Art Gallery"
+ icon_state = "library"
+
/area/library/abandoned
name = "Abandoned Library"
icon_state = "library"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index a5561f5d7df..4297038cc35 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1126,82 +1126,33 @@
locked = TRUE
return
-
-/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/W, mob/user)
- if(!W.can_use(user))
+// gets called when a player uses an airlock painter on this airlock
+/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/painter, mob/user)
+ if((!in_range(src, user) && loc != user) || !painter.can_use(user)) // user should be adjacent to the airlock, and the painter should have a toner cartridge that isn't empty
return
- var/list/optionlist
- if(airlock_material == "glass")
- optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance")
+ // reads from the airlock painter's `available paintjob` list. lets the player choose a paint option, or cancel painting
+ var/current_paintjob = input(user, "Please select a paintjob for this airlock.") as null|anything in sortList(painter.available_paint_jobs)
+ if(!current_paintjob) // if the user clicked cancel on the popup, return
+ return
+
+ var/airlock_type = painter.available_paint_jobs["[current_paintjob]"] // get the airlock type path associated with the airlock name the user just chose
+ var/obj/machinery/door/airlock/airlock = new airlock_type // we need to create an new instance of the airlock and assembly to read vars from them
+ var/obj/structure/door_assembly/assembly = new airlock.assemblytype
+
+ if(airlock_material == "glass" && assembly.noglass) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer
+ to_chat(user, "This paint job can only be applied to non-glass airlocks.")
else
- optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Freezer", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance")
+ // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock
+ painter.use_paint(user)
+ icon = airlock.icon
+ overlays_file = airlock.overlays_file
+ assemblytype = airlock.assemblytype
+ update_icon()
- var/paintjob = input(user, "Please select a paintjob for this airlock.") in sortList(optionlist)
- if((!in_range(src, usr) && loc != usr) || !W.use_paint(user))
- return
- switch(paintjob)
- if("Standard")
- icon = 'icons/obj/doors/airlocks/station/public.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly
- if("Public")
- icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_public
- if("Engineering")
- icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_eng
- if("Atmospherics")
- icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_atmo
- if("Security")
- icon = 'icons/obj/doors/airlocks/station/security.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_sec
- if("Command")
- icon = 'icons/obj/doors/airlocks/station/command.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_com
- if("Medical")
- icon = 'icons/obj/doors/airlocks/station/medical.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_med
- if("Research")
- icon = 'icons/obj/doors/airlocks/station/research.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_research
- if("Freezer")
- icon = 'icons/obj/doors/airlocks/station/freezer.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_fre
- if("Science")
- icon = 'icons/obj/doors/airlocks/station/science.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_science
- if("Virology")
- icon = 'icons/obj/doors/airlocks/station/virology.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_viro
- if("Mining")
- icon = 'icons/obj/doors/airlocks/station/mining.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_min
- if("Maintenance")
- icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_mai
- if("External")
- icon = 'icons/obj/doors/airlocks/external/external.dmi'
- overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_ext
- if("External Maintenance")
- icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi'
- overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_extmai
- update_icon()
+ // these are just hanging around but are never placed, we need to delete them
+ qdel(airlock)
+ qdel(assembly)
/obj/machinery/door/airlock/CanAStarPass(obj/item/card/id/ID)
//Airlock is passable if it is open (!density), bot has access, and is not bolted shut or powered off)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index b8ba632a82b..75f36289907 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -15,6 +15,24 @@
usesound = 'sound/effects/spray2.ogg'
var/obj/item/toner/ink = null
+ /// Associate list of all paint jobs the airlock painter can apply. The key is the name of the airlock the user will see. The value is the type path of the airlock
+ var/list/available_paint_jobs = list(
+ "Public" = /obj/machinery/door/airlock/public,
+ "Engineering" = /obj/machinery/door/airlock/engineering,
+ "Atmospherics" = /obj/machinery/door/airlock/atmos,
+ "Security" = /obj/machinery/door/airlock/security,
+ "Command" = /obj/machinery/door/airlock/command,
+ "Medical" = /obj/machinery/door/airlock/medical,
+ "Research" = /obj/machinery/door/airlock/research,
+ "Freezer" = /obj/machinery/door/airlock/freezer,
+ "Science" = /obj/machinery/door/airlock/science,
+ "Mining" = /obj/machinery/door/airlock/mining,
+ "Maintenance" = /obj/machinery/door/airlock/maintenance,
+ "External" = /obj/machinery/door/airlock/external,
+ "External Maintenance"= /obj/machinery/door/airlock/maintenance/external,
+ "Virology" = /obj/machinery/door/airlock/virology,
+ "Standard" = /obj/machinery/door/airlock
+ )
/obj/item/airlock_painter/Initialize()
. = ..()
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 1767f4e9ef5..fd501938225 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -330,9 +330,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A Carp Classic brand cigarette. A small label on its side indicates that it does NOT contain carpotoxin."
/obj/item/clothing/mask/cigarette/carp/Initialize()
- . = ..()
- if(prob(5))
- list_reagents = list(/datum/reagent/drug/nicotine = 15, /datum/reagent/toxin/carpotoxin = 3) //they lied
+ . = ..()
+ if(!prob(5))
+ return
+ reagents?.add_reagent(/datum/reagent/toxin/carpotoxin , 3) // They lied
/obj/item/clothing/mask/cigarette/syndicate
desc = "An unknown brand cigarette."
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 92f9b70a089..07a222e403f 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -365,10 +365,11 @@
martialname = "sleeping carp"
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
greet = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
- directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab."
+ directed toward you while in Throw Mode. Your body is also honed to protect you from damage and punctures, and even briefly survive space. \
+ However, you are also unable to use any ranged weaponry, and some medical supplies will prove useless to you. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll2"
- remarks = list("I must prove myself worthy to the masters of the sleeping carp...", "Stance means everything...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Grab them first so they don't retaliate...", "I must prove myself worthy of this power...")
+ remarks = list("Wait, a high protein diet is really all it takes to become bulletproof...?", "Overwhelming force, immovable object...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Become one with the carp...", "Glub...")
/obj/item/book/granter/martial/carp/onlearned(mob/living/carbon/user)
..()
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 310d3b65264..b7e90603f2e 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -315,6 +315,9 @@
name = "bola"
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
icon_state = "bola"
+ item_state = "bola"
+ lefthand_file = 'icons/mob/inhands/weapons/thrown_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/thrown_righthand.dmi'
breakouttime = 35//easy to apply, easy to break out of
gender = NEUTER
var/knockdown = 0
@@ -351,6 +354,7 @@
name = "reinforced bola"
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
icon_state = "bola_r"
+ item_state = "bola_r"
breakouttime = 70
knockdown = 35
@@ -358,6 +362,7 @@
name = "energy bola"
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
icon_state = "ebola"
+ item_state = "ebola"
hitsound = 'sound/weapons/taserhit.ogg'
w_class = WEIGHT_CLASS_SMALL
breakouttime = 60
@@ -373,6 +378,7 @@
name = "gonbola"
desc = "Hey, if you have to be hugged in the legs by anything, it might as well be this little guy."
icon_state = "gonbola"
+ item_state = "bola_r"
breakouttime = 300
slowdown = 0
var/datum/status_effect/gonbolaPacify/effectReference
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index c44c2402afd..d39a9d6e681 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -240,7 +240,7 @@
to_chat(user, "You hit yourself over the head!")
user.Paralyze(knockdown_time_carbon * force)
- user.adjustStaminaLoss(stamina_damage)
+ user.apply_damage(stamina_damage, STAMINA, BODY_ZONE_HEAD)
additional_effects_carbon(user) // user is the target here
if(ishuman(user))
@@ -292,7 +292,7 @@
playsound(get_turf(src), on_stun_sound, 75, TRUE, -1)
target.Knockdown(knockdown_time_carbon)
- target.adjustStaminaLoss(stamina_damage)
+ target.apply_damage(stamina_damage, STAMINA)
additional_effects_carbon(target, user)
log_combat(user, target, "stunned", src)
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 9cc2bac1b19..7c74edcc127 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -223,7 +223,7 @@
L.Jitter(20)
L.confused = max(confusion_amt, L.confused)
L.stuttering = max(8, L.stuttering)
- L.adjustStaminaLoss(stamina_loss_amt)
+ L.apply_damage(stamina_loss_amt, STAMINA)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
addtimer(CALLBACK(src, .proc/apply_stun_effect_end, L), apply_stun_delay)
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index b4d306dbe4a..8f120e3d309 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -50,6 +50,7 @@
var/used = FALSE
var/painting_name //Painting name, this is set after framing.
var/finalized = FALSE //Blocks edits
+ var/author_ckey
var/icon_generated = FALSE
var/icon/generated_icon
@@ -123,6 +124,7 @@
/obj/item/canvas/proc/finalize(mob/user)
finalized = TRUE
+ author_ckey = user.ckey
generate_proper_overlay()
try_rename(user)
@@ -237,6 +239,7 @@
/obj/structure/sign/painting/Initialize(mapload, dir, building)
. = ..()
+ SSpersistence.painting_frames += src
AddComponent(/datum/component/art, 20)
if(dir)
setDir(dir)
@@ -244,6 +247,10 @@
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
+/obj/structure/sign/painting/Destroy()
+ . = ..()
+ SSpersistence.painting_frames -= src
+
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
if(!C && istype(I, /obj/item/canvas))
frame_canvas(user,I)
@@ -305,6 +312,7 @@
return
var/list/chosen = pick(SSpersistence.paintings[persistence_id])
var/title = chosen["title"]
+ var/author = chosen["ckey"]
var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png"
if(!fexists(png))
stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.")
@@ -323,6 +331,7 @@
new_canvas.icon_generated = TRUE
new_canvas.finalized = TRUE
new_canvas.painting_name = title
+ new_canvas.author_ckey = author
C = new_canvas
update_icon()
@@ -345,15 +354,14 @@
var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data)
if(result)
CRASH("Error saving persistent painting: [result]")
- current += list(list("title" = C.painting_name , "md5" = md5))
+ current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey))
SSpersistence.paintings[persistence_id] = current
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
- var/w = I.Width() + 1
var/h = I.Height() + 1
for(var/x in 1 to width)
for(var/y in 1 to height)
- grid[x][y] = I.GetPixel(w-x,h-y)
+ grid[x][y] = I.GetPixel(x,h-y)
//Presets for art gallery mapping, for paintings to be shared across stations
/obj/structure/sign/painting/library
@@ -364,3 +372,31 @@
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
persistence_id = "library_private"
+
+/obj/structure/sign/painting/vv_get_dropdown()
+ . = ..()
+ VV_DROPDOWN_OPTION(VV_HK_REMOVE_PAINTING, "Remove Persistent Painting")
+
+/obj/structure/sign/painting/vv_do_topic(list/href_list)
+ . = ..()
+ if(href_list[VV_HK_REMOVE_PAINTING])
+ if(!check_rights(NONE))
+ return
+ var/mob/user = usr
+ if(!persistence_id || !C)
+ to_chat(user,"This is not a persistent painting.")
+ return
+ var/md5 = md5(C.get_data_string())
+ var/author = C.author_ckey
+ var/list/current = SSpersistence.paintings[persistence_id]
+ if(current)
+ for(var/list/entry in current)
+ if(entry["md5"] == md5)
+ current -= entry
+ var/png = "data/paintings/[persistence_id]/[md5].png"
+ fdel(png)
+ for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
+ if(P.C && md5(P.C.get_data_string()) == md5)
+ QDEL_NULL(P.C)
+ log_admin("[key_name(user)] has deleted a persistent painting made by [author].")
+ message_admins("[key_name_admin(user)] has deleted persistent painting made by [author].")
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 5d618a1cd92..f7558a46c69 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -104,7 +104,7 @@
new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/suit/chaplainsuit/nun(src)
new /obj/item/clothing/head/nun_hood(src)
- new /obj/item/clothing/suit/hooded/chaplainsuit/monkfrock(src)
+ new /obj/item/clothing/suit/hooded/chaplainsuit/monkhabit(src)
new /obj/item/clothing/suit/chaplainsuit/holidaypriest(src)
new /obj/item/storage/backpack/cultpack(src)
new /obj/item/storage/fancy/candle_box(src)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 81e31dc49b1..9d77a9718d7 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -10,6 +10,7 @@
max_integrity = 200
integrity_failure = 0.25
var/obj/item/showpiece = null
+ var/obj/item/showpiece_type = null //This allows for showpieces that can only hold items if they're the same istype as this.
var/alert = TRUE
var/open = FALSE
var/openable = TRUE
@@ -17,6 +18,7 @@
var/start_showpiece_type = null //add type for items on display
var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk")
var/trophy_message = ""
+ var/glass_fix = TRUE
/obj/structure/displaycase/Initialize()
. = ..()
@@ -131,11 +133,14 @@
to_chat(user, "You [open ? "close":"open"] [src].")
toggle_lock(user)
else if(open && !showpiece)
+ if(showpiece_type && !istype(W, showpiece_type))
+ to_chat(user, "This doesn't belong in this kind of display.")
+ return TRUE
if(user.transferItemToLoc(W, src))
showpiece = W
to_chat(user, "You put [W] on display.")
update_icon()
- else if(istype(W, /obj/item/stack/sheet/glass) && broken)
+ else if(glass_fix && broken && istype(W, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = W
if(G.get_amount() < 2)
to_chat(user, "You need two glass sheets to fix the case!")
@@ -206,6 +211,21 @@
electronics = I
to_chat(user, "You install the airlock electronics.")
+ else if(istype(I, /obj/item/stock_parts/card_reader))
+ var/obj/item/stock_parts/card_reader/C = I
+ to_chat(user, "You start adding [C] to [src]...")
+ if(do_after(user, 20, target = src))
+ var/obj/structure/displaycase/forsale/sale = new(src.loc)
+ if(electronics)
+ electronics.forceMove(sale)
+ sale.electronics = electronics
+ if(electronics.one_access)
+ sale.req_one_access = electronics.accesses
+ else
+ sale.req_access = electronics.accesses
+ qdel(src)
+ qdel(C)
+
else if(istype(I, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = I
if(G.get_amount() < 10)
@@ -342,3 +362,137 @@
name = initial(I.name)
icon = initial(I.icon)
icon_state = initial(I.icon_state)
+
+/obj/structure/displaycase/forsale
+ name = "vend-a-tray"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "laserbox0"
+ desc = "A display case with an ID-card swiper. Use your ID to purchase the contents."
+ density = FALSE
+ max_integrity = 100
+ req_access = list(ACCESS_KITCHEN)
+ showpiece_type = /obj/item/reagent_containers/food
+ alert = FALSE //No, we're not calling the fire department because someone stole your cookie.
+ glass_fix = FALSE //Fixable with tools instead.
+ var/sale_price = 20
+ var/datum/bank_account/payments_acc = null
+
+/obj/structure/displaycase/forsale/update_icon() //remind me to fix my shitcode later
+ var/icon/I
+ if(open)
+ I = icon('icons/obj/stationobjs.dmi',"laserboxb0")
+ else
+ I = icon('icons/obj/stationobjs.dmi',"laserbox0")
+ if(!showpiece && !open)
+ I = icon('icons/obj/stationobjs.dmi',"laserbox_open")
+ if(broken)
+ I = icon('icons/obj/stationobjs.dmi',"laserbox_broken")
+ if(showpiece)
+ var/icon/S = getFlatIcon(showpiece)
+ S.Scale(17,17)
+ I.Blend(S,ICON_UNDERLAY,8,12)
+ src.icon = I
+ return
+
+/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params)
+ if(isidcard(I))
+ //Card Registration
+ var/obj/item/card/id/potential_acc = I
+ if(!potential_acc.registered_account)
+ to_chat(user, "This ID card has no account registered!")
+ return
+ if(payments_acc && payments_acc != potential_acc.registered_account)
+ to_chat(user, "This Vend-a-tray is already registered!")
+ return
+ if(!payments_acc && potential_acc.registered_account)
+ payments_acc = potential_acc.registered_account
+ playsound(src, 'sound/machines/click.ogg', 20, TRUE)
+ to_chat(user, "Vend-a-tray registered. Use your ID on grab intent to change the sale price, or disarm intent to open the tray.")
+ return
+ //Buying the contained item with the ID.
+ switch(user.a_intent)
+ if(INTENT_HELP)
+ if(!showpiece)
+ to_chat(user, "There's nothing for sale.")
+ return TRUE
+ if(broken)
+ to_chat(user, "[src] appears to be broken.")
+ return TRUE
+ var/confirm = alert(user, "Purchase [showpiece] for [sale_price]?", "Purchase?", "Confirm", "Cancel")
+ if(confirm == "Cancel" || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return TRUE
+ var/datum/bank_account/account = potential_acc.registered_account
+ if(!account.has_money(sale_price))
+ to_chat(user, "You do not possess the funds to purchase this.")
+ return TRUE
+ else
+ account.adjust_money(-sale_price)
+ if(payments_acc)
+ payments_acc.adjust_money(sale_price)
+ user.put_in_hands(showpiece)
+ to_chat(user, "You purchase [showpiece] for [sale_price] credits.")
+ playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE)
+ icon = 'icons/obj/stationobjs.dmi'
+ flick("laserbox_vend", src)
+ showpiece = null
+ update_icon()
+ return TRUE
+ //Setting the object's price.
+ if(INTENT_GRAB)
+ var/new_price_input = input(user,"Set the sale price for this vend-a-tray.","new price",0) as num|null
+ if(isnull(new_price_input) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+ new_price_input = clamp(round(new_price_input, 1), 10, 1000)
+ sale_price = new_price_input
+ to_chat(user, "The cost is now set to [sale_price].")
+ return TRUE
+ if(I.tool_behaviour == TOOL_WRENCH && open && user.a_intent == INTENT_HELP )
+ if(anchored)
+ to_chat(user, "You start unsecuring [src]...")
+ else
+ to_chat(user, "You start securing [src]...")
+ if(I.use_tool(src, user, 16, volume=50))
+ if(QDELETED(I))
+ return
+ if(anchored)
+ to_chat(user, "You unsecure [src].")
+ else
+ to_chat(user, "You secure [src].")
+ anchored = !anchored
+ return
+ else if(I.tool_behaviour == TOOL_WRENCH && !open && user.a_intent == INTENT_HELP)
+ to_chat(user, "[src] must be open to move it.")
+ return
+ if(istype(I, /obj/item/pda))
+ return TRUE
+ . = ..()
+
+/obj/structure/displaycase/forsale/multitool_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(obj_integrity <= (integrity_failure * max_integrity))
+ to_chat(user, "You start recalibrating [src]'s hover field...")
+ if(do_after(user, 20, target = src))
+ broken = 0
+ obj_integrity = max_integrity
+ update_icon()
+ return TRUE
+
+/obj/structure/displaycase/forsale/emag_act(mob/user)
+ . = ..()
+ payments_acc = null
+ req_access = list()
+ to_chat(user, "[src]'s card reader fizzles and smokes, and the account owner is reset.")
+
+/obj/structure/displaycase/forsale/examine(mob/user)
+ . = ..()
+ if(showpiece && !open)
+ . += "[showpiece] is for sale for [sale_price] credits."
+ if(broken)
+ . += "[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it."
+
+/obj/structure/displaycase/forsale/obj_break(damage_flag)
+ if(!broken && !(flags_1 & NODECONSTRUCT_1))
+ broken = TRUE
+ playsound(src, "shatter", 70, TRUE)
+ update_icon()
+ trigger_alarm() //In case it's given an alarm anyway.
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 6f8bd2fcd6a..3bc0e8e0a6a 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -151,7 +151,14 @@
outside_tube()
/obj/structure/transit_tube_pod/proc/outside_tube()
+ var/list/savedcontents = contents.Copy()
+ var/saveddir = dir
+ var/turf/destination = get_edge_target_turf(src,saveddir)
+ visible_message("[src] ejects its insides out!")
deconstruct(FALSE)//we automatically deconstruct the pod
+ for(var/i in savedcontents)
+ var/atom/movable/AM = i
+ AM.throw_at(destination,rand(1,3),5)
/obj/structure/transit_tube_pod/return_air()
return air_contents
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 89b290d4994..1824eaa0bff 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -244,6 +244,7 @@
name = "\improper Nar'Sien bola"
desc = "A strong bola, bound with dark magic that allows it to pass harmlessly through Nar'Sien cultists. Throw it to trip and slow your victim."
icon_state = "bola_cult"
+ item_state = "bola_cult"
breakouttime = 60
knockdown = 30
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 21068814cb7..3a88b809966 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -77,6 +77,8 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
+ permeability_coefficient = 0.05
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/gloves/color/plasmaman/black
name = "black envirogloves"
@@ -107,11 +109,13 @@
name = "engineering envirogloves"
icon_state = "engieplasma"
item_state = "engieplasma"
+ siemens_coefficient = 0
/obj/item/clothing/gloves/color/plasmaman/atmos
name = "atmos envirogloves"
icon_state = "atmosplasma"
item_state = "atmosplasma"
+ siemens_coefficient = 0
/obj/item/clothing/gloves/color/plasmaman/explorer
name = "explorer envirogloves"
@@ -123,6 +127,8 @@
desc = "Covers up those scandalous boney hands."
icon_state = "botanyplasma"
item_state = "botanyplasma"
+ permeability_coefficient = 0.05
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/gloves/color/plasmaman/prototype
name = "prototype envirogloves"
@@ -133,4 +139,4 @@
name = "clown envirogloves"
icon_state = "clownplasma"
item_state = "clownplasma"
-
+
diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm
index 20409af040f..949265f8337 100644
--- a/code/modules/clothing/suits/chaplainsuits.dm
+++ b/code/modules/clothing/suits/chaplainsuits.dm
@@ -1,5 +1,5 @@
//Chaplain Suit Subtypes
-//If any new staple chaplain items get added, put them in these lists
+//If any new staple chaplain items get added, put them in these lists
/obj/item/clothing/suit/chaplainsuit
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -30,7 +30,7 @@
item_state = "bishoprobe"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
-
+
/obj/item/clothing/suit/chaplainsuit/studentuni
name = "student robe"
desc = "The uniform of a bygone institute of learning."
@@ -45,15 +45,15 @@
item_state = "witchhunter"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
-/obj/item/clothing/suit/hooded/chaplainsuit/monkfrock
- name = "monk's frock"
+/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit
+ name = "monk's habit"
desc = "A few steps above rended sackcloth."
icon_state = "monkfrock"
item_state = "monkfrock"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- hoodtype = /obj/item/clothing/head/hooded/monkfrock
-
-/obj/item/clothing/head/hooded/monkfrock
+ hoodtype = /obj/item/clothing/head/hooded/monkhabit
+
+/obj/item/clothing/head/hooded/monkhabit
name = "monk's hood"
desc = "For when a man wants to cover up his tonsure."
icon_state = "monkhood"
@@ -76,7 +76,7 @@
item_state = "whiterobe"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
-
+
/obj/item/clothing/suit/chaplainsuit/clownpriest
name = "Robes of the Honkmother"
desc = "Meant for a clown of the cloth."
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index b0357e2e4bc..4231eb71952 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -22,7 +22,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/T = pick(turfs)
- new /datum/spacevine_controller(T, pick(subtypesof(/datum/spacevine_mutation)), rand(10,100), rand(5,10), src) //spawn a controller at turf with randomized stats and a single random mutation
+ new /datum/spacevine_controller(T, list(pick(subtypesof(/datum/spacevine_mutation))), rand(10,100), rand(5,10), src) //spawn a controller at turf with randomized stats and a single random mutation
/datum/spacevine_mutation
@@ -419,7 +419,6 @@
if(muts && muts.len)
for(var/datum/spacevine_mutation/M in muts)
M.add_mutation_to_vinepiece(SV)
- return
if(parent)
SV.mutations |= parent.mutations
var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY]
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4d17cc45631..454eaea180f 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -111,6 +111,20 @@
dna.species.handle_environment_pressure(environment, src)
dna.species.handle_body_temperature(src)
+/**
+ * get_body_temperature Returns the body temperature with any modifications applied
+ *
+ * This applies the result from proc/get_body_temp_normal_change() against the bodytemp_normal
+ * for the species and returns the result
+ *
+ * arguments:
+ * * apply_change (optional) Default True This applies the changes to body temperature normal
+ */
+/mob/living/carbon/human/get_body_temp_normal(apply_change=TRUE)
+ if(!apply_change)
+ return dna.species.bodytemp_normal
+ return dna.species.bodytemp_normal + get_body_temp_normal_change()
+
///FIRE CODE
/mob/living/carbon/human/handle_fire()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index ac274dc98b1..d744bcf1753 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1653,7 +1653,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
firemodifier = min(firemodifier, 0)
// this can go below 5 at log 2.5
- burn_damage = max(log(2 - firemodifier, (H.bodytemperature - bodytemp_normal)) - 5,0)
+ burn_damage = max(log(2 - firemodifier, (H.bodytemperature - H.get_body_temp_normal())) - 5,0)
// Display alerts based on the amount of fire damage being taken
if (burn_damage)
@@ -1758,7 +1758,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H)
var/areatemp = H.get_temperature(environment)
var/body_temp = H.bodytemperature // Get current body temperature
- var/body_temperature_difference = bodytemp_normal - body_temp
+ var/body_temperature_difference = H.get_body_temp_normal() - body_temp
var/natural_change = 0
// We are very cold, increate body temperature
@@ -1767,12 +1767,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
bodytemp_autorecovery_min)
// we are cold, reduce the minimum increment and do not jump over the difference
- else if(body_temp > bodytemp_cold_damage_limit && body_temp < bodytemp_normal)
+ else if(body_temp > bodytemp_cold_damage_limit && body_temp < H.get_body_temp_normal())
natural_change = max(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \
min(body_temperature_difference, bodytemp_autorecovery_min / 4))
// We are hot, reduce the minimum increment and do not jump below the difference
- else if(body_temp > bodytemp_normal && body_temp <= bodytemp_heat_damage_limit)
+ else if(body_temp > H.get_body_temp_normal() && body_temp <= bodytemp_heat_damage_limit)
natural_change = min(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \
max(body_temperature_difference, -(bodytemp_autorecovery_min / 4)))
@@ -1782,7 +1782,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/thermal_protection = H.get_insulation_protection(body_temp + natural_change)
if(areatemp > body_temp) // It is hot here
- if(body_temp < bodytemp_normal)
+ if(body_temp < H.get_body_temp_normal())
// Our bodytemp is below normal we are cold, insulation helps us retain body heat
// and will reduce the heat we lose to the environment
natural_change = (thermal_protection + 1) * natural_change
@@ -1792,7 +1792,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
natural_change = (1 / (thermal_protection + 1)) * natural_change
else // It is cold here
if(!H.on_fire) // If on fire ignore ignore local temperature in cold areas
- if(body_temp < bodytemp_normal)
+ if(body_temp < H.get_body_temp_normal())
// Our bodytemp is below normal, insulation helps us retain body heat
// and will reduce the heat we lose to the environment
natural_change = (thermal_protection + 1) * natural_change
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index adbf553d822..20926b5dce9 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -2,6 +2,7 @@
/datum/species/human/felinid
name = "Felinid"
id = "felinid"
+ say_mod = "meows"
limbs_id = "human"
mutant_bodyparts = list("ears", "tail_human")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 64d05233ae5..e2a8863e9b5 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -572,7 +572,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
*/
/mob/living/carbon/proc/natural_bodytemperature_stabilization(datum/gas_mixture/environment)
var/areatemp = get_temperature(environment)
- var/body_temperature_difference = BODYTEMP_NORMAL - bodytemperature
+ var/body_temperature_difference = get_body_temp_normal() - bodytemperature
var/natural_change = 0
// We are very cold, increate body temperature
@@ -581,12 +581,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
BODYTEMP_AUTORECOVERY_MINIMUM)
// we are cold, reduce the minimum increment and do not jump over the difference
- else if(bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT && bodytemperature < BODYTEMP_NORMAL)
+ else if(bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT && bodytemperature < get_body_temp_normal())
natural_change = max(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \
min(body_temperature_difference, BODYTEMP_AUTORECOVERY_MINIMUM / 4))
// We are hot, reduce the minimum increment and do not jump below the difference
- else if(bodytemperature > BODYTEMP_NORMAL && bodytemperature <= BODYTEMP_HEAT_DAMAGE_LIMIT)
+ else if(bodytemperature > get_body_temp_normal() && bodytemperature <= BODYTEMP_HEAT_DAMAGE_LIMIT)
natural_change = min(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \
max(body_temperature_difference, -(BODYTEMP_AUTORECOVERY_MINIMUM / 4)))
@@ -596,7 +596,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
var/thermal_protection = 1 - get_insulation_protection(areatemp) // invert the protection
if(areatemp > bodytemperature) // It is hot here
- if(bodytemperature < BODYTEMP_NORMAL)
+ if(bodytemperature < get_body_temp_normal())
// Our bodytemp is below normal we are cold, insulation helps us retain body heat
// and will reduce the heat we lose to the environment
natural_change = (thermal_protection + 1) * natural_change
@@ -606,7 +606,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
natural_change = (1 / (thermal_protection + 1)) * natural_change
else // It is cold here
if(!on_fire) // If on fire ignore ignore local temperature in cold areas
- if(bodytemperature < BODYTEMP_NORMAL)
+ if(bodytemperature < get_body_temp_normal())
// Our bodytemp is below normal, insulation helps us retain body heat
// and will reduce the heat we lose to the environment
natural_change = (thermal_protection + 1) * natural_change
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index f9a0f9443ef..746fd12db92 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -50,7 +50,7 @@
return ..()
/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
- if(abs(BODYTEMP_NORMAL - breath.temperature) > 50)
+ if(abs(get_body_temp_normal() - breath.temperature) > 50)
switch(breath.temperature)
if(-INFINITY to 120)
adjustFireLoss(3)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 29d38f40df8..8f142dea3c9 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -580,7 +580,7 @@
losebreath = 0
radiation = 0
set_nutrition(NUTRITION_LEVEL_FED + 50)
- bodytemperature = BODYTEMP_NORMAL
+ bodytemperature = get_body_temp_normal(apply_change=FALSE)
set_blindness(0)
set_blurriness(0)
set_dizziness(0)
@@ -1408,3 +1408,52 @@
var/ERROR_ERROR_LANDMARK_ERROR = "ERROR-ERROR: ERROR landmark missing!"
log_mapping(ERROR_ERROR_LANDMARK_ERROR)
CRASH(ERROR_ERROR_LANDMARK_ERROR)
+
+/**
+ * add_body_temperature_change Adds modifications to the body temperature
+ *
+ * This collects all body temperature changes that the mob is experiencing to the list body_temp_changes
+ * the aggrogate result is used to derive the new body temperature for the mob
+ *
+ * arguments:
+ * * key_name (str) The unique key for this change, if it already exist it will be overridden
+ * * amount (int) The amount of change from the base body temperature
+ */
+/mob/living/proc/add_body_temperature_change(key_name, amount)
+ body_temp_changes["[key_name]"] = amount
+
+/**
+ * remove_body_temperature_change Removes the modifications to the body temperature
+ *
+ * This removes the recorded change to body temperature from the body_temp_changes list
+ *
+ * arguments:
+ * * key_name (str) The unique key for this change that will be removed
+ */
+/mob/living/proc/remove_body_temperature_change(key_name)
+ body_temp_changes -= key_name
+
+/**
+ * get_body_temp_normal_change Returns the aggregate change to body temperature
+ *
+ * This aggregates all the changes in the body_temp_changes list and returns the result
+ */
+/mob/living/proc/get_body_temp_normal_change()
+ var/total_change = 0
+ if(body_temp_changes.len)
+ for(var/change in body_temp_changes)
+ total_change += body_temp_changes["[change]"]
+ return total_change
+
+/**
+ * get_body_temp_normal Returns the mobs normal body temperature with any modifications applied
+ *
+ * This applies the result from proc/get_body_temp_normal_change() against the BODYTEMP_NORMAL and returns the result
+ *
+ * arguments:
+ * * apply_change (optional) Default True This applies the changes to body temperature normal
+ */
+/mob/living/proc/get_body_temp_normal(apply_change=TRUE)
+ if(!apply_change)
+ return BODYTEMP_NORMAL
+ return BODYTEMP_NORMAL + get_body_temp_normal_change()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 935411b3b0b..e5c83816829 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -127,3 +127,6 @@
var/list/ownedSoullinks ///soullinks we are the owner of
var/list/sharedSoullinks ///soullinks we are a/the sharer of
+
+ /// List of changes to body temperature, used by desease symtoms like fever
+ var/list/body_temp_changes = list()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 34914b1c990..2ffaf6e5871 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -243,6 +243,11 @@
status = LIGHT_BROKEN
icon_state = "tube-broken"
+/obj/machinery/light/dim
+ nightshift_allowed = FALSE
+ bulb_colour = "#FFDDCC"
+ bulb_power = 0.8
+
// the smaller bulb light fixture
/obj/machinery/light/small
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index a8d889ef0f2..35924a9455d 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -9,15 +9,17 @@
idle_power_usage = 500
active_power_usage = 10000
dir = NORTH
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
+ ui_x = 350
+ ui_y = 185
var/strength_upper_limit = 2
- var/interface_control = 1
+ var/interface_control = TRUE
var/list/obj/structure/particle_accelerator/connected_parts
var/assembled = FALSE
var/construction_state = PA_CONSTRUCTION_UNSECURED
var/active = FALSE
var/strength = 0
var/powered = FALSE
- mouse_opacity = MOUSE_OPACITY_OPAQUE
/obj/machinery/particle_accelerator/control_box/Initialize()
. = ..()
@@ -75,36 +77,6 @@
else
icon_state = "control_boxc"
-/obj/machinery/particle_accelerator/control_box/Topic(href, href_list)
- if(..())
- return
-
- if(!interface_control)
- to_chat(usr, "ERROR: Request timed out. Check wire contacts.")
- return
-
- if(href_list["close"])
- usr << browse(null, "window=pacontrol")
- usr.unset_machine()
- return
- if(href_list["togglep"])
- if(!wires.is_cut(WIRE_POWER))
- toggle_power()
-
- else if(href_list["scan"])
- part_scan()
-
- else if(href_list["strengthup"])
- if(!wires.is_cut(WIRE_STRENGTH))
- add_strength()
-
- else if(href_list["strengthdown"])
- if(!wires.is_cut(WIRE_STRENGTH))
- remove_strength()
-
- updateDialog()
- update_icon()
-
/obj/machinery/particle_accelerator/control_box/proc/strength_change()
for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP
@@ -120,7 +92,6 @@
log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [AREACOORD(src)]")
investigate_log("increased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
-
/obj/machinery/particle_accelerator/control_box/proc/remove_strength(s)
if(assembled && (strength > 0))
strength--
@@ -130,7 +101,6 @@
log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [AREACOORD(src)]")
investigate_log("decreased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
-
/obj/machinery/particle_accelerator/control_box/power_change()
. = ..()
if(machine_stat & NOPOWER)
@@ -200,7 +170,6 @@
return TRUE
return FALSE
-
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
active = !active
investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
@@ -222,44 +191,6 @@
part.update_icon()
return TRUE
-
-/obj/machinery/particle_accelerator/control_box/ui_interact(mob/user)
- . = ..()
-
- if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
- wires.interact(user)
- return
- if(construction_state != PA_CONSTRUCTION_COMPLETE)
- return
-
- if((get_dist(src, user) > 1) || (machine_stat & (BROKEN|NOPOWER)))
- if(!issilicon(user))
- user.unset_machine()
- user << browse(null, "window=pacontrol")
- return
-
- var/dat = ""
- dat += "Close
"
- dat += "