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 += "

Status

" - if(!assembled) - dat += "Unable to detect all parts!
" - dat += "Run Scan

" - else - dat += "All parts in place.

" - dat += "Power:" - if(active) - dat += "On
" - else - dat += "Off
" - dat += "Toggle Power

" - dat += "Particle Strength: [strength] " - dat += "--|++

" - - var/datum/browser/popup = new(user, "pacontrol", name, 420, 300) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - /obj/machinery/particle_accelerator/control_box/examine(mob/user) . = ..() switch(construction_state) @@ -270,7 +201,6 @@ if(PA_CONSTRUCTION_PANEL_OPEN) . += "The panel is open." - /obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params) var/did_something = FALSE @@ -328,6 +258,65 @@ if(prob(50)) qdel(src) +/obj/machinery/particle_accelerator/control_box/interact(mob/user) + if(construction_state == PA_CONSTRUCTION_PANEL_OPEN) + wires.interact(user) + else + ..() + +/obj/machinery/particle_accelerator/control_box/proc/is_interactive(mob/user) + if(!interface_control) + to_chat(user, "ERROR: Request timed out. Check wire contacts.") + return FALSE + if(construction_state != PA_CONSTRUCTION_COMPLETE) + return FALSE + return TRUE + +/obj/machinery/particle_accelerator/control_box/ui_status(mob/user) + if(is_interactive(user)) + return ..() + return UI_CLOSE + +/obj/machinery/particle_accelerator/control_box/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "particle_accelerator", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/particle_accelerator/control_box/ui_data(mob/user) + var/list/data = list() + data["assembled"] = assembled + data["power"] = active + data["strength"] = strength + return data + +/obj/machinery/particle_accelerator/control_box/ui_act(action, params) + if(..()) + return + + switch(action) + if("power") + if(wires.is_cut(WIRE_POWER)) + return + toggle_power() + . = TRUE + if("scan") + part_scan() + . = TRUE + if("add_strength") + if(wires.is_cut(WIRE_STRENGTH)) + return + add_strength() + . = TRUE + if("remove_strength") + if(wires.is_cut(WIRE_STRENGTH)) + return + remove_strength() + . = TRUE + + update_icon() + #undef PA_CONSTRUCTION_UNSECURED #undef PA_CONSTRUCTION_UNWIRED #undef PA_CONSTRUCTION_PANEL_OPEN diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index a3f9ad5356e..da01893bbc7 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -2,6 +2,16 @@ //Please do not bother them with bugs from this port, however, as it has been modified quite a bit. //Modifications include removing the world-ending full supermatter variation, and leaving only the shard. +//Zap constants, speeds up targeting + +#define BIKE (COIL + 1) +#define COIL (ROD + 1) +#define ROD (LIVING + 1) +#define LIVING (MACHINERY + 1) +#define MACHINERY (OBJECT + 1) +#define OBJECT (LOWEST + 1) +#define LOWEST (1) + #define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty. #define OXYGEN_HEAT_PENALTY 1 #define PLUOXIUM_HEAT_PENALTY -1 @@ -73,6 +83,8 @@ ///to prevent accent sounds from layering #define SUPERMATTER_ACCENT_SOUND_MIN_COOLDOWN 2 SECONDS +#define DEFAULT_ZAP_ICON_STATE "sm_arc" + GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal @@ -83,6 +95,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) density = TRUE anchored = TRUE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + var/zap_icon = DEFAULT_ZAP_ICON_STATE var/uid = 1 var/static/gl_uid = 1 light_range = 4 @@ -302,18 +315,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "delam", /datum/mood_event/delam) if(combined_gas > MOLE_PENALTY_THRESHOLD) investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER) - if(T) + if(T) //If something fucks up we blow anyhow. This fix is 4 years old and none ever said why it's here. help. var/obj/singularity/S = new(T) S.energy = 800 S.consume(src) - else - investigate_log("has exploded.", INVESTIGATE_SUPERMATTER) - explosion(get_turf(T), explosion_power * max(gasmix_power_ratio, 0.205) * 0.5 , explosion_power * max(gasmix_power_ratio, 0.205) + 2, explosion_power * max(gasmix_power_ratio, 0.205) + 4 , explosion_power * max(gasmix_power_ratio, 0.205) + 6, 1, 1) - if(power > POWER_PENALTY_THRESHOLD) - investigate_log("has spawned additional energy balls.", INVESTIGATE_SUPERMATTER) + return //No boom for me sir + else if(power > POWER_PENALTY_THRESHOLD) + investigate_log("has spawned additional energy balls.", INVESTIGATE_SUPERMATTER) + if(T) var/obj/singularity/energy_ball/E = new(T) E.energy = power - qdel(src) + investigate_log("has exploded.", INVESTIGATE_SUPERMATTER) + explosion(get_turf(T), explosion_power * max(gasmix_power_ratio, 0.205) * 0.5 , explosion_power * max(gasmix_power_ratio, 0.205) + 2, explosion_power * max(gasmix_power_ratio, 0.205) + 4 , explosion_power * max(gasmix_power_ratio, 0.205) + 6, 1, 1) + qdel(src) + //this is here to eat arguments /obj/machinery/power/supermatter_crystal/proc/call_explode() @@ -514,24 +529,32 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //This wraps around to the begining of the function //Handle high power zaps/anomaly generation if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point) //If the power is above 5000 or if the damage is above 550 - if(removed && removed.temperature) - zap_cutoff = clamp(3000 - (power * (env.total_moles()) / 10) / env.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols - else - zap_cutoff = 1500 - //We should always be able to zap our way out of the default enclosure - //See supermatter_zap() for more details - var/range = clamp(power / env.return_pressure() * 10, 2, 8) + var/range = 4 + zap_cutoff = 1500 + if(removed && removed.return_pressure() > 0 && removed.return_temperature() > 0) + //You may be able to freeze the zapstate of the engine with good planning, we'll see + zap_cutoff = clamp(3000 - (power * (removed.total_moles()) / 10) / removed.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + //We should always be able to zap our way out of the default enclosure + //See supermatter_zap() for more details + range = clamp(power / removed.return_pressure() * 10, 2, 7) + var/flags = ZAP_SUPERMATTER_FLAGS + var/zap_count = 0 + //Deal with power zaps if(power > POWER_PENALTY_THRESHOLD) - playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) - supermatter_zap(src, range, min(power*2, 20000)) - supermatter_zap(src, range, min(power*2, 20000)) + zap_icon = DEFAULT_ZAP_ICON_STATE + zap_count += 2 if(power > SEVERE_POWER_PENALTY_THRESHOLD) - supermatter_zap(src, range, min(power*2, 20000)) + zap_count += 1 if(power > CRITICAL_POWER_PENALTY_THRESHOLD) - supermatter_zap(src, range, min(power*2, 20000)) - else if (damage > damage_penalty_point && prob(20)) + zap_count += 1 + //Now we deal with damage shit + if (damage > damage_penalty_point && prob(20)) + zap_count += 1 + + if(zap_count >= 1) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) - supermatter_zap(src, range, clamp(power*2, 4000, 20000)) + for(var/i in 1 to zap_count) + supermatter_zap(src, range, clamp(power*2, 4000, 20000), list(), flags) if(prob(15) && power > POWER_PENALTY_THRESHOLD) supermatter_pull(src, power/750) @@ -857,55 +880,94 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(PYRO_ANOMALY) new /obj/effect/anomaly/pyro(L, 200) -/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart, range = 5, zap_str, list/targets_hit = list()) +/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 4000, list/targets_hit = list(), zap_flags = ZAP_SUPERMATTER_FLAGS) + if(QDELETED(zapstart)) + return . = zapstart.dir //If the strength of the zap decays past the cutoff, we stop if(zap_str < zap_cutoff) return - var/target + var/datum/target + var/target_type = (LOWEST) var/list/arctargets = list() //Making a new copy so additons further down the recursion do not mess with other arcs - var/list/targets_copy = targets_hit.Copy() //Lets put this ourself into the do not hit list, so we don't curve back to hit the same thing twice with one arc - targets_copy += zapstart + for(var/test in oview(zapstart, range)) + if(!(zap_flags & ZAP_ALLOW_DUPLICATES) && LAZYACCESS(targets_hit, test)) + continue - for(var/obj/vehicle/ridden/bicycle/bike in oview(zapstart, range)) - if(!(bike in targets_copy) && !(bike.obj_flags & BEING_SHOCKED) && bike.can_buckle)//God's not on our side cause he hates idiots. - arctargets += bike + if(istype(test, /obj/vehicle/ridden/bicycle/)) + var/obj/vehicle/ridden/bicycle/bike = test + if(!(bike.obj_flags & BEING_SHOCKED) && bike.can_buckle)//God's not on our side cause he hates idiots. + if(target_type != BIKE) + arctargets = list() + arctargets += test + target_type = BIKE - if(!arctargets.len) - for(var/obj/machinery/power/tesla_coil/coil in oview(zapstart, range)) - if(!(coil in targets_copy) && coil.anchored && !(coil.obj_flags & BEING_SHOCKED) && !coil.panel_open && prob(70))//Diversity of death - arctargets += coil + if(target_type > COIL) + continue - if(!arctargets.len) - for(var/obj/machinery/power/grounding_rod/rod in oview(zapstart, range)) - //2 rods are safer then one, intended to keep the bolts dangourus - //If the sm puts out 2 bolts every half second, then a rod gets ignored every 5 seconds or so. - if(rod.anchored && !rod.panel_open && prob(90)) - arctargets += rod + if(istype(test, /obj/machinery/power/tesla_coil/)) + var/obj/machinery/power/tesla_coil/coil = test + if(coil.anchored && !(coil.obj_flags & BEING_SHOCKED) && !coil.panel_open && prob(70))//Diversity of death + if(target_type != COIL) + arctargets = list() + arctargets += test + target_type = COIL - if(!arctargets.len) - for(var/mob/living/Z in oview(zapstart, range)) - if(!(Z in targets_copy) && !(HAS_TRAIT(Z, TRAIT_TESLA_SHOCKIMMUNE)) && !(Z.flags_1 & SHOCKED_1) && Z.stat != DEAD && prob(20))//let's not hit all the engineers with every beam and/or segment of the arc - arctargets += Z + if(target_type > ROD) + continue - if(!arctargets.len) - for(var/obj/machinery/X in oview(zapstart, range)) - if(!(X in targets_copy) && !(X.obj_flags & BEING_SHOCKED) && prob(40)) - arctargets += X + if(istype(test, /obj/machinery/power/grounding_rod/)) + var/obj/machinery/power/grounding_rod/rod = test + //We're adding machine damaging effects, rods need to be surefire + if(rod.anchored && !rod.panel_open) + if(target_type != ROD) + arctargets = list() + arctargets += test + target_type = ROD - if(!arctargets.len) - for(var/obj/Y in oview(zapstart, range)) - if(!(Y in targets_copy) && !(Y.obj_flags & BEING_SHOCKED)) - arctargets += Y + if(target_type > LIVING) + continue + + if(istype(test, /mob/living/)) + var/mob/living/alive = test + if(!(HAS_TRAIT(alive, TRAIT_TESLA_SHOCKIMMUNE)) && !(alive.flags_1 & SHOCKED_1) && alive.stat != DEAD && prob(20))//let's not hit all the engineers with every beam and/or segment of the arc + if(target_type != LIVING) + arctargets = list() + arctargets += test + target_type = LIVING + + if(target_type > MACHINERY) + continue + + if(istype(test, /obj/machinery/)) + var/obj/machinery/machine = test + if(!(machine.obj_flags & BEING_SHOCKED) && prob(40)) + if(target_type != MACHINERY) + arctargets = list() + arctargets += test + target_type = MACHINERY + + if(target_type > OBJECT) + continue + + if(istype(test, /obj/)) + var/obj/object = test + if(!(object.obj_flags & BEING_SHOCKED)) + if(target_type != OBJECT) + arctargets = list() + arctargets += test + target_type = OBJECT if(arctargets.len)//Pick from our pool target = pick(arctargets) - if(target)//If we found something + if(!QDELETED(target))//If we found something //Do the animation to zap to it from here - zapstart.Beam(target, icon_state="sm_arc", time=5) + if(!(zap_flags & ZAP_ALLOW_DUPLICATES)) + LAZYSET(targets_hit, target, TRUE) + zapstart.Beam(target, icon_state=zap_icon, time=5) var/zapdir = get_dir(zapstart, target) if(zapdir) . = zapdir @@ -921,34 +983,43 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/obj/machinery/power/grounding_rod/rod = target //We can expect this to do very little, maybe shock the poor soul buckled to it, but that's all. //This is one of our endpoints, if the bolt hits a grounding rod, it stops jumping - rod.zap_act(zap_str, ZAP_SUPERMATTER_FLAGS, list()) + rod.zap_act(zap_str, zap_flags, list()) return else if(isliving(target))//If we got a fleshbag on our hands var/mob/living/mob = target mob.set_shocked() addtimer(CALLBACK(mob, /mob/living/proc/reset_shocked), 10) - mob.electrocute_act(rand(5,10), "Supermatter Discharge Bolt", 1, SHOCK_NOSTUN) + var/shock_damage = ((zap_flags & ZAP_MOB_DAMAGE) ? (power / 200) - 10 : rand(5,10)) + mob.electrocute_act(shock_damage, "Supermatter Discharge Bolt", 1, ((zap_flags & ZAP_MOB_STUN) ? SHOCK_TESLA : SHOCK_NOSTUN)) zap_str /= 1.5 //Meatsacks are conductive, makes working in pairs more destructive else if(isobj(target)) var/obj/junk = target - junk.zap_act(zap_str, ZAP_SUPERMATTER_FLAGS, list()) - zap_str /= 1.8 // worse then living things, better then coils - //Then we finish it all up + junk.zap_act(zap_str, zap_flags, list()) + zap_str /= 2 // worse then living things, better then coils + else + zap_str = 0 //This gotdamn variable is a boomer and keeps giving me problems var/turf/T = get_turf(target) var/pressure = max(1,T.return_air().return_pressure()) //We get our range with the strength of the zap and the pressure, the lower the former and the higher the latter the better var/new_range = clamp(zap_str / pressure * 10, 2, 7) + var/zap_count = 1 if(prob(5)) zap_str = zap_str - (zap_str/10) - supermatter_zap(target, new_range, zap_str, targets_copy) - supermatter_zap(target, new_range, zap_str, targets_copy) - else - supermatter_zap(target, new_range, zap_str, targets_copy) + zap_count += 1 + for(var/j in 1 to zap_count) + supermatter_zap(target, new_range, zap_str, targets_hit, zap_flags) #undef HALLUCINATION_RANGE #undef GRAVITATIONAL_ANOMALY #undef FLUX_ANOMALY #undef PYRO_ANOMALY +#undef BIKE +#undef COIL +#undef ROD +#undef LIVING +#undef MACHINERY +#undef OBJECT +#undef LOWEST diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index b858365445b..0bce20a3d23 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -2,24 +2,20 @@ name = "tesla bolt" icon_state = "tesla_projectile" impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - var/chain + damage = 10 //A worse lasergun var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE var/zap_range = 3 var/power = 10000 -/obj/projectile/energy/tesla/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - /obj/projectile/energy/tesla/on_hit(atom/target) . = ..() - tesla_zap(target, zap_range, power, zap_flags) + tesla_zap(src, zap_range, power, zap_flags) qdel(src) -/obj/projectile/energy/tesla/Destroy() - QDEL_NULL(chain) - return ..() +/obj/projectile/energy/tesla/process() + . = ..() + //Many coders have given their blood for this speed + tesla_zap(src, zap_range, power, zap_flags) /obj/projectile/energy/tesla/revolver name = "energy orb" @@ -27,3 +23,4 @@ /obj/projectile/energy/tesla/cannon name = "tesla orb" power = 20000 + damage = 15 //Mech man big diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 0b93f5f7533..4419a82514e 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -210,7 +210,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-7) M.AdjustSleeping(-40) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) if(!HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) M.Jitter(5) return ..() @@ -646,7 +646,7 @@ All effects don't start immediately, but rather get worse over time; the rate is shot_glass_icon_state = "toxinsspecialglass" /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(var/mob/living/M) - M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. + M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. return ..() /datum/reagent/consumable/ethanol/beepsky_smash @@ -850,7 +850,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The ultimate refreshment." /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. + M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. return ..() /datum/reagent/consumable/ethanol/barefoot @@ -1673,7 +1673,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M) M.apply_status_effect(/datum/status_effect/throat_soothed) - M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) ..() /datum/reagent/consumable/ethanol/alexander diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 3376d68798b..59e49e9bf41 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -403,26 +403,25 @@ /*Suffix: Combo of healing, prob gonna get wack REAL fast*/ /datum/reagent/medicine/C2/instabitaluri name = "Synthflesh (Instabitaluri)" - description = "Has a 100% chance of instantly healing brute and burn damage at the cost of toxicity (75% of damage healed). Touch application only." + description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only." reagent_state = LIQUID color = "#FFEBEB" /datum/reagent/medicine/C2/instabitaluri/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) - var/mob/living/carbon/Carbies = M - if (Carbies.stat == DEAD) + var/mob/living/carbon/carbies = M + if (carbies.stat == DEAD) show_message = 0 if(method in list(PATCH, TOUCH)) - var/harmies = min(Carbies.getBruteLoss(),Carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) - var/burnies = min(Carbies.getFireLoss(),Carbies.adjustFireLoss(-1.25 * reac_volume)*-1) - Carbies.adjustToxLoss((harmies+burnies)*0.66) + var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) + var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) + carbies.adjustToxLoss((harmies+burnies)*0.66) if(show_message) - to_chat(Carbies, "You feel your burns and bruises healing! It stings like hell!") - SEND_SIGNAL(Carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - //Has to be at less than TRESHOLD_UNHUSK burn damage and have 100 isntabitaluri before unhusking. Corpses dont metabolize. - if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && Carbies.getFireLoss() < TRESHOLD_UNHUSK && Carbies.reagents.has_reagent(/datum/reagent/medicine/C2/instabitaluri, 100)) - Carbies.cure_husk("burn") - Carbies.visible_message("With most of the burnt off flesh replaced, [Carbies] looks a lot healthier.") + to_chat(carbies, "You feel your burns and bruises healing! It stings like hell!") + SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/C2/instabitaluri) + reac_volume >= 100)) + carbies.cure_husk("burn") + carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or a golem or something ..() return TRUE diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index a2d7696566d..55d0c5c207a 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -257,7 +257,7 @@ M.drowsyness = max(0,M.drowsyness-3) M.AdjustSleeping(-40, FALSE) //310.15 is the normal bodytemp. - M.adjust_bodytemperature(25 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(25 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) if(holder.has_reagent(/datum/reagent/consumable/frostoil)) holder.remove_reagent(/datum/reagent/consumable/frostoil, 5) ..() @@ -280,7 +280,7 @@ M.AdjustSleeping(-20, FALSE) if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1, 0) - M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) ..() . = 1 @@ -325,7 +325,7 @@ M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) M.AdjustSleeping(-40, FALSE) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) M.Jitter(5) ..() . = 1 @@ -346,7 +346,7 @@ M.AdjustSleeping(-40, FALSE) if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1, 0) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() . = 1 @@ -361,7 +361,7 @@ /datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-5) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/nuka_cola @@ -388,7 +388,7 @@ M.dizziness +=1.5 M.drowsyness = 0 M.AdjustSleeping(-40, FALSE) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() . = 1 @@ -415,7 +415,7 @@ M.dizziness +=1 M.drowsyness = 0 M.AdjustSleeping(-40, FALSE) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/spacemountainwind @@ -430,7 +430,7 @@ /datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-7) M.AdjustSleeping(-20, FALSE) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) M.Jitter(5) ..() . = 1 @@ -446,7 +446,7 @@ /datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-6) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/space_up @@ -460,7 +460,7 @@ /datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/lemon_lime @@ -474,7 +474,7 @@ /datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() @@ -488,7 +488,7 @@ glass_desc = "Goes well with a Vlad's salad." /datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/shamblers @@ -501,7 +501,7 @@ glass_desc = "Mmm mm, shambly." /datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/sodawater name = "Soda Water" @@ -515,7 +515,7 @@ /datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/tonic @@ -531,7 +531,7 @@ M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) M.AdjustSleeping(-40, FALSE) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() . = 1 @@ -550,7 +550,7 @@ M.dizziness +=1 M.drowsyness = 0 M.AdjustSleeping(-40, FALSE) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/L) @@ -579,7 +579,7 @@ glass_desc = "Generally, you're supposed to put something else in there too..." /datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/soy_latte @@ -596,7 +596,7 @@ M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) M.SetSleeping(0, FALSE) - M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) M.Jitter(5) if(M.getBruteLoss() && prob(20)) M.heal_bodypart_damage(1,0, 0) @@ -617,7 +617,7 @@ M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) M.SetSleeping(0, FALSE) - M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) M.Jitter(5) if(M.getBruteLoss() && prob(20)) M.heal_bodypart_damage(1,0, 0) @@ -742,7 +742,7 @@ glass_desc = "It's grape (soda)!" /datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/milk/chocolate_milk @@ -763,7 +763,7 @@ glass_desc = "A favorite winter drink to warm you up." /datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) ..() /datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/M) @@ -828,7 +828,7 @@ glass_desc = "A classic space-American vanilla flavored soft drink." /datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) ..() /datum/reagent/consumable/sol_dry diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 7d38d02018e..6c6617a3ffb 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -458,7 +458,7 @@ taste_description = "imprisonment" /datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal()) ..() /datum/reagent/consumable/hell_ramen diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index e8d78fdaa69..931f9575af4 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -20,10 +20,10 @@ color = "#DB90C6" /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) - if(M.bodytemperature > BODYTEMP_NORMAL) - M.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) - else if(M.bodytemperature < (BODYTEMP_NORMAL + 1)) - M.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE)) + M.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE)) + else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1)) + M.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE)) ..() /datum/reagent/medicine/adminordrazine //An OP chemical for admins @@ -203,7 +203,7 @@ . = ..() if(iscarbon(M)) var/mob/living/carbon/patient = M - if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < TRESHOLD_UNHUSK) //One carp yields 12u rezadone. + if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone. patient.cure_husk("burn") patient.visible_message("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.") diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index ce8a46ea879..fa718344e94 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -316,3 +316,13 @@ build_path = /obj/item/stock_parts/subspace/transmitter category = list("Stock Parts") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/card_reader + name = "Card Reader" + desc = "A small magnetic card reader, used for devices that take and transmit holocredits." + id = "c-reader" + build_type = PROTOLATHE + materials = list(/datum/material/iron=50, /datum/material/glass=10) + build_path = /obj/item/stock_parts/card_reader + category = list("Stock Parts") + departmental_flags = DEPARTMENTAL_FLAG_ALL diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index b9e9e558813..706a048be49 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -36,15 +36,15 @@ rogue_types = list(/datum/nanite_program/skin_decay) /datum/nanite_program/temperature/check_conditions() - if(host_mob.bodytemperature > (BODYTEMP_NORMAL - 30) && host_mob.bodytemperature < (BODYTEMP_NORMAL + 30)) + if(host_mob.bodytemperature > (host_mob.get_body_temp_normal(apply_change=FALSE) - 30) && host_mob.bodytemperature < (host_mob.get_body_temp_normal(apply_change=FALSE) + 30)) return FALSE return ..() /datum/nanite_program/temperature/active_effect() - if(host_mob.bodytemperature > BODYTEMP_NORMAL) - host_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) - else if(host_mob.bodytemperature < (BODYTEMP_NORMAL + 1)) - host_mob.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + if(host_mob.bodytemperature > host_mob.get_body_temp_normal(apply_change=FALSE)) + host_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, host_mob.get_body_temp_normal(apply_change=FALSE)) + else if(host_mob.bodytemperature < (host_mob.get_body_temp_normal(apply_change=FALSE) + 1)) + host_mob.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, host_mob.get_body_temp_normal(apply_change=FALSE)) /datum/nanite_program/purging name = "Blood Purification" diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 352d3010120..ac082f11d6e 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -317,6 +317,12 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi desc = "A large piece of equipment used to open a window into the subspace dimension." custom_materials = list(/datum/material/iron=50) +/obj/item/stock_parts/card_reader + name = "card reader" + icon_state = "card_reader" + desc = "A small magnetic card reader, used for devices that take and transmit holocredits." + custom_materials = list(/datum/material/iron=50, /datum/material/glass=10) + /obj/item/research//Makes testing much less of a pain -Sieve name = "research" icon = 'icons/obj/stock_parts.dmi' diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 54095e6b354..e2e6f165fc8 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -8,7 +8,7 @@ display_name = "Basic Research Technology" description = "NT default research technologies." // Default research tech, prevents bricking - design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "salestagger", "handlabel", "packagewrap", + design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "c-reader", "desttagger", "salestagger", "handlabel", "packagewrap", "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", "space_heater", "bucket", "sec_rshot", "sec_beanbag_slug", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "rglass", "plasteel", "plastitanium", "plasmaglass", "plasmareinforcedglass", "titaniumglass", "plastitaniumglass", "plastic_knife", "plastic_fork", "plastic_spoon") diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index be3276bbeb2..0344ec1fe9a 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -471,7 +471,7 @@ datum/status_effect/rebreathing/tick() colour = "orange" /datum/status_effect/stabilized/orange/tick() - var/body_temperature_difference = BODYTEMP_NORMAL - owner.bodytemperature + var/body_temperature_difference = owner.get_body_temp_normal(apply_change=FALSE) - owner.bodytemperature owner.adjust_bodytemperature(min(5,body_temperature_difference)) return ..() diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 791089924e1..b372e58b0ad 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -569,9 +569,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_weapons/martialarts name = "Martial Arts Scroll" desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat, \ - deflecting all ranged weapon fire, but you also refuse to use dishonorable ranged weaponry." + gain skin as hard as steel and swat bullets from the air, but you also refuse to use dishonorable ranged weaponry." item = /obj/item/book/granter/martial/carp - cost = 17 + cost = 15 surplus = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 2c35f6d26e2..8c2f32671fb 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(vending_products) new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) - C.AddElement(/datum/element/squish, 18 SECONDS) + C.AddElement(/datum/element/squish, 80 SECONDS) else L.visible_message("[L] is crushed by [src]!", \ "You are crushed by [src]!") diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 3a5bcdff21c..3a1d24021d3 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -348,7 +348,7 @@ /obj/item/clothing/suit/chaplainsuit/nun = 1, /obj/item/clothing/head/nun_hood = 1, /obj/item/clothing/suit/chaplainsuit/holidaypriest = 1, - /obj/item/clothing/suit/hooded/chaplainsuit/monkfrock = 1, + /obj/item/clothing/suit/hooded/chaplainsuit/monkhabit = 1, /obj/item/storage/fancy/candle_box = 2, /obj/item/clothing/head/kippah = 3, /obj/item/clothing/suit/chaplainsuit/whiterobe = 1, diff --git a/html/changelog.html b/html/changelog.html index 7fe7d16ce82..e4c042e23eb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,145 @@ -->
+

29 February 2020

+

ATHATH updated:

+ +

ArcaneDefence updated:

+ +

ArcaneMusic updated:

+ +

Arkatos updated:

+ +

Arkatos and Skoglol updated:

+ +

Arkatos and actioninja updated:

+ +

Arkatos1 updated:

+ +

Bumtickley00 updated:

+ +

Farquaar updated:

+ +

LemonInTheDark updated:

+ +

Mickyan updated:

+ +

Ryll/Shaps updated:

+ +

ShizCalev updated:

+ +

SteelSlayer updated:

+ +

Time-Green updated:

+ +

Twaticus updated:

+ +

Yenwodyah updated:

+ +

bobbahbrown updated:

+ +

cacogen updated:

+ +

fluffe9911 updated:

+ +

improvedname updated:

+ +

nemvar updated:

+ +

nightred updated:

+ +

pireamaineach updated:

+ +

tralezab updated:

+ +

24 February 2020

AffectedArc07 updated:

GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 16424ac2c72..ca0567b9d61 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -37390,3 +37390,119 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. nightred: - bugfix: space ninja space suit to warm the wearer now, no more button for that - bugfix: space ninja cell size is now reverted to original size +2020-02-29: + ATHATH: + - bugfix: Synthflesh now unhusks a burn husked corpse on reaching 100u instead of + on the next application. Still requires <50 burn damage after application. + - bugfix: Splashing synthflesh on a burn husked corpse will unhusk it if the total + of synthflesh in the body and synthflesh being splashed is 100 or more. Still + requires <50 burn damage after application. + - bugfix: Updates the description of synthflesh to reflect what it actually does + more accurately. The amount of tox damage dealt is 66% of the amount of brute + and burn damage healed, not 75%. + ArcaneDefence: + - bugfix: The recipe for Carp Classic cigarettes has been brought up to company + standards. + ArcaneMusic: + - rscadd: Nanotrasen's Customer Service Division has developed a new, shielded product + cage to better allow for sale of food and drink items on station, called the + "Vend-A-Tray". + - rscadd: Vend-A-Trays are made with display case frames and a Card Reader stock + part, now available at all protolathes. + - rscadd: The Nanotrasen Deliveries and Handling League (NDHL) have been noticing + a decrease in station export profits, and the crate recycling program just isn't + cutting it. New Sales Taggers have been deployed in all station cargo setups. + - rscadd: Wrapped items can be zapped with Sales Taggers in order to give the account + holder a portion of the profit on a sale. + - tweak: Wooden Fermenting barrels now cost 8 wooden planks to craft, down from + 30. + - balance: Wooden Fermenting barrels can now be made in the stack crafting menu, + in addition to the crafting menu. + Arkatos: + - rscadd: Electropack now uses tgui. + Arkatos and Skoglol: + - rscadd: Gas Turbine now uses tgui. + Arkatos and actioninja: + - rscadd: Malfunction Modules Picker now uses tgui. + Arkatos1: + - rscadd: Particle Accelerator now uses tgui. + Bumtickley00: + - bugfix: Helbital now heals brute instead of dealing brute + Farquaar: + - tweak: Felinid speech is now audibly distinct from human speech. + LemonInTheDark: + - rscadd: Tesla zaps will now turn tesla generators into teslas. + - bugfix: Explosions might be a little less common, I've fixed the thing where machines + would explode with no visible arc to the object. + - bugfix: Fixes a whole bunch of issues, teslas make more sense now + - code_imp: Makes my shitcode better + - tweak: The tesla revolver/cannon's projectiles now arc while in flight. + - balance: The projectiles now deal light burn damage on hit. + - bugfix: Zaps no longer infinite chain after hitting coils. + Mickyan: + - tweak: Added plumbing room to Deltastation + - tweak: Added the art gallery to Deltastation + - bugfix: Deltastation's disposal system will no longer accidentally dump garbage + into the morgue + - tweak: Added the art gallery to Pubbystation + Ryll/Shaps: + - tweak: Embeddables have been reworked and given new functionality. + - rscadd: Adds toy shurikens for pranks and shock shurikens for less lethal takedowns. + - rscadd: Adds sticky tape that lets you stick random junk to people! How will anyone + believe the Captain's cries that he's not actually a boomer when there's a can + of Monkey Energy stuck to his head? + - refactor: Embedding functionality has been made an element, with new support for + dealing a mix of brute and stamina damage, and a separate pain check for on-move. + - rscadd: Officer Beepsky has been promoted to Commander Beepsky! He is now officially + in command of all of the bots on the station, who will now show him proper respect + by saluting him when they cross paths. + - tweak: Vendors make you squish for longer + ShizCalev: + - bugfix: Blindfolds now properly blind you! + SteelSlayer: + - bugfix: Fixes some mixed up in-hand sprites for the airlock painter + - code_imp: Gives the airlock painter's paint selection popup menu a cancel button + - code_imp: Improves airlock painter code. Makes it easier to add new paintjob options + and cuts down on duplicate code. + Time-Green: + - bugfix: reaction chamber empties again + - rscadd: adds the snail achievement to genetics + - bugfix: fixes gastrolisis runtime + Twaticus: + - imageadd: bola inhand sprites + Yenwodyah: + - bugfix: Removed geneticists from the medbay radio channel + - bugfix: Geneticists are on the science payroll now + bobbahbrown: + - tweak: Nanotrasen is now manufacturing wigs with waterproof dye -- shower with + new-found confidence! + - bugfix: Wigs can no longer have their color changed when not being held. + - bugfix: Fixed unsanitized blob broadcast allowing html injection + cacogen: + - tweak: Box now has a Service Door between hydroponics and the kitchen instead + of the desk + fluffe9911: + - rscadd: King Goat achievements + - tweak: King Goat spells per phase lowered from 10 to 5 + - tweak: King Goat goes back to normal speed after casting super speed spell 2x + faster + - bugfix: Hiro teleport no longer works in NOTELEPORT areas + - bugfix: moved king goat file to proper area + - tweak: better goat hoof and goat gun sprite courtesy of Usnavi! + improvedname: + - rscdel: Removes magicarp bolt of change + nemvar: + - spellcheck: Renamed "My mental status" to "My current sanity" in the mood printout. + nightred: + - balance: natural body temp stabilization is more in line with expected results + - bugfix: fever/chills now cause your body temp to be changed based on the severity + of the illness + - bugfix: mob code now uses the species proper body temp instead of the default + body temp + - refactor: added new interface for body temp changes + pireamaineach: + - imageadd: Resprites several plasmaman items. add:Adds plasmagloves and fixes clipping + on the plasmaman suit. + - balance: Envirogloves now have insul-tier permeability. + tralezab: + - tweak: transit tube pods will now throw you when they leave the transit tube diff --git a/html/changelogs/AutoChangeLog-pr-48959.yml b/html/changelogs/AutoChangeLog-pr-48959.yml deleted file mode 100644 index ea18a285c54..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48959.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Ryll/Shaps" -delete-after: True -changes: - - tweak: "Embeddables have been reworked and given new functionality." - - rscadd: "Adds toy shurikens for pranks and shock shurikens for less lethal takedowns." - - rscadd: "Adds sticky tape that lets you stick random junk to people! How will anyone believe the Captain's cries that he's not actually a boomer when there's a can of Monkey Energy stuck to his head?" - - refactor: "Embedding functionality has been made an element, with new support for dealing a mix of brute and stamina damage, and a separate pain check for on-move." diff --git a/html/changelogs/AutoChangeLog-pr-49111.yml b/html/changelogs/AutoChangeLog-pr-49111.yml deleted file mode 100644 index d14c2825234..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49111.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - rscadd: "The Nanotrasen Deliveries and Handling League (NDHL) have been noticing a decrease in station export profits, and the crate recycling program just isn't cutting it. New Sales Taggers have been deployed in all station cargo setups." - - rscadd: "Wrapped items can be zapped with Sales Taggers in order to give the account holder a portion of the profit on a sale." diff --git a/html/changelogs/AutoChangeLog-pr-49159.yml b/html/changelogs/AutoChangeLog-pr-49159.yml deleted file mode 100644 index d788feb7dab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49159.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "fluffe9911" -delete-after: True -changes: - - rscadd: "King Goat achievements" - - tweak: "King Goat spells per phase lowered from 10 to 5" - - tweak: "King Goat goes back to normal speed after casting super speed spell 2x faster" - - bugfix: "Hiro teleport no longer works in NOTELEPORT areas" - - bugfix: "moved king goat file to proper area" - - tweak: "better goat hoof and goat gun sprite courtesy of Usnavi!" diff --git a/html/changelogs/AutoChangeLog-pr-49260.yml b/html/changelogs/AutoChangeLog-pr-49260.yml deleted file mode 100644 index 9a60b448b09..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49260.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "LemonInTheDark" -delete-after: True -changes: - - rscadd: "Tesla zaps will now turn tesla generators into teslas." - - bugfix: "Explosions might be a little less common, I've fixed the thing where machines would explode with no visible arc to the object." - - bugfix: "Fixes a whole bunch of issues, teslas make more sense now" - - code_imp: "Makes my shitcode better" diff --git a/html/changelogs/AutoChangeLog-pr-49406.yml b/html/changelogs/AutoChangeLog-pr-49406.yml deleted file mode 100644 index ed5f08ba689..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49406.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "pireamaineach" -delete-after: True -changes: - - imageadd: "Resprites several plasmaman items. -add:Adds plasmagloves and fixes clipping on the plasmaman suit." diff --git a/html/changelogs/AutoChangeLog-pr-49475.yml b/html/changelogs/AutoChangeLog-pr-49475.yml deleted file mode 100644 index 0eba9655378..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49475.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Yenwodyah" -delete-after: True -changes: - - bugfix: "Removed geneticists from the medbay radio channel" - - bugfix: "Geneticists are on the science payroll now" diff --git a/html/changelogs/AutoChangeLog-pr-49484.yml b/html/changelogs/AutoChangeLog-pr-49484.yml deleted file mode 100644 index f0fa2e74793..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49484.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - tweak: "Wooden Fermenting barrels now cost 8 wooden planks to craft, down from 30." - - balance: "Wooden Fermenting barrels can now be made in the stack crafting menu, in addition to the crafting menu." diff --git a/html/changelogs/AutoChangeLog-pr-49485.yml b/html/changelogs/AutoChangeLog-pr-49485.yml deleted file mode 100644 index 6faa88bfd56..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49485.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos and Skoglol" -delete-after: True -changes: - - rscadd: "Gas Turbine now uses tgui." diff --git a/html/changelogs/AutoChangeLog-pr-49499.yml b/html/changelogs/AutoChangeLog-pr-49499.yml deleted file mode 100644 index f178b3cec8b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49499.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "cacogen" -delete-after: True -changes: - - tweak: "Box now has a Service Door between hydroponics and the kitchen instead of the desk" diff --git a/html/changelogs/AutoChangeLog-pr-49504.yml b/html/changelogs/AutoChangeLog-pr-49504.yml deleted file mode 100644 index 5f016498f39..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49504.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Time-Green" -delete-after: True -changes: - - bugfix: "reaction chamber empties again" diff --git a/html/changelogs/AutoChangeLog-pr-49507.yml b/html/changelogs/AutoChangeLog-pr-49507.yml deleted file mode 100644 index bc4000720ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49507.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mickyan" -delete-after: True -changes: - - tweak: "Added plumbing room to Deltastation" diff --git a/html/changelogs/AutoChangeLog-pr-49508.yml b/html/changelogs/AutoChangeLog-pr-49508.yml deleted file mode 100644 index 735e4b7e84c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49508.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "improvedname" -delete-after: True -changes: - - rscdel: "Removes magicarp bolt of change" diff --git a/html/changelogs/AutoChangeLog-pr-49509.yml b/html/changelogs/AutoChangeLog-pr-49509.yml deleted file mode 100644 index a5168b01b8a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49509.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Bumtickley00" -delete-after: True -changes: - - bugfix: "Helbital now heals brute instead of dealing brute" diff --git a/html/changelogs/AutoChangeLog-pr-49510.yml b/html/changelogs/AutoChangeLog-pr-49510.yml deleted file mode 100644 index 2d9910bd56b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49510.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Electropack now uses tgui." diff --git a/html/changelogs/AutoChangeLog-pr-49515.yml b/html/changelogs/AutoChangeLog-pr-49515.yml deleted file mode 100644 index 52d70ffd014..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49515.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Time-Green" -delete-after: True -changes: - - rscadd: "adds the snail achievement to genetics" diff --git a/html/changelogs/AutoChangeLog-pr-49516.yml b/html/changelogs/AutoChangeLog-pr-49516.yml deleted file mode 100644 index cacc4b7159e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49516.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Time-Green" -delete-after: True -changes: - - bugfix: "fixes gastrolisis runtime" diff --git a/html/changelogs/AutoChangeLog-pr-49517.yml b/html/changelogs/AutoChangeLog-pr-49517.yml deleted file mode 100644 index 652997daf60..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49517.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mickyan" -delete-after: True -changes: - - tweak: "Added the art gallery to Deltastation" diff --git a/html/changelogs/AutoChangeLog-pr-49524.yml b/html/changelogs/AutoChangeLog-pr-49524.yml new file mode 100644 index 00000000000..70274ecf7f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49524.yml @@ -0,0 +1,11 @@ +author: "NecromancerAnne" +delete-after: True +changes: + - tweak: "Completely reworked Sleeping Carp" + - balance: "Sleeping Carp now costs 15TC." + - balance: "Sleeping Carp users are really goddamn durable." + - balance: "Sleeping Carp users have less moves but shorter combos and more ultraviolence." + - balance: "Carp faction. Space walking-lite." + - balance: "Sleeping Carp users need to be in throw mode to deflect ranged attacks." + - balance: "Sleeping Carp users are immune to objects that puncture the skin." + - balance: "Stun batons are now apply_damage instead of applyStaminaLoss. This might change some things." diff --git a/html/changelogs/AutoChangeLog-pr-49526.yml b/html/changelogs/AutoChangeLog-pr-49526.yml deleted file mode 100644 index a650e3b323d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49526.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "bobbahbrown" -delete-after: True -changes: - - tweak: "Nanotrasen is now manufacturing wigs with waterproof dye -- shower with new-found confidence!" - - bugfix: "Wigs can no longer have their color changed when not being held." diff --git a/html/changelogs/AutoChangeLog-pr-49532.yml b/html/changelogs/AutoChangeLog-pr-49532.yml deleted file mode 100644 index 5de00757ee4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49532.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos and actioninja" -delete-after: True -changes: - - rscadd: "Malfunction Modules Picker now uses tgui." diff --git a/html/changelogs/AutoChangeLog-pr-49541.yml b/html/changelogs/AutoChangeLog-pr-49541.yml deleted file mode 100644 index fcbe4c6cd49..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49541.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Blindfolds now properly blind you!" diff --git a/html/changelogs/AutoChangeLog-pr-49553.yml b/html/changelogs/AutoChangeLog-pr-49553.yml deleted file mode 100644 index 740b5853f53..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49553.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nemvar" -delete-after: True -changes: - - spellcheck: "Renamed \"My mental status\" to \"My current sanity\" in the mood printout." diff --git a/html/changelogs/AutoChangeLog-pr-49561.yml b/html/changelogs/AutoChangeLog-pr-49561.yml deleted file mode 100644 index 2c071071822..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49561.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "bobbahbrown" -delete-after: True -changes: - - bugfix: "Fixed unsanitized blob broadcast allowing html injection" diff --git a/html/changelogs/AutoChangeLog-pr-49585.yml b/html/changelogs/AutoChangeLog-pr-49585.yml deleted file mode 100644 index d3ddef84f98..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49585.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ryll/Shaps" -delete-after: True -changes: - - rscadd: "Officer Beepsky has been promoted to Commander Beepsky! He is now officially in command of all of the bots on the station, who will now show him proper respect by saluting him when they cross paths." diff --git a/html/changelogs/AutoChangeLog-pr-49593.yml b/html/changelogs/AutoChangeLog-pr-49593.yml deleted file mode 100644 index 814826bc3a9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49593.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LemonInTheDark" -delete-after: True -changes: - - bugfix: "Zaps no longer infinite chain after hitting coils." diff --git a/html/changelogs/AutoChangeLog-pr-49595.yml b/html/changelogs/AutoChangeLog-pr-49595.yml deleted file mode 100644 index 3855bd876c6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49595.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mickyan" -delete-after: True -changes: - - bugfix: "Deltastation's disposal system will no longer accidentally dump garbage into the morgue" diff --git a/icons/mob/clothing/under/plasmaman.dmi b/icons/mob/clothing/under/plasmaman.dmi index 53e2c7a0fc5..266f5e4bc14 100644 Binary files a/icons/mob/clothing/under/plasmaman.dmi and b/icons/mob/clothing/under/plasmaman.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index d7d7470a5bc..b53905cb2d4 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/thrown_lefthand.dmi b/icons/mob/inhands/weapons/thrown_lefthand.dmi new file mode 100644 index 00000000000..0fc6ea58a54 Binary files /dev/null and b/icons/mob/inhands/weapons/thrown_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/thrown_righthand.dmi b/icons/mob/inhands/weapons/thrown_righthand.dmi new file mode 100644 index 00000000000..ba33c217ac2 Binary files /dev/null and b/icons/mob/inhands/weapons/thrown_righthand.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index c8ee39ede6d..0d487ca493a 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index fbc8be5474b..d71a7625213 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/sound/effects/cashregister.ogg b/sound/effects/cashregister.ogg new file mode 100644 index 00000000000..fa1f29f1de2 Binary files /dev/null and b/sound/effects/cashregister.ogg differ diff --git a/tgui/packages/tgui-dev-server/link/server.js b/tgui/packages/tgui-dev-server/link/server.js index 4d0e22d3413..652d403973f 100644 --- a/tgui/packages/tgui-dev-server/link/server.js +++ b/tgui/packages/tgui-dev-server/link/server.js @@ -29,10 +29,13 @@ export const broadcastMessage = (link, msg) => { } }; -const deserializeObject = obj => { - return JSON.parse(obj, (key, value) => { +const deserializeObject = str => { + return JSON.parse(str, (key, value) => { if (typeof value === 'object' && value !== null) { if (value.__error__) { + if (!value.stack) { + return value.string; + } return retrace(value.stack); } if (value.__number__) { @@ -102,7 +105,7 @@ const setupHttpLink = () => { body += chunk.toString(); }); req.on('end', () => { - const msg = JSON.parse(body); + const msg = deserializeObject(body); handleLinkMessage(msg); res.end(); }); diff --git a/tgui/packages/tgui/interfaces/Bepis.js b/tgui/packages/tgui/interfaces/Bepis.js index bc47d59ca77..71ba5c8cb64 100644 --- a/tgui/packages/tgui/interfaces/Bepis.js +++ b/tgui/packages/tgui/interfaces/Bepis.js @@ -87,10 +87,10 @@ export const Bepis = props => {
- Average technology cost: {data.mean_value} + Average technology cost: {data.mean_value} - Current chance of Success: Est. {data.success_estimate}% + Current chance of Success: Est. {data.success_estimate}% {data.error_name && ( diff --git a/tgui/packages/tgui/interfaces/Canvas.js b/tgui/packages/tgui/interfaces/Canvas.js index b30639697c2..9571d94e225 100644 --- a/tgui/packages/tgui/interfaces/Canvas.js +++ b/tgui/packages/tgui/interfaces/Canvas.js @@ -73,7 +73,7 @@ class PaintCanvas extends Component { height={y_size || 300} {...rest} onClick={e => this.clickwrapper(e)}> - Canvas failed to render. + Canvas failed to render. ); } diff --git a/tgui/packages/tgui/interfaces/GravityGenerator.js b/tgui/packages/tgui/interfaces/GravityGenerator.js index 9fbf263a381..080ac327e19 100644 --- a/tgui/packages/tgui/interfaces/GravityGenerator.js +++ b/tgui/packages/tgui/interfaces/GravityGenerator.js @@ -55,7 +55,7 @@ export const GravityGenerator = props => { )} {charging_state === 2 && ( - Discharging + Discharging )} diff --git a/tgui/packages/tgui/interfaces/HypnoChair.js b/tgui/packages/tgui/interfaces/HypnoChair.js index 00ef2e819dc..6348ca272e0 100644 --- a/tgui/packages/tgui/interfaces/HypnoChair.js +++ b/tgui/packages/tgui/interfaces/HypnoChair.js @@ -12,7 +12,7 @@ export const HypnoChair = props => { The Enhanced Interrogation Chamber is designed to induce a deep-rooted trance trigger into the subject. Once the procedure is complete, by using the implanted trigger phrase, the authorities are able to - ensure immediate and complete obedience and truthfulness. + ensure immediate and complete obedience and truthfulness.
{ )}> {language.desc} {' '} - Key: ,{language.key} + Key: ,{language.key} {' '} {!!language.shadow && '(gained from mob)'} {' '} diff --git a/tgui/packages/tgui/interfaces/Launchpad.js b/tgui/packages/tgui/interfaces/Launchpad.js index e96ab310f85..781f6b3dd2f 100644 --- a/tgui/packages/tgui/interfaces/Launchpad.js +++ b/tgui/packages/tgui/interfaces/Launchpad.js @@ -154,7 +154,7 @@ export const LaunchpadControl = props => { inline bold mr={1}> - Y: + Y: {
{data.user && ( - Welcome, {data.user.name || "Unknown"}, + Welcome, {data.user.name || "Unknown"}, {' '} {data.user.job || "Unemployed"}!
- Your balance is {data.user.points} mining points. + Your balance is {data.user.points} mining points.
) || ( - No registered ID card!
- Please contact your local HoP! + No registered ID card!
+ Please contact your local HoP!
)}
diff --git a/tgui/packages/tgui/interfaces/NaniteRemote.js b/tgui/packages/tgui/interfaces/NaniteRemote.js index ebe1a635858..9abc4c2dbd4 100644 --- a/tgui/packages/tgui/interfaces/NaniteRemote.js +++ b/tgui/packages/tgui/interfaces/NaniteRemote.js @@ -109,16 +109,16 @@ export const NaniteRemote = props => { - Name + Name - Mode + Mode - Code + Code - Relay + Relay {saved_settings.map(setting => ( @@ -156,7 +156,7 @@ export const NaniteRemote = props => {
) : ( - No settings currently saved + No settings currently saved )}
diff --git a/tgui/packages/tgui/interfaces/NtosAiRestorer.js b/tgui/packages/tgui/interfaces/NtosAiRestorer.js index ee68bbd5c41..a50bd41034b 100644 --- a/tgui/packages/tgui/interfaces/NtosAiRestorer.js +++ b/tgui/packages/tgui/interfaces/NtosAiRestorer.js @@ -61,7 +61,7 @@ export const NtosAiRestorer = props => { fontSize="20px" color="good" mt={1}> - RECONSTRUCTION IN PROGRESS + RECONSTRUCTION IN PROGRESS )}