diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index b81f55be21..612d4b757c 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -12995,22 +12995,35 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/chapel/main) "aCP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/grown/harebell{ + pixel_y = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aCQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/hydroponics/soil, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 3 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/grass, /area/chapel/main) "aCR" = ( /turf/closed/wall, @@ -13536,7 +13549,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -13556,35 +13569,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEl" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aEm" = ( -/obj/machinery/door/window{ - dir = 8; - name = "Mass Driver"; - req_access_txt = "22" +/obj/structure/bookcase, +/obj/machinery/camera{ + c_tag = "Chapel North" }, -/obj/machinery/mass_driver{ - dir = 4; - id = "chapelgun"; - name = "Holy Driver" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEn" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aEz" = ( /obj/machinery/power/apc{ @@ -13978,16 +13980,10 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aFA" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/computer/pod/old{ - density = 0; - icon = 'icons/obj/airlock_machines.dmi'; - icon_state = "airlock_control_standby"; - id = "chapelgun"; - name = "Mass Driver Controller"; - pixel_x = 24 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aFB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -14617,7 +14613,7 @@ departmentType = 2; pixel_y = 30 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aGV" = ( /obj/structure/disposalpipe/segment{ @@ -14652,7 +14648,7 @@ /obj/machinery/airalarm{ pixel_y = 25 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aGZ" = ( /obj/machinery/door/airlock/security{ @@ -14703,7 +14699,7 @@ pixel_y = 25 }, /obj/machinery/vending/wardrobe/chap_wardrobe, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aHg" = ( /obj/machinery/light_switch{ @@ -14712,7 +14708,7 @@ /obj/machinery/camera{ c_tag = "Chapel Office" }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aHh" = ( /obj/structure/cable{ @@ -14724,9 +14720,9 @@ /turf/open/floor/plasteel, /area/gateway) "aHi" = ( -/obj/structure/closet/crate/coffin, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" }, /turf/open/floor/plasteel/dark, /area/chapel/office) @@ -14743,42 +14739,47 @@ /turf/open/floor/plasteel, /area/gateway) "aHk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aHl" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/door/window/eastleft{ - name = "Coffin Storage"; - req_access_txt = "22" +/obj/structure/chair/comfy/plywood, +/obj/machinery/light/floor, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1480; + name = "Confessional Intercom"; + pixel_x = 25 }, +/obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plasteel/dark, /area/chapel/office) "aHm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/lattice, +/turf/closed/wall, /area/chapel/main) "aHn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/mass_driver{ + dir = 4; + id = "chapelgun"; + name = "Holy Driver" }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) -"aHo" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/food/snacks/grown/poppy, -/obj/item/reagent_containers/food/snacks/grown/harebell, -/turf/open/floor/plasteel/chapel{ - dir = 4 +/obj/machinery/door/window{ + dir = 8; + name = "Mass Driver"; + req_access_txt = "22" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/area/chapel/main) -"aHq" = ( -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/chapel/main) "aHu" = ( @@ -15278,9 +15279,14 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "aIz" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/grimy, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/table/wood, +/obj/item/storage/crayons{ + pixel_y = 8 + }, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aIB" = ( /obj/structure/bodycontainer/crematorium{ @@ -15293,20 +15299,16 @@ /area/chapel/office) "aIC" = ( /obj/effect/landmark/start/chaplain, -/obj/structure/chair, -/turf/open/floor/plasteel/grimy, -/area/chapel/office) -"aID" = ( -/obj/structure/closet/crate/coffin, -/obj/structure/window/reinforced{ +/obj/structure/chair/comfy/plywood, +/obj/structure/disposalpipe/segment{ dir = 4 }, +/turf/open/floor/carpet, +/area/chapel/office) +"aID" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plasteel/dark, /area/chapel/office) -"aIE" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/chapel, -/area/chapel/main) "aIH" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -15328,7 +15330,7 @@ /area/construction/mining/aux_base) "aII" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aIJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -15783,15 +15785,14 @@ /area/hydroponics) "aJM" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, /obj/structure/disposalpipe/segment, -/obj/item/nullrod, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/item/flashlight/lamp{ + pixel_y = 15 + }, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aJO" = ( /obj/structure/table, @@ -15825,39 +15826,44 @@ /area/library) "aJT" = ( /obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/storage/crayons, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/item/pen/fountain{ + pixel_y = 4 + }, +/turf/open/floor/carpet, /area/chapel/office) "aJU" = ( /obj/structure/table/wood, -/obj/item/pen, -/obj/item/reagent_containers/food/drinks/bottle/holywater, +/obj/item/reagent_containers/food/drinks/bottle/holywater{ + pixel_x = 9; + pixel_y = 4 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/item/nullrod{ + pixel_x = -15; + pixel_y = 3 + }, +/turf/open/floor/carpet, /area/chapel/office) "aJV" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/door/window/eastleft{ - dir = 8; - name = "Coffin Storage"; - req_access_txt = "22" +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/turf/open/floor/plating, +/area/chapel/main) "aJW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aJX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -15916,10 +15922,10 @@ /turf/open/floor/plasteel, /area/gateway) "aKe" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/chapel{ +/obj/structure/chair/wood/normal{ dir = 4 }, +/turf/open/floor/carpet, /area/chapel/main) "aKf" = ( /obj/structure/cable{ @@ -16248,7 +16254,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aLb" = ( /obj/structure/disposalpipe/segment{ @@ -16267,7 +16273,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aLd" = ( /obj/structure/table, @@ -16286,13 +16292,13 @@ /turf/open/floor/plasteel, /area/hydroponics) "aLe" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/grimy, +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aLf" = ( /obj/machinery/airalarm{ @@ -16816,13 +16822,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/chair/wood/wings{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/chapel/main) "aMM" = ( -/obj/machinery/camera{ - c_tag = "Chapel North" - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aMN" = ( /obj/machinery/chem_master/condimaster, @@ -16887,7 +16894,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aMX" = ( -/turf/open/floor/plasteel/grimy, +/turf/open/floor/wood/wood_large, /area/chapel/office) "aMY" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, @@ -17177,28 +17184,24 @@ /turf/open/floor/wood, /area/library) "aNW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel Office"; +/turf/open/floor/wood/wood_large, +/area/chapel/main) +"aNX" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/eastright{ + dir = 8; + name = "Coffin Storage"; req_access_txt = "22" }, /turf/open/floor/plasteel/dark, -/area/chapel/office) -"aNX" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1480; - name = "Confessional Intercom"; - pixel_x = 25 - }, -/obj/structure/chair, -/turf/open/floor/plasteel/dark, /area/chapel/main) "aNY" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth (Chaplain)"; - req_access_txt = "22" +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" }, -/turf/open/floor/plasteel/dark, +/obj/structure/fans/tiny, +/turf/open/floor/plating, /area/chapel/main) "aNZ" = ( /obj/structure/chair, @@ -17679,7 +17682,12 @@ }, /area/chapel/main) "aPo" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/eastleft{ + dir = 8; + name = "Coffin Storage"; + req_access_txt = "22" + }, /turf/open/floor/plasteel/dark, /area/chapel/main) "aPp" = ( @@ -18085,7 +18093,11 @@ /area/chapel/main) "aQw" = ( /obj/structure/table/wood, -/turf/open/floor/plasteel/dark, +/obj/item/trash/candle{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/carpet, /area/chapel/main) "aQx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -18098,22 +18110,17 @@ }, /area/chapel/main) "aQz" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1480; - name = "Confessional Intercom"; - pixel_x = 25 - }, -/obj/structure/chair{ - dir = 1 +/obj/structure/closet/crate/coffin, +/obj/structure/window/reinforced{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/chapel/main) "aQA" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/wood/wood_large, /area/chapel/main) "aQB" = ( /obj/effect/turf_decal/tile/red{ @@ -19111,24 +19118,32 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aTf" = ( -/obj/structure/chair/stool, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel, /area/chapel/main) "aTg" = ( -/obj/structure/chair/stool, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 8 }, /area/chapel/main) "aTh" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel, /area/chapel/main) "aTi" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/landmark/start/assistant, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 8 }, @@ -19659,28 +19674,36 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aUH" = ( -/obj/structure/chair/stool, /obj/effect/landmark/start/assistant, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 4 }, /area/chapel/main) "aUI" = ( -/obj/structure/chair/stool, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 1 }, /area/chapel/main) "aUJ" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/pew/right{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 4 }, /area/chapel/main) "aUK" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 1 }, @@ -20207,8 +20230,10 @@ /turf/open/floor/wood, /area/library) "aVU" = ( -/obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair/pew/left{ + dir = 1 + }, /turf/open/floor/plasteel/chapel{ dir = 8 }, @@ -21999,13 +22024,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) -"bag" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "bah" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 @@ -23874,14 +23892,15 @@ /turf/closed/wall, /area/maintenance/disposal) "bfb" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 +/obj/machinery/computer/pod/old{ + density = 0; + icon = 'icons/obj/airlock_machines.dmi'; + icon_state = "airlock_control_standby"; + id = "chapelgun"; + name = "Mass Driver Controller"; + pixel_x = 24 }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, +/turf/open/floor/wood/wood_large, /area/chapel/main) "bfc" = ( /obj/machinery/power/apc{ @@ -34004,9 +34023,6 @@ /area/medical/surgery) "bCJ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/light_switch{ - pixel_y = 26 - }, /turf/open/floor/plasteel/white, /area/medical/surgery) "bCK" = ( @@ -46267,7 +46283,7 @@ "chY" = ( /obj/machinery/shieldgen, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "cia" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -46617,7 +46633,7 @@ "ciW" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "ciX" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/metal/fifty, @@ -46632,14 +46648,14 @@ /obj/item/lightreplacer, /obj/item/lightreplacer, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "ciY" = ( /obj/machinery/door/poddoor{ id = "Secure Storage"; name = "secure storage" }, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "ciZ" = ( /turf/open/floor/plating, /area/engine/engineering) @@ -46947,7 +46963,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "cjN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -47234,11 +47250,11 @@ "ckB" = ( /obj/machinery/field/generator, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "ckC" = ( /obj/machinery/power/emitter, /turf/open/floor/plating, -/area/engine/storage) +/area/engine/engineering) "ckD" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -49323,9 +49339,12 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "csT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/xmastree, -/turf/open/floor/plasteel/dark, +/obj/structure/table/glass, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/storage/book/bible{ + pixel_y = -1 + }, +/turf/open/floor/wood/wood_large, /area/chapel/main) "csU" = ( /obj/structure/transit_tube/station/reverse, @@ -51957,14 +51976,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cBZ" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/turf/open/floor/plasteel/grimy, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, /area/chapel/office) "cCb" = ( /obj/structure/table, @@ -53407,10 +53423,6 @@ dir = 4 }, /obj/machinery/suit_storage_unit/atmos, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -53432,6 +53444,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"dmX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/chapel/main) "dnW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -53462,6 +53478,14 @@ icon_state = "carpetsymbol" }, /area/crew_quarters/theatre) +"dsJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/glass, +/obj/item/toy/figure/chaplain{ + pixel_y = -9 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "dtx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54381,8 +54405,9 @@ /turf/open/floor/plasteel, /area/security/range) "fsQ" = ( -/turf/open/floor/plating, -/area/engine/storage) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "fty" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible, @@ -56336,6 +56361,17 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space/basic, /area/space/nearstation) +"kdF" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/closet/crate/coffin, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "kdO" = ( /obj/machinery/pool/controller, /turf/open/floor/plasteel/yellowsiding, @@ -56734,6 +56770,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"kOL" = ( +/obj/structure/table/glass, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -57074,6 +57114,15 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"lNB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/xmastree{ + pixel_x = 14 + }, +/turf/open/floor/carpet, +/area/chapel/main) "lNH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -57332,6 +57381,10 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/wood, /area/maintenance/bar) +"mtU" = ( +/obj/structure/sign/departments/holy, +/turf/closed/wall, +/area/chapel/main) "mug" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -57366,6 +57419,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/crew_quarters/theatre) +"mzv" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "mzB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/window, @@ -57575,6 +57634,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"mZx" = ( +/obj/structure/table/glass, +/obj/item/storage/box/matches{ + pixel_x = 4; + pixel_y = -8 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "naI" = ( /turf/open/space, /area/space/station_ruins) @@ -58844,6 +58911,14 @@ icon_state = "wood-broken2" }, /area/maintenance/port/fore) +"pXG" = ( +/obj/structure/table/wood, +/obj/item/candle{ + pixel_x = 5; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/chapel/main) "pYQ" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket, @@ -58938,6 +59013,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"qkn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "qkC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59027,6 +59109,11 @@ /obj/structure/lattice, /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain) +"qCR" = ( +/obj/structure/musician/piano, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "qEB" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -59160,6 +59247,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"qUh" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "qVP" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -59442,6 +59536,14 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"rxF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/glass, +/obj/item/storage/book/bible{ + pixel_y = 17 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "ryr" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -60469,6 +60571,12 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"tSm" = ( +/obj/item/kirbyplants{ + icon_state = "plant-18" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "tSo" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -61202,6 +61310,19 @@ /obj/item/clothing/under/misc/pj/blue, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"vqE" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/obj/machinery/light/floor, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1480; + name = "Confessional Intercom"; + pixel_x = -25 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "vqP" = ( /obj/structure/bed/dogbed{ desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off."; @@ -62236,8 +62357,17 @@ /turf/open/floor/carpet, /area/library) "xES" = ( -/turf/closed/wall/r_wall, -/area/engine/storage) +/obj/structure/table/glass, +/obj/item/storage/fancy/candle_box{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/storage/fancy/candle_box{ + pixel_x = 1; + pixel_y = 4 + }, +/turf/open/floor/wood/wood_large, +/area/chapel/main) "xFM" = ( /obj/item/clothing/gloves/color/rainbow, /obj/item/clothing/head/soft/rainbow, @@ -62327,6 +62457,12 @@ /obj/item/instrument/trombone, /turf/open/floor/wood, /area/crew_quarters/theatre) +"xRa" = ( +/obj/item/kirbyplants{ + icon_state = "plant-20" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "xSW" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -87889,14 +88025,14 @@ cdc cdZ bVI cay -xES -xES -xES -xES -xES -xES -xES -xES +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw cfL coH cBO @@ -88146,14 +88282,14 @@ bWB cec bVI kNv -xES +ccw chY ciX cjM ckB ckB ckB -xES +ccw cnY coH cgR @@ -88403,14 +88539,14 @@ cde ceb bVI cay -xES +ccw chY -fsQ +ciZ ciW ckB ckB ckC -xES +ccw cnX coH cps @@ -88660,14 +88796,14 @@ cdf ced bVI cay -xES -fsQ -fsQ -fsQ +ccw +ciZ +ciZ +ciZ ckC ckC ckC -xES +ccw coa coJ clJ @@ -88917,14 +89053,14 @@ bWB bWB bVI cay -xES -xES +ccw +ccw ciY ciY -xES -xES -xES -xES +ccw +ccw +ccw +ccw cnZ coH cgI @@ -99147,7 +99283,7 @@ aSZ aQc qaY acN -bag +aKR aJC aYV aYV @@ -108390,7 +108526,7 @@ cBZ aJT aLc aFw -aFz +tSm aFz aFz aRR @@ -108400,7 +108536,7 @@ aFz aRS aXW baz -aCR +mtU bcx aXq aYV @@ -108646,7 +108782,7 @@ aGY aII aJW aMX -aNW +qUh aFz aPl aQv @@ -108656,7 +108792,7 @@ aUI aTg aRS aZf -aFz +xRa bbF aYV aXq @@ -108900,8 +109036,8 @@ aCM aEg aFw aHi -aHi -aJV +aFw +aFw aFw aFw aFz @@ -109158,18 +109294,18 @@ aEi aFw aHl aID -aID -aFw -aMM -aFz +vqE +aCR +qCR aFz +aRS aQw aRS aRS aRS aRS aRS -aZf +lNB aRS bbF aYV @@ -109412,15 +109548,15 @@ aAz asB aCO aEh -aFz -aHk -aFz -aFz -aTe +aCR +aCR +aCR +mzv +aCR aML aFz -aFz -aQw +aRS +pXG cdl aRS aRS @@ -109669,11 +109805,11 @@ aAA asB aCQ aEk -aFB -aHn -aFB -csT -aFB +fsQ +dsJ +rxF +fsQ +qkn aLr aFB aPn @@ -109925,12 +110061,12 @@ awO awO asB aCP -aEj +aMM aFA -aHm -aEj -aEj -aEj +aMM +aMM +aMM +aMM aEj aEj aPm @@ -109941,7 +110077,7 @@ aUJ aTh aXz aZg -aFz +xRa bbF aYV bdv @@ -110181,18 +110317,18 @@ ayj azx aAB asB -aCR aEm -aCR -aPl -aQv -aPl -aQv -aCR -aNY -aCR +aNW aQA -aCR +aNW +aNW +aNW +aNW +aFz +aFz +aFz +aFz +aFz aTj aFz aVV @@ -110438,14 +110574,14 @@ asB asB asB asB -aCR +aHk +aNW bfb -aCR -aHo -aIE aKe -aIE -aCR +aKe +aKe +aNW +kdF aNX aPo aQz @@ -110694,14 +110830,14 @@ atS aaf aaf aaf -atS +asB aCR aEn aCR -aHq -aHq -aHq -aHq +aKe +aKe +aKe +aNW aCR aCR aCR @@ -110951,14 +111087,14 @@ atS aoV aoV aaf -atS -aaf -aaa -aaf -aaa -aaa -aaa -aaa +gXs +aHm +aHn +dmX +aNW +aNW +aNW +aNW aMZ aNZ aPp @@ -111208,14 +111344,14 @@ aaH aoV aoV aaf -atS -aaf -aaa -aaf -aaa -aaa -aaa -aaf +gXs +aHm +aJV +dmX +csT +kOL +mZx +xES aMZ aOb aPr @@ -111465,14 +111601,14 @@ aaH aoV aoV aoV -atS -aaf -aaa -aaf -aaa -aaa -aaa -aaf +gXs +aHm +aNY +aCR +dmX +dmX +dmX +dmX aMZ aOa aVX @@ -111722,7 +111858,7 @@ atS aoV aoV aoV -atS +gXs aaf aaa aaf diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index ecd043a66a..973457692e 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -72,9 +72,11 @@ #define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though //loadout saving/loading specific defines -#define MAXIMUM_LOADOUT_SAVES 5 -#define LOADOUT_ITEM "loadout_item" -#define LOADOUT_COLOR "loadout_color" +#define MAXIMUM_LOADOUT_SAVES 5 +#define LOADOUT_ITEM "loadout_item" +#define LOADOUT_COLOR "loadout_color" +#define LOADOUT_CUSTOM_NAME "loadout_custom_name" +#define LOADOUT_CUSTOM_DESCRIPTION "loadout_custom_description" //loadout item flags #define LOADOUT_CAN_NAME (1<<0) //renaming items diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 9f89920b46..71bbfe64fe 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -263,7 +263,7 @@ Turf and target are separate in case you want to teleport some distance from a t return . //Returns a list of all items of interest with their name -/proc/getpois(mobs_only=0,skip_mindless=0) +/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE) var/list/mobs = sortmobs() var/list/namecounts = list() var/list/pois = list() @@ -277,7 +277,7 @@ Turf and target are separate in case you want to teleport some distance from a t if(M.real_name && M.real_name != M.name) name += " \[[M.real_name]\]" - if(M.stat == DEAD) + if(M.stat == DEAD && specify_dead_role) if(isobserver(M)) name += " \[ghost\]" else diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 7fad1690e6..41068048a1 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) //LANGUAGE CHARACTER CUSTOMIZATION -GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles")) +GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles", "caws", "gekkers", "clucks")) GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc, "xeno tongue" = /obj/item/organ/tongue/alien)) //SPECIES BODYPART LISTS diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 779ee2fbac..165f6e9d81 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -691,21 +691,29 @@ SUBSYSTEM_DEF(job) if(!permitted) continue var/obj/item/I = new G.path - if(I && length(i[LOADOUT_COLOR])) //handle loadout colors - //handle polychromic items - if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors)) - var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this - if(polychromic && istype(polychromic)) - var/list/polychromic_entry = polychromic.colors_by_atom[I] - if(polychromic_entry) - if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things? - polychromic.connect_helmet(I,i[LOADOUT_COLOR]) - polychromic.colors_by_atom[I] = i[LOADOUT_COLOR] - I.update_icon() - else - //handle non-polychromic items (they only have one color) - I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY) - I.update_icon() + if(I) + if(length(i[LOADOUT_COLOR])) //handle loadout colors + //handle polychromic items + if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors)) + var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this + if(polychromic && istype(polychromic)) + var/list/polychromic_entry = polychromic.colors_by_atom[I] + if(polychromic_entry) + if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things? + polychromic.connect_helmet(I,i[LOADOUT_COLOR]) + polychromic.colors_by_atom[I] = i[LOADOUT_COLOR] + I.update_icon() + else + //handle non-polychromic items (they only have one color) + I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY) + I.update_icon() + //when inputting the data it's already sanitized + if(i[LOADOUT_CUSTOM_NAME]) + var/custom_name = i[LOADOUT_CUSTOM_NAME] + I.name = custom_name + if(i[LOADOUT_CUSTOM_DESCRIPTION]) + var/custom_description = i[LOADOUT_CUSTOM_DESCRIPTION] + I.desc = custom_description if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 49b19f767c..26f52f6ba5 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -146,9 +146,11 @@ if(!istype(A) || !get_turf(A) || A == src) return + orbit_target = A return A.AddComponent(/datum/component/orbiter, src, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) /atom/movable/proc/stop_orbit(datum/component/orbiter/orbits) + orbit_target = null return // We're just a simple hook /atom/proc/transfer_observers_to(atom/target) diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index e9aa5afe92..e11eca2975 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -37,7 +37,7 @@ qdel(src) /datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force) - handle_vehicle_offsets() + handle_vehicle_offsets(M.buckled?.dir) /datum/component/riding/proc/handle_vehicle_layer(dir) var/atom/movable/AM = parent diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index d770e0f30d..619f674969 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -141,7 +141,7 @@ /obj/item/clothing/head/mob_holder/dropped(mob/user) . = ..() - if(held_mob && isturf(loc))//don't release on soft-drops + if(held_mob && !ismob(loc))//don't release on soft-drops release() /obj/item/clothing/head/mob_holder/proc/release() diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 36ca035be9..9a29158b33 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -239,8 +239,13 @@ GLOBAL_LIST_EMPTY(explosions) atoms += A for(var/i in atoms) var/atom/A = i - if(!QDELETED(A)) - A.ex_act(dist) + if(QDELETED(A)) + continue + A.ex_act(dist, null, src) + if(QDELETED(A) || !ismovable(A)) + continue + var/atom/movable/AM = A + LAZYADD(AM.acted_explosions, explosion_id) if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) new /obj/effect/hotspot(T) //Mostly for ambience! diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index c6466fdd96..22a851da1d 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -11,6 +11,8 @@ var/antag_removal_text // Text will be given to the quirk holder if they get an antag that has it blacklisted. var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled var/mob_trait //if applicable, apply and remove this mob trait + /// should we immediately call on_spawn or add a timer to trigger + var/on_spawn_immediate = TRUE var/mob/living/quirk_holder /datum/quirk/New(mob/living/quirk_mob, spawn_effects) @@ -26,7 +28,10 @@ START_PROCESSING(SSquirks, src) add() if(spawn_effects) - on_spawn() + if(on_spawn_immediate) + on_spawn() + else + addtimer(CALLBACK(src, .proc/on_spawn), 0) addtimer(CALLBACK(src, .proc/post_add), 30) /datum/quirk/Destroy() diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 3cbf4b3cd2..cce138e82c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -184,6 +184,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) gain_text = null // Handled by trauma. lose_text = null medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." + on_spawn_immediate = FALSE /datum/quirk/paraplegic/add() var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 4a24416e3c..1b64cca787 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -99,6 +99,9 @@ ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() var/list/targeted_by + ///Reference to atom being orbited + var/atom/orbit_target + /** * Called when an atom is created in byond (built in engine proc) * @@ -548,7 +551,7 @@ /atom/proc/contents_explosion(severity, target) return //For handling the effects of explosions on contents that would not normally be effected -/atom/proc/ex_act(severity, target) +/atom/proc/ex_act(severity, target, datum/explosion/E) set waitfor = FALSE contents_explosion(severity, target) SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index effd70e9ab..25445f0d1c 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -10,7 +10,7 @@ circuit = /obj/item/circuitboard/machine/cell_charger pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null - var/charge_rate = 500 + var/recharge_coeff = 1 /obj/machinery/cell_charger/update_overlays() . += ..() @@ -28,9 +28,10 @@ . = ..() . += "There's [charging ? "a" : "no"] cell in the charger." if(charging) - . += "Current charge: [round(charging.percent(), 1)]%." + var/obj/item/stock_parts/cell/C = charging.get_cell() + . += "Current charge: [C.percent()]%." if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Charge rate at [charge_rate]J per cycle." + . += "The status display reads: Charge rate at [recharge_coeff*10]J per cycle." /obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell) && !panel_open) @@ -122,17 +123,18 @@ charging.emp_act(severity) /obj/machinery/cell_charger/RefreshParts() - charge_rate = 500 for(var/obj/item/stock_parts/capacitor/C in component_parts) - charge_rate *= C.rating + recharge_coeff = C.rating /obj/machinery/cell_charger/process() if(!charging || !anchored || (stat & (BROKEN|NOPOWER))) return - if(charging.percent() >= 100) - return - use_power(charge_rate) - charging.give(charge_rate) //this is 2558, efficient batteries exist + if(charging) + var/obj/item/stock_parts/cell/C = charging.get_cell() + if(C) + if(C.charge < C.maxcharge) + C.give(C.chargerate * recharge_coeff) + use_power(250 * recharge_coeff) update_icon() diff --git a/code/game/machinery/colormate.dm b/code/game/machinery/colormate.dm index b4306d49a4..1f1c16248c 100644 --- a/code/game/machinery/colormate.dm +++ b/code/game/machinery/colormate.dm @@ -6,10 +6,12 @@ density = TRUE anchored = TRUE circuit = /obj/item/circuitboard/machine/colormate - var/obj/item/inserted + var/atom/movable/inserted var/activecolor = "#FFFFFF" var/list/color_matrix_last var/matrix_mode = FALSE + /// Allow holder'd mobs + var/allow_mobs = TRUE /// Minimum lightness for normal mode var/minimum_normal_lightness = 50 /// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white. @@ -57,11 +59,22 @@ return if(user.a_intent == INTENT_HARM) return ..() + if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder)) + var/obj/item/clothing/head/mob_holder/H = I + var/mob/victim = H.held_mob + if(!user.transferItemToLoc(I, src)) + to_chat(user, "[I] is stuck to your hand!") + return + if(!QDELETED(H)) + H.release() + insert_mob(victim, user) if(is_type_in_list(I, allowed_types) && is_operational()) if(!user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return + if(QDELETED(I)) + return user.visible_message("[user] inserts [I] into [src]'s receptable.") inserted = I @@ -69,9 +82,22 @@ else return ..() +/obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user) + if(inserted) + return + if(user) + visible_message("[user] stuffs [victim] into [src]!") + inserted = victim + inserted.forceMove(src) + /obj/machinery/gear_painter/AllowDrop() return FALSE +/obj/machinery/gear_painter/handle_atom_del(atom/movable/AM) + if(AM == inserted) + inserted = null + return ..() + /obj/machinery/gear_painter/AltClick(mob/user) . = ..() if(!user.CanReach(src)) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 29883a073a..ee0a8224a8 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -393,6 +393,27 @@ spark_system.start() //creates some sparks because they look cool qdel(cover) //deletes the cover - no need on keeping it there! +//turret healing +/obj/machinery/porta_turret/examine(mob/user) + . = ..() + if(obj_integrity < max_integrity) + . += "[src] is damaged, use a lit welder to fix it." + +/obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I) + . = TRUE + if(cover && obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the turret.", \ + "You begin repairing the turret...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the turret.") + else + to_chat(user, "The turret doesn't need repairing.") + /obj/machinery/porta_turret/process() //the main machinery process if(cover == null && anchored) //if it has no cover and is anchored diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index c1579dfe15..301b8d4155 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -63,7 +63,7 @@ name = "advanced fire extinguisher" desc = "Used to stop thermonuclear fires from spreading inside your engine." icon_state = "foam_extinguisher0" - //item_state = "foam_extinguisher" needs sprite + item_state = "foam_extinguisher" dog_fashion = null chem = /datum/reagent/firefighting_foam tanktype = /obj/structure/reagent_dispensers/foamtank diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 81bae3d54b..e47b2bb0d8 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -19,6 +19,8 @@ var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off var/alert = FALSE // TRUE to display things more seriously + /// resets target on toggle + var/resets_target = TRUE /obj/item/pinpointer/Initialize() . = ..() @@ -27,7 +29,7 @@ /obj/item/pinpointer/Destroy() STOP_PROCESSING(SSfastprocess, src) GLOB.pinpointer_list -= src - target = null + unset_target() return ..() /obj/item/pinpointer/DoRevenantThrowEffects(atom/target) @@ -41,7 +43,8 @@ if(active) START_PROCESSING(SSfastprocess, src) else - target = null + if(resets_target) + unset_target() STOP_PROCESSING(SSfastprocess, src) update_icon() @@ -54,6 +57,18 @@ /obj/item/pinpointer/proc/scan_for_target() return +/obj/item/pinpointer/proc/set_target(atom/movable/newtarget) + if(target) + unset_target() + target = newtarget + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/unset_target) + +/obj/item/pinpointer/proc/unset_target() + if(!target) + return + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = null + /obj/item/pinpointer/update_overlays() . = ..() if(!active) @@ -105,7 +120,8 @@ active = FALSE user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) - target = null //Restarting the pinpointer forces a target reset + if(resets_target) + unset_target() //Restarting the pinpointer forces a target reset STOP_PROCESSING(SSfastprocess, src) update_icon() return @@ -141,7 +157,7 @@ if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated()) return - target = names[A] + set_target(names[A]) active = TRUE user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.") playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) @@ -153,7 +169,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target if(!trackable(H)) - target = null + unset_target() if(!target) //target can be set to null from above code, or elsewhere active = FALSE @@ -167,7 +183,7 @@ . = ..() /obj/item/pinpointer/pair/scan_for_target() - target = other_pair + set_target(other_pair) /obj/item/pinpointer/pair/examine(mob/user) . = ..() @@ -199,7 +215,7 @@ shuttleport = SSshuttle.getShuttle("huntership") /obj/item/pinpointer/shuttle/scan_for_target() - target = shuttleport + set_target(shuttleport) /obj/item/pinpointer/shuttle/Destroy() shuttleport = null @@ -211,4 +227,8 @@ icon_state = "pinpointer_ian" /obj/item/pinpointer/ian/scan_for_target() - target = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list + set_target(locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list) + +/obj/item/pinpointer/custom + resets_target = FALSE + diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 4856f5af32..ab0b0d933a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -113,12 +113,6 @@ to_chat(src, "Error: Use the admin IRC/Discord channel, nerd.", confidential = TRUE) return - //clean the message if it's not sent by a high-rank admin - if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots - msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) - if(!msg) - return - else //get message text, limit it's length.and clean/escape html if(!msg) @@ -133,11 +127,16 @@ else if(holder) to_chat(src, "Error: Admin-PM: Client not found.", confidential = TRUE) - to_chat(src, "Message not sent:
[msg]", confidential = TRUE) + to_chat(src, "Message not sent:
[sanitize(msg)]", confidential = TRUE) if(recipient_ticket) recipient_ticket.AddInteraction("No client found, message not sent:
[msg]") return else + //clean the message if it's not sent by a high-rank admin + if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots + msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) + if(!msg) + return current_ticket.MessageNoRecipient(msg) return @@ -149,6 +148,12 @@ if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) return + //clean the message if it's not sent by a high-rank admin + if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots + msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) + if(!msg) + return + var/rawmsg = msg if(holder) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7c6ba30b80..7cc8be800c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -895,19 +895,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) continue var/class_link = "" var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]") - var/extra_color_data = "" + var/extra_loadout_data = "" if(loadout_item) class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'" if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) - extra_color_data += "
Color" + extra_loadout_data += "
Color" for(var/loadout_color in loadout_item[LOADOUT_COLOR]) - extra_color_data += "   " + extra_loadout_data += "   " else var/loadout_color_non_poly = "#FFFFFF" if(length(loadout_item[LOADOUT_COLOR])) loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1] - extra_color_data += "
Color" - extra_color_data += "   " + extra_loadout_data += "
Color" + extra_loadout_data += "   " + if(gear.loadout_flags & LOADOUT_CAN_NAME) + extra_loadout_data += "
Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]" + if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION) + extra_loadout_data += "
Description" else if((gear_points - gear.cost) < 0) class_link = "style='white-space:normal;' class='linkOff'" else if(donoritem) @@ -916,7 +920,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" else class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'" - dat += "[name][extra_color_data]" + dat += "[name][extra_loadout_data]" dat += "[gear.cost]" if(islist(gear.restricted_roles)) if(gear.restricted_roles.len) @@ -929,14 +933,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += gear.restricted_roles.Join(";") dat += "" if(!istype(gear, /datum/gear/unlockable)) - dat += "[gear.description]" + // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description" + dat += "[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description]" else //we add the user's progress to the description assuming they have progress var/datum/gear/unlockable/unlockable = gear var/progress_made = unlockable_loadout_data[unlockable.progress_key] if(!progress_made) progress_made = 0 - dat += "[gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]" + dat += "[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]" dat += "" if(4) // Content preferences @@ -2700,7 +2705,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) loadout_data["SAVE_[loadout_slot]"] += list(new_loadout_data) //double packed because it does the union of the CONTENTS of the lists else loadout_data["SAVE_[loadout_slot]"] = list(new_loadout_data) //double packed because you somehow had no save slot in your loadout? - if(href_list["loadout_color"]) + + if(href_list["loadout_color"] || href_list["loadout_color_polychromic"] || href_list["loadout_rename"] || href_list["loadout_redescribe"]) + //if the gear doesn't exist, or they don't have it, ignore the request var/name = html_decode(href_list["loadout_gear_name"]) var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name] if(!G) @@ -2708,29 +2715,44 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/user_gear = has_loadout_gear(loadout_slot, "[G.type]") if(!user_gear) return - if(!length(user_gear[LOADOUT_COLOR])) - user_gear[LOADOUT_COLOR] = list("#FFFFFF") - var/current_color = user_gear[LOADOUT_COLOR][1] - var/new_color = input(user, "Polychromic options", "Choose Color", current_color) as color|null - user_gear[LOADOUT_COLOR][1] = sanitize_hexcolor(new_color, 6, TRUE, current_color) - if(href_list["loadout_color_polychromic"]) - var/name = html_decode(href_list["loadout_gear_name"]) - var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name] - if(!G) - return - var/user_gear = has_loadout_gear(loadout_slot, "[G.type]") - if(!user_gear) - return - var/list/color_options = list() - for(var/i=1, i<=length(G.loadout_initial_colors), i++) - color_options += "Color [i]" - var/color_to_change = input(user, "Polychromic options", "Recolor [name]") as null|anything in color_options - if(color_to_change) - var/color_index = text2num(copytext(color_to_change, 7)) - var/current_color = user_gear[LOADOUT_COLOR][color_index] - var/new_color = input(user, "Polychromic options", "Choose [color_to_change] Color", current_color) as color|null - if(new_color) - user_gear[LOADOUT_COLOR][color_index] = sanitize_hexcolor(new_color, 6, TRUE, current_color) + + //possible requests: recolor, recolor (polychromic), rename, redescribe + //always make sure the gear allows said request before proceeding + + //non-poly coloring can only be done by non-poly items + if(href_list["loadout_color"] && !(G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC)) + if(!length(user_gear[LOADOUT_COLOR])) + user_gear[LOADOUT_COLOR] = list("#FFFFFF") + var/current_color = user_gear[LOADOUT_COLOR][1] + var/new_color = input(user, "Polychromic options", "Choose Color", current_color) as color|null + user_gear[LOADOUT_COLOR][1] = sanitize_hexcolor(new_color, 6, TRUE, current_color) + + //poly coloring can only be done by poly items + if(href_list["loadout_color_polychromic"] && (G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC)) + var/list/color_options = list() + for(var/i=1, i<=length(G.loadout_initial_colors), i++) + color_options += "Color [i]" + var/color_to_change = input(user, "Polychromic options", "Recolor [name]") as null|anything in color_options + if(color_to_change) + var/color_index = text2num(copytext(color_to_change, 7)) + var/current_color = user_gear[LOADOUT_COLOR][color_index] + var/new_color = input(user, "Polychromic options", "Choose [color_to_change] Color", current_color) as color|null + if(new_color) + user_gear[LOADOUT_COLOR][color_index] = sanitize_hexcolor(new_color, 6, TRUE, current_color) + + //both renaming and redescribing strip the input to stop html injection + + //renaming is only allowed if it has the flag for it + if(href_list["loadout_rename"] && (G.loadout_flags & LOADOUT_CAN_NAME)) + var/new_name = stripped_input(user, "Enter new name for item. Maximum [MAX_NAME_LEN] characters.", "Loadout Item Naming", null, MAX_NAME_LEN) + if(new_name) + user_gear[LOADOUT_CUSTOM_NAME] = new_name + + //redescribing is only allowed if it has the flag for it + if(href_list["loadout_redescribe"] && (G.loadout_flags & LOADOUT_CAN_DESCRIPTION)) //redescribe isnt a real word but i can't think of the right term to use + var/new_description = stripped_input(user, "Enter new description for item. Maximum 500 characters.", "Loadout Item Redescribing", null, 500) + if(new_description) + user_gear[LOADOUT_CUSTOM_DESCRIPTION] = new_description ShowChoices(user) return 1 diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 5dd35788f1..fc4185f207 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -33,6 +33,16 @@ actions_types = list(/datum/action/item_action/adjust) mutantrace_variation = STYLE_MUZZLE +/obj/item/clothing/mask/surgical/aesthetic + name = "aesthetic sterile mask" + desc = "A sterile mask designed to help prevent the spread of diseases. This one doesn't seem like it does a whole lot, somehow." + flags_inv = HIDEFACE + flags_cover = null + visor_flags_inv = null + visor_flags_cover = null + permeability_coefficient = 1 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/clothing/mask/surgical/attack_self(mob/user) adjustmask(user) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 3228fbbaba..b0af7aa0d5 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -237,6 +237,12 @@ icon_state = "choker" poly_colors = list("#222222") +/obj/item/clothing/neck/necklace/cowbell + name = "cowbell collar" + desc = "Who would wear this? Take this off, you aren't a cow, you're just an awful degenerate." + icon = 'icons/obj/clothing/neck.dmi' + icon_state = "cowbell" + /obj/item/key/collar name = "Collar Key" desc = "A key for a tiny lock on a collar or bag." diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index ee7e4c48e1..7f28b88ad6 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -79,13 +79,175 @@ if(initial(above_suit)) . += "\The [src] can be worn above or below your suit. Alt-click to toggle." +////////////// +//Waistcoats// +////////////// + /obj/item/clothing/accessory/waistcoat - name = "waistcoat" + name = "black waistcoat" desc = "For some classy, murderous fun." icon_state = "waistcoat" item_state = "waistcoat" minimize_when_attached = FALSE +/obj/item/clothing/accessory/waistcoat/red + name = "red waistcoat" + icon_state = "waistcoat_red" + item_state = "waistcoat_red" + +/obj/item/clothing/accessory/waistcoat/grey + name = "grey waistcoat" + icon_state = "waistcoat_grey" + item_state = "waistcoat_grey" + +/obj/item/clothing/accessory/waistcoat/brown + name = "red waistcoat" + icon_state = "waistcoat_brown" + item_state = "waistcoat_brown" + +/obj/item/clothing/accessory/waistcoat/sweatervest + name = "black sweatervest" + icon_state = "sweatervest" + item_state = "sweatervest" + +/obj/item/clothing/accessory/waistcoat/sweatervest/blue + name = "blue sweatervest" + icon_state = "sweatervest_blue" + item_state = "sweatervest_blue" + +/obj/item/clothing/accessory/waistcoat/sweatervest/red + name = "red sweatervest" + icon_state = "sweatervest_red" + item_state = "sweatervest_red" + +//////////// +//Sweaters// +//////////// + +/obj/item/clothing/accessory/sweater + name = "grey sweater" + desc = "Nicely comfy and warm!" + icon_state = "sweater" + item_state = "sweater" + minimize_when_attached = FALSE + +/obj/item/clothing/accessory/sweater/pink + name = "pink sweater" + icon_state = "sweater_pink" + item_state = "sweater_pink" + +/obj/item/clothing/accessory/sweater/heart + name = "heart sweater" + icon_state = "sweater_heart" + item_state = "sweater_heart" + +/obj/item/clothing/accessory/sweater/blue + name = "blue sweater" + icon_state = "sweater_blue" + item_state = "sweater_blue" + +/obj/item/clothing/accessory/sweater/nt + name = "nanotrasen sweater" + icon_state = "sweater_nt" + item_state = "sweater_nt" + +/obj/item/clothing/accessory/sweater/mint + name = "mint sweater" + icon_state = "sweater_mint" + item_state = "sweater_mint" + +/obj/item/clothing/accessory/sweater/shoulderless + name = "shoulderless sweater" + icon_state = "sweater_shoulderless" + item_state = "sweater_shoulderless" + +/obj/item/clothing/accessory/sweater/uglyxmas + name = "ugly xmas sweater" + icon_state = "sweater_uglyxmas" + item_state = "sweater_uglyxmas" + +/obj/item/clothing/accessory/sweater/flower + name = "flower sweater" + icon_state = "sweater_flower" + item_state = "sweater_flower" + +//////////////// +//Suit Jackets// +//////////////// + +/obj/item/clothing/accessory/suitjacket + name = "tan suit jacket" + desc = "For those times when you have to attend a fancy business meeting without wearing your pants." + icon_state = "jacket_tan" + item_state = "jacket_tan" + minimize_when_attached = FALSE + +/obj/item/clothing/accessory/suitjacket/charcoal + name = "charcoal suit jacket" + icon_state = "jacket_charcoal" + item_state = "jacket_charcoal" + +/obj/item/clothing/accessory/suitjacket/navy + name = "navy suit jacket" + icon_state = "jacket_navy" + item_state = "jacket_navy" + +/obj/item/clothing/accessory/suitjacket/burgundy + name = "burgundy suit jacket" + icon_state = "jacket_burgundy" + item_state = "jacket_burgundy" + +/obj/item/clothing/accessory/suitjacket/checkered + name = "checkered suit jacket" + icon_state = "jacket_checkered" + item_state = "jacket_checkered" + +/////////////////////// +//Tactical Turtlnecks// +/////////////////////// + +/obj/item/clothing/accessory/turtleneck + name = "black turtleneck" + desc = "Extra cool. Extra fool." + icon_state = "turtleneck" + item_state = "turtleneck" + minimize_when_attached = FALSE + +/obj/item/clothing/accessory/turtleneck/red + name = "red turtleneck" + icon_state = "turtleneck_red" + item_state = "turtleneck_red" + +/obj/item/clothing/accessory/turtleneck/comfy + name = "comfy turtleneck" + icon_state = "turtleneck_comfy" + item_state = "turtleneck_comfy" + +/obj/item/clothing/accessory/turtleneck/tactifool + name = "black sweaterneck" + desc = "Extra fool. Extra cool." + icon_state = "tactifool" + item_state = "tactifool" + +/obj/item/clothing/accessory/turtleneck/tactifool/green + name = "green sweaterneck" + icon_state = "tactifool_green" + item_state = "tactifool_green" + +/obj/item/clothing/accessory/turtleneck/tactifool/blue + name = "blue sweaterneck" + icon_state = "tactifool_blue" + item_state = "tactifool_blue" + +/obj/item/clothing/accessory/turtleneck/tactifool/syndicate + name = "tactifool sweaterneck" + icon_state = "tactifool_syndicate" + item_state = "tactifool_syndicate" + +///////////////// +//Miscellaneous// +///////////////// + /obj/item/clothing/accessory/maidapron name = "maid apron" desc = "The best part of a maid costume." diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 96a732d08f..25fa7058fb 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -137,6 +137,10 @@ //Shooting Code: A.preparePixelProjectile(target, src) A.fire() + if(ismob(loc.loc)) + installed_gun.shoot_live_shot(loc.loc) + else + installed_gun.shoot_live_shot() //Shitcode, but we don't have much of a choice log_attack("[assembly] [REF(assembly)] has fired [installed_gun].") return A diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 9c39601b4e..6af1c2118c 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -522,7 +522,7 @@ max_charges = 1 item_flags = NEEDS_PERMIT | NOBLUDGEON w_class = WEIGHT_CLASS_BULKY - force = 18 + force = 15 /obj/item/ammo_casing/magic/hook name = "hook" @@ -536,11 +536,11 @@ icon_state = "hook" icon = 'icons/obj/lavaland/artefacts.dmi' pass_flags = PASSTABLE - damage = 25 - armour_penetration = 100 + damage = 15 + armour_penetration = 10 + knockdown = 5 damage_type = BRUTE hitsound = 'sound/effects/splat.ogg' - knockdown = 30 var/chain /obj/item/projectile/hook/fire(setAngle) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 0268d32a6b..d6c4dfae34 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -250,6 +250,8 @@ if(points) if(I) I.mining_points += points + if(usr.client) + usr.client.increment_progress("miner", points) points = 0 else to_chat(usr, "No ID detected.") diff --git a/code/modules/mining/point_bank.dm b/code/modules/mining/point_bank.dm index f18b62635f..f467b94de5 100644 --- a/code/modules/mining/point_bank.dm +++ b/code/modules/mining/point_bank.dm @@ -20,25 +20,6 @@ data["totalPoints"] = points return data -/obj/machinery/mineral/ore_redemption/ui_act(action, params) - if(..()) - return - switch(action) - if("Claim") - var/mob/M = usr - var/obj/item/card/id/I = M.get_idcard(TRUE) - if(points) - if(I) - I.mining_points += points - if(usr.client) - usr.client.increment_progress("miner", points) - points = 0 - else - to_chat(usr, "No ID detected.") - else - to_chat(usr, "No points to claim.") - return TRUE - /obj/machinery/point_bank/power_change() ..() update_icon() diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index 55ab18c20c..0c22a85886 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -13,6 +13,10 @@ name = "Bald" icon_state = "bald" +/datum/sprite_accessory/hair/adhara + name = "Adhara" + icon_state = "hair_adhara" + /datum/sprite_accessory/hair/afro name = "Afro" icon_state = "hair_afro" @@ -29,6 +33,14 @@ name = "Ahoge" icon_state = "hair_antenna" +/datum/sprite_accessory/hair/amazon + name = "Amazon" + icon_state = "hair_amazon" + +/datum/sprite_accessory/hair/anita + name = "Anita" + icon_state = "hair_anita" + /datum/sprite_accessory/hair/balding name = "Balding Hair" icon_state = "hair_e" @@ -61,6 +73,18 @@ name = "Beehive 2" icon_state = "hair_beehive2" +/datum/sprite_accessory/hair/belenko + name = "Beleneko" + icon_state = "hair_belenko" + +/datum/sprite_accessory/hair/belenkotied + name = "Belenko (Tied)" + icon_state = "hair_belenkotied" + +/datum/sprite_accessory/hair/belle + name = "Belle" + icon_state = "hair_belle" + /datum/sprite_accessory/hair/bob name = "Bob Hair" icon_state = "hair_bob" @@ -309,6 +333,10 @@ name = "Flow Hair" icon_state = "hair_f" +/datum/sprite_accessory/hair/fluffy + name = "Fluffy" + icon_state = "hair_fluffy" + /datum/sprite_accessory/hair/fringetail name = "Fringe Tail" icon_state = "hair_fringetail" @@ -365,6 +393,10 @@ name = "Hitop" icon_state = "hair_hitop" +/datum/sprite_accessory/hair/inkling + name = "Inkling" + icon_state = "hair_inkling" + /datum/sprite_accessory/hair/jade name = "Jade" icon_state = "hair_jade" @@ -373,6 +405,10 @@ name = "Jensen" icon_state = "hair_jensen" +/datum/sprite_accessory/hair/jessica + name = "Jessica" + icon_state = "hair_jessica" + /datum/sprite_accessory/hair/joestar name = "Joestar" icon_state = "hair_joestar" @@ -389,6 +425,10 @@ name = "Kusanagi" icon_state = "hair_kusanagi" +/datum/sprite_accessory/hair/kleeia + name = "Kleeia" + icon_state = "hair_kleeia" + /datum/sprite_accessory/hair/long name = "Long Hair 1" icon_state = "hair_long" @@ -445,6 +485,10 @@ name = "Mohawk" icon_state = "hair_d" +/datum/sprite_accessory/hair/newyou + name = "New You" + icon_state = "hair_newyou" + /datum/sprite_accessory/hair/reversemohawk name = "Mohawk (Reverse)" icon_state = "hair_reversemohawk" @@ -575,6 +619,10 @@ name = "Ponytail (Side) 4" icon_state = "hair_sidetail4" +/datum/sprite_accessory/hair/sharptail + name = "Ponytail (Sharp)" + icon_state = "hair_sharptail" + /datum/sprite_accessory/hair/spikytail name = "Ponytail (Spiky)" icon_state = "hair_spikyponytail" @@ -679,6 +727,26 @@ name = "Skinhead" icon_state = "hair_skinhead" +/datum/sprite_accessory/hair/simple + name = "Simple" + icon_state = "hair_simple" + +/datum/sprite_accessory/hair/skrellvshort + name = "Skrell Replicant (Very Short)" + icon_state = "hair_skrellvshort" + +/datum/sprite_accessory/hair/skrellshort + name = "Skrell Replicant (Short)" + icon_state = "hair_skrellshort" + +/datum/sprite_accessory/hair/skrell + name = "Skrell Replicant (Average)" + icon_state = "hair_skrell" + +/datum/sprite_accessory/hair/skrelllong + name = "Skrell Replicant (Long)" + icon_state = "hair_skrelllong" + /datum/sprite_accessory/hair/sleaze name = "Sleaze" icon_state = "hair_sleaze" @@ -699,6 +767,10 @@ name = "Spiky 3" icon_state = "hair_spiky2" +/datum/sprite_accessory/hair/supernova + name = "Supernova" + icon_state = "hair_supernova" + /datum/sprite_accessory/hair/swept name = "Swept Back Hair" icon_state = "hair_swept" @@ -743,6 +815,10 @@ name = "Trimmed (Flat)" icon_state = "hair_trimflat" +/datum/sprite_accessory/hair/twincurls + name = "Twincurls" + icon_state = "hair_twincurls" + /datum/sprite_accessory/hair/twintails name = "Twintails" icon_state = "hair_twintail" @@ -787,6 +863,10 @@ name = "Very Short Over Eye (Alt)" icon_state = "hair_veryshortovereyealternate" +/datum/sprite_accessory/hair/vivi + name = "Vivi" + icon_state = "hair_vivi" + /datum/sprite_accessory/hair/volaju name = "Volaju" icon_state = "hair_volaju" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm index d4c8ea096a..78517b003e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm @@ -88,6 +88,10 @@ name = "Pantyhose" icon_state = "pantyhose" +/datum/sprite_accessory/underwear/socks/pantyhose_ripped + name = "Pantyhose - Ripped" + icon_state = "pantyhose_ripped" + /datum/sprite_accessory/underwear/socks/socks_short name = "Short" icon_state = "socks_short" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm index 1be02c207e..364485fe8a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm @@ -343,6 +343,20 @@ icon_state = "fishnet_body" gender = FEMALE +/datum/sprite_accessory/underwear/top/shibari + name = "Shibari Ropes" + icon_state = "shibari" + gender = FEMALE + has_color = TRUE + covers_chest = FALSE + +/datum/sprite_accessory/underwear/top/shibari_sleeved + name = "Shibari Ropes - sleeves" + icon_state = "shibari_sleeves" + gender = FEMALE + has_color = TRUE + covers_chest = FALSE + /datum/sprite_accessory/underwear/top/swimsuit name = "Swimsuit Top" icon_state = "bra_swimming" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index dc53f9487f..783f55d12d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -556,7 +556,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/list/dest = list() //List of possible destinations (mobs) var/target = null //Chosen target. - dest += getpois(mobs_only=1) //Fill list, prompt user with list + dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest if (!target)//Make sure we actually have a target @@ -893,7 +893,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!eye_name) return - var/mob/mob_eye = creatures[eye_name] + do_observe(creatures[eye_name]) + +/mob/dead/observer/proc/do_observe(mob/mob_eye) //Istype so we filter out points of interest that are not mobs if(client && mob_eye && istype(mob_eye)) client.eye = mob_eye diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 3aa5f8e302..26494dcb34 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -1,5 +1,6 @@ /datum/orbit_menu var/mob/dead/observer/owner + var/auto_observe = FALSE /datum/orbit_menu/New(mob/dead/observer/new_owner) if(!istype(new_owner)) @@ -10,6 +11,7 @@ return GLOB.observer_state /datum/orbit_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) if (!ui) ui = new(user, src, "Orbit") ui.open() @@ -18,15 +20,35 @@ if (..()) return - if (action == "orbit") - var/ref = params["ref"] - var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list) - if (poi != null) + switch(action) + if ("orbit") + var/ref = params["ref"] + var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list) + if (poi == null) + . = TRUE + return owner.ManualFollow(poi) + owner.reset_perspective(null) + if (auto_observe) + owner.do_observe(poi) + . = TRUE + if ("refresh") + update_static_data(owner, ui) + . = TRUE + if ("toggle_observe") + auto_observe = !auto_observe + if (auto_observe && owner.orbit_target) + owner.do_observe(owner.orbit_target) + else + owner.reset_perspective(null) /datum/orbit_menu/ui_data(mob/user) var/list/data = list() + data["auto_observe"] = auto_observe + return data +/datum/orbit_menu/ui_static_data(mob/user) + var/list/data = list() var/list/alive = list() var/list/antagonists = list() var/list/dead = list() @@ -34,7 +56,7 @@ var/list/misc = list() var/list/npcs = list() - var/list/pois = getpois(skip_mindless = 1) + var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE) for (var/name in pois) var/list/serialized = list() serialized["name"] = name @@ -80,7 +102,7 @@ data["npcs"] = npcs return data - + /datum/orbit_menu/ui_assets() . = ..() || list() . += get_asset_datum(/datum/asset/simple/orbit) diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 09336d2fea..476bddded3 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -1,6 +1,6 @@ //This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N -/mob/proc/gib() +/mob/proc/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion) return //This is the proc for turning a mob into ash. Mostly a copy of gib code (above). diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index ee2f945b65..528848fb14 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -17,7 +17,7 @@ if(SSticker.mode) SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now -/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts) +/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion) var/atom/Tsec = drop_location() for(var/mob/M in src) if(M in stomach_contents) @@ -27,7 +27,7 @@ "You burst out of [src]!") ..() -/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts) +/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion) var/atom/Tsec = drop_location() if(!no_bodyparts) if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop. @@ -41,6 +41,8 @@ qdel(O) //so the brain isn't transfered to the head when the head drops. continue if(!(O.organ_flags & ORGAN_NO_DISMEMBERMENT) && check_zone(O.zone) == BODY_ZONE_CHEST) + if(was_explosion) + LAZYADD(O.acted_explosions, was_explosion.explosion_id) O.Remove() O.forceMove(Tsec) O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) @@ -50,13 +52,16 @@ if(I.organ_flags & ORGAN_NO_DISMEMBERMENT || (no_brain && istype(I, /obj/item/organ/brain)) || (no_organs && !istype(I, /obj/item/organ/brain))) qdel(I) continue + if(was_explosion) + LAZYADD(I.acted_explosions, was_explosion.explosion_id) I.Remove() I.forceMove(Tsec) I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) - -/mob/living/carbon/spread_bodyparts() +/mob/living/carbon/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion) for(var/X in bodyparts) var/obj/item/bodypart/BP = X + if(was_explosion) + LAZYADD(BP.acted_explosions, was_explosion.explosion_id) BP.drop_limb() BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index df7ed66169..f653c96cbc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -938,43 +938,43 @@ admin_ticket_log(src, msg) /mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) - if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS) + var/GS_needed = istype(target, /mob/living/silicon/pai)? GRAB_PASSIVE : GRAB_AGGRESSIVE + if(pulling == target && grab_state >= GS_needed && stat == CONSCIOUS) //If they dragged themselves and we're currently aggressively grabbing them try to piggyback if(user == target && can_piggyback(target)) piggyback(target) return //If you dragged them to you and you're aggressively grabbing try to fireman carry them - else if(user != target) + else if(user == src) if(user.a_intent == INTENT_GRAB) fireman_carry(target) return . = ..() //src is the user that will be carrying, target is the mob to be carried -/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target) - return (istype(target) && target.stat == CONSCIOUS) +/mob/living/carbon/human/proc/can_piggyback(mob/living/target) + return (iscarbon(target) || ispAI(target)) && target.stat == CONSCIOUS /mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target) - return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) + return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) || ispAI(target) /mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target) var/carrydelay = 50 //if you have latex you are faster at grabbing var/skills_space = "" //cobby told me to do this if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY)) carrydelay = 30 - skills_space = "expertly" + skills_space = "expertly " else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY)) carrydelay = 40 - skills_space = "quickly" + skills_space = "quickly " if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) - visible_message("[src] starts [skills_space] lifting [target] onto their back..", + visible_message("[src] starts [skills_space]lifting [target] onto their back..", //Joe Medic starts quickly/expertly lifting Grey Tider onto their back.. - "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]") + "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space]start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]") //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...) if(do_after(src, carrydelay, TRUE, target)) //Second check to make sure they're still valid to be carried if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) - target.set_resting(FALSE, TRUE) buckle_mob(target, TRUE, TRUE, 90, 1, 0, TRUE) return visible_message("[src] fails to fireman carry [target]!") @@ -992,13 +992,13 @@ if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) target.visible_message("[target] can't hang onto [src]!") return - buckle_mob(target, TRUE, TRUE, FALSE, 1, 2, FALSE) + buckle_mob(target, TRUE, TRUE, 0, 1, 2, FALSE) else visible_message("[target] fails to climb onto [src]!") else to_chat(target, "You can't piggyback ride [src] right now!") -/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, fireman = FALSE) +/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = 0, hands_needed = 0, target_hands_needed = 0, fireman = FALSE) if(!force)//humans are only meant to be ridden through piggybacking and special cases return if(!is_type_in_typecache(target, can_ride_typecache)) @@ -1010,6 +1010,9 @@ riding_datum.ride_check_rider_restrained = TRUE if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled) return + if(istype(target, /mob/living/silicon/pai)) + hands_needed = 1 + target_hands_needed = 0 var/equipped_hands_self var/equipped_hands_target if(hands_needed) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index a82151cc1d..eedc59d9d5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -71,7 +71,7 @@ var/list/datum/bioware = list() var/creamed = FALSE //to use with creampie overlays - var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) + var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot, /mob/living/silicon/pai)) var/lastpuke = 0 var/account_id var/last_fire_update diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index 7c35ade4f2..e0a9bcaa36 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -30,10 +30,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // /datum/species/dwarf/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - var/dwarf_hair = pick("Beard (Dwarf)", "Beard (Very Long)", "Beard (Long)") //beard roullette var/mob/living/carbon/human/H = C - H.facial_hair_style = dwarf_hair - H.update_hair() H.AddElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src) RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used. diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 688b0cf63e..be9cd0aabb 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -1,4 +1,4 @@ -/mob/living/gib(no_brain, no_organs, no_bodyparts) +/mob/living/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion) var/prev_lying = lying if(stat != DEAD) death(1) @@ -6,22 +6,22 @@ if(!prev_lying) gib_animation() - spill_organs(no_brain, no_organs, no_bodyparts) + spill_organs(no_brain, no_organs, no_bodyparts, was_explosion) if(!no_bodyparts) - spread_bodyparts(no_brain, no_organs) + spread_bodyparts(no_brain, no_organs, was_explosion) for(var/X in implants) var/obj/item/implant/I = X qdel(I) - spawn_gibs(no_bodyparts) + spawn_gibs(no_bodyparts, null, was_explosion) qdel(src) /mob/living/proc/gib_animation() return -/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override) +/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override, datum/explosion/was_explosion) var/location = loc_override ? loc_override.drop_location() : drop_location() if(mob_biotypes & MOB_ROBOTIC) new /obj/effect/gibspawner/robot(location, src, get_static_viruses()) @@ -31,7 +31,7 @@ /mob/living/proc/spill_organs() return -/mob/living/proc/spread_bodyparts() +/mob/living/proc/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion) return /mob/living/dust(just_ash, drop_items, force) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 2ab74664a3..5740f98e90 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -143,6 +143,10 @@ custom_holoform.Grant(src) emitter_next_use = world.time + 10 SECONDS +/mob/living/silicon/pai/deployed/Initialize() + . = ..() + fold_out(TRUE) + /mob/living/silicon/pai/ComponentInitialize() . = ..() if(possible_chassis[chassis]) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 6d45914add..3455547d20 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -175,7 +175,7 @@ if("PRG_edit") if(!computer || !authenticated || !target_id_card) return - var/new_name = params["name"] + var/new_name = reject_bad_name(params["name"]) if(!new_name) return target_id_card.registered_name = new_name @@ -190,7 +190,7 @@ return if(target == "Custom") - var/custom_name = params["custom_name"] + var/custom_name = reject_bad_name(params["custom_name"]) if(custom_name) target_id_card.assignment = custom_name target_id_card.update_label() diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm index b6c2458670..1a03e8a602 100644 --- a/code/modules/movespeed/modifiers/reagents.dm +++ b/code/modules/movespeed/modifiers/reagents.dm @@ -12,3 +12,7 @@ /datum/movespeed_modifier/reagent/nitryl multiplicative_slowdown = -1 + +/datum/movespeed_modifier/reagent/meth + multiplicative_slowdown = -0.5 + absolute_max_tiles_per_second = 11 diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 1a8f6edcbe..0e1cd77793 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -504,6 +504,14 @@ glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." value = REAGENT_VALUE_COMMON +/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/M) + M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + return ..() + +/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/M) + M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + return ..() + /datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M) M.Jitter(20) M.set_drugginess(30) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 0b44c33926..675502c5fb 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -174,11 +174,13 @@ ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) L.update_movespeed() ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) /datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L) REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) L.update_movespeed() REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) ..() /datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 0d0a234afc..c9fbf6928a 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -783,6 +783,8 @@ value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M) + return ..() // until fixed - the rotations never stop +/* if(M.hud_used) if(current_cycle >= 20 && current_cycle%20 == 0) var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], @@ -800,6 +802,7 @@ for(var/whole_screen in screens) animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING) ..() +*/ /datum/reagent/toxin/skewium name = "Skewium" diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index a088eb2e4f..09f0a901a3 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -404,6 +404,7 @@ on_mob.set_light(1, 1, current_color_string) /obj/effect/abstract/eye_lighting + mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/obj/item/organ/eyes/robotic/glow/parent /obj/effect/abstract/eye_lighting/Initialize() diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm index 18a7707a88..1bd75fa2b1 100644 --- a/code/modules/uplink/uplink_items/uplink_stealth.dm +++ b/code/modules/uplink/uplink_items/uplink_stealth.dm @@ -102,6 +102,7 @@ along with slurred speech, aggression, and the ability to infect others with this agent." item = /obj/item/storage/box/syndie_kit/romerol cost = 25 + player_minimum = 25 cant_discount = TRUE exclude_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 462d4b5cb5..8d19d46530 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -34,6 +34,20 @@ /obj/item/clothing/under/costume/kilt = 3, /obj/item/clothing/under/misc/overalls = 3, /obj/item/clothing/under/suit/sl = 3, + /obj/item/clothing/accessory/sweater = 3, + /obj/item/clothing/accessory/sweater/pink = 3, + /obj/item/clothing/accessory/sweater/heart = 3, + /obj/item/clothing/accessory/sweater/blue = 3, + /obj/item/clothing/accessory/sweater/nt = 3, + /obj/item/clothing/accessory/sweater/mint = 3, + /obj/item/clothing/accessory/sweater/shoulderless = 3, + /obj/item/clothing/accessory/sweater/flower = 3, + /obj/item/clothing/accessory/turtleneck = 2, + /obj/item/clothing/accessory/turtleneck/red = 2, + /obj/item/clothing/accessory/turtleneck/comfy = 2, + /obj/item/clothing/accessory/turtleneck/tactifool = 2, + /obj/item/clothing/accessory/turtleneck/tactifool/green = 2, + /obj/item/clothing/accessory/turtleneck/tactifool/blue = 2, /obj/item/clothing/under/sweater = 3, /obj/item/clothing/under/sweater/black = 3, /obj/item/clothing/under/sweater/purple = 3, @@ -50,6 +64,11 @@ /obj/item/clothing/under/pants/black = 4, /obj/item/clothing/under/pants/tan = 4, /obj/item/clothing/under/pants/track = 3, + /obj/item/clothing/accessory/suitjacket = 2, + /obj/item/clothing/accessory/suitjacket/charcoal = 2, + /obj/item/clothing/accessory/suitjacket/navy = 2, + /obj/item/clothing/accessory/suitjacket/burgundy = 2, + /obj/item/clothing/accessory/suitjacket/checkered = 2, /obj/item/clothing/suit/jacket/miljacket = 5, /obj/item/clothing/under/suit/white_on_white/skirt = 2, /obj/item/clothing/under/rank/captain/suit/skirt = 2, @@ -74,6 +93,12 @@ /obj/item/clothing/neck/stripedbluescarf = 3, /obj/item/clothing/neck/stripedgreenscarf = 3, /obj/item/clothing/accessory/waistcoat = 2, + /obj/item/clothing/accessory/waistcoat/red = 2, + /obj/item/clothing/accessory/waistcoat/grey = 2, + /obj/item/clothing/accessory/waistcoat/brown = 2, + /obj/item/clothing/accessory/waistcoat/sweatervest = 2, + /obj/item/clothing/accessory/waistcoat/sweatervest/blue = 2, + /obj/item/clothing/accessory/waistcoat/sweatervest/red = 2, /obj/item/clothing/under/dress/skirt = 3, /obj/item/clothing/under/dress/skirt/blue = 3, /obj/item/clothing/under/dress/skirt/red = 3, @@ -132,22 +157,22 @@ /obj/item/clothing/ears/headphones = 10, /obj/item/clothing/suit/apron/purple_bartender = 4, /obj/item/clothing/under/rank/civilian/bartender/purple = 4, + /* Commenting out until next Christmas or made automatic + /obj/item/clothing/accessory/sweater/uglyxmas = 3, /obj/item/clothing/under/costume/christmas = 3, /obj/item/clothing/under/costume/christmas/green = 3, /obj/item/clothing/under/costume/christmas/croptop = 3, /obj/item/clothing/under/costume/christmas/croptop/green = 3, - */ /obj/item/clothing/suit/hooded/wintercoat/christmascoatr = 3, /obj/item/clothing/suit/hooded/wintercoat/christmascoatg = 3, /obj/item/clothing/suit/hooded/wintercoat/christmascoatrg = 3, - /*Commenting out until next Christmas or made automatic /obj/item/clothing/head/christmashat = 3, /obj/item/clothing/head/christmashatg = 3, - */ /obj/item/clothing/shoes/winterboots/christmasbootsr = 3, /obj/item/clothing/shoes/winterboots/christmasbootsg = 3, /obj/item/clothing/shoes/winterboots/santaboots = 3, + */ /obj/item/clothing/head/cowboyhat = 3, /obj/item/clothing/head/cowboyhat/black = 3, /obj/item/clothing/head/cowboyhat/white = 3, @@ -161,7 +186,8 @@ /obj/item/clothing/under/costume/cheongsam/white = 3, /obj/item/clothing/under/costume/cheongsam/red = 3, /obj/item/storage/backpack/snail = 3) - contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3, + contraband = list(/obj/item/clothing/accessory/turtleneck/tactifool/syndicate = 3, + /obj/item/clothing/under/syndicate/tacticool = 3, /obj/item/clothing/under/syndicate/tacticool/skirt = 3, /obj/item/clothing/mask/balaclava = 3, /obj/item/clothing/head/ushanka = 3, diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index 56d794e341..2316682e68 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -12,6 +12,7 @@ /obj/item/clothing/neck/petcollar = 5, /obj/item/clothing/neck/petcollar/choker = 5, /obj/item/clothing/neck/petcollar/leather = 5, + /obj/item/clothing/neck/necklace/cowbell = 5, /obj/item/restraints/handcuffs/fake/kinky = 5, /obj/item/clothing/glasses/sunglasses/blindfold = 4, /obj/item/clothing/mask/muzzle = 4, diff --git a/config/game_options.txt b/config/game_options.txt index 3c53d9fecb..7776d87d4e 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -675,3 +675,6 @@ TURF_DIRT_THRESHOLD 100 ## Default alpha of dirt on spawn DIRT_ALPHA_STARTING 127 + +## Allows pAI custom holoforms +PAI_CUSTOM_HOLOFORMS diff --git a/html/changelog.html b/html/changelog.html index b18d4f45aa..bf38e39d2e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,128 @@ -->
+

03 February 2021

+

Hatterhat updated:

+ + +

02 February 2021

+

silicons updated:

+ + +

31 January 2021

+

Putnam3145 updated:

+ + +

30 January 2021

+

timothyteakettle updated:

+ +

zeroisthebiggay updated:

+ + +

29 January 2021

+

MrJWhit updated:

+ +

TripleShades updated:

+ +

timothyteakettle updated:

+ +

zeroisthebiggay updated:

+ + +

28 January 2021

+

silicons updated:

+ + +

27 January 2021

+

ArcaneMusic, ported by Hatterhat updated:

+ +

Arturlang updated:

+ +

DeltaFire15 updated:

+ +

Hatterhat updated:

+ +

MrJWhit updated:

+ +

SandPoot updated:

+ +

raspy-on-osu updated:

+ +

shellspeed1 updated:

+ +

timothyteakettle updated:

+ +

25 January 2021

MrJWhit updated: