diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..fc4b7caec6a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +.dockerignore +.editorconfig +.travis.yml +GPLv3.txt +LICENSE +README.md +TGS3.json +.github +.gitignore +.gitattributes +.git/hooks +.git/info +.git/modules +.git/objects +.git/refs +.vs* +tools +cfg +data +SQL +tgui/node_modules +tgstation.dmb +tgstation.int +tgstation.rsc +tgstation.lk +tgstation.dyn.rsc +libmariadb.dll +rust_g.dll +Dockerfile diff --git a/.travis.yml b/.travis.yml index 0eccf6708e5..56fa54f58db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,6 @@ matrix: addons: apt: packages: - - libc6-i386 - libstdc++6:i386 cache: directories: @@ -39,7 +38,6 @@ matrix: mariadb: '10.2' apt: packages: - - libc6-i386 - libstdc++6:i386 - libssl-dev:i386 - gcc-multilib diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000000..afe89aeb761 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +FROM i386/ubuntu:xenial as build + +WORKDIR /rust_g + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + libssl-dev \ + ca-certificates \ + rustc \ + cargo \ + pkg-config \ + && git init \ + && git remote add origin https://github.com/tgstation/rust-g + +#TODO: find a way to read these from .travis.yml or a common source eventually +ENV RUST_G_VERSION=0.3.0 + +RUN git fetch --depth 1 origin $RUST_G_VERSION \ + && git checkout FETCH_HEAD \ + && cargo build --release + +FROM tgstation/byond:512.1427 + +EXPOSE 1337 + +WORKDIR /tgstation + +COPY . . + +RUN mkdir data && mkdir -p /root/.byond/bin + +VOLUME [ "/tgstation/config", "/tgstation/data" ] + +RUN DreamMaker -max_errors 0 tgstation.dme + +COPY --from=build /rust_g/target/release/librust_g.so /root/.byond/bin/rust_g + +ENTRYPOINT [ "DreamDaemon", "tgstation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ] diff --git a/README.md b/README.md index 0b1baf0841d..0596aae25c5 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ [![Percentage of issues still open](https://isitmaintained.com/badge/open/tgstation/tgstation.svg)](https://isitmaintained.com/project/tgstation/tgstation "Percentage of issues still open") [![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/tgstation/tgstation.svg)](https://isitmaintained.com/project/tgstation/tgstation "Average time to resolve an issue") ![Coverage](https://img.shields.io/badge/coverage---2%25-red.svg) [![forthebadge](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://forthebadge.com) [![forthebadge](https://forthebadge.com/images/badges/contains-technical-debt.svg)](https://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) -**Website:** https://www.tgstation13.org
-**Code:** https://github.com/tgstation/tgstation
-**Wiki** https://tgstation13.org/wiki/Main_Page
-**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
+**Website:** https://www.tgstation13.org +**Code:** https://github.com/tgstation/tgstation +**Wiki** https://tgstation13.org/wiki/Main_Page +**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus) ## DOWNLOADING @@ -24,6 +24,12 @@ hassle if you want to make any changes at all, so it's not recommended.) Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2) +Option 4: Use our docker image that tracks the master branch (See commits for build status. Again, same caveats as option 2) + +``` +docker run -d -p :1337 -v /path/to/your/config:/tgstation/config -v /path/to/your/data:/tgstation/data tgstation/tgstation +``` + ## INSTALLATION First-time installation should be fairly straightforward. First, you'll need diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index be05a8d1d61..fe624c19bf1 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -334,6 +334,16 @@ /obj/item/stack/sheet/metal/fifty, /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) +"XA" = ( +/obj/structure/fluff/bus/passable/seat{ + icon_state = "backseat" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/plush/awakenedplushie, +/turf/open/floor/plasteel/airless/dark{ + icon_state = "bus" + }, +/area/ruin/unpowered/no_grav) (1,1,1) = {" aa @@ -484,7 +494,7 @@ ab ae ad aj -am +XA az aK ad diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 787053d2b03..120f9175b81 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -714,7 +714,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "abV" = ( -/obj/machinery/computer/security, +/obj/machinery/computer/security/hos, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "abW" = ( @@ -1737,10 +1737,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); +/obj/machinery/computer/security/telescreen/prison{ pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -1776,10 +1773,7 @@ /turf/open/floor/plasteel, /area/security/prison) "aen" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); +/obj/machinery/computer/security/telescreen/prison{ pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -3525,7 +3519,8 @@ "ail" = ( /obj/machinery/camera{ c_tag = "Brig Interrogation"; - dir = 8 + dir = 8; + network = list("interrogation") }, /turf/open/floor/plasteel/dark, /area/security/prison) @@ -4003,10 +3998,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel, /area/security/processing) "ajv" = ( @@ -4063,6 +4055,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, +/obj/machinery/computer/security/telescreen/interrogation{ + pixel_y = 30 + }, /turf/open/floor/plasteel/red/side{ dir = 1 }, @@ -7926,11 +7921,8 @@ pixel_y = 7 }, /obj/item/pen, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; +/obj/machinery/computer/security/telescreen/prison{ dir = 1; - name = "Prison Monitor"; - network = list("prison"); pixel_y = -27 }, /turf/open/floor/wood, @@ -9141,12 +9133,9 @@ /obj/item/wallframe/camera, /obj/item/wallframe/camera, /obj/item/assault_pod/mining, -/obj/machinery/computer/security/telescreen{ - desc = "Used for the Auxillary Mining Base."; +/obj/machinery/computer/security/telescreen/auxbase{ dir = 8; - name = "Auxillary Base Monitor"; - network = list("auxbase"); - pixel_x = 28 + pixel_x = 30 }, /turf/open/floor/plasteel/yellow/side{ dir = 4 @@ -12611,7 +12600,7 @@ /obj/machinery/camera/motion{ c_tag = "Vault"; dir = 1; - network = list("minisat") + network = list("vault") }, /obj/machinery/light, /turf/open/floor/plasteel/vault/corner{ @@ -17727,9 +17716,7 @@ /turf/open/floor/plasteel, /area/bridge) "aUd" = ( -/obj/machinery/computer/security/mining{ - network = list("mine","auxbase") - }, +/obj/machinery/computer/security/mining, /turf/open/floor/plasteel/brown{ dir = 6 }, @@ -20820,7 +20807,8 @@ /obj/structure/table, /obj/item/aiModule/supplied/quarantine, /obj/machinery/camera/motion{ - dir = 4 + dir = 4; + network = list("aiupload") }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) @@ -20838,7 +20826,8 @@ pixel_x = 32 }, /obj/machinery/camera/motion{ - dir = 8 + dir = 8; + network = list("aiupload") }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) @@ -23908,6 +23897,7 @@ "bkb" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; + network = list("ss13", "medbay"); dir = 8 }, /obj/machinery/airalarm{ @@ -24434,6 +24424,7 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Medbay Foyer"; + network = list("ss13", "medbay"); dir = 8 }, /obj/machinery/cell_charger, @@ -25527,10 +25518,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "bnR" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); +/obj/machinery/computer/security/telescreen/vault{ pixel_y = 30 }, /obj/machinery/disposal/bin, @@ -26827,6 +26815,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; + network = list("ss13", "medbay"); dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -27511,6 +27500,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay East"; + network = list("ss13", "medbay"); dir = 8; pixel_y = -22 }, @@ -28839,7 +28829,8 @@ /obj/machinery/camera{ c_tag = "Genetics Research"; dir = 1; - network = list("ss13","rd") + network = list("ss13", "medbay"); + }, /obj/machinery/firealarm{ dir = 1; @@ -28873,6 +28864,7 @@ "bvB" = ( /obj/machinery/camera{ c_tag = "Genetics Access"; + network = list("ss13", "medbay"); dir = 8; pixel_y = -22 }, @@ -29230,7 +29222,8 @@ "bww" = ( /obj/structure/chair, /obj/machinery/camera{ - c_tag = "Surgery Observation" + c_tag = "Surgery Observation"; + network = list("ss13", "medbay") }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -29315,6 +29308,7 @@ /obj/structure/table/glass, /obj/machinery/camera{ c_tag = "Medbay Cryogenics"; + network = list("ss13", "medbay"); dir = 2 }, /obj/item/reagent_containers/glass/beaker/cryoxadone, @@ -29333,6 +29327,7 @@ "bwL" = ( /obj/machinery/camera{ c_tag = "Genetics Cloning"; + network = list("ss13", "medbay"); dir = 4 }, /obj/structure/table, @@ -29585,13 +29580,8 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bxj" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; - name = "Research Monitor"; - network = list("rd","minisat"); - pixel_y = 2 - }, /obj/structure/table, +/obj/machinery/computer/security/telescreen/rd, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "bxk" = ( @@ -30237,8 +30227,7 @@ pixel_x = 27 }, /obj/machinery/computer/security/mining{ - dir = 8; - network = list("mine","auxbase") + dir = 8 }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -30581,13 +30570,8 @@ /area/security/checkpoint/science) "bzD" = ( /obj/structure/table, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 2 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/computer/security/telescreen/circuitry, /turf/open/floor/plasteel/red/side{ dir = 1 }, @@ -30905,6 +30889,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Treatment Center"; + network = list("ss13", "medbay"); dir = 8 }, /turf/open/floor/plasteel, @@ -31123,10 +31108,6 @@ /turf/open/floor/engine, /area/science/explab) "bAS" = ( -/obj/machinery/computer/security/mining{ - dir = 4; - network = list("mine","auxbase") - }, /obj/machinery/camera{ c_tag = "Quartermaster's Office"; dir = 4 @@ -31139,6 +31120,9 @@ pixel_x = -32; supply_display = 1 }, +/obj/machinery/computer/security/qm{ + dir = 4 + }, /turf/open/floor/plasteel/brown{ dir = 10 }, @@ -31938,6 +31922,7 @@ /obj/structure/closet/secure_closet/medical3, /obj/machinery/camera{ c_tag = "Medbay Storage"; + network = list("ss13", "medbay"); dir = 2 }, /turf/open/floor/plasteel/white, @@ -32020,6 +32005,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay South"; + network = list("ss13", "medbay"); dir = 4 }, /turf/open/floor/plasteel/white, @@ -32312,6 +32298,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; + network = list("ss13", "medbay"); dir = 8 }, /obj/machinery/iv_drip, @@ -32553,6 +32540,7 @@ }, /obj/machinery/camera{ c_tag = "Chief Medical Office"; + network = list("ss13", "medbay"); dir = 8; pixel_y = -22 }, @@ -32765,13 +32753,11 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "bEK" = ( -/obj/machinery/computer/security/mining{ - network = list("mine","auxbase") - }, /obj/machinery/camera{ c_tag = "Mining Dock"; dir = 4 }, +/obj/machinery/computer/security/mining, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bEL" = ( @@ -33135,6 +33121,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/computer/security/telescreen/cmo{ + dir = 1; + pixel_y = -24 + }, /turf/open/floor/plasteel/barber, /area/crew_quarters/heads/cmo) "bFF" = ( @@ -33847,17 +33837,13 @@ /turf/open/floor/plasteel, /area/science/mixing) "bHv" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the test chamber."; - dir = 8; - layer = 4; - name = "Test Chamber Telescreen"; - network = list("toxins"); - pixel_x = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 4; + pixel_x = 30 + }, /turf/open/floor/plasteel, /area/science/mixing) "bHw" = ( @@ -34100,6 +34086,7 @@ }, /obj/machinery/camera{ c_tag = "Surgery Operating"; + network = list("ss13", "medbay"); dir = 1; pixel_x = 22 }, @@ -34421,7 +34408,8 @@ pixel_y = 29 }, /obj/machinery/camera{ - c_tag = "Virology Break Room" + c_tag = "Virology Break Room"; + network = list("ss13", "medbay") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -34570,7 +34558,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bJa" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -34913,7 +34900,7 @@ /turf/open/floor/plasteel, /area/science/misc_lab) "bJP" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/plasteel/bar, /area/maintenance/port/aft) "bJQ" = ( @@ -35613,21 +35600,13 @@ }, /area/science/test_area) "bLr" = ( -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Test Site"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site."; - dir = 8; - invuln = 1; - light = null; - name = "Hardened Bomb-Test Camera"; - network = list("toxins"); - use_power = 0 - }, /obj/item/target/alien/anchored, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/camera/preset/toxins{ + dir = 8 + }, /turf/open/floor/plating{ luminosity = 2; initial_gas_mix = "o2=0.01;n2=0.01" @@ -36475,7 +36454,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bNF" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -36728,6 +36706,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; + network = list("ss13", "medbay"); dir = 2 }, /obj/effect/turf_decal/stripes/line{ @@ -37872,14 +37851,10 @@ /area/science/misc_lab) "bQY" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - dir = 2; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 28 - }, /obj/item/integrated_circuit_printer, +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 + }, /turf/open/floor/plasteel/white, /area/science/circuit) "bQZ" = ( @@ -37890,12 +37865,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"bRb" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) "bRc" = ( @@ -37989,13 +37959,9 @@ /obj/machinery/computer/secure_data{ dir = 8 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the Engine."; +/obj/machinery/computer/security/telescreen/engine{ dir = 8; - layer = 4; - name = "Engine Monitor"; - network = list("engine"); - pixel_x = 30 + pixel_x = 24 }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -38415,7 +38381,8 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Telecomms Monitoring"; - dir = 8 + dir = 8; + network = list("tcomms") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -38684,7 +38651,8 @@ icon_state = "0-8" }, /obj/machinery/camera{ - c_tag = "Virology Module" + c_tag = "Virology Module"; + network = list("ss13", "medbay") }, /turf/open/floor/plasteel/white, /area/medical/virology) @@ -41988,7 +41956,8 @@ "cbl" = ( /obj/machinery/camera{ c_tag = "Telecomms Server Room"; - dir = 4 + dir = 4; + network = list("tcomms") }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -42330,14 +42299,11 @@ /area/science/circuit) "cbZ" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - dir = 1; - name = "Research Monitor"; - network = list("rd"); - pixel_y = -28 - }, /obj/item/integrated_circuit_printer, +/obj/machinery/computer/security/telescreen/circuitry{ + dir = 1; + pixel_y = -30 + }, /turf/open/floor/plasteel/white, /area/science/circuit) "cca" = ( @@ -45328,11 +45294,8 @@ /obj/machinery/computer/station_alert{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; +/obj/machinery/computer/security/telescreen/ce{ dir = 4; - name = "Research Monitor"; - network = list("rd"); pixel_x = -24 }, /turf/open/floor/plasteel/vault, @@ -48084,16 +48047,13 @@ /turf/open/space, /area/space/nearstation) "csq" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the turbine vent."; - dir = 1; - name = "turbine vent monitor"; - network = list("turbine"); - pixel_y = -29 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, +/obj/machinery/computer/security/telescreen/turbine{ + dir = 1; + pixel_y = -30 + }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) "csr" = ( @@ -49449,7 +49409,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Core Hallway"; dir = 4; - network = list("minisat") + network = list("aicore") }, /obj/machinery/firealarm{ dir = 8; @@ -49827,7 +49787,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber North"; dir = 1; - network = list("minisat") + network = list("aicore") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -50723,7 +50683,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber South"; dir = 2; - network = list("minisat") + network = list("aicore") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -52676,17 +52636,13 @@ /turf/open/floor/plating, /area/engine/engineering) "cMC" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the Engine."; - dir = 8; - layer = 4; - name = "Engine Monitor"; - network = list("engine"); - pixel_x = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/computer/security/telescreen/engine{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -53325,6 +53281,8 @@ /obj/item/radio/intercom{ pixel_x = -30 }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white, /area/science/circuit) "eyM" = ( @@ -53363,7 +53321,8 @@ /turf/closed/wall/r_wall, /area/science/mixing) "flc" = ( -/obj/machinery/bookbinder, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/white, /area/science/circuit) "fnC" = ( @@ -53475,8 +53434,6 @@ /obj/machinery/cell_charger{ pixel_y = 5 }, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, /turf/open/floor/plasteel/white, /area/science/circuit) "ijc" = ( @@ -53541,7 +53498,6 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "jrE" = ( -/obj/machinery/rnd/production/protolathe/department/science, /obj/structure/sign/poster/official/random{ pixel_x = 32 }, @@ -53833,13 +53789,6 @@ }, /turf/open/floor/plasteel, /area/science/circuit) -"qpv" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/autolathe, -/turf/open/floor/plasteel/white, -/area/science/circuit) "quT" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -54043,6 +53992,7 @@ dir = 8; pixel_x = -24 }, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white, /area/science/circuit) "vCb" = ( @@ -54057,7 +54007,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/libraryscanner, /turf/open/floor/plasteel/white, /area/science/circuit) "wkN" = ( @@ -54089,9 +54038,7 @@ "wvX" = ( /obj/structure/table/reinforced, /obj/machinery/light, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) "wBd" = ( @@ -103907,16 +103854,16 @@ bMB bNA cOe bSl -bRb +bUq flc vPE -bUq +bXs bVt dfh jSO jgm oUh -qpv +vPE jrE saK bSl diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c3a5e9d6349..7433e00c90d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -9053,11 +9053,9 @@ /turf/open/floor/plasteel/redblue, /area/maintenance/port/fore) "ayW" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plasteel/redblue/redside{ dir = 8 }, @@ -19222,9 +19220,6 @@ /turf/open/floor/plasteel/neutral, /area/quartermaster/qm) "aUs" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, /obj/machinery/status_display{ pixel_x = 32 }, @@ -19233,6 +19228,9 @@ dir = 8; name = "cargo camera" }, +/obj/machinery/computer/security/qm{ + dir = 8 + }, /turf/open/floor/plasteel/brown{ dir = 4 }, @@ -28842,14 +28840,11 @@ }, /area/security/execution/transfer) "bpg" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, /obj/item/radio/intercom{ name = "Station Intercom"; pixel_y = 26 }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel/red, /area/security/execution/transfer) "bph" = ( @@ -30117,12 +30112,12 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brC" = ( -/obj/machinery/computer/security{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/computer/security/hos{ + dir = 1 + }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brD" = ( @@ -32400,7 +32395,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Chamber - Fore"; name = "motion-sensitive ai camera"; - network = list("ai") + network = list("aichamber") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -32854,7 +32849,8 @@ "bxe" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 4 + dir = 4; + network = list("vault") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40848,7 +40844,7 @@ c_tag = "Telecomms - Monitoring"; dir = 2; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) @@ -41332,7 +41328,7 @@ c_tag = "AI Chamber - Aft"; dir = 1; name = "motion-sensitive ai camera"; - network = list("ai") + network = list("aichamber") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai) @@ -45721,12 +45717,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the AI's satellite."; - dir = 4; - name = "Research Monitor"; - network = list("minisat"); - pixel_y = 2 +/obj/machinery/computer/security/telescreen/minisat{ + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -45767,12 +45759,8 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the Engine."; +/obj/machinery/computer/security/telescreen/ce{ dir = 4; - layer = 4; - name = "Engine Monitor"; - network = list("engine"); pixel_x = -30 }, /mob/living/simple_animal/parrot/Poly, @@ -49046,6 +49034,10 @@ /obj/item/stack/packageWrap, /obj/item/hand_labeler, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/computer/security/telescreen/vault{ + dir = 8; + pixel_x = 26 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "ccD" = ( @@ -49056,7 +49048,7 @@ c_tag = "Telecomms - Chamber Port"; dir = 4; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -49500,7 +49492,7 @@ /obj/machinery/camera/motion{ c_tag = "AI - Upload"; name = "motion-sensitive ai camera"; - network = list("minisat") + network = list("aiupload") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai_upload) @@ -50943,7 +50935,7 @@ c_tag = "Telecomms - Chamber Starboard"; dir = 8; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -52599,7 +52591,7 @@ /obj/machinery/camera/motion{ c_tag = "Bridge - Captain's Emergency Escape"; dir = 4; - name = "command camera" + name = "motion-sensitive command camera" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -54725,7 +54717,7 @@ c_tag = "Telecomms - Cooling Room"; dir = 8; name = "telecomms camera"; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -63602,9 +63594,7 @@ }, /area/crew_quarters/locker) "cGO" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -67894,6 +67884,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Storage"; + network = list("ss13", "medbay"); dir = 4; name = "medbay camera" }, @@ -71812,6 +71803,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay - Waiting Room"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -71951,6 +71943,7 @@ "cYc" = ( /obj/machinery/camera{ c_tag = "Medbay - Break Room"; + network = list("ss13", "medbay"); dir = 2; name = "medbay camera" }, @@ -72628,6 +72621,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Medbay - Fore Port"; + network = list("ss13", "medbay"); dir = 8; name = "medbay camera" }, @@ -72709,6 +72703,7 @@ /obj/item/stack/medical/ointment, /obj/machinery/camera{ c_tag = "Medbay - Sleepers"; + network = list("ss13", "medbay"); dir = 2; name = "medbay camera" }, @@ -75477,9 +75472,9 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Chemistry"; + network = list("ss13", "medbay"); dir = 8; - name = "medbay camera"; - network = list("ss13","medbay") + name = "medbay camera" }, /turf/open/floor/plasteel/whiteyellow/corner, /area/medical/chemistry) @@ -76308,6 +76303,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Center"; + network = list("ss13", "medbay"); dir = 2; name = "medbay camera" }, @@ -77164,19 +77160,17 @@ /area/science/research/abandoned) "djp" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, +/obj/machinery/cell_charger, /turf/open/floor/plasteel/white/side, /area/science/circuit) "djq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/rnd/production/protolathe/department/science, /obj/machinery/light{ dir = 1 }, /turf/open/floor/plasteel/white/side, /area/science/circuit) "djr" = ( -/obj/machinery/autolathe, /turf/open/floor/plasteel/white/side, /area/science/circuit) "djs" = ( @@ -77700,6 +77694,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay - Port"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -77798,6 +77793,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay - Starboard"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -78542,12 +78538,11 @@ /area/crew_quarters/abandoned_gambling_den) "dmr" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, /obj/structure/sign/departments/science{ pixel_x = -32 }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white/side{ dir = 4 }, @@ -79282,7 +79277,8 @@ pixel_x = -26 }, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/metal/fifty, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/white/side{ dir = 4 }, @@ -80849,8 +80845,6 @@ pixel_y = -32 }, /obj/machinery/cell_charger, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -80884,16 +80878,16 @@ }, /area/science/circuit) "drD" = ( -/obj/machinery/vending/assist, /turf/open/floor/plasteel/white/side{ dir = 1 }, /area/science/circuit) "drE" = ( -/obj/machinery/bookbinder, /obj/structure/sign/poster/official/build{ pixel_y = -32 }, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/white/side{ dir = 1 }, @@ -80902,11 +80896,11 @@ /obj/machinery/light_switch{ pixel_x = 36 }, -/obj/machinery/libraryscanner, /obj/machinery/firealarm{ dir = 4; pixel_x = 24 }, +/obj/machinery/vending/assist, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -81250,6 +81244,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Cloning Lab"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -81309,6 +81304,7 @@ /obj/item/clothing/neck/stethoscope, /obj/machinery/camera{ c_tag = "Medbay - Cryogenics"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -81775,6 +81771,7 @@ /obj/machinery/iv_drip, /obj/machinery/camera{ c_tag = "Medbay - Recovery Room"; + network = list("ss13", "medbay"); dir = 8; name = "medbay camera" }, @@ -83171,6 +83168,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Genetics Lab"; + network = list("ss13", "medbay"); dir = 4; name = "medbay camera" }, @@ -83802,6 +83800,7 @@ /obj/item/storage/box/disks, /obj/machinery/camera{ c_tag = "Medbay - Genetics Desk"; + network = list("ss13", "medbay"); dir = 4; name = "medbay camera" }, @@ -84109,6 +84108,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Surgery"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -84703,6 +84703,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Medbay - Aft Port"; + network = list("ss13", "medbay"); dir = 8; name = "medbay camera" }, @@ -84761,6 +84762,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Chief Medical Officer's Office"; + network = list("ss13", "medbay"); dir = 8; name = "medbay camera" }, @@ -85669,14 +85671,12 @@ /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) "dBR" = ( -/obj/machinery/vending/boozeomat{ - req_access_txt = "0" - }, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random{ pixel_y = -32 }, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dBS" = ( @@ -85983,8 +85983,9 @@ /obj/structure/table/glass, /obj/item/clipboard, /obj/item/toy/figure/cmo, -/obj/machinery/status_display{ - pixel_x = -32 +/obj/machinery/computer/security/telescreen/cmo{ + dir = 4; + pixel_x = -30 }, /turf/open/floor/plasteel/neutral/side{ dir = 4 @@ -86031,6 +86032,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Aft Starboard"; + network = list("ss13", "medbay"); dir = 4; name = "medbay camera" }, @@ -88056,16 +88058,12 @@ /area/science/test_area) "dGY" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the testing site."; - dir = 4; - layer = 4; - name = "Testing Site Telescreen"; - network = list("toxins") - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "dGZ" = ( @@ -89064,6 +89062,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ c_tag = "Medbay - Morgue"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -89175,6 +89174,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay - Chief Medical Officer's Quarters"; + network = list("ss13", "medbay"); dir = 1; name = "medbay camera" }, @@ -90372,17 +90372,8 @@ /obj/item/target, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Test Site"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site."; - dir = 4; - invuln = 1; - light = null; - name = "hardened testing camera"; - network = list("toxins"); - start_active = 1; - use_power = 0 +/obj/machinery/camera/preset/toxins{ + dir = 4 }, /turf/open/floor/plating/airless, /area/science/test_area) @@ -92475,6 +92466,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Virology - Containment Lock"; + network = list("ss13", "medbay"); dir = 8; name = "virology camera" }, @@ -92987,6 +92979,7 @@ }, /obj/machinery/camera{ c_tag = "Virology - Break Room"; + network = list("ss13", "medbay"); dir = 8; name = "virology camera" }, @@ -94693,6 +94686,7 @@ }, /obj/machinery/camera{ c_tag = "Virology - Lab"; + network = list("ss13", "medbay"); name = "virology camera" }, /obj/effect/turf_decal/bot, @@ -94712,6 +94706,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Virology - Hallway"; + network = list("ss13", "medbay"); dir = 8; name = "virology camera" }, @@ -96415,6 +96410,7 @@ }, /obj/machinery/camera{ c_tag = "Virology - Cells"; + network = list("ss13", "medbay"); dir = 8; name = "virology camera" }, @@ -99717,7 +99713,7 @@ "gUH" = ( /obj/machinery/light, /obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white/side{ dir = 1 }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index b2910da72e9..fc5ac28c792 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1910,7 +1910,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aev" = ( -/obj/machinery/computer/security, +/obj/machinery/computer/security/hos, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aew" = ( @@ -3555,13 +3555,6 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching certain areas."; - dir = 1; - name = "Head of Security's Monitor"; - network = list("prison","minisat","tcomm"); - pixel_y = -30 - }, /turf/open/floor/plasteel/vault, /area/crew_quarters/heads/hos) "ahK" = ( @@ -7851,10 +7844,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aqY" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel/dark, /area/security/brig) "aqZ" = ( @@ -8777,12 +8767,8 @@ /area/security/main) "asN" = ( /obj/structure/chair, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching proceedings in the interrogation room."; +/obj/machinery/computer/security/telescreen/interrogation{ dir = 1; - layer = 4; - name = "interrogation monitor"; - network = list("interrogation"); pixel_y = -30 }, /turf/open/floor/plasteel/grimy, @@ -9866,6 +9852,10 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/red/side{ dir = 5 }, @@ -10532,7 +10522,7 @@ /area/security/brig) "awz" = ( /obj/machinery/camera{ - c_tag = "Interrogation"; + c_tag = "Interrogation room"; dir = 8; network = list("interrogation") }, @@ -13114,6 +13104,7 @@ "aCg" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; + network = list("vault"); dir = 1 }, /obj/machinery/light, @@ -14210,8 +14201,7 @@ /area/quartermaster/warehouse) "aEv" = ( /obj/machinery/computer/security/mining{ - dir = 4; - network = list("mine","auxbase") + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) @@ -17485,7 +17475,7 @@ /obj/structure/table, /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Fore"; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 @@ -19641,13 +19631,12 @@ /turf/closed/wall, /area/quartermaster/qm) "aQq" = ( -/obj/machinery/computer/security/mining{ - dir = 4; - network = list("mine","auxbase") - }, /obj/machinery/light_switch{ pixel_x = -23 }, +/obj/machinery/computer/cargo{ + dir = 4 + }, /turf/open/floor/plasteel/brown{ dir = 8 }, @@ -19746,7 +19735,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Port"; dir = 1; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -19769,7 +19758,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Starboard"; dir = 1; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -20267,7 +20256,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aRK" = ( -/obj/machinery/computer/cargo{ +/obj/machinery/computer/security/qm{ dir = 4 }, /turf/open/floor/plasteel/brown{ @@ -21602,16 +21591,9 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching areas on the MiniSat."; - dir = 8; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); - pixel_x = 29 - }, /obj/machinery/camera/motion{ c_tag = "AI Upload Foyer"; - network = list("ss13","rd","aiupload") + network = list("aiupload") }, /obj/machinery/airalarm{ pixel_y = 26 @@ -21934,7 +21916,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Fore"; dir = 2; - network = list("rd") + network = list("aicore") }, /obj/structure/showcase/cyborg/old{ dir = 2; @@ -22182,8 +22164,7 @@ pixel_x = 27 }, /obj/machinery/computer/security/mining{ - dir = 8; - network = list("mine","auxbase") + dir = 8 }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -23418,7 +23399,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Port"; dir = 4; - network = list("rd") + network = list("aicore") }, /obj/structure/showcase/cyborg/old{ dir = 4; @@ -24130,7 +24111,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Core"; dir = 2; - network = list("rd") + network = list("aicore") }, /turf/open/floor/plasteel/vault{ dir = 10 @@ -25034,10 +25015,8 @@ pixel_y = 10 }, /obj/item/radio/off, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 4; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_x = -29 }, /turf/open/floor/plasteel/red/side{ @@ -25095,7 +25074,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Starboard"; dir = 8; - network = list("rd") + network = list("aicore") }, /obj/structure/showcase/cyborg/old{ dir = 8; @@ -26191,10 +26170,8 @@ /obj/structure/rack, /obj/item/storage/secure/briefcase, /obj/item/clothing/mask/cigarette/cigar, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/ce{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -30 }, /turf/open/floor/plasteel/vault{ @@ -28116,7 +28093,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Aft"; dir = 1; - network = list("rd") + network = list("aicore") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -30031,15 +30008,12 @@ }, /obj/item/storage/secure/briefcase, /obj/structure/table/wood, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); - pixel_y = 30 - }, /obj/item/folder/blue, /obj/item/storage/secure/briefcase, /obj/item/assembly/flash/handheld, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bmq" = ( @@ -32208,10 +32182,8 @@ /obj/structure/rack, /obj/item/aicard, /obj/item/radio/off, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/darkblue/side{ @@ -33006,10 +32978,8 @@ /obj/machinery/porta_turret/ai{ dir = 2 }, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 8; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_x = 28 }, /turf/open/floor/plasteel/vault{ @@ -33031,10 +33001,8 @@ }, /obj/machinery/light, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/dark, @@ -33796,10 +33764,8 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/item/pen, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -28 }, /turf/open/floor/plasteel/darkblue/corner, @@ -35513,7 +35479,7 @@ /obj/machinery/computer/security/telescreen{ dir = 8; name = "Telecomms Camera Monitor"; - network = list("tcomm"); + network = list("tcomms"); pixel_x = 26 }, /obj/machinery/computer/telecomms/monitor{ @@ -36809,10 +36775,8 @@ /area/crew_quarters/heads/captain/private) "bAe" = ( /obj/machinery/light, -/obj/machinery/computer/security/telescreen{ +/obj/machinery/computer/security/telescreen/minisat{ dir = 1; - name = "MiniSat Monitor"; - network = list("minisat","tcomm"); pixel_y = -29 }, /obj/structure/bed/dogbed/renault, @@ -38520,7 +38484,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Port"; dir = 2; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -38551,7 +38515,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Starboard"; dir = 2; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -40870,7 +40834,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Control Room"; dir = 1; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/structure/table/wood, /obj/item/pen, @@ -41730,9 +41694,7 @@ /turf/open/floor/plating, /area/maintenance/port) "bLe" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plating, /area/maintenance/port) "bLf" = ( @@ -42287,7 +42249,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Port"; dir = 4; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -42325,7 +42287,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Starboard"; dir = 8; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -43131,7 +43093,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft"; dir = 1; - network = list("ss13","tcomm") + network = list("ss13","tcomms") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/ntnet_relay, @@ -53014,7 +52976,7 @@ /turf/open/floor/plating/airless, /area/engine/atmos) "cjp" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/wood, /area/maintenance/port/aft) "cjq" = ( @@ -57861,13 +57823,8 @@ /turf/open/floor/plating, /area/crew_quarters/heads/hor) "csZ" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 2 - }, /obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/rd, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -62086,7 +62043,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cBO" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -62876,22 +62832,13 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cDy" = ( -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Test Site"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; - dir = 8; - invuln = 1; - light = null; - luminosity = 3; - name = "Hardened Bomb-Test Camera"; - network = list("toxins"); - use_power = 0 - }, /obj/item/target/alien/anchored, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/camera/preset/toxins{ + dir = 8 + }, /turf/open/floor/plating/airless{ luminosity = 2 }, @@ -63871,7 +63818,6 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cFw" = ( -/obj/item/flashlight/lamp, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -75955,6 +75901,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) "eqG" = ( @@ -76018,10 +75965,6 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"gfh" = ( -/obj/machinery/libraryscanner, -/turf/open/floor/plasteel/white, -/area/science/circuit) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -76103,13 +76046,6 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"hfJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/autolathe, -/turf/open/floor/plasteel/white, -/area/science/circuit) "hvt" = ( /obj/structure/kitchenspike_frame, /obj/effect/decal/cleanable/blood/gibs/old, @@ -76173,15 +76109,11 @@ /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) "jyv" = ( -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stack/sheet/metal/fifty, /obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_x = 30 }, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -76478,19 +76410,15 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/stock_parts/cell/super, /obj/structure/table/reinforced, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of your own office."; - name = "Research Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 }, -/obj/item/stock_parts/cell/super, -/obj/item/stack/sheet/metal/fifty, /turf/open/floor/plasteel/white, /area/science/circuit) "ohj" = ( @@ -76709,11 +76637,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) -"sog" = ( -/obj/machinery/libraryscanner, -/obj/machinery/bookbinder, -/turf/open/floor/plasteel/white, -/area/science/circuit) "sFv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76755,11 +76678,6 @@ "sJW" = ( /turf/closed/wall/mineral/plastitanium, /area/engine/break_room) -"tjH" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/plasteel/white, -/area/science/circuit) "tsx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76858,7 +76776,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/rnd/production/protolathe/department/science, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, /turf/open/floor/plasteel/white, /area/science/circuit) "uYk" = ( @@ -113709,7 +113629,7 @@ cuZ fFM cud kxk -tjH +cxO cxO cxO dGH @@ -114996,7 +114916,7 @@ mjJ krD eqq llb -hfJ +uTS cxO cxO krD @@ -115255,7 +115175,7 @@ lsv txj eEe cxO -gfh +cxO krD aaa aaa @@ -115512,7 +115432,7 @@ jyv ohj nnK cxO -sog +cxO krD aaa aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 531a6c32d08..57d2a4ad850 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2249,9 +2249,7 @@ c_tag = "Brig Prison Hallway"; network = list("ss13","prison") }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; +/obj/machinery/computer/security/telescreen/prison{ network = list("prison"); pixel_y = 30 }, @@ -4378,7 +4376,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "amz" = ( -/obj/machinery/computer/security{ +/obj/machinery/computer/security/hos{ dir = 8 }, /turf/open/floor/carpet, @@ -5072,10 +5070,7 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "aok" = ( -/obj/machinery/computer/security{ - name = "Labor Camp Monitoring"; - network = list("labor") - }, +/obj/machinery/computer/security/labor, /turf/open/floor/plasteel/dark, /area/security/brig) "aol" = ( @@ -5936,6 +5931,10 @@ }, /area/security/brig) "aqA" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/red/side{ dir = 5 }, @@ -6269,7 +6268,8 @@ "arz" = ( /obj/machinery/camera{ c_tag = "Brig Interrogation"; - dir = 8 + dir = 8; + network = list("interrogation") }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -7310,6 +7310,7 @@ "aud" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; + network = list("vault"); dir = 1 }, /obj/machinery/light, @@ -10280,6 +10281,9 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aBA" = ( +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, /obj/machinery/computer/security/mining, /turf/open/floor/wood, /area/crew_quarters/heads/hop) @@ -10783,7 +10787,8 @@ /obj/item/aiModule/supplied/quarantine, /obj/machinery/camera/motion{ c_tag = "AI Upload Port"; - dir = 4 + dir = 4; + network = list("aiupload") }, /obj/item/aiModule/reset, /obj/machinery/flasher{ @@ -10830,7 +10835,8 @@ /obj/item/aiModule/supplied/freeform, /obj/machinery/camera/motion{ c_tag = "AI Upload Starboard"; - dir = 8 + dir = 8; + network = list("aiupload") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -11261,7 +11267,8 @@ /obj/machinery/holopad, /obj/machinery/camera/motion{ c_tag = "AI Upload Center"; - dir = 1 + dir = 1; + network = list("aiupload") }, /obj/item/radio/intercom{ broadcasting = 1; @@ -16561,6 +16568,10 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/computer/security/telescreen/auxbase{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aRH" = ( @@ -21317,14 +21328,14 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bdM" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, /obj/machinery/requests_console{ department = "Mining"; departmentType = 0; pixel_x = 32 }, +/obj/machinery/computer/security/mining{ + dir = 8 + }, /turf/open/floor/plasteel/brown/corner, /area/quartermaster/miningdock) "bdQ" = ( @@ -22046,13 +22057,11 @@ }, /area/quartermaster/qm) "bfD" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_y = -35 }, +/obj/machinery/computer/security/qm, /turf/open/floor/plasteel/brown{ dir = 6 }, @@ -23836,6 +23845,7 @@ }, /obj/machinery/camera{ c_tag = "Genetics Cloning Foyer"; + network = list("ss13","medbay"); dir = 2 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -24222,12 +24232,8 @@ dir = 1 }, /obj/item/integrated_electronics/debugger, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the other eggheads from the comfort of the circuitry lab."; - dir = 2; - name = "RnD Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -24235,13 +24241,9 @@ /area/science/explab) "blV" = ( /obj/structure/table/reinforced, -/obj/item/stack/sheet/metal/fifty{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/metal/fifty, /obj/item/clothing/glasses/science, /obj/item/clothing/glasses/science, +/obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -24252,12 +24254,8 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the other eggheads from the comfort of the circuitry lab."; - dir = 2; - name = "RnD Monitor"; - network = list("rd"); - pixel_y = 32 +/obj/machinery/computer/security/telescreen/circuitry{ + pixel_y = 30 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -24404,6 +24402,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Security Post"; + network = list("ss13","medbay"); dir = 4 }, /obj/structure/closet/secure_closet/security/med, @@ -24645,10 +24644,10 @@ /obj/machinery/cell_charger{ pixel_y = 5 }, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, -/obj/item/stock_parts/cell/super, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -24987,7 +24986,9 @@ /turf/open/floor/engine, /area/science/explab) "bnZ" = ( -/obj/machinery/rnd/production/techfab/department/science, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -25231,6 +25232,7 @@ /obj/structure/bed/roller, /obj/machinery/camera{ c_tag = "Medbay Entrance"; + network = list("ss13","medbay"); dir = 1 }, /turf/open/floor/plasteel/whiteblue/side, @@ -26121,7 +26123,7 @@ /obj/machinery/camera{ c_tag = "Genetics Monkey Pen Fore"; dir = 4; - network = list("ss13","rd") + network = list("ss13","medbay") }, /obj/machinery/light/small{ dir = 8 @@ -26733,6 +26735,7 @@ /obj/machinery/dna_scannernew, /obj/machinery/camera{ c_tag = "Genetics Cloning"; + network = list("ss13","medbay"); dir = 4 }, /obj/machinery/airalarm/unlocked{ @@ -27758,6 +27761,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Medbay Port Hallway"; + network = list("ss13","medbay"); dir = 4 }, /obj/machinery/airalarm{ @@ -29667,7 +29671,7 @@ /obj/machinery/camera{ c_tag = "Genetics Monkey Pen Aft"; dir = 4; - network = list("ss13","rd") + network = list("ss13","medbay") }, /obj/structure/flora/ausbushes/grassybush, /obj/machinery/light/small{ @@ -30318,20 +30322,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching surgery."; - dir = 8; - layer = 4; - name = "Surgery Telescreen"; - network = list("surgery"); - pixel_x = 30 - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/cable{ icon_state = "2-8" }, +/obj/machinery/computer/security/telescreen/cmo{ + dir = 8; + pixel_x = 30 + }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) "bBl" = ( @@ -30689,7 +30689,7 @@ /obj/machinery/camera{ c_tag = "Genetics"; dir = 1; - network = list("ss13","rd") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whitepurple/side, /area/medical/genetics) @@ -30745,6 +30745,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; + network = list("ss13","medbay"); dir = 2 }, /obj/effect/turf_decal/stripes/line{ @@ -32005,13 +32006,11 @@ pixel_x = 4; pixel_y = 6 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; - name = "Research Monitor"; - network = list("rd","minisat"); - pixel_y = -32 - }, /obj/structure/table/glass, +/obj/machinery/computer/security/telescreen/rd{ + dir = 1; + pixel_y = -26 + }, /turf/open/floor/plasteel/darkpurple/side, /area/crew_quarters/heads/hor) "bEV" = ( @@ -33213,6 +33212,7 @@ "bHY" = ( /obj/machinery/camera{ c_tag = "Virology"; + network = list("ss13","medbay"); dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -33271,6 +33271,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay Equipment Room"; + network = list("ss13","medbay"); dir = 1 }, /turf/open/floor/plasteel/whiteblue/side, @@ -33337,6 +33338,7 @@ "bIm" = ( /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; + network = list("ss13","medbay"); dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -38256,6 +38258,9 @@ c_tag = "Chief Engineer's Office"; dir = 2 }, +/obj/machinery/computer/security/telescreen/ce{ + pixel_y = 30 + }, /turf/open/floor/plasteel/yellow/side{ dir = 1 }, @@ -41892,7 +41897,7 @@ dir = 2; layer = 4; name = "Telecomms Telescreen"; - network = list("tcomm"); + network = list("tcomms"); pixel_y = 28 }, /obj/structure/disposalpipe/segment{ @@ -43106,16 +43111,7 @@ /turf/open/floor/carpet, /area/library/lounge) "cjV" = ( -/obj/machinery/camera{ - active_power_usage = 0; - c_tag = "Bomb Testing Asteroid Fore"; - desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; - invuln = 1; - luminosity = 3; - name = "Hardened Bomb-Test Camera"; - network = list("ss13","rd","toxins"); - use_power = 0 - }, +/obj/machinery/camera/preset/toxins, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation/bomb_site) "cjZ" = ( @@ -43867,7 +43863,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Port"; dir = 8; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -43929,7 +43925,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Starboard"; dir = 4; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -44105,7 +44101,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms Server Room"; dir = 1; - network = list("ss13","tcomm") + network = list("tcomms") }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) @@ -44136,7 +44132,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Port Aft"; dir = 2; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -44145,7 +44141,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Starboard Aft"; dir = 2; - network = list("tcomm") + network = list("tcomms") }, /turf/open/space, /area/space/nearstation) @@ -48943,12 +48939,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"hOd" = ( -/obj/machinery/autolathe, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, -/area/science/explab) "hOx" = ( /obj/structure/cable{ icon_state = "2-4" @@ -49224,7 +49214,7 @@ /obj/machinery/camera{ c_tag = "Telecomms External Fore"; dir = 1; - network = list("SS13","tcomm"); + network = list("tcomms"); start_active = 1 }, /obj/structure/cable/yellow{ @@ -50943,7 +50933,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms Monitoring"; dir = 2; - network = list("ss13","tcomm") + network = list("tcomms") }, /obj/structure/cable{ icon_state = "2-8" @@ -52239,7 +52229,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Access"; dir = 1; - network = list("ss13","tcomm") + network = list("tcomms") }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -54458,7 +54448,7 @@ /obj/machinery/camera{ c_tag = "Engineering Telecomms Access"; dir = 8; - network = list("tcomm") + network = list("tcomms") }, /obj/machinery/light{ dir = 4 @@ -96233,7 +96223,7 @@ bjx bjw qDJ vmG -hOd +bnZ pDP nBL bqs diff --git a/_maps/shuttles/aux_base_default.dmm b/_maps/shuttles/aux_base_default.dmm index e093d3c864e..365c34cf502 100644 --- a/_maps/shuttles/aux_base_default.dmm +++ b/_maps/shuttles/aux_base_default.dmm @@ -78,7 +78,8 @@ /area/shuttle/auxillary_base) "X" = ( /obj/machinery/camera{ - dir = 1 + dir = 1; + network = list("auxbase") }, /obj/structure/mining_shuttle_beacon, /turf/open/floor/plating, diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 5c7217bc502..e0222f7b0a6 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -1,5 +1,7 @@ #define SEND_SIGNAL(target, sigtype, arguments...) ( !target.datum_components ? NONE : target._SendSignal(sigtype, list(##arguments)) ) +#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( !SSdcs.comp_lookup[sigtype] ? NONE : SSdcs._SendGlobalSignal(sigtype, list(##arguments)) ) + //shorthand #define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) #define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) @@ -16,6 +18,14 @@ // All signals. Format: // When the signal is called: (signal arguments) +// global signals +// These are signals which can be listened to by any component on any parent +// GLOBAL SIGNALS MUST START WITH "!" +#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) +#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args) + +////////////////////////////////////////////////////////////////// + // /datum signals #define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component) #define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 98d75eaa262..3ed28c46934 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -29,9 +29,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NOJAUNT_1 (1<<0) #define UNUSED_RESERVATION_TURF_1 (1<<1) #define CAN_BE_DIRTY_1 (1<<2) // If a turf can be made dirty at roundstart. This is also used in areas. -#define NO_DEATHRATTLE_1 (1<<4) // Do not notify deadchat about any deaths that occur on this turf. -#define NO_RUINS_1 (1<<5) //Blocks ruins spawning on the turf #define NO_LAVA_GEN_1 (1<<6) //Blocks lava rivers being generated on the turf +#define NO_RUINS_1 (1<<10) //Blocks ruins spawning on the turf /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index cf8a9df1193..54dd2a982cb 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -488,6 +488,11 @@ for(var/key in key_list) . |= key_list[key] +/proc/make_associative(list/flat_list) + . = list() + for(var/thing in flat_list) + .[thing] = TRUE + //Picks from the list, with some safeties, and returns the "default" arg if it fails #define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 97bff98a9ad..24b6233c598 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -429,6 +429,7 @@ Proc for attack log creation, because really why not step(X, pick(NORTH, SOUTH, EAST, WEST)) /proc/deadchat_broadcast(message, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR) + message = "[message]" for(var/mob/M in GLOB.player_list) var/datum/preferences/prefs if(M.client && M.client.prefs) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 52cc6d86acb..e86c57ac24b 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -203,21 +203,20 @@ //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) - var/temprole = Mind.special_role - if(temprole) //if they are an antagonist of some sort. - if(temprole in total_antagonists) //If the role exists already, add the name to it - total_antagonists[temprole] += ", [Mind.name]([Mind.key])" - else - total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob - total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + for(var/datum/antagonist/A in GLOB.antagonists) + if(!A.owner) + continue + if(!(A.name in total_antagonists)) + total_antagonists[A.name] = list() + total_antagonists[A.name] += "[key_name(A.owner)]" CHECK_TICK //Now print them all into the log! log_game("Antagonists at round end were...") - for(var/i in total_antagonists) - log_game("[i]s[total_antagonists[i]].") + for(var/antag_name in total_antagonists) + var/list/L = total_antagonists[antag_name] + log_game("[antag_name]s :[L.Join(", ")].") CHECK_TICK SSdbcore.SetRoundEnd() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d6c4e176573..d0cf511e22c 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -195,7 +195,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/safety = 0 while(loop && safety < 5) - if(C && C.prefs.custom_names[role] && !safety) + if(C && C.prefs.custom_names[role] && !safety && (!jobban_isbanned(src, "appearance"))) newname = C.prefs.custom_names[role] else switch(role) @@ -375,6 +375,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/client/C var/key var/ckey + var/fallback_name if(!whom) return "*null*" @@ -394,6 +395,16 @@ Turf and target are separate in case you want to teleport some distance from a t C = GLOB.directory[ckey] if(C) M = C.mob + else if(istype(whom,/datum/mind)) + var/datum/mind/mind = whom + key = mind.key + ckey = ckey(key) + if(mind.current) + M = mind.current + if(M.client) + C = M.client + else + fallback_name = mind.name else return "*invalid*" @@ -419,11 +430,14 @@ Turf and target are separate in case you want to teleport some distance from a t else . += "*no key*" - if(include_name && M) - if(M.real_name) - . += "/([M.real_name])" - else if(M.name) - . += "/([M.name])" + if(include_name) + if(M) + if(M.real_name) + . += "/([M.real_name])" + else if(M.name) + . += "/([M.name])" + else if(fallback_name) + . += "/([fallback_name])" return . diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 53c92a295d7..2ad35a6b1b4 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -117,11 +117,15 @@ GLOBAL_LIST_INIT(bitfields, list( "NOJAUNT_1" = NOJAUNT_1, "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, "CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1, - "HEAR_1 / NO_DEATHRATTLE_1 (turfs)" = HEAR_1, - "CHECK_RICOCHET_1 / NO_RUINS_1 (turfs)" = CHECK_RICOCHET_1, - "CONDUCT_1 / NO_LAVA_GEN_1" = CONDUCT_1, + "HEAR_1" = HEAR_1, + "CHECK_RICOCHET_1" = CHECK_RICOCHET_1, + "CONDUCT_1" = CONDUCT_1, + "NO_LAVA_GEN_1" = NO_LAVA_GEN_1, "NODECONSTRUCT_1" = NODECONSTRUCT_1, "OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1, + "ON_BORDER_1" = ON_BORDER_1, + "NO_RUINS_1" = NO_RUINS_1, + "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, "HOLOGRAM_1" = HOLOGRAM_1, "TESLA_IGNORE_1" = TESLA_IGNORE_1, "INITIALIZED_1" = INITIALIZED_1, diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index efda7a457fd..1339d8cae49 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -170,8 +170,6 @@ config_entry_value = -1 min_val = -1 -/datum/config_entry/flag/rename_cyborg - /datum/config_entry/flag/ooc_during_round /datum/config_entry/flag/emojis diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 3a2b79dbc28..34bf57594dd 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -230,9 +230,9 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table sqlrowlist = " [sqlrowlist.Join(",\n ")]" var/datum/DBQuery/Query = NewQuery("INSERT[delayed][ignore_errors] INTO [table]\n([columns.Join(", ")])\nVALUES\n[sqlrowlist]\n[duplicate_key]") if (warn) - return Query.warn_execute() + . = Query.warn_execute() else - return Query.Execute() + . = Query.Execute() qdel(Query) @@ -264,6 +264,10 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table SSdbcore.active_queries -= src return ..() +/datum/DBQuery/CanProcCall(proc_name) + //fuck off kevinz + return FALSE + /datum/DBQuery/proc/Activity(activity) last_activity = activity last_activity_time = world.time @@ -273,6 +277,11 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table if(!.) to_chat(usr, "A SQL error occurred during this operation, check the server logs.") +/datum/DBQuery/proc/SetQuery(new_sql) + Activity("SetQuery") + Close() + sql = new_sql + /datum/DBQuery/proc/Execute(sql_query = sql, cursor_handler = default_cursor, log_error = TRUE) Activity("Execute") var/start_time diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm new file mode 100644 index 00000000000..3eed510adcd --- /dev/null +++ b/code/controllers/subsystem/dcs.dm @@ -0,0 +1,35 @@ +SUBSYSTEM_DEF(dcs) + name = "Datum Component System" + flags = SS_NO_INIT | SS_NO_FIRE + + var/list/comp_lookup = list() // A signal:list(components) assoc list + +/datum/controller/subsystem/dcs/proc/_SendGlobalSignal(sigtype, list/arguments) + . = NONE + for(var/i in comp_lookup[sigtype]) + var/datum/component/comp = i + if(!comp.enabled) + continue + var/datum/callback/CB = comp.signal_procs[sigtype] + if(!CB) + continue // Should we error from this? + . |= CB.InvokeAsync(arglist(arguments)) + +/datum/controller/subsystem/dcs/proc/RegisterSignal(datum/component/comp, sigtype) + if(!comp_lookup[sigtype]) + comp_lookup[sigtype] = list() + + comp_lookup[sigtype][comp] = TRUE + +/datum/controller/subsystem/dcs/proc/UnregisterSignal(datum/component/comp, list/sigtypes) + if(!length(sigtypes)) + sigtypes = list(sigtypes) + for(var/sigtype in sigtypes) + switch(length(comp_lookup[sigtype])) + if(1) + comp_lookup -= sigtype + if(2 to INFINITY) + comp_lookup[sigtype] -= comp + +/datum/controller/subsystem/dcs/Recover() + comp_lookup = SSdcs.comp_lookup diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index e70fd1cd7d6..ffc934c0611 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -93,25 +93,6 @@ SUBSYSTEM_DEF(events) else if(. == EVENT_READY) E.runEvent(TRUE) -/datum/round_event/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! - var/list/safe_areas = list( - /area/ai_monitored/turret_protected/ai, - /area/ai_monitored/turret_protected/ai_upload, - /area/engine, - /area/solar, - /area/holodeck, - /area/shuttle - ) - - //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. - var/list/danger_areas = list( - /area/engine/break_room, - /area/crew_quarters/heads/chief) - - //Need to locate() as it's just a list of paths. - return locate(pick((GLOB.the_station_areas - safe_areas) + danger_areas)) in GLOB.sortedAreas - - //allows a client to trigger an event //aka Badmin Central // > Not in modules/admin diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index ed5d92108ce..b10ce096f8e 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -349,37 +349,40 @@ SUBSYSTEM_DEF(job) // Hand out random jobs to the people who didn't get any in the last check // Also makes sure that they got their preference correct for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) - else if(jobban_isbanned(player, SSjob.overflow_role) || QDELETED(player)) - GiveRandomJob(player) //you get to roll for random before everyone else just to be sure you don't get overflow. you're so speshul - - for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) - else if(player.client.prefs.joblessrole == BERANDOMJOB) - GiveRandomJob(player) + HandleUnassigned(player) Debug("DO, Standard Check end") Debug("DO, Running AC2") - // For those who wanted to be assistant if their preferences were filled, here you go. - for(var/mob/dead/new_player/player in unassigned) - if(PopcapReached()) - RejectPlayer(player) - if(player.client.prefs.joblessrole == BEOVERFLOW) - Debug("AC2 Assistant located, Player: [player]") - AssignRole(player, SSjob.overflow_role) - else // For those who don't want to play if their preference were filled, back you go. - RejectPlayer(player) - + //Mop up people who can't leave. for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) if(!GiveRandomJob(player)) AssignRole(player, SSjob.overflow_role) //If everything is already filled, make them an assistant return 1 +//We couldn't find a job from prefs for this guy. +/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) + if(PopcapReached()) + RejectPlayer(player) + else if(player.client.prefs.joblessrole == BEOVERFLOW) + var/allowed_to_be_a_loser = !jobban_isbanned(player, SSjob.overflow_role) + if(QDELETED(player) || !allowed_to_be_a_loser) + RejectPlayer(player) + else + if(!AssignRole(player, SSjob.overflow_role)) + RejectPlayer(player) + else if(player.client.prefs.joblessrole == BERANDOMJOB) + if(!GiveRandomJob(player)) + RejectPlayer(player) + else if(player.client.prefs.joblessrole == RETURNTOLOBBY) + RejectPlayer(player) + else //Something gone wrong if we got here. + var/message = "DO: [player] fell through handling unassigned" + log_game(message) + message_admins(message) + RejectPlayer(player) //Gives the player the stuff he should have with his rank /datum/controller/subsystem/job/proc/EquipRank(mob/M, rank, joined_late = FALSE) var/mob/dead/new_player/N @@ -439,7 +442,7 @@ SUBSYSTEM_DEF(job) to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") if(job && H) - job.after_spawn(H, M, joined_late) + job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. return H diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index db1bf1ff5f4..dad71a005a6 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -78,5 +78,8 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/integrated_electronics/wirer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/analyzer, - /obj/item/integrated_electronics/detailer + /obj/item/integrated_electronics/detailer, + /obj/item/card/data, + /obj/item/card/data/full_color, + /obj/item/card/data/disk ) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index dfd5c4f89fa..caf53f09af6 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -58,6 +58,7 @@ if(!silent) SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) parent = null + SSdcs.UnregisterSignal(src, signal_procs) LAZYCLEARLIST(signal_procs) return ..() @@ -93,6 +94,9 @@ if(!override && procs[sig_type]) stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") + if(sig_type[1] == "!") + SSdcs.RegisterSignal(src, sig_type) + procs[sig_type] = proc_or_callback enabled = TRUE diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm new file mode 100644 index 00000000000..c0a875d4579 --- /dev/null +++ b/code/datums/components/edit_complainer.dm @@ -0,0 +1,23 @@ +// This is just a bit of fun while making an example for global signal +/datum/component/edit_complainer + var/list/say_lines + +/datum/component/edit_complainer/Initialize(list/text) + if(!ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + + var/static/list/default_lines = list( + "CentCom's profligacy frays another thread.", + "Another tug at the weave.", + "Who knows when the stresses will finally shatter the form?", + "Even now a light shines through the cracks.", + "CentCom once more twists knowledge beyond its authority.", + "There is an uncertain air in the mansus.", + ) + say_lines = text || default_lines + + RegisterSignal(COMSIG_GLOB_VAR_EDIT, .proc/var_edit_react) + +/datum/component/edit_complainer/proc/var_edit_react(list/arguments) + var/atom/movable/master = parent + master.say(pick(say_lines)) diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index eb895fd74ff..14f6fe28b38 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -20,7 +20,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE click_gather = TRUE - max_w_class = WEIGHT_CLASS_NORMAL + max_w_class = WEIGHT_CLASS_BULKY // can fit vending refills max_combined_w_class = 800 max_items = 400 display_numerical_stacking = TRUE @@ -29,5 +29,5 @@ . = ..() if(!I.get_part_rating()) if (!stop_messages) - to_chat(M, "[parent] only accepts machine par ts!") + to_chat(M, "[parent] only accepts machine parts!") return FALSE diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 59953a4ce1a..56f22430158 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -96,7 +96,7 @@ else atomsnowflake += "[D]" if(A.dir) - atomsnowflake += "
<< [dir2text(A.dir)] >>" + atomsnowflake += "
<< [dir2text(A.dir)] >>" else atomsnowflake += "[D]" diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 26a0a0f414a..4ef292d1b1c 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -51,6 +51,7 @@ tele_play_specials(teleatom, curturf, effectin, asoundin) var/success = force_teleport ? teleatom.forceMove(destturf) : teleatom.Move(destturf) if (success) + log_game("[teleatom] ([key_name(teleatom)]) has teleported from [AREACOORD(curturf)] to [AREACOORD(destturf)]") tele_play_specials(teleatom, destturf, effectout, asoundout) if(ismegafauna(teleatom)) message_admins("[teleatom] [ADMIN_FLW(teleatom)] has teleported from [ADMIN_VERBOSEJMP(curturf)] to [ADMIN_VERBOSEJMP(destturf)].") diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 0e1f681b6a3..dbe150b0fab 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -101,7 +101,7 @@ text_gain_indication = "You twitch." /datum/mutation/human/tourettes/on_life(mob/living/carbon/human/owner) - if(prob(10) && owner.stat == CONSCIOUS) + if(prob(10) && owner.stat == CONSCIOUS && !owner.IsStun()) owner.Stun(200) switch(rand(1, 3)) if(1) diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index f5449369b5c..30de1314c99 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -121,7 +121,6 @@ icon_state = "yellow" requires_power = FALSE has_gravity = STANDARD_GRAVITY - flags_1 = NO_DEATHRATTLE_1 /area/ctf/control_room name = "Control Room A" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 348f7d3cb51..211bb35263b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -29,6 +29,7 @@ var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. var/atom/movable/pulling var/grab_state = 0 + var/throwforce = 0 /atom/movable/vv_edit_var(var_name, var_value) var/static/list/banned_edits = list("step_x", "step_y", "step_size") diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 8a1bf7b029a..c1adb0e9d0a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -419,7 +419,7 @@ Class Procs: B.moveToNullspace() SEND_SIGNAL(W, COMSIG_TRY_STORAGE_INSERT, A, null, null, TRUE) component_parts -= A - to_chat(user, "[A.name] replaced with [B.name].") + to_chat(user, "[capitalize(A.name)] replaced with [B.name].") shouldplaysound = 1 //Only play the sound when parts are actually replaced! break RefreshParts() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 22db77090b4..84059e8029b 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -154,6 +154,7 @@ var/multiplier = text2num(href_list["multiplier"]) var/is_stack = ispath(being_built.build_path, /obj/item/stack) + multiplier = CLAMP(multiplier,1,50) ///////////////// diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 5cf652f00d8..3e8e3afc98b 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -41,6 +41,16 @@ var/internal_light = TRUE //Whether it can light up when an AI views it +/obj/machinery/camera/preset/toxins //Bomb test site in space + name = "Hardened Bomb-Test Camera" + desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top." + c_tag = "Bomb Testing Site" + network = list("rd","toxins") + use_power = NO_POWER_USE //Test site is an unpowered area + invuln = TRUE + light_range = 10 + start_active = TRUE + /obj/machinery/camera/Initialize(mapload, obj/structure/camera_assembly/CA) . = ..() for(var/i in network) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index d9a93a65789..45f0268a003 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -10,6 +10,8 @@ if(!isMotion()) . = PROCESS_KILL return + if(stat & EMPED) + return if (detectTime > 0) var/elapsed = world.time - detectTime if (elapsed > alarm_delay) @@ -63,6 +65,7 @@ for (var/mob/living/silicon/aiPlayer in GLOB.player_list) if (status) aiPlayer.triggerAlarm("Motion", get_area(src), list(src), src) + visible_message("A red light flashes on the [src]!") detectTime = -1 return TRUE diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index db501180627..afcc1fee7c0 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -2,7 +2,7 @@ // EMP /obj/machinery/camera/emp_proof - start_active = 1 + start_active = TRUE /obj/machinery/camera/emp_proof/Initialize() . = ..() @@ -11,7 +11,7 @@ // X-ray /obj/machinery/camera/xray - start_active = 1 + start_active = TRUE icon_state = "xraycam" // Thanks to Krutchen for the icons. /obj/machinery/camera/xray/Initialize() @@ -20,7 +20,7 @@ // MOTION /obj/machinery/camera/motion - start_active = 1 + start_active = TRUE name = "motion-sensitive security camera" /obj/machinery/camera/motion/Initialize() @@ -29,7 +29,7 @@ // ALL UPGRADES /obj/machinery/camera/all - start_active = 1 + start_active = TRUE /obj/machinery/camera/all/Initialize() . = ..() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 703b0e1b502..696c9442b93 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -152,6 +152,50 @@ D["[C.c_tag][(C.status ? null : " (Deactivated)")]"] = C return D +// SECURITY MONITORS + +/obj/machinery/computer/security/wooden_tv + name = "security camera monitor" + desc = "An old TV hooked into the station's camera network." + icon_state = "television" + icon_keyboard = null + icon_screen = "detective_tv" + clockwork = TRUE //it'd look weird + +/obj/machinery/computer/security/mining + name = "outpost camera console" + desc = "Used to access the various cameras on the outpost." + icon_screen = "mining" + icon_keyboard = "mining_key" + network = list("mine", "auxbase") + circuit = /obj/item/circuitboard/computer/mining + +/obj/machinery/computer/security/research + name = "research camera console" + desc = "Used to access the various cameras in science." + network = list("rd") + circuit = /obj/item/circuitboard/computer/research + +/obj/machinery/computer/security/hos + name = "Head of Security's camera console" + desc = "A custom security console with added access to the labor camp network." + network = list("ss13", "labor") + circuit = null + +/obj/machinery/computer/security/labor + name = "labor camp monitoring" + desc = "Used to access the various cameras on the labor camp." + network = list("labor") + circuit = null + +/obj/machinery/computer/security/qm + name = "Quartermaster's camera console" + desc = "A console with access to the mining, auxillary base and vault camera networks." + network = list("mine", "auxbase", "vault") + circuit = null + +// TELESCREENS + /obj/machinery/computer/security/telescreen name = "\improper Telescreen" desc = "Used for watching an empty arena." @@ -161,7 +205,6 @@ density = FALSE circuit = null clockwork = TRUE //it'd look very weird - light_power = 0 /obj/machinery/computer/security/telescreen/update_icon() @@ -176,28 +219,68 @@ icon = 'icons/obj/status_display.dmi' icon_state = "entertainment" network = list("thunder") - density = FALSE - circuit = null -/obj/machinery/computer/security/wooden_tv - name = "security camera monitor" - desc = "An old TV hooked into the stations camera network." - icon_state = "television" - icon_keyboard = null - icon_screen = "detective_tv" - clockwork = TRUE //it'd look weird +/obj/machinery/computer/security/telescreen/rd + name = "Research Director's telescreen" + desc = "Used for watching the AI and the RD's goons from the safety of his office." + network = list("rd", "aicore", "aiupload", "minisat", "xeno", "test") - -/obj/machinery/computer/security/mining - name = "outpost camera console" - desc = "Used to access the various cameras on the outpost." - icon_screen = "mining" - icon_keyboard = "mining_key" - network = list("mine") - circuit = /obj/item/circuitboard/computer/mining - -/obj/machinery/computer/security/research - name = "research camera console" - desc = "Used to access the various cameras in science." +/obj/machinery/computer/security/telescreen/circuitry + name = "circuitry telescreen" + desc = "Used for watching the other eggheads from the safety of the circuitry lab." network = list("rd") - circuit = /obj/item/circuitboard/computer/research + +/obj/machinery/computer/security/telescreen/ce + name = "Chief Engineer's telescreen" + desc = "Used for watching the engine, telecommunications and the minisat." + network = list("engine", "singularity", "tcomms", "minisat") + +/obj/machinery/computer/security/telescreen/cmo + name = "Chief Medical Officer's telescreen" + desc = "A telescreen with access to the medbay's camera network." + network = list("medbay") + +/obj/machinery/computer/security/telescreen/vault + name = "Vault monitor" + desc = "A telescreen that connects to the vault's camera network." + network = list("vault") + +/obj/machinery/computer/security/telescreen/toxins + name = "Bomb test site monitor" + desc = "A telescreen that connects to the bomb test site's camera." + network = list("toxin") + +/obj/machinery/computer/security/telescreen/engine + name = "engine monitor" + desc = "A telescreen that connects to the engine's camera network." + network = list("engine") + +/obj/machinery/computer/security/telescreen/turbine + name = "turbine monitor" + desc = "A telescreen that connects to the turbine's camera." + network = list("turbine") + +/obj/machinery/computer/security/telescreen/interrogation + name = "interrogation room monitor" + desc = "A telescreen that connects to the interrogation room's camera." + network = list("interrogation") + +/obj/machinery/computer/security/telescreen/prison + name = "prison monitor" + desc = "A telescreen that connects to the permabrig's camera network." + network = list("prison") + +/obj/machinery/computer/security/telescreen/auxbase + name = "auxillary base monitor" + desc = "A telescreen that connects to the auxillary base's camera." + network = list("auxbase") + +/obj/machinery/computer/security/telescreen/minisat + name = "minisat monitor" + desc = "A telescreen that connects to the minisat's camera network." + network = list("minisat") + +/obj/machinery/computer/security/telescreen/aiupload + name = "AI upload monitor" + desc = "A telescreen that connects to the AI upload's camera network." + network = list("aiupload") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 32b40f686c6..5e5c08ee99d 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -45,8 +45,9 @@ /obj/machinery/computer/communications/process() if(..()) - if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE) - updateDialog() + var/ai_autoupdate = aistate != STATE_STATUSDISPLAY && aistate != STATE_CALLSHUTTLE && aistate != STATE_PURCHASE && aistate != STATE_VIEWMESSAGE + var/machine_user_autoupdate = state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE + updateDialog(machine_user_autoupdate,ai_autoupdate) /obj/machinery/computer/communications/Topic(href, href_list) if(..()) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 93b997eee69..9e12a7bcdd2 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -171,6 +171,8 @@ var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L target = L[desc] + var/turf/T = get_turf(target) + log_game("[key_name(user)] has set the teleporter target to [target] at [AREACOORD(T)]") else var/list/S = power_station.linked_stations @@ -185,6 +187,8 @@ var/obj/machinery/teleport/station/target_station = L[desc] if(!target_station || !target_station.teleporter_hub) return + var/turf/T = get_turf(target_station) + log_game("[key_name(user)] has set the teleporter target to [target_station] at [AREACOORD(T)]") target = target_station.teleporter_hub target_station.linked_stations |= power_station target_station.stat &= ~NOPOWER diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 65f74d3811f..a709fdbd2a2 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -180,7 +180,7 @@ break if(component_check) P.play_tool_sound(src) - var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1) + var/obj/machinery/new_machine = new circuit.build_path(loc, 1) new_machine.anchored = anchored new_machine.on_construction() for(var/obj/O in new_machine.component_parts) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 409e64ca7ec..2f8bf41a0b1 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -3,6 +3,7 @@ /obj/machinery/iv_drip name = "\improper IV drip" + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate." icon = 'icons/obj/iv_drip.dmi' icon_state = "iv_drip" anchored = FALSE diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3d217e52c5f..2c1f9d01b04 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -69,6 +69,7 @@ if(do_teleport(M, com.target)) use_power(5000) if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem + log_game("[M] ([key_name(M)]) was turned into a fly person") if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M if(human.dna && human.dna.species.id == "human") diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 42f59cc5358..307a912fe3f 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -11,8 +11,8 @@ var/static/list/AllTeleporters -/obj/effect/bump_teleporter/New() - ..() +/obj/effect/bump_teleporter/Initialize() + . = ..() LAZYADD(AllTeleporters, src) /obj/effect/bump_teleporter/Destroy() diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 69c80c85f67..8cb48d18744 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -14,9 +14,9 @@ var/displayed_text var/atom/attached_to -/obj/effect/countdown/New(atom/A) +/obj/effect/countdown/Initialize() . = ..() - attach(A) + attach(loc) /obj/effect/countdown/examine(mob/user) . = ..() diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 8c31847f786..eb4c562c369 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -12,13 +12,13 @@ would spawn and follow the beaker, even if it is carried or thrown. pass_flags = PASSTABLE | PASSGRILLE anchored = TRUE -/obj/effect/particle_effect/New() - ..() +/obj/effect/particle_effect/Initialize() + . = ..() GLOB.cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() GLOB.cameranet.updateVisibility(src) - . = ..() + return ..() /datum/effect_system var/number = 3 diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 33ecd308d1b..d208510e860 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -4,8 +4,8 @@ opacity = 1 anchored = TRUE -/obj/effect/particle_effect/expl_particles/New() - ..() +/obj/effect/particle_effect/expl_particles/Initialize() + . = ..() QDEL_IN(src, 15) /datum/effect_system/expl_particles @@ -29,8 +29,8 @@ pixel_x = -32 pixel_y = -32 -/obj/effect/explosion/New() - ..() +/obj/effect/explosion/Initialize() + . = ..() QDEL_IN(src, 10) /datum/effect_system/explosion diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index d9a7d6fb7b8..e7b7472e86e 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -270,8 +270,8 @@ max_integrity = 20 CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/foamedmetal/New() - ..() +/obj/structure/foamedmetal/Initialize() + . = ..() air_update_turf(1) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index ef8b0b07344..75aeaa447c3 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -30,8 +30,8 @@ set_opacity(0) //if we were blocking view, we aren't now because we're fading out stoplag() -/obj/effect/particle_effect/smoke/New() - ..() +/obj/effect/particle_effect/smoke/Initialize() + . = ..() create_reagents(500) START_PROCESSING(SSobj, src) diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index b74175b5ad1..49f82e106dd 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -22,8 +22,8 @@ anchored = TRUE light_range = 1 -/obj/effect/particle_effect/sparks/New() - ..() +/obj/effect/particle_effect/sparks/Initialize() + . = ..() flick("sparks", src) // replay the animation playsound(src.loc, "sparks", 100, 1) var/turf/T = loc diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 4c84c976509..469b05176a3 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -7,8 +7,8 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/particle_effect/water/New() - ..() +/obj/effect/particle_effect/water/Initialize() + . = ..() QDEL_IN(src, 70) /obj/effect/particle_effect/water/Move(turf/newloc) @@ -45,8 +45,8 @@ steam.start() -- spawns the effect icon_state = "extinguish" density = FALSE -/obj/effect/particle_effect/steam/New() - ..() +/obj/effect/particle_effect/steam/Initialize() + . = ..() QDEL_IN(src, 20) /datum/effect_system/steam_spread diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index ef074f4cec5..6aab4f386a4 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -8,8 +8,8 @@ CanAtmosPass = ATMOS_PASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) -/obj/effect/forcefield/New() - ..() +/obj/effect/forcefield/Initialize() + . = ..() if(timeleft) QDEL_IN(src, timeleft) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm deleted file mode 100644 index 2082f2b4952..00000000000 --- a/code/game/objects/effects/manifest.dm +++ /dev/null @@ -1,17 +0,0 @@ -/obj/effect/manifest - name = "manifest" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x" - -/obj/effect/manifest/New() - src.invisibility = INVISIBILITY_ABSTRACT - -/obj/effect/manifest/proc/manifest() - var/dat = "Crew Manifest:
" - for(var/mob/living/carbon/human/M in GLOB.carbon_list) - dat += text(" [] - []
", M.name, M.get_assignment()) - var/obj/item/paper/P = new /obj/item/paper( src.loc ) - P.info = dat - P.name = "paper- 'Crew Manifest'" - //SN src = null - qdel(src) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 4e00d984366..4bca817e735 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -98,8 +98,8 @@ density = FALSE var/duration = 0 -/obj/effect/mine/pickup/New() - ..() +/obj/effect/mine/pickup/Initialize() + . = ..() animate(src, pixel_y = 4, time = 20, loop = -1) /obj/effect/mine/pickup/triggermine(mob/victim) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c1abc2c02eb..a0634928ce3 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -13,8 +13,8 @@ icon_state="b_beam" var/atom/BeamSource -/obj/effect/overlay/beam/New() - ..() +/obj/effect/overlay/beam/Initialize() + . = ..() QDEL_IN(src, 10) /obj/effect/overlay/palmtree_r diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index b4e02a58cc0..afb2b220765 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -16,8 +16,8 @@ var/obj/item/toner/ink = null -/obj/item/airlock_painter/New() - ..() +/obj/item/airlock_painter/Initialize() + . = ..() ink = new /obj/item/toner(src) //This proc doesn't just check if the painter can be used, but also uses it. diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index a0ec648a1ac..b660801f904 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -14,8 +14,8 @@ var/start_lit = FALSE heat = 1000 -/obj/item/candle/New() - ..() +/obj/item/candle/Initialize() + . = ..() if(start_lit) // No visible message light(show_message = FALSE) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 3104f4b3426..7f750855f10 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -9,7 +9,7 @@ /* - * DATA CARDS - Used for the teleporter + * DATA CARDS - Used for the IC data card reader */ /obj/item/card name = "card" @@ -24,30 +24,49 @@ return BRUTELOSS /obj/item/card/data - name = "data disk" - desc = "A disk of data." - icon_state = "data" + name = "data card" + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has a stripe running down the middle." + icon_state = "data_1" + obj_flags = UNIQUE_RENAME var/function = "storage" var/data = "null" var/special = null item_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + var/detail_color = COLOR_ASSEMBLY_ORANGE -/obj/item/card/data/verb/label(t as text) - set name = "Label Disk" - set category = "Object" - set src in usr +/obj/item/card/data/Initialize() + .=..() + update_icon() - if(usr.stat || !usr.canmove || usr.restrained()) +/obj/item/card/data/update_icon() + cut_overlays() + if(detail_color == COLOR_FLOORTILE_GRAY) return + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) - if (t) - src.name = "data disk- '[t]'" - else - src.name = "data disk" - src.add_fingerprint(usr) - return +/obj/item/card/data/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/integrated_electronics/detailer)) + var/obj/item/integrated_electronics/detailer/D = I + detail_color = D.detail_color + update_icon() + return ..() + +/obj/item/proc/GetCard() + +/obj/item/card/data/GetCard() + return src + +/obj/item/card/data/full_color + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has the entire card colored." + icon_state = "data_2" + +/obj/item/card/data/disk + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one inexplicibly looks like a floppy disk." + icon_state = "data_3" /* * ID CARDS diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 66eb0ed98fd..64ccdf50470 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -215,37 +215,36 @@ name = "Booze-O-Mat Vendor (Machine Board)" desc = "You can turn the \"brand selection\" dial using a screwdriver." build_path = /obj/machinery/vending/boozeomat - req_components = list( - /obj/item/vending_refill/boozeomat = 3) + req_components = list(/obj/item/vending_refill/boozeomat = 1) - var/static/list/vending_names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat", - /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", - /obj/machinery/vending/snack = "Getmore Chocolate Corp", - /obj/machinery/vending/cola = "Robust Softdrinks", - /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", - /obj/machinery/vending/games = "\improper Good Clean Fun", - /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", - /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", - /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", - /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", - /obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe", - /obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe", - /obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe", - /obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe", - /obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe", - /obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe", - /obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe", - /obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe", - /obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe", - /obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe", - /obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe", - /obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe", - /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", - /obj/machinery/vending/clothing = "ClothesMate", - /obj/machinery/vending/medical = "NanoMed Plus", - /obj/machinery/vending/wallmed = "NanoMed") - needs_anchored = FALSE + var/static/list/vending_names_paths = list( + /obj/machinery/vending/boozeomat = "Booze-O-Mat", + /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", + /obj/machinery/vending/snack = "Getmore Chocolate Corp", + /obj/machinery/vending/cola = "Robust Softdrinks", + /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", + /obj/machinery/vending/games = "\improper Good Clean Fun", + /obj/machinery/vending/autodrobe = "AutoDrobe", + /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", + /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", + /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", + /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", + /obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe", + /obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe", + /obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe", + /obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe", + /obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe", + /obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe", + /obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe", + /obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe", + /obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe", + /obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe", + /obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe", + /obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe", + /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", + /obj/machinery/vending/clothing = "ClothesMate", + /obj/machinery/vending/medical = "NanoMed Plus", + /obj/machinery/vending/wallmed = "NanoMed") /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -261,7 +260,7 @@ /obj/item/circuitboard/machine/vendor/proc/set_type(obj/machinery/vending/typepath) build_path = typepath name = "[vending_names_paths[build_path]] Vendor (Machine Board)" - req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count)) + req_components = list(initial(typepath.refill_canister) = 1) /obj/item/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M) for(var/typepath in vending_names_paths) @@ -865,14 +864,14 @@ build_path = /obj/machinery/vending/donksofttoyvendor req_components = list( /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksoft = 3) + /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor name = "Syndicate Donksoft Toy Vendor (Machine Board)" build_path = /obj/machinery/vending/toyliberationstation req_components = list( /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksoft = 3) + /obj/item/vending_refill/donksoft = 1) /obj/item/circuitboard/machine/dish_drive name = "Dish Drive (Machine Board)" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 89d4585b2a3..e514a82c5a4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -92,8 +92,12 @@ GLOBAL_LIST_EMPTY(PDAs) ..() if(!id && !inserted_item) return - else - to_chat(user, "Alt-click to remove contents.") + + if(id) + to_chat(user, "Alt-click to remove the id.") + + if(inserted_item && (!isturf(loc))) + to_chat(user, "Ctrl-click to remove [inserted_item].") /obj/item/pda/Initialize() . = ..() @@ -712,6 +716,15 @@ GLOBAL_LIST_EMPTY(PDAs) else remove_pen() +/obj/item/pda/CtrlClick() + ..() + + if(issilicon(usr)) + return + + if(usr.canUseTopic(src) && !isturf(loc)) + remove_pen() + /obj/item/pda/verb/verb_remove_id() set category = "Object" set name = "Eject ID" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index aa738056402..43c2b06d440 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -129,18 +129,18 @@ detect_state = PROXIMITY_ON_SCREEN break - if(!detect_state && GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z)) - var/datum/camerachunk/chunk = GLOB.cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z) - if(chunk) - if(chunk.seenby.len) - for(var/mob/camera/aiEye/A in chunk.seenby) - var/turf/detect_turf = get_turf(A) - if(get_dist(our_turf, detect_turf) < rangealert) - detect_state = PROXIMITY_ON_SCREEN - break - if(get_dist(our_turf, detect_turf) < rangewarning) - detect_state = PROXIMITY_NEAR - break + if(detect_state) + return + var/datum/camerachunk/chunk = GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z) + if(chunk && chunk.seenby.len) + for(var/mob/camera/aiEye/A in chunk.seenby) + var/turf/detect_turf = get_turf(A) + if(get_dist(our_turf, detect_turf) < rangealert) + detect_state = PROXIMITY_ON_SCREEN + break + if(get_dist(our_turf, detect_turf) < rangewarning) + detect_state = PROXIMITY_NEAR + break /obj/item/multitool/cyborg name = "multitool" diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 0ef20dea19d..fca7f9bc6d0 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -160,11 +160,22 @@ if(sensor.on && sensor.visible) add_overlay("proxy_beam") -/obj/item/transfer_valve/proc/merge_gases() - tank_two.air_contents.volume += tank_one.air_contents.volume +/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE) + var/target_self = FALSE + if(!target || (target == tank_one.air_contents)) + target = tank_two.air_contents + if(target == tank_two.air_contents) + target_self = TRUE + if(change_volume) + if(!target_self) + target.volume += tank_two.volume + target.volume += tank_one.air_contents.volume var/datum/gas_mixture/temp temp = tank_one.air_contents.remove_ratio(1) - tank_two.air_contents.merge(temp) + target.merge(temp) + if(!target_self) + temp = tank_two.air_contents.remove_ratio(1) + target.merge(temp) /obj/item/transfer_valve/proc/split_gases() if (!valve_open || !tank_one || !tank_two) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index c3691b5d376..c961fca9f2d 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -165,15 +165,17 @@ /obj/item/grenade/chem_grenade/log_grenade(mob/user, turf/T) ..() + var/reagent_string = "" + var/beaker_number = 1 for(var/obj/exploded_beaker in beakers) if(!exploded_beaker.reagents) continue - var/reagent_list = pretty_string_from_reagent_list(exploded_beaker.reagents) - var/message = "[src] primed by [user] at [ADMIN_VERBOSEJMP(T)] contained [reagent_list]." - GLOB.bombers += message - message_admins(message) - log_game("[src] primed by [user] at [AREACOORD(T)] contained [reagent_list].") - add_logs(user, src, "primed", addition = "[reagent_list] inside.") + reagent_string += "[exploded_beaker] [beaker_number++] : " + pretty_string_from_reagent_list(exploded_beaker.reagents.reagent_list) + ";" + var/message = "[src] primed by [user] at [ADMIN_VERBOSEJMP(T)] contained [reagent_string]." + GLOB.bombers += message + message_admins(message) + log_game("[src] primed by [user] at [AREACOORD(T)] contained [reagent_string].") + add_logs(user, src, "primed", addition = "[reagent_string] inside.") /obj/item/grenade/chem_grenade/prime() if(stage != READY) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index b69da523c3c..c9e1e2811a2 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -88,6 +88,51 @@ if(istype(B)) playsound(B, 'sound/items/sheath.ogg', 25, 1) +/obj/item/melee/sabre/suicide_act(mob/living/user) + user.visible_message("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!") + var/i = 0 + var/originally_nodropped = item_flags & NODROP + item_flags |= NODROP + if(iscarbon(user)) + var/mob/living/carbon/Cuser = user + var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src) + var/list/limbs_to_dismember + var/list/arms = list() + var/list/legs = list() + var/obj/item/bodypart/bodypart + + for(bodypart in Cuser.bodyparts) + if(bodypart == holding_bodypart) + continue + if(bodypart.body_part & ARMS) + arms += bodypart + else if (bodypart.body_part & LEGS) + legs += bodypart + + limbs_to_dismember = arms + legs + if(holding_bodypart) + limbs_to_dismember += holding_bodypart + + var/speedbase = abs((4 SECONDS) / limbs_to_dismember.len) + for(bodypart in limbs_to_dismember) + i++ + addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i) + addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i) + return MANUAL_SUICIDE + +/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting) + if(!QDELETED(affecting) && affecting.dismemberable && affecting.owner == user && !QDELETED(user)) + playsound(user, hitsound, 25, 1) + affecting.dismember(BRUTE) + user.adjustBruteLoss(20) + +/obj/item/melee/sabre/proc/manual_suicide(mob/living/user, originally_nodropped) + if(!QDELETED(user)) + user.adjustBruteLoss(200) + user.death(FALSE) + if(!originally_nodropped) + item_flags &= ~NODROP + /obj/item/melee/classic_baton name = "police baton" desc = "A wooden truncheon for beating criminal scum." diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 0d993da41bf..eec6c00834c 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -510,3 +510,13 @@ attack_verb = list("blorbled", "slimed", "absorbed") squeak_override = list('sound/effects/blobattack.ogg' = 1) gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy + +/obj/item/toy/plush/awakenedplushie + name = "awakened plushie" + desc = "An ancient plushie that has grown enlightened to the true nature of reality." + icon_state = "plushie_awake" + item_state = "plushie_awake" + +/obj/item/toy/plush/awakenedplushie/ComponentInitialize() + . = ..() + AddComponent(/datum/component/edit_complainer) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 3db5756f157..522e1a11536 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -67,6 +67,7 @@ attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") novariants = TRUE grind_results = list("bluespace" = 20) + point_value = 30 var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index edddb27979a..a6e2d255fbe 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list("silicon" = 20) + point_value = 1 /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -138,6 +139,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list("silicon" = 20, "iron" = 10) + point_value = 4 /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -180,6 +182,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10) + point_value = 23 /obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 3813010827a..8d1562826c6 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("carbon" = 20) + point_value = 25 GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ @@ -129,6 +130,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("uranium" = 20) + point_value = 20 GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -154,6 +156,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ max_integrity = 100 materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) grind_results = list("plasma" = 20) + point_value = 20 /obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -193,6 +196,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ sheettype = "gold" materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT) grind_results = list("gold" = 20) + point_value = 20 GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ @@ -220,6 +224,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) grind_results = list("silver" = 20) + point_value = 20 GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ @@ -247,6 +252,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("banana" = 20) + point_value = 50 GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -272,6 +278,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ throw_range = 3 sheettype = "titanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 GLOBAL_LIST_INIT(titanium_recipes, list ( \ new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \ @@ -300,6 +307,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ throw_range = 3 sheettype = "plastitanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) + point_value = 45 GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c1dfc38235d..37371d11222 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -98,6 +98,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/metal grind_results = list("iron" = 20) + point_value = 2 /obj/item/stack/sheet/metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -158,6 +159,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list("iron" = 20, "plasma" = 20) + point_value = 23 /obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plasteel_recipes diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 315cc94b661..21b43eba201 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -11,4 +11,5 @@ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") novariants = FALSE var/perunit = MINERAL_MATERIAL_AMOUNT - var/sheettype = null //this is used for girders in the creation of walls/false walls \ No newline at end of file + var/sheettype = null //this is used for girders in the creation of walls/false walls + var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity. \ No newline at end of file diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index fe46141614d..c338f24d261 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -231,3 +231,35 @@ new /obj/item/reagent_containers/pill/patch/silver_sulf(src) for(var/i in 1 to 3) new /obj/item/reagent_containers/pill/patch/styptic(src) + +/obj/item/storage/pill_bottle/zoom + name = "suspicious pill bottle" + desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds." + +/obj/item/storage/pill_bottle/zoom/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/zoom(src) + +/obj/item/storage/pill_bottle/happy + name = "suspicious pill bottle" + desc = "There is a smiley on the top." + +/obj/item/storage/pill_bottle/happy/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/happy(src) + +/obj/item/storage/pill_bottle/lsd + name = "suspicious pill bottle" + desc = "There is a badly drawn thing with the shape of a mushroom." + +/obj/item/storage/pill_bottle/lsd/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/lsd(src) + +/obj/item/storage/pill_bottle/aranesp + name = "suspicious pill bottle" + desc = "The label says 'gotta go fast'." + +/obj/item/storage/pill_bottle/aranesp/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/aranesp(src) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 447a83422b7..74aea29768b 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -226,7 +226,6 @@ air_contents.react() check_status() - /obj/item/tank/proc/check_status() //Handle exploding, leaking, and rupturing of the tank diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 7a43a7d2554..3be12abf4fc 100644 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -18,19 +18,34 @@ throw_range = 7 w_class = WEIGHT_CLASS_BULKY armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30) - var/charges = list(0, 0, 0) //how many restocking "charges" the refill has for standard/contraband/coin products - var/init_charges = list(0, 0, 0) + // Built automatically from the corresponding vending machine. + // If null, considered to be full. Otherwise, is list(/typepath = amount). + var/list/products + var/list/contraband + var/list/premium -/obj/item/vending_refill/New(amt = -1) - ..() +/obj/item/vending_refill/Initialize(mapload) + . = ..() name = "\improper [machine_name] restocking unit" - if(isnum(amt) && amt > -1) - charges[1] = amt /obj/item/vending_refill/examine(mob/user) ..() - if(charges[1] > 0) - to_chat(user, "It can restock [charges[1]+charges[2]+charges[3]] item(s).") + var/num = get_part_rating() + if (num == INFINITY) + to_chat(user, "It's sealed tight, completely full of supplies.") + else if (num == 0) + to_chat(user, "It's empty!") else - to_chat(user, "It's empty!") \ No newline at end of file + to_chat(user, "It can restock [num] item\s.") + +/obj/item/vending_refill/get_part_rating() + if (!products || !contraband || !premium) + return INFINITY + . = 0 + for(var/key in products) + . += products[key] + for(var/key in contraband) + . += contraband[key] + for(var/key in premium) + . += premium[key] diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index b16f7ba4f6e..b296ec7f178 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -48,13 +48,7 @@ /obj/hitby(atom/movable/AM) ..() - var/tforce = 0 - if(ismob(AM)) - tforce = 10 - else if(isobj(AM)) - var/obj/O = AM - tforce = O.throwforce - take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM)) + take_damage(AM.throwforce, BRUTE, "melee", 1, get_dir(src, AM)) /obj/ex_act(severity, target) if(resistance_flags & INDESTRUCTIBLE) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 02e1cc9bd0e..bd08fb67191 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,7 +2,6 @@ /obj var/crit_fail = FALSE animate_movement = 2 - var/throwforce = 0 var/obj_flags = CAN_BE_HIT var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. @@ -138,19 +137,22 @@ else obj_flags &= ~IN_USE -/obj/proc/updateDialog() +/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) // Check that people are actually using the machine. If not, don't update anymore. if(obj_flags & IN_USE) - var/list/nearby = viewers(1, src) - var/is_in_use = 0 - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - is_in_use = 1 - src.interact(M) - var/ai_in_use = AutoUpdateAI(src) + var/is_in_use = FALSE + if(update_viewers) + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + is_in_use = TRUE + src.interact(M) + var/ai_in_use = FALSE + if(update_ais) + ai_in_use = AutoUpdateAI(src) - if(!ai_in_use && !is_in_use) - obj_flags &= ~IN_USE + if(update_viewers && update_ais) //State change is sure only if we check both + if(!ai_in_use && !is_in_use) + obj_flags &= ~IN_USE /obj/attack_ghost(mob/user) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index c7ab58f0117..47278179454 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -148,14 +148,17 @@ resistance_flags = FLAMMABLE max_integrity = 70 buildstackamount = 2 - var/mutable_appearance/armrest item_chair = null + var/mutable_appearance/armrest /obj/structure/chair/comfy/Initialize() - armrest = mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") + armrest = GetArmrest() armrest.layer = ABOVE_MOB_LAYER return ..() +/obj/structure/chair/comfy/proc/GetArmrest() + return mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") + /obj/structure/chair/comfy/Destroy() QDEL_NULL(armrest) return ..() @@ -194,7 +197,6 @@ buildstackamount = 5 item_chair = null - /obj/structure/chair/office/Moved() . = ..() if(has_gravity()) @@ -411,12 +413,6 @@ /obj/structure/chair/shuttle name = "shuttle seat" desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights." - icon_state = "shuttle_chair" - buildstackamount = 2 - var/mutable_appearance/armrest - item_chair = null + icon = 'goon/icons/obj/chairs.dmi' + icon_state = "shuttle_chair" //thanks gannets! -/obj/structure/chair/shuttle/Initialize() - armrest = mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest") - armrest.layer = ABOVE_MOB_LAYER - return ..() \ No newline at end of file diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index f73a2067478..aa2f7bed86b 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -8,23 +8,23 @@ max_integrity = 200 integrity_failure = 50 var/obj/item/extinguisher/stored_extinguisher - var/opened = 0 + var/opened = FALSE -/obj/structure/extinguisher_cabinet/examine(mob/user) - ..() - to_chat(user, "Alt-click to [opened ? "close":"open"] it.") - -/obj/structure/extinguisher_cabinet/New(loc, ndir, building) - ..() +/obj/structure/extinguisher_cabinet/Initialize(mapload, ndir, building) + . = ..() if(building) setDir(ndir) pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27) pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 - opened = 1 + opened = TRUE icon_state = "extinguisher_empty" else stored_extinguisher = new /obj/item/extinguisher(src) +/obj/structure/extinguisher_cabinet/examine(mob/user) + ..() + to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) qdel(stored_extinguisher) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 0c84c4cf639..448734d9176 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -1,19 +1,20 @@ /obj/structure/fireaxecabinet name = "fire axe cabinet" desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." - var/obj/item/twohanded/fireaxe/fireaxe = new/obj/item/twohanded/fireaxe icon = 'icons/obj/wallmounts.dmi' icon_state = "fireaxe" anchored = TRUE density = FALSE armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) - var/locked = TRUE - var/open = FALSE max_integrity = 150 integrity_failure = 50 + var/locked = TRUE + var/open = FALSE + var/obj/item/twohanded/fireaxe/fireaxe /obj/structure/fireaxecabinet/Initialize() . = ..() + fireaxe = new update_icon() /obj/structure/fireaxecabinet/Destroy() diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 9c045c12158..b0e46b8aa4b 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -79,8 +79,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( qdel(src) //Just get the side effects and call Destroy var/turf/W = new path(src) - W.vis_contents.Cut() - for(var/i in transferring_comps) W.TakeComponent(i) diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index 6d4a949c754..3c4c8d9f858 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -47,8 +47,9 @@ /turf/open/floor/plating/ashplanet/Initialize() if(smooth) - pixel_y = -4 - pixel_x = -4 + var/matrix/M = new + M.Translate(-4, -4) + transform = M icon = smooth_icon . = ..() diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 8c907573d86..6123bf25e6b 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -27,8 +27,9 @@ /turf/closed/mineral/Initialize() if (!canSmoothWith) canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible) - pixel_y = -4 - pixel_x = -4 + var/matrix/M = new + M.Translate(-4, -4) + transform = M icon = smooth_icon . = ..() if (mineralType && mineralAmt && spread && spreadChance) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 46b0e0b2021..490a6dcaf72 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -19,8 +19,6 @@ flags_1 = CAN_BE_DIRTY_1 - var/image/obscured //camerachunks - var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes var/explosion_level = 0 //for preventing explosion dodging @@ -44,6 +42,9 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + // by default, vis_contents is inherited from the turf that was here before + vis_contents.Cut() + assemble_baseturfs() levelupdate() @@ -325,6 +326,14 @@ /turf/proc/visibilityChanged() GLOB.cameranet.updateVisibility(src) + // The cameranet usually handles this for us, but if we've just been + // recreated we should make sure we have the cameranet vis_contents. + var/datum/camerachunk/C = GLOB.cameranet.chunkGenerated(x, y, z) + if(C) + if(C.obscuredTurfs[src]) + vis_contents += GLOB.cameranet.vis_contents + else + vis_contents -= GLOB.cameranet.vis_contents /turf/proc/burn_tile() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 334528a1c25..56662a2157e 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,11 +1,11 @@ //////////////////////////////// /proc/message_admins(msg) - msg = "ADMIN LOG: [msg]" + msg = "ADMIN LOG: [msg]" to_chat(GLOB.admins, msg) /proc/relay_msg_admins(msg) - msg = "RELAY: [msg]" + msg = "RELAY: [msg]" to_chat(GLOB.admins, msg) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 260a4a9061e..c88c6108410 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -6,7 +6,7 @@ anchored = TRUE var/popped = FALSE -/obj/effect/fun_balloon/New() +/obj/effect/fun_balloon/Initialize() . = ..() SSobj.processing |= src diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 05629631241..ff830a2d70b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1056,14 +1056,21 @@ if(!check_rights(R_ADMIN)) return var/mob/M = locate(href_list["boot2"]) - if (ismob(M)) + if(ismob(M)) if(!check_if_greater_rights_than(M.client)) to_chat(usr, "Error: They have more rights than you do.") return + if(alert(usr, "Kick [key_name(M)]?", "Confirm", "Yes", "No") != "Yes") + return + if(!M) + to_chat(usr, "Error: [M] no longer exists!") + return + if(!M.client) + to_chat(usr, "Error: [M] no longer has a client!") + return to_chat(M, "You have been kicked from the server by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.ckey]"].") log_admin("[key_name(usr)] kicked [key_name(M)].") message_admins("[key_name_admin(usr)] kicked [key_name_admin(M)].") - //M.client = null qdel(M.client) else if(href_list["addmessage"]) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 319a79a59da..d49cb921f66 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -255,7 +255,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help/proc/MessageNoRecipient(msg) var/ref_src = "[REF(src)]" //Message to be sent to all admins - var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" + var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" AddInteraction("[LinkedReplyName(ref_src)]: [msg]") @@ -267,7 +267,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) to_chat(X, admin_msg) //show it to the person adminhelping too - to_chat(initiator, "PM to-Admins: [msg]") + to_chat(initiator, "PM to-Admins: [msg]") //Reopen a closed ticket /datum/admin_help/proc/Reopen() diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 8a47fa1a480..e1bd92e3008 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -145,15 +145,15 @@ var/keywordparsedmsg = keywords_lookup(msg) if(irc) - to_chat(src, "PM to-Admins: [rawmsg]") + to_chat(src, "PM to-Admins: [rawmsg]") var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]") ircreplyamount-- send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg) else if(recipient.holder) if(holder) //both are admins - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") //omg this is dumb, just fill in both their tickets var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]" @@ -162,10 +162,10 @@ admin_ticket_log(recipient, interaction_message) else //recipient is an admin but sender is not - var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" + var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" admin_ticket_log(src, replymsg) to_chat(recipient, replymsg) - to_chat(src, "PM to-Admins: [msg]") + to_chat(src, "PM to-Admins: [msg]") //play the receiving admin the adminhelp sound (if they have them enabled) if(recipient.prefs.toggles & SOUND_ADMINHELP) @@ -177,9 +177,9 @@ new /datum/admin_help(msg, recipient, TRUE) to_chat(recipient, "-- Administrator private message --") - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") to_chat(recipient, "Click on the administrator's name to reply.") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 82bbc27abcf..bf392885115 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -12,10 +12,10 @@ log_talk(mob,"[key_name(src)] : [msg]",LOGASAY) msg = keywords_lookup(msg) if(check_rights(R_ADMIN,0)) - msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" + msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" to_chat(GLOB.admins, msg) else - msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" + msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" to_chat(GLOB.admins, msg) SSblackbox.record_feedback("tally", "admin_verb", 1, "Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 0c41ae8fd23..405595d1de9 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -629,6 +629,7 @@ GLOBAL_PROTECT(VVpixelmovement) if (O.vv_edit_var(variable, var_new) == FALSE) to_chat(src, "Your edit was rejected by the object.") return + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args) log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]") log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]") var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]" diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 35a74b07bf1..190ddd7e635 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -57,7 +57,7 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(isReadytoRumble(applicant, ROLE_TRAITOR, FALSE)) + if(isReadytoRumble(applicant, ROLE_TRAITOR)) if(temp.age_check(applicant.client)) if(!(applicant.job in temp.restricted_jobs)) candidates += applicant diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index aaed0f22942..e690d0a0ad3 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -39,7 +39,7 @@ font_color = "blue" prayer_type = "SPIRITUAL PRAYER" - msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" + msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" for(var/client/C in GLOB.admins) if(C.prefs.chat_toggles & CHAT_PRAYER) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 6202260ef6e..e1710dae96a 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -521,7 +521,7 @@ sleep(20) var/global/list/curses if(!curses) - curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by three minutes.", + curses = list("A fuel technician just slit his own throat and begged for death.", "The shuttle's navigation programming was replaced by a file containing just two words: IT COMES.", "The shuttle's custodian was found washing the windows with their own blood.", "A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh.", diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 7c304e69967..ff4f7276bc5 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -555,6 +555,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /datum/action/innate/ai/ranged/overload_machine/proc/detonate_machine(obj/machinery/M) if(M && !QDELETED(M)) + var/turf/T = get_turf(M) + message_admins("[ADMIN_LOOKUPFLW(usr)] overloaded [M.name] at [ADMIN_VERBOSEJMP(T)].") + log_game("[key_name(usr)] overloaded [M.name] at [AREACOORD(T)].") explosion(get_turf(M), 0, 2, 3, 0) if(M) //to check if the explosion killed it before we try to delete it qdel(M) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index aa2857a9716..8959029b9bc 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -186,6 +186,7 @@ Code: item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + resistance_flags = FIRE_PROOF var/anomaly_type = /obj/effect/anomaly /obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index ce05f58ff62..67836746fa4 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -402,13 +402,13 @@ var/pressure = air.return_pressure() var/old_heat_capacity = air.heat_capacity() - var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],1))),cached_gases[/datum/gas/tritium][MOLES],cached_gases[/datum/gas/plasma][MOLES]/2) + var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/nitrous_oxide][MOLES],1))),cached_gases[/datum/gas/nitrous_oxide][MOLES],cached_gases[/datum/gas/plasma][MOLES]/2) var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED - if ((cached_gases[/datum/gas/tritium][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing. + if ((cached_gases[/datum/gas/nitrous_oxide][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing. return NO_REACTION ASSERT_GAS(/datum/gas/bz,air) cached_gases[/datum/gas/bz][MOLES] += reaction_efficency - cached_gases[/datum/gas/tritium][MOLES] -= reaction_efficency + cached_gases[/datum/gas/nitrous_oxide][MOLES] -= reaction_efficency cached_gases[/datum/gas/plasma][MOLES] -= 2*reaction_efficency @@ -422,6 +422,7 @@ priority = 5 name = "Stimulum formation" id = "stimformation" + /datum/gas_reaction/stimformation/init_reqs() min_requirements = list( /datum/gas/tritium = 30, @@ -496,10 +497,4 @@ #undef STIMULUM_SECOND_RISE #undef STIMULUM_ABSOLUTE_DROP #undef REACTION_OPPRESSION_THRESHOLD -#undef PLASMA_BINDING_ENERGY -#undef MAX_CATALYST_EFFICENCY -#undef PLASMA_FUSED_COEFFICENT -#undef CATALYST_COEFFICENT -#undef FUSION_PURITY_THRESHOLD -#undef FUSION_HEAT_DROPOFF #undef NOBLIUM_FORMATION_ENERGY diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 0c908dd12f3..7d095869cb1 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -125,7 +125,7 @@ Pipelines + Other Objects -> Pipe network pixel_y = (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y layer = initial(layer) + ((piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE) -/obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target) +/obj/machinery/atmospherics/proc/can_be_node(obj/machinery/atmospherics/target, iteration) return connection_check(target, piping_layer) //Find a connecting /obj/machinery/atmospherics in specified direction diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index ee52d89e5bc..b087859a47c 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -1,7 +1,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging icon = 'icons/obj/atmospherics/pipes/heat.dmi' level = 2 - var/initialize_directions_he var/minimum_temperature_difference = 20 var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT color = "#404040" @@ -9,22 +8,18 @@ var/icon_temperature = T20C //stop small changes in temperature causing icon refresh resistance_flags = LAVA_PROOF | FIRE_PROOF -/obj/machinery/atmospherics/pipe/heat_exchanging/New() - ..() +/obj/machinery/atmospherics/pipe/heat_exchanging/Initialize() + . = ..() add_atom_colour("#404040", FIXED_COLOUR_PRIORITY) -/obj/machinery/atmospherics/pipe/heat_exchanging/can_be_node(obj/machinery/atmospherics/pipe/heat_exchanging/target) - if(!istype(target)) - return 0 - if(target.initialize_directions_he & get_dir(target,src)) - return 1 +/obj/machinery/atmospherics/pipe/heat_exchanging/isConnectable(obj/machinery/atmospherics/pipe/heat_exchanging/target, given_layer, HE_type_check = TRUE) + if(istype(target, /obj/machinery/atmospherics/pipe/heat_exchanging) != HE_type_check) + return FALSE + . = ..() /obj/machinery/atmospherics/pipe/heat_exchanging/hide() return -/obj/machinery/atmospherics/pipe/heat_exchanging/GetInitDirections() - return ..() | initialize_directions_he - /obj/machinery/atmospherics/pipe/heat_exchanging/process_atmos() var/environment_temperature = 0 var/datum/gas_mixture/pipe_air = return_air() @@ -56,8 +51,6 @@ L.bodytemperature = avg_temp pipe_air.temperature = avg_temp - - /obj/machinery/atmospherics/pipe/heat_exchanging/process() if(!parent) return //machines subsystem fires before atmos is initialized so this prevents race condition runtimes diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm index d0bf90c27b1..606693dddaa 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/junction.dm @@ -9,11 +9,9 @@ thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT dir = SOUTH - initialize_directions = NORTH - initialize_directions_he = SOUTH device_type = BINARY - + construction_type = /obj/item/pipe/directional pipe_state = "junction" @@ -26,34 +24,18 @@ piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/heat_exchanging/junction/SetInitDirections() switch(dir) - if(SOUTH) - initialize_directions = NORTH - initialize_directions_he = SOUTH - if(NORTH) - initialize_directions = SOUTH - initialize_directions_he = NORTH - if(EAST) - initialize_directions = WEST - initialize_directions_he = EAST - if(WEST) - initialize_directions = EAST - initialize_directions_he = WEST + if(NORTH,SOUTH) + initialize_directions = SOUTH|NORTH + if(EAST,WEST) + initialize_directions = WEST|EAST /obj/machinery/atmospherics/pipe/heat_exchanging/junction/getNodeConnects() return list(turn(dir, 180), dir) -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/can_be_node(obj/machinery/atmospherics/target, iteration) - var/init_dir - switch(iteration) - if(1) - init_dir = target.initialize_directions - if(2) - var/obj/machinery/atmospherics/pipe/heat_exchanging/H = target - if(!istype(H)) - return 0 - init_dir = H.initialize_directions_he - if(init_dir & get_dir(target,src)) - return 1 +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/isConnectable(obj/machinery/atmospherics/target, given_layer, he_type_check) + if(dir == get_dir(target, src)) + return ..(target, given_layer, FALSE) //we want a normal pipe instead + return ..(target, given_layer, TRUE) diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm index 9b95840875b..6689905cf7e 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm @@ -6,13 +6,13 @@ desc = "A manifold composed of regular pipes." dir = SOUTH - initialize_directions_he = EAST|NORTH|WEST + initialize_directions = EAST|NORTH|WEST device_type = TRINARY construction_type = /obj/item/pipe/trinary pipe_state = "he_manifold" - + /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -26,13 +26,13 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/SetInitDirections() switch(dir) if(NORTH) - initialize_directions_he = EAST|SOUTH|WEST + initialize_directions = EAST|SOUTH|WEST if(SOUTH) - initialize_directions_he = WEST|NORTH|EAST + initialize_directions = WEST|NORTH|EAST if(EAST) - initialize_directions_he = SOUTH|WEST|NORTH + initialize_directions = SOUTH|WEST|NORTH if(WEST) - initialize_directions_he = NORTH|EAST|SOUTH + initialize_directions = NORTH|EAST|SOUTH /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/update_icon() var/invis = invisibility ? "-f" : "" @@ -53,13 +53,13 @@ name = "4-way pipe manifold" desc = "A manifold composed of heat-exchanging pipes." - initialize_directions_he = NORTH|SOUTH|EAST|WEST + initialize_directions = NORTH|SOUTH|EAST|WEST device_type = QUATERNARY construction_type = /obj/item/pipe/quaternary pipe_state = "he_manifold4w" - + /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -71,7 +71,7 @@ pixel_y = PIPING_LAYER_P_Y /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/SetInitDirections() - initialize_directions_he = initial(initialize_directions_he) + initialize_directions = initial(initialize_directions) /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w/update_icon() var/invis = invisibility ? "-f" : "" diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm index d00304114da..ad137a227d3 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/simple.dm @@ -5,13 +5,13 @@ desc = "A one meter section of heat-exchanging pipe." dir = SOUTH - initialize_directions_he = SOUTH|NORTH + initialize_directions = SOUTH|NORTH device_type = BINARY construction_type = /obj/item/pipe/binary/bendable pipe_state = "he" - + /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -24,12 +24,12 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/SetInitDirections() if(dir in GLOB.diagonals) - initialize_directions_he = dir + initialize_directions = dir switch(dir) if(NORTH,SOUTH) - initialize_directions_he = SOUTH|NORTH + initialize_directions = SOUTH|NORTH if(EAST,WEST) - initialize_directions_he = WEST|EAST + initialize_directions = WEST|EAST /obj/machinery/atmospherics/pipe/heat_exchanging/simple/proc/normalize_dir() if(dir==SOUTH) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 03eca5200c8..e27cb8f56ef 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1125,8 +1125,7 @@ desc = "Contains refills for medical vending machines." cost = 2000 contains = list(/obj/item/vending_refill/medical, - /obj/item/vending_refill/medical, - /obj/item/vending_refill/medical) + /obj/item/vending_refill/wallmed) crate_name = "medical vending crate" /datum/supply_pack/medical/virus @@ -1359,53 +1358,41 @@ /datum/supply_pack/service/vending/bartending name = "Bartending Supply Crate" - desc = "Bring on the booze with six vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" + desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" cost = 2000 contains = list(/obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/boozeomat, - /obj/item/vending_refill/coffee, - /obj/item/vending_refill/coffee, /obj/item/vending_refill/coffee, /obj/item/book/granter/action/drink_fling) crate_name = "bartending supply crate" /datum/supply_pack/service/vending/cigarette name = "Cigarette Supply Crate" - desc = "Don't believe the reports - smoke today! Contains cigarette vending machine refills." + desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill." cost = 1500 - contains = list(/obj/item/vending_refill/cigarette, - /obj/item/vending_refill/cigarette, - /obj/item/vending_refill/cigarette) + contains = list(/obj/item/vending_refill/cigarette) crate_name = "cigarette supply crate" crate_type = /obj/structure/closet/crate /datum/supply_pack/service/vending/games name = "Games Supply Crate" - desc = "Get your game on with these three game vending machine refills." + desc = "Get your game on with this game vending machine refill." cost = 1000 - contains = list(/obj/item/vending_refill/games, - /obj/item/vending_refill/games, - /obj/item/vending_refill/games) + contains = list(/obj/item/vending_refill/games) crate_name = "games supply crate" crate_type = /obj/structure/closet/crate /datum/supply_pack/service/vending/snack name = "Snack Supply Crate" - desc = "Three vending machine refills of cavity-bringin' goodness! The number one dentist recommended order!" + desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!" cost = 1500 - contains = list(/obj/item/vending_refill/snack, - /obj/item/vending_refill/snack, - /obj/item/vending_refill/snack) + contains = list(/obj/item/vending_refill/snack) crate_name = "snacks supply crate" /datum/supply_pack/service/vending/cola name = "Softdrinks Supply Crate" - desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with these three soda machine refills, today!" + desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!" cost = 1500 - contains = list(/obj/item/vending_refill/cola, - /obj/item/vending_refill/cola, - /obj/item/vending_refill/cola) + contains = list(/obj/item/vending_refill/cola) crate_name = "soft drinks supply crate" ////////////////////////////////////////////////////////////////////////////// @@ -1738,14 +1725,26 @@ /datum/supply_pack/costumes_toys/randomised/contraband name = "Contraband Crate" - desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, bling, even some ambrosia deus...you know, the good stuff. Just keep it away from the cops, kay?" + desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" contraband = TRUE cost = 3000 - num_contained = 5 + num_contained = 7 contains = list(/obj/item/poster/random_contraband, + /obj/item/poster/random_contraband, + /obj/item/reagent_containers/food/snacks/grown/cannabis, + /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow, + /obj/item/reagent_containers/food/snacks/grown/cannabis/white, + /obj/item/storage/pill_bottle/zoom, + /obj/item/storage/pill_bottle/happy, + /obj/item/storage/pill_bottle/lsd, + /obj/item/storage/pill_bottle/aranesp, + /obj/item/storage/pill_bottle/stimulant, + /obj/item/toy/cards/deck/syndicate, + /obj/item/reagent_containers/food/drinks/bottle/absinthe, + /obj/item/clothing/under/syndicate/tacticool, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/seeds/ambrosia/deus, + /obj/item/clothing/mask/gas/syndicate, /obj/item/clothing/neck/necklace/dope) crate_name = "crate" @@ -1937,10 +1936,9 @@ /datum/supply_pack/costumes_toys/wardrobes/autodrobe name = "Autodrobe Supply Crate" - desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills." + desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill." cost = 1500 - contains = list(/obj/item/vending_refill/autodrobe, - /obj/item/vending_refill/autodrobe) + contains = list(/obj/item/vending_refill/autodrobe) crate_name = "autodrobe supply crate" /datum/supply_pack/costumes_toys/wardrobes/cargo diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index fe37f4af6c6..347308c5e84 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", "1408" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", + "1428" = "bug causing right-click menus to show too many verbs that's been fixed in version 1429", )) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 824a6910bff..2f4922fddf0 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -58,18 +58,19 @@ if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" + //The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url for(var/client/C in GLOB.clients) if(C.prefs.chat_toggles & CHAT_OOC) if(holder) if(!holder.fakekey || C.holder) if(check_rights_for(src, R_ADMIN)) - to_chat(C, "[CONFIG_GET(flag/allow_admin_ooccolor) && prefs.ooccolor ? "" :"" ]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") + to_chat(C, "[CONFIG_GET(flag/allow_admin_ooccolor) && prefs.ooccolor ? "" :"" ]OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else - to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") + to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else - to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") else if(!(key in C.prefs.ignoring)) - to_chat(C, "OOC: [keyname]: [msg]") + to_chat(C, "OOC: [keyname]: [msg]") /proc/toggle_ooc(toggle = null) if(toggle != null) //if we're specifically en/disabling ooc @@ -232,7 +233,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) var/motd = global.config.motd if(motd) - to_chat(src, "
[motd]
") + to_chat(src, "
[motd]
", handle_whitespace=FALSE) else to_chat(src, "The Message of the Day has not been set.") diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index cb797c34d4a..82451480962 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -100,6 +100,11 @@ icon_state = "scarf" color = "#4A4A4B" //Grey but it looks black +/obj/item/clothing/neck/scarf/pink + name = "pink scarf" + icon_state = "scarf" + color = "#F699CD" //Pink + /obj/item/clothing/neck/scarf/red name = "red scarf" icon_state = "scarf" @@ -118,7 +123,7 @@ /obj/item/clothing/neck/scarf/purple name = "purple scarf" icon_state = "scarf" - color = "#9557C5" //purple + color = "#9557C5" //Purple /obj/item/clothing/neck/scarf/yellow name = "yellow scarf" @@ -128,7 +133,7 @@ /obj/item/clothing/neck/scarf/orange name = "orange scarf" icon_state = "scarf" - color = "#C67A4B" //orange + color = "#C67A4B" //Orange /obj/item/clothing/neck/scarf/cyan name = "cyan scarf" diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index c866dcca0fe..bb1df49ca5c 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -12,17 +12,33 @@ announceWhen = 1 -/datum/round_event/anomaly/setup(loop=0) - var/safety_loop = loop + 1 - if(safety_loop > 50) - kill() - end() +/datum/round_event/anomaly/proc/findEventArea() + var/static/list/allowed_areas + if(!allowed_areas) + //Places that shouldn't explode + var/list/safe_area_types = typecacheof(list( + /area/ai_monitored/turret_protected/ai, + /area/ai_monitored/turret_protected/ai_upload, + /area/engine, + /area/solar, + /area/holodeck, + /area/shuttle) + ) + + //Subtypes from the above that actually should explode. + var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room)) + + allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes + + return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) + +/datum/round_event/anomaly/setup() impact_area = findEventArea() if(!impact_area) - setup(safety_loop) + CRASH("No valid areas for anomaly found.") var/list/turf_test = get_area_turfs(impact_area) if(!turf_test.len) - setup(safety_loop) + CRASH("Anomaly : No valid turfs found for [impact_area] - [impact_area.type]") /datum/round_event/anomaly/announce(fake) priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") @@ -30,4 +46,4 @@ /datum/round_event/anomaly/start() var/turf/T = safepick(get_area_turfs(impact_area)) if(T) - newAnomaly = new /obj/effect/anomaly/flux(T) + newAnomaly = new /obj/effect/anomaly/flux(T) \ No newline at end of file diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 29be63a2bba..dc903dce85d 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -59,7 +59,7 @@ if(!proximity) return - if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") return diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 0548d026242..55d5a806bd1 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -97,7 +97,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic for(var/message in messageQueue) - to_chat(owner, message) + // whitespace has already been handled by the original to_chat + to_chat(owner, message, handle_whitespace=FALSE) messageQueue = null sendClientData() @@ -175,7 +176,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Global chat procs -/proc/to_chat(target, message) +/proc/to_chat(target, message, handle_whitespace=TRUE) if(!target) return @@ -201,8 +202,9 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Some macros remain in the string even after parsing and fuck up the eventual output message = replacetext(message, "\improper", "") message = replacetext(message, "\proper", "") - message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") + if(handle_whitespace) + message = replacetext(message, "\n", "
") + message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") for(var/I in targets) //Grab us a client if possible diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index ba8e0b9dcf9..15265b2a93d 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -95,8 +95,53 @@ if (typeof String.prototype.trim !== 'function') { }; } +// Linkify the contents of a node, within its parent. +function linkify(parent, insertBefore, text) { + var start = 0; + var match; + var regex = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#\/%?=~_|$!:,.;()]+/ig; + while ((match = regex.exec(text)) !== null) { + // add the unmatched text + parent.insertBefore(document.createTextNode(text.substring(start, match.index)), insertBefore); + + var href = match[0]; + if (!/^https?:\/\//i.test(match[0])) { + href = "http://" + match[0]; + } + + // add the link + var link = document.createElement("a"); + link.href = href; + link.textContent = match[0]; + parent.insertBefore(link, insertBefore); + + start = regex.lastIndex; + } + if (start !== 0) { + // add the remaining text and remove the original text node + parent.insertBefore(document.createTextNode(text.substring(start)), insertBefore); + parent.removeChild(insertBefore); + } +} + +// Recursively linkify the children of a given node. +function linkify_node(node) { + var children = node.childNodes; + // work backwards to avoid the risk of looping forever on our own output + for (var i = children.length - 1; i >= 0; --i) { + var child = children[i]; + if (child.nodeType == Node.TEXT_NODE) { + // text is to be linkified + linkify(node, child, child.textContent); + } else if (child.nodeName != "A" && child.nodeName != "a") { + // do not linkify existing links + linkify_node(child); + } + } +} + //Shit fucking piece of crap that doesn't work god fuckin damn it -function linkify(text) { +function linkify_fallback(text) { var rex = /((?: 0) { @@ -892,23 +946,26 @@ $(function() { }); $('#saveLog').click(function(e) { + // Requires IE 10+ to issue download commands. Just opening a popup + // window will cause Ctrl+S to save a blank page, ignoring innerHTML. + if (!window.Blob) { + output('This function is only supported on IE 10+. Upgrade if possible.', 'internal'); + return; + } + $.ajax({ type: 'GET', url: 'browserOutput.css', success: function(styleData) { - var win; + var blob = new Blob(['Chat Log', $messages.html(), '']); - try { - win = window.open('', 'Chat Log', 'toolbar=no, location=no, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=yes, width=780, height=600, top=' + (screen.height/2 - 635/2) + ', left=' + (screen.width/2 - 780/2)); - } catch (e) { - return; - } + var fname = 'SS13 Chat Log'; + var date = new Date(), month = date.getMonth(), day = date.getDay(), hours = date.getHours(), mins = date.getMinutes(), secs = date.getSeconds(); + fname += ' ' + date.getFullYear() + '-' + (month < 10 ? '0' : '') + month + '-' + (day < 10 ? '0' : '') + day; + fname += ' ' + (hours < 10 ? '0' : '') + hours + (mins < 10 ? '0' : '') + mins + (secs < 10 ? '0' : '') + secs; + fname += '.html'; - if (win) { - win.document.head.innerHTML = 'Chat Log'; - win.document.head.innerHTML += ''; - win.document.body.innerHTML = $messages.html(); - } + window.navigator.msSaveBlob(blob, fname); } }); }); diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index e9ffb9e450d..7e541f2471a 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -427,7 +427,7 @@ /obj/item/disk/plantgene/proc/update_name() if(gene) - name = "[gene.get_name()] (Plant Data Disk)" + name = "[gene.get_name()] (plant data disk)" else name = "plant data disk" @@ -437,4 +437,6 @@ /obj/item/disk/plantgene/examine(mob/user) ..() + if(gene && (istype(gene, /datum/plant_gene/core/potency))) + to_chat(user,"Percent is relative to potency, not maximum volume of the plant.") to_chat(user, "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].") diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm index bf710be0e2a..9012cd10899 100644 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -1,5 +1,5 @@ /obj/item/integrated_circuit/input/card_reader - name = "card reader" + name = "ID card reader" //To differentiate it from the data card reader desc = "A circuit that can read the registred name, assignment, and PassKey string from an ID card." icon_state = "card_reader" @@ -14,6 +14,10 @@ "on read" = IC_PINTYPE_PULSE_OUT ) +/obj/item/integrated_circuit/input/card_reader/old + name = "card reader" + spawn_flags = 0 + /obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) var/obj/item/card/id/card = I.GetID() var/list/access = I.GetAccess() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index cf406e13988..6b0fa5518a5 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1104,3 +1104,104 @@ else activate_pin(3) +/obj/item/integrated_circuit/input/atmospheric_analyzer + name = "atmospheric analyzer" + desc = "A miniaturized analyzer which can scan anything that contains gases. Leave target as NULL to scan the air around the assembly." + extended_desc = "The nth element of gas amounts is the number of moles of the \ + nth gas in gas list. \ + Pressure is in kPa, temperature is in Kelvin. \ + Due to programming limitations, scanning an object that does \ + not contain a gas will return the air around it instead." + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "target" = IC_PINTYPE_REF + ) + outputs = list( + "gas list" = IC_PINTYPE_LIST, + "gas amounts" = IC_PINTYPE_LIST, + "total moles" = IC_PINTYPE_NUMBER, + "pressure" = IC_PINTYPE_NUMBER, + "temperature" = IC_PINTYPE_NUMBER, + "volume" = IC_PINTYPE_NUMBER + ) + activators = list( + "scan" = IC_PINTYPE_PULSE_IN, + "on success" = IC_PINTYPE_PULSE_OUT, + "on failure" = IC_PINTYPE_PULSE_OUT + ) + power_draw_per_use = 5 + +/obj/item/integrated_circuit/input/atmospheric_analyzer/do_work() + for(var/i=1 to 6) + set_pin_data(IC_OUTPUT, i, null) + var/atom/target = get_pin_data_as_type(IC_INPUT, 1, /atom) + var/atom/movable/acting_object = get_object() + if(!target) + target = acting_object.loc + if(!target.Adjacent(acting_object)) + activate_pin(3) + return + + var/datum/gas_mixture/air_contents = target.return_air() + if(!air_contents) + activate_pin(3) + return + + var/list/gases = air_contents.gases + var/list/gas_names = list() + var/list/gas_amounts = list() + for(var/id in gases) + var/name = gases[id][GAS_META][META_GAS_NAME] + var/amt = round(gases[id][MOLES], 0.001) + gas_names.Add(name) + gas_amounts.Add(amt) + + set_pin_data(IC_OUTPUT, 1, gas_names) + set_pin_data(IC_OUTPUT, 2, gas_amounts) + set_pin_data(IC_OUTPUT, 3, round(air_contents.total_moles(), 0.001)) + set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001)) + set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001)) + set_pin_data(IC_OUTPUT, 6, round(air_contents.return_volume(), 0.001)) + push_data() + activate_pin(2) + +/obj/item/integrated_circuit/input/data_card_reader + name = "data card reader" + desc = "A circuit that can read from and write to data cards." + extended_desc = "Setting the \"write mode\" boolean to true will cause any data cards that are used on the assembly to replace\ + their existing function and data strings with the given strings, if it is set to false then using a data card on the assembly will cause\ + the function and data strings stored on the card to be written to the output pins." + icon_state = "card_reader" + complexity = 4 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "function" = IC_PINTYPE_STRING, + "data to store" = IC_PINTYPE_STRING, + "write mode" = IC_PINTYPE_BOOLEAN + ) + outputs = list( + "function" = IC_PINTYPE_STRING, + "stored data" = IC_PINTYPE_STRING + ) + activators = list( + "on write" = IC_PINTYPE_PULSE_OUT, + "on read" = IC_PINTYPE_PULSE_OUT + ) + +/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/living/user, intent) + var/obj/item/card/data/card = I.GetCard() + var/write_mode = get_pin_data(IC_INPUT, 3) + if(card) + if(write_mode == TRUE) + card.function = get_pin_data(IC_INPUT, 1) + card.data = get_pin_data(IC_INPUT, 2) + push_data() + activate_pin(1) + else + set_pin_data(IC_OUTPUT, 1, card.function) + set_pin_data(IC_OUTPUT, 2, card.data) + push_data() + activate_pin(2) + else + return FALSE + return TRUE diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index c391c629629..2d20f85aa02 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -367,7 +367,7 @@ var/atom/movable/acting_object = get_object() var/turf/T = get_turf(acting_object) var/obj/item/AM = get_pin_data_as_type(IC_INPUT, 1, /obj/item) - if(AM) + if(!QDELETED(AM) && !istype(AM, /obj/item/electronic_assembly)) var/mode = get_pin_data(IC_INPUT, 2) if(mode == 1) if(check_target(AM)) diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm index c53e034ddfb..86246952f31 100644 --- a/code/modules/jobs/job_types/silicon.dm +++ b/code/modules/jobs/job_types/silicon.dm @@ -85,5 +85,4 @@ Cyborg return H.Robotize(FALSE, latejoin) /datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) - if(CONFIG_GET(flag/rename_cyborg)) //name can't be set in robot/New without the client - R.rename_self("cyborg", M.client) + R.rename_self("cyborg", M.client) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index a6c28b4146b..59ce11baebf 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -56,10 +56,10 @@ if (top_atom) LAZYREMOVE(top_atom.light_sources, src) - + if (needs_update) GLOB.lighting_update_lights -= src - + . = ..() // Yes this doesn't align correctly on anything other than 4 width tabs. @@ -116,7 +116,6 @@ . = LUM_FALLOFF(C, pixel_turf); \ . *= light_power; \ var/OLD = effect_str[C]; \ - \ effect_str[C] = .; \ \ C.update_lumcount \ @@ -126,7 +125,6 @@ (. * lum_b) - (OLD * applied_lum_b) \ ); - #define REMOVE_CORNER(C) \ . = -effect_str[C]; \ C.update_lumcount \ @@ -167,8 +165,9 @@ /datum/light_source/proc/update_corners() var/update = FALSE + var/atom/source_atom = src.source_atom - if (!source_atom || QDELETED(source_atom)) + if (QDELETED(source_atom)) qdel(src) return diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index a0d84c55dde..6129c5fd2b6 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -17,6 +17,7 @@ z_list += S /datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, args) var/new_z = z_list.len + 1 if (world.maxz < new_z) world.incrementMaxZ() diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index a8d94e9ce4a..765f9d92e00 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST(labor_sheet_values) + /**********************Prisoners' Console**************************/ /obj/machinery/mineral/labor_claim_console @@ -20,6 +22,18 @@ Radio.listening = FALSE locate_stacking_machine() + if(!GLOB.labor_sheet_values) + var/sheet_list = list() + for(var/sheet_type in subtypesof(/obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = sheet_type + if(!initial(sheet.point_value) || (initial(sheet.merge_type) && initial(sheet.merge_type) != sheet_type)) //ignore no-value sheets and x/fifty subtypes + continue + sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) + GLOB.labor_sheet_values = sortList(sheet_list, /proc/cmp_sheet_list) + +/proc/cmp_sheet_list(list/a, list/b) + return a["value"] - b["value"] + /obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id/prisoner)) if(!inserted_id) @@ -52,16 +66,10 @@ if(check_auth()) can_go_home = TRUE - var/list/ores = list() if(stacking_machine) data["unclaimed_points"] = stacking_machine.points - for(var/ore in stacking_machine.ore_values) - var/list/O = list() - O["ore"] = ore - O["value"] = stacking_machine.ore_values[ore] - ores += list(O) - data["ores"] = ores + data["ores"] = GLOB.labor_sheet_values data["can_go_home"] = can_go_home return data @@ -127,15 +135,10 @@ /obj/machinery/mineral/stacking_machine/laborstacker - var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list("glass" = 1, "metal" = 2, "reinforced glass" = 4, "gold" = 20, "silver" = 20, "uranium" = 20, "titanium" = 20, "solid plasma" = 20, "plasteel" = 23, "plasma glass" = 23, "diamond" = 25, "bluespace polycrystal" = 30, "plastitanium" = 45, "bananium" = 50) + var/points = 0 //The unclaimed value of ore stacked. /obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a + points += inp.point_value * inp.amount ..() diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index f0a06429c55..dcc9034e2d5 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -105,8 +105,8 @@ stack_list[inp.type] = s var/obj/item/stack/sheet/storage = stack_list[inp.type] storage.amount += inp.amount //Stack the sheets - qdel(inp) //Let the old sheet garbage collect while(storage.amount > stack_amt) //Get rid of excessive stackage var/obj/item/stack/sheet/out = new inp.type(null, stack_amt) unload_mineral(out) storage.amount -= stack_amt + qdel(inp) //Let the old sheet garbage collect diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 6e19c6ec5ba..a9230195ac4 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -171,8 +171,6 @@ if("Survival Capsule and Explorer's Webbing") new /obj/item/storage/belt/mining/vendor(drop_location) if("Resonator Kit") - new /obj/item/storage/belt/mining/alt(drop_location) - new /obj/item/t_scanner/adv_mining_scanner(drop_location) new /obj/item/extinguisher/mini(drop_location) new /obj/item/resonator(drop_location) if("Minebot Kit") @@ -185,8 +183,6 @@ new /obj/item/fulton_core(drop_location) new /obj/item/stack/marker_beacon/thirty(drop_location) if("Crusher Kit") - new /obj/item/storage/belt/mining/alt(drop_location) - new /obj/item/t_scanner/adv_mining_scanner(drop_location) new /obj/item/extinguisher/mini(drop_location) new /obj/item/twohanded/required/kinetic_crusher(drop_location) if("Mining Conscription Kit") diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 8a971805885..c93d9e05aa4 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -11,7 +11,7 @@ var/motd = global.config.motd if(motd) - to_chat(src, "
[motd]
") + to_chat(src, "
[motd]
", handle_whitespace=FALSE) if(GLOB.admin_notice) to_chat(src, "Admin Notice:\n \t [GLOB.admin_notice]") diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index e950effb3b5..bc2d6132e15 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -137,3 +137,6 @@ update_inv_wear_mask() update_inv_head() +/mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) + var/index = get_held_index_of_item(I) + return index && hand_bodyparts[index] diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 7542c0c79cb..4b6280f1f9e 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -54,7 +54,7 @@ var/turf/T = get_turf(src) for(var/obj/item/I in contents) I.on_mob_death(src, gibbed) - if(mind && mind.name && mind.active && (!(T.flags_1 & NO_DEATHRATTLE_1))) + if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf)) var/rendered = "[mind.name] has died at [get_area_name(T)]." deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) if(mind) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 5cc08ff1e0d..36ae19b478f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -18,12 +18,21 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // The object used for the clickable stat() button. var/obj/effect/statclick/statclick + // The object used in vis_contents of obscured turfs + var/vis_contents + // The image given to the effect in vis_contents on AI clients + var/image/obscured + +/datum/cameranet/New() + vis_contents = new /obj/effect/overlay/camera_static() + obscured = new('icons/effects/cameravis.dmi', vis_contents, null, BYOND_LIGHTING_LAYER + 0.1) + obscured.plane = BYOND_LIGHTING_PLANE + 1 + // Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" - return (chunks[key]) + return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. @@ -31,10 +40,9 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) var/key = "[x],[y],[z]" - if(!chunks[key]) - chunks[key] = new /datum/camerachunk(null, x, y, z) - - return chunks[key] + . = chunks[key] + if(!.) + chunks[key] = . = new /datum/camerachunk(x, y, z) // Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. @@ -46,14 +54,8 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) else other_eyes = list() - var/list/chunks_pre_seen = list() - var/list/chunks_post_seen = list() - for(var/V in moved_eyes) var/mob/camera/aiEye/eye = V - if(C) - chunks_pre_seen |= eye.visibleCameraChunks - // 0xf = 15 var/static_range = eye.static_visibility_range var/x1 = max(0, eye.x - static_range) & ~(CHUNK_SIZE - 1) var/y1 = max(0, eye.y - static_range) & ~(CHUNK_SIZE - 1) @@ -71,44 +73,26 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/chunk in remove) var/datum/camerachunk/c = chunk - c.remove(eye, FALSE) + c.remove(eye) for(var/chunk in add) var/datum/camerachunk/c = chunk - c.add(eye, FALSE) - - if(C) - chunks_post_seen |= eye.visibleCameraChunks + c.add(eye) if(C) - for(var/V in other_eyes) - var/mob/camera/aiEye/eye = V - chunks_post_seen |= eye.visibleCameraChunks - - var/list/remove = chunks_pre_seen - chunks_post_seen - var/list/add = chunks_post_seen - chunks_pre_seen - - for(var/chunk in remove) - var/datum/camerachunk/c = chunk - C.images -= c.obscured - - for(var/chunk in add) - var/datum/camerachunk/c = chunk - C.images += c.obscured + C.images += obscured // Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - if(!SSticker || (opacity_check && !A.opacity)) return majorChunkChange(A, 2) /datum/cameranet/proc/updateChunk(x, y, z) - // 0xf = 15 - if(!chunkGenerated(x, y, z)) + var/datum/camerachunk/chunk = chunkGenerated(x, y, z) + if (!chunk) return - var/datum/camerachunk/chunk = getCameraChunk(x, y, z) chunk.hasChanged() // Removes a camera from a chunk. @@ -135,7 +119,6 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // If you want to update the chunks around an object, without adding/removing a camera, use choice 2. /datum/cameranet/proc/majorChunkChange(atom/c, choice) - // 0xf = 15 if(!c) return @@ -147,8 +130,8 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - if(chunkGenerated(x, y, T.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, T.z) + var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) + if(chunk) if(choice == 0) // Remove the camera. chunk.cameras -= c @@ -160,14 +143,12 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) // Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) - - // 0xf = 15 var/turf/position = get_turf(target) return checkTurfVis(position) /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -180,3 +161,17 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) + +/obj/effect/overlay/camera_static + name = "static" + icon = null + icon_state = null + anchored = TRUE // should only appear in vis_contents, but to be safe + appearance_flags = RESET_TRANSFORM | TILE_BOUND + // this combination makes the static block clicks to everything below it, + // without appearing in the right-click menu for non-AI clients + mouse_opacity = MOUSE_OPACITY_ICON + invisibility = INVISIBILITY_ABSTRACT + + layer = BYOND_LIGHTING_LAYER + 0.1 + plane = BYOND_LIGHTING_PLANE + 1 diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index e03bba3067b..9a84616fbf5 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -8,11 +8,9 @@ /datum/camerachunk var/list/obscuredTurfs = list() var/list/visibleTurfs = list() - var/list/obscured = list() var/list/cameras = list() var/list/turfs = list() var/list/seenby = list() - var/visible = FALSE var/changed = 0 var/x = 0 var/y = 0 @@ -20,28 +18,17 @@ // Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(mob/camera/aiEye/eye, add_images = TRUE) - if(add_images) - var/client/client = eye.GetViewerClient() - if(client) - client.images += obscured +/datum/camerachunk/proc/add(mob/camera/aiEye/eye) eye.visibleCameraChunks += src - visible++ seenby += eye if(changed) update() // Remove an AI eye from the chunk, then update if changed. -/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_images = TRUE) - if(remove_images) - var/client/client = eye.GetViewerClient() - if(client) - client.images -= obscured +/datum/camerachunk/proc/remove(mob/camera/aiEye/eye) eye.visibleCameraChunks -= src seenby -= eye - if(visible > 0) - visible-- // Called when a chunk has changed. I.E: A wall was deleted. @@ -54,7 +41,7 @@ // instead be flagged to update the next time an AI Eye moves near it. /datum/camerachunk/proc/hasChanged(update_now = 0) - if(visible || update_now) + if(seenby.len || update_now) addtimer(CALLBACK(src, .proc/update), UPDATE_BUFFER, TIMER_UNIQUE) else changed = 1 @@ -94,41 +81,18 @@ for(var/turf in visAdded) var/turf/t = turf - if(t.obscured) - obscured -= t.obscured - for(var/eye in seenby) - var/mob/camera/aiEye/m = eye - if(!m) - continue - var/client/client = m.GetViewerClient() - if(client) - client.images -= t.obscured + t.vis_contents -= GLOB.cameranet.vis_contents for(var/turf in visRemoved) var/turf/t = turf - if(obscuredTurfs[t]) - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1) - t.obscured.pixel_x = -t.pixel_x - t.obscured.pixel_y = -t.pixel_y - t.obscured.plane = BYOND_LIGHTING_PLANE+0.1 - obscured += t.obscured - for(var/eye in seenby) - var/mob/camera/aiEye/m = eye - if(!m) - seenby -= m - continue - var/client/client = m.GetViewerClient() - if(client) - client.images += t.obscured + if(obscuredTurfs[t] && !istype(t, /turf/open/ai_visible)) + t.vis_contents += GLOB.cameranet.vis_contents changed = 0 // Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(loc, x, y, z) - - // 0xf = 15 +/datum/camerachunk/New(x, y, z) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) @@ -164,12 +128,7 @@ for(var/turf in obscuredTurfs) var/turf/t = turf - if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1) - t.obscured.pixel_x = -t.pixel_x - t.obscured.pixel_y = -t.pixel_y - t.obscured.plane = BYOND_LIGHTING_PLANE+0.1 - obscured += t.obscured + t.vis_contents += GLOB.cameranet.vis_contents #undef UPDATE_BUFFER #undef CHUNK_SIZE diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 469639d58f0..41c2902c73d 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -50,9 +50,7 @@ /mob/camera/aiEye/proc/RemoveImages() var/client/C = GetViewerClient() if(C && use_static) - for(var/V in visibleCameraChunks) - var/datum/camerachunk/c = V - C.images -= c.obscured + C.images -= GLOB.cameranet.obscured /mob/camera/aiEye/Destroy() if(ai) diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index b6f3724fcf9..d77e7f8a408 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -88,10 +88,6 @@ icon_state = "room_background" flags_1 = NOJAUNT_1 -/turf/open/ai_visible/Initialize() - . = ..() - obscured = image(null, src, null) - /area/ai_multicam_room name = "ai_multicam_room" icon_state = "ai_camera_room" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7af7ffe22d2..4f23b6252c8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -162,8 +162,8 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() + var/atom/T = drop_location()//To hopefully prevent run time errors. if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - var/turf/T = get_turf(loc)//To hopefully prevent run time errors. if(T) mmi.forceMove(T) if(mmi.brainmob) @@ -182,6 +182,10 @@ connected_ai.connected_robots -= src if(shell) GLOB.available_ai_shells -= src + else + if(T && istype(radio) && istype(radio.keyslot)) + radio.keyslot.forceMove(T) + radio.keyslot = null qdel(wires) qdel(module) qdel(eye_lights) @@ -228,7 +232,8 @@ if(custom_name) changed_name = custom_name if(changed_name == "" && client) - changed_name = client.prefs.custom_names["cyborg"] + rename_self(src, client) + return //built in camera handled in proc if(!changed_name) changed_name = get_standard_name() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index e5425573b4e..7d03ad4b9e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -1,3 +1,5 @@ +#define MEDAL_PREFIX "Bubblegum" + /* BUBBLEGUM @@ -7,15 +9,15 @@ Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. -It tries to strike at its target through any bloodpools under them; if it fails to do that, it will spray blood and then attempt to warp to a bloodpool near the target. -If it fails to warp to a target, it may summon up to 6 slaughterlings from the blood around it. -If it does not summon all 6 slaughterlings, it will instead charge at its target, dealing massive damage to anything it hits and spraying a stream of blood. -At half health, it will either charge three times or warp, then charge, instead of doing a single charge. +It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming. +Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target. +To make this possible, it sprays streams of blood at random. +From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress. -When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things: - 1. A bottle that, when activated, drives everyone nearby into a frenzy - 2. A contract that marks for death the chosen target - 3. A spellblade that can slice off limbs at range +When Bubblegum dies, it leaves behind a H.E.C.K. suit+helmet as well as a chest that can contain three things: + 1. A spellblade that can slice off limbs at range + 2. A bottle that, when activated, drives everyone nearby into a frenzy + 3. A contract that marks for death the chosen target Difficulty: Hard @@ -44,8 +46,7 @@ Difficulty: Hard del_on_death = 1 crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) - blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME - var/charging = FALSE + var/charging = 0 medal_type = BOSS_MEDAL_BUBBLEGUM score_type = BUBBLEGUM_SCORE deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " @@ -57,54 +58,33 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 -/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && prob(25)) - var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc) - if(prob(40)) - step(B, pick(GLOB.cardinals)) - else - B.setDir(pick(GLOB.cardinals)) - -/obj/effect/decal/cleanable/blood/gibs/bubblegum - name = "thick blood" - desc = "Thick, splattered blood." - random_icon_states = list("gib3", "gib5", "gib6") - bloodiness = 20 - -/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() - return TRUE - /mob/living/simple_animal/hostile/megafauna/bubblegum/Life() ..() - move_to_delay = CLAMP((health/maxHealth) * 10, 5, 10) + move_to_delay = CLAMP(round((health/maxHealth) * 10), 5, 10) /mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - anger_modifier = CLAMP(((maxHealth - health)/60),0,20) + anger_modifier = CLAMP(((maxHealth - health)/50),0,20) if(charging) return ranged_cooldown = world.time + ranged_cooldown_time - var/warped = FALSE - if(!try_bloodattack()) - INVOKE_ASYNC(src, .proc/blood_spray) - warped = blood_warp() - if(warped && prob(100 - anger_modifier)) - return + blood_warp() - if(prob(90 - anger_modifier) || slaughterlings()) - if(health > maxHealth * 0.5) + if(prob(25)) + INVOKE_ASYNC(src, .proc/blood_spray) + + else if(prob(5+anger_modifier/2)) + slaughterlings() + else + if(health > maxHealth/2 && !client) INVOKE_ASYNC(src, .proc/charge) else - if(prob(70) || warped) - INVOKE_ASYNC(src, .proc/charge, 2) - else - INVOKE_ASYNC(src, .proc/warp_charge) + INVOKE_ASYNC(src, .proc/triple_charge) /mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize() . = ..() - for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_living_list) + for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list) if(B != src) return INITIALIZE_HINT_QDEL //There can be only one var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new @@ -118,56 +98,53 @@ Difficulty: Hard if(.) SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon) - if(!charging) - ..() +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A) + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget() - if(!charging) - return ..() + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance) - if(!charging) - ..() + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() + if(!stat) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) - new /obj/effect/temp_visual/decoy/fading(loc,src) + new/obj/effect/temp_visual/decoy/fading(loc,src) DestroySurroundings() . = ..() - if(!stat && .) - playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) DestroySurroundings() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/warp_charge() - blood_warp() +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge() + charge() + sleep(10) + charge() + sleep(10) charge() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(bonus_charges) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge() var/turf/T = get_turf(target) if(!T || T == loc) return - new /obj/effect/temp_visual/dragon_swoop/bubblegum(T) - charging = TRUE + new /obj/effect/temp_visual/dragon_swoop(T) + charging = 1 DestroySurroundings() walk(src, 0) setDir(get_dir(src, T)) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src) - animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) - sleep(3) - throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges)) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge_end(bonus_charges, list/effects_to_destroy) - charging = FALSE - try_bloodattack() - if(target) - if(bonus_charges) - bonus_charges-- - charge(bonus_charges) - else - Goto(target, move_to_delay, minimum_distance) - SetRecoveryTime(MEGAFAUNA_DEFAULT_RECOVERY_TIME) + animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5) + sleep(5) + throw_at(T, get_dist(src, T), 1, src, 0) + charging = 0 + Goto(target, move_to_delay, minimum_distance) /mob/living/simple_animal/hostile/megafauna/bubblegum/Collide(atom/A) @@ -191,142 +168,20 @@ Difficulty: Hard var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) L.throw_at(throwtarget, 3) - charging = FALSE + charging = 0 -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood() - var/list/targets = ListTargets() - . = list() - for(var/mob/living/L in targets) - var/list/bloodpool = get_pools(get_turf(L), 0) - if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD)) - . += L - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() - var/list/targets = get_mobs_on_blood() - if(targets.len) - INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50)) - - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness) - var/mob/living/target_one = pick_n_take(targets) - var/turf/target_one_turf = get_turf(target_one) - var/mob/living/target_two - if(targets.len) - target_two = pick_n_take(targets) - var/turf/target_two_turf = get_turf(target_two) - if(target_two.stat != CONSCIOUS || prob(10)) - bloodgrab(target_two_turf, handedness) - else - bloodsmack(target_two_turf, handedness) - - if(target_one) - var/list/pools = get_pools(get_turf(target_one), 0) - if(pools.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, !handedness) - else - bloodsmack(target_one_turf, !handedness) - - if(!target_two && target_one) - var/list/poolstwo = get_pools(get_turf(target_one), 0) - if(poolstwo.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, handedness) - else - bloodsmack(target_one_turf, handedness) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) - sleep(2.5) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, "[src] rends you!") - playsound(T, attack_sound, 100, 1, -1) - var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - L.apply_damage(25, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration)) - sleep(3) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) - sleep(6) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, "[src] drags you through the blood!") - playsound(T, 'sound/magic/enter_blood.ogg', 100, 1, -1) - var/turf/targetturf = get_step(src, dir) - L.forceMove(targetturf) - playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, 1, -1) - if(L.stat != CONSCIOUS) - addtimer(CALLBACK(src, .proc/devour, L), 2) - sleep(1) - -/obj/effect/temp_visual/dragon_swoop/bubblegum - duration = 10 - -/obj/effect/temp_visual/bubblegum_hands - icon = 'icons/effects/bubblegum.dmi' - duration = 9 - -/obj/effect/temp_visual/bubblegum_hands/rightthumb - icon_state = "rightthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/leftthumb - icon_state = "leftthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/rightpaw - icon_state = "rightpawgrab" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/bubblegum_hands/leftpaw - icon_state = "leftpawgrab" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/bubblegum_hands/rightsmack - icon_state = "rightsmack" - -/obj/effect/temp_visual/bubblegum_hands/leftsmack - icon_state = "leftsmack" - /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp() - if(Adjacent(target)) - return FALSE - var/list/can_jaunt = get_pools(get_turf(src), 1) - if(!can_jaunt.len) - return FALSE - - var/list/pools = get_pools(get_turf(target), 2) - var/list/pools_to_remove = get_pools(get_turf(target), 1) - pools -= pools_to_remove - if(!pools.len) - return FALSE - - var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src) - DA.color = "#FF0000" - var/oldtransform = DA.transform - DA.transform = matrix()*2 - animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3) - sleep(3) - qdel(DA) - var/obj/effect/decal/cleanable/blood/found_bloodpool - pools = get_pools(get_turf(target), 2) - pools_to_remove = get_pools(get_turf(target), 1) - pools -= pools_to_remove + var/list/pools = list() + var/can_jaunt = FALSE + for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2)) + can_jaunt = TRUE + break + if(!can_jaunt) + return + for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2)) + pools += nearby if(pools.len) shuffle_inplace(pools) found_bloodpool = pick(pools) @@ -336,51 +191,30 @@ Difficulty: Hard forceMove(get_turf(found_bloodpool)) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) visible_message("And springs back out!") - return TRUE - return FALSE -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range) - . = list() - for(var/obj/effect/decal/cleanable/nearby in view(T, range)) - if(nearby.can_bloodcrawl_in()) - . += nearby /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray() visible_message("[src] sprays a stream of gore!") - var/range = 6 + round(anger_modifier * 0.4) + var/turf/E = get_edge_target_turf(src, src.dir) + var/range = 10 var/turf/previousturf = get_turf(src) - var/turf/J = previousturf - var/targetdir = get_dir(src, target) - if(target.loc == loc) - targetdir = dir - face_atom(target) - new /obj/effect/decal/cleanable/blood/bubblegum(J) - for(var/i in 1 to range) - J = get_step(previousturf, targetdir) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) - playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1) - if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J]) + for(var/turf/J in getline(src,E)) + if(!range) break - new /obj/effect/decal/cleanable/blood/bubblegum(J) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) + if(!previousturf.CanAtmosPass(J)) + break + playsound(J,'sound/effects/splat.ogg', 100, 1, -1) + new /obj/effect/decal/cleanable/blood(J) + range-- previousturf = J sleep(1) -/obj/effect/decal/cleanable/blood/bubblegum - bloodiness = 0 - -/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in() - return TRUE - /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings() visible_message("[src] summons a shoal of slaughterlings!") - var/max_amount = 6 - for(var/H in get_pools(get_turf(src), 1)) - if(!max_amount) - break - max_amount-- - var/obj/effect/decal/cleanable/blood/B = H - new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(B.loc) - return max_amount + for(var/obj/effect/decal/cleanable/blood/H in range(src, 10)) + if(prob(25)) + new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(H.loc) /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter name = "slaughterling" @@ -398,3 +232,5 @@ Difficulty: Hard if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) return 1 return 0 + +#undef MEDAL_PREFIX \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4cb9723dbd8..3dff46ec84a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -7,6 +7,7 @@ hud_possible = list(ANTAG_HUD) pressure_resistance = 8 mouse_drag_pointer = MOUSE_ACTIVE_POINTER + throwforce = 10 var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind var/list/datum/action/actions = list() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 55b9ee3c6c9..0b8cb8d155a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -379,8 +379,7 @@ else if(transfer_after) R.key = key - if (CONFIG_GET(flag/rename_cyborg)) - R.rename_self("cyborg") + R.rename_self("cyborg") if(R.mmi) R.mmi.name = "Man-Machine Interface: [real_name]" diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 310a0a5054b..ca075b51e46 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -40,7 +40,10 @@ return data /datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/A, O, obj/source) - if(!is_station_level(source.z) && !is_mining_level(source.z)) + if(is_station_level(source.z)) + if(!(A.type in GLOB.the_station_areas)) + return + else if(!is_mining_level(source.z) || istype(A, /area/ruin)) return var/list/L = alarms[class] @@ -95,4 +98,4 @@ /datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE) GLOB.alarmdisplay -= src - ..() \ No newline at end of file + ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 2a352932faf..be25a137347 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -130,6 +130,8 @@ return /obj/item/gun/energy/update_icon(force_update) + if(QDELETED(src)) + return ..() if(!automatic_charge_overlays) return diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index e7b628653fd..df1f9fdfbd0 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -11,8 +11,21 @@ clumsy_check = FALSE randomspread = FALSE + var/hugbox = TRUE + var/max_power = INFINITY + var/reaction_volume_mod = 0 + var/reaction_cycles = 3 //How many times gases react() before calculation. Very finnicky value, do not mess with without good reason. + var/prereaction = TRUE + + var/bombcheck = TRUE + var/debug_power = 0 + var/obj/item/transfer_valve/bomb +/obj/item/gun/blastcannon/debug + debug_power = 80 + bombcheck = FALSE + /obj/item/gun/blastcannon/Initialize() . = ..() if(!pin) @@ -56,27 +69,33 @@ return TRUE return ..() +//returns the third value of a bomb blast /obj/item/gun/blastcannon/proc/calculate_bomb() if(!istype(bomb) || !istype(bomb.tank_one) || !istype(bomb.tank_two)) return 0 - var/datum/gas_mixture/temp = new(60) //directional buff. - temp.merge(bomb.tank_one.air_contents.remove_ratio(1)) - temp.merge(bomb.tank_two.air_contents.remove_ratio(2)) - for(var/i in 1 to 6) + var/datum/gas_mixture/temp = new(max(reaction_volume_mod, 0)) + bomb.merge_gases(temp) + if(prereaction) + temp.react(src) + var/prereaction_pressure = temp.return_pressure() + if(prereaction_pressure < TANK_FRAGMENT_PRESSURE) + return 0 + for(var/i in 1 to reaction_cycles) temp.react(src) var/pressure = temp.return_pressure() qdel(temp) if(pressure < TANK_FRAGMENT_PRESSURE) return 0 - return (pressure / TANK_FRAGMENT_SCALE) + return ((pressure - TANK_FRAGMENT_PRESSURE) / TANK_FRAGMENT_SCALE) /obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) - if((!bomb) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) + if((!bomb && bombcheck) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) return ..() - var/power = calculate_bomb() + var/power = bomb? calculate_bomb() : debug_power + power = min(power, max_power) QDEL_NULL(bomb) update_icon() - var/heavy = power * 0.2 + var/heavy = power * 0.25 var/medium = power * 0.5 var/light = power user.visible_message("[user] opens [bomb] on [user.p_their()] [name] and fires a blast wave at [target]!","You open [bomb] on your [name] and fire a blast wave at [target]!") @@ -87,7 +106,8 @@ message_admins(log_str) log_game(log_str) var/obj/item/projectile/blastwave/BW = new(loc, heavy, medium, light) - BW.preparePixelProjectile(target, get_turf(target), user, params, 0) + BW.hugbox = hugbox + BW.preparePixelProjectile(target, get_turf(src), params, 0) BW.fire() /obj/item/projectile/blastwave @@ -99,6 +119,7 @@ var/heavyr = 0 var/mediumr = 0 var/lightr = 0 + var/hugbox = TRUE range = 150 /obj/item/projectile/blastwave/Initialize(mapload, _h, _m, _l) @@ -110,14 +131,25 @@ /obj/item/projectile/blastwave/Range() ..() var/amount_destruction = EXPLODE_NONE + var/wallbreak_chance = 0 if(heavyr) amount_destruction = EXPLODE_DEVASTATE + wallbreak_chance = 99 else if(mediumr) amount_destruction = EXPLODE_HEAVY + wallbreak_chance = 66 else if(lightr) amount_destruction = EXPLODE_LIGHT + wallbreak_chance = 33 if(amount_destruction) - loc.ex_act(amount_destruction) + if(hugbox) + loc.contents_explosion(EXPLODE_HEAVY, loc) + if(istype(loc, /turf/closed/wall)) + var/turf/closed/wall/W = loc + if(prob(wallbreak_chance)) + W.dismantle_wall(TRUE, TRUE) + else + loc.ex_act(amount_destruction) else qdel(src) diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index d8190cd6ee6..44c8df6c009 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -11,7 +11,7 @@ . = ..() if(isliving(target)) var/mob/living/L = target - L.adjust_bodytemperature(L.bodytemperature + (((100-blocked)/100)*(temperature - L.bodytemperature))) // the new body temperature is adjusted by 100-blocked % of the delta between body temperature and the bullet's effect temperature + L.adjust_bodytemperature(((100-blocked)/100)*(temperature - L.bodytemperature)) // the new body temperature is adjusted by 100-blocked % of the delta between body temperature and the bullet's effect temperature /obj/item/projectile/temp/hot name = "heat beam" diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 86aaa16cd7b..33437a63fc2 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -115,10 +115,10 @@ to_chat(M, "You're not feeling good at all! You really need some [name].") return -/proc/pretty_string_from_reagent_list(var/list/reagent_list) +/proc/pretty_string_from_reagent_list(list/reagent_list) //Convert reagent list to a printable string for logging etc - var/result = "| " + var/list/rs = list() for (var/datum/reagent/R in reagent_list) - result += "[R.name], [R.volume] | " + rs += "[R.name], [R.volume]" - return result + return rs.Join(" | ") diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index ba5703cbfb2..4de87fabc64 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -283,10 +283,10 @@ if(ishuman(victim)) var/mob/living/carbon/human/H = victim if( H.head ) - if ( H.head.flags_cover & MASKCOVERSEYES ) + if ( H.head.flags_cover & HEADCOVERSEYES ) eyes_covered = 1 safe_thing = H.head - if ( H.head.flags_cover & MASKCOVERSMOUTH ) + if ( H.head.flags_cover & HEADCOVERSMOUTH ) mouth_covered = 1 safe_thing = H.head if(H.glasses) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3a64da8f047..596973a2c44 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -286,10 +286,16 @@ /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() - if(slot == SLOT_HEAD && reagents.total_volume) - to_chat(user, "[src]'s contents spill all over you!") - reagents.reaction(user, TOUCH) - reagents.clear_reagents() + if (slot == SLOT_HEAD) + if(reagents.total_volume) + to_chat(user, "[src]'s contents spill all over you!") + reagents.reaction(user, TOUCH) + reagents.clear_reagents() + container_type = NONE + +/obj/item/reagent_containers/glass/bucket/dropped(mob/user) + . = ..() + container_type = initial(container_type) /obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index f5d46a240e3..d2f840cda33 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -151,10 +151,32 @@ icon_state = "pill18" list_reagents = list("insulin" = 50) roundstart = 1 - +///////////////////////////////////////// this pill is used only in a legion mob drop /obj/item/reagent_containers/pill/shadowtoxin name = "black pill" desc = "I wouldn't eat this if I were you." icon_state = "pill9" color = "#454545" - list_reagents = list("shadowmutationtoxin" = 1) \ No newline at end of file + list_reagents = list("shadowmutationtoxin" = 1) +//////////////////////////////////////// drugs +/obj/item/reagent_containers/pill/zoom + name = "zoom pill" + list_reagents = list("synaptizine" = 10, "nicotine" = 10, "methamphetamine" = 1) + + +/obj/item/reagent_containers/pill/happy + name = "happy pill" + list_reagents = list("sugar" = 10, "space_drugs" = 10) + + +/obj/item/reagent_containers/pill/lsd + name = "hallucinogen pill" + list_reagents = list("mushroomhallucinogen" = 15, "mindbreaker" = 15) + + +/obj/item/reagent_containers/pill/aranesp + name = "speedy pill" + list_reagents = list("aranesp" = 10) + + + diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index be7d362544a..0a36394bc93 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -423,10 +423,11 @@ /datum/design/healthanalyzer name = "Health Analyzer" id = "healthanalyzer" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 50) build_path = /obj/item/healthanalyzer category = list("initial", "Medical") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/pillbottle name = "Pill Bottle" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index a122fed7962..5f1e5ea5207 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -200,7 +200,17 @@ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - + +/datum/design/healthanalyzer_advanced + name = "advanced health analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." + id = "healthanalyzer_advanced" + build_path = /obj/item/healthanalyzer/advanced + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 2000, MAT_GOLD = 1500) + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + ///////////////////////////////////////// //////////Cybernetic Implants//////////// ///////////////////////////////////////// diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 4307626b828..e62b0808b60 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -126,7 +126,12 @@ Note: Must be placed within 3 tiles of the R&D Console var/list/point_value = techweb_item_point_check(loaded_item) if(linked_console.stored_research.deconstructed_items[loaded_item.type]) point_value = list() - var/choice = input("Are you sure you want to destroy [loaded_item] for [length(point_value) ? "[json_encode(point_value)] points" : "material reclamation"]?") in list("Proceed", "Cancel") + var/user_mode_string = "" + if(length(point_value)) + user_mode_string = " for [json_encode(point_value)] points" + else if(loaded_item.materials.len) + user_mode_string = " for material reclamation" + var/choice = input("Are you sure you want to destroy [loaded_item][user_mode_string]?") in list("Proceed", "Cancel") if(choice == "Cancel") return FALSE if(QDELETED(loaded_item) || QDELETED(linked_console) || !user.Adjacent(linked_console) || QDELETED(src)) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index eb4c3b69a4b..0ba9312314b 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -594,9 +594,9 @@ Nothing else in the console has ID requirements. l += "This item is worth:
[techweb_point_display_generic(point_values)]!" l += "[RDSCREEN_NOBREAK]" - var/list/materials = linked_destroy.loaded_item.materials - if (materials.len) - l += "
Material Reclamation" + if(!(linked_destroy.loaded_item.resistance_flags & INDESTRUCTIBLE)) + var/list/materials = linked_destroy.loaded_item.materials + l += "
[materials.len? "Material Reclamation" : "Destroy Item"]" for (var/M in materials) l += "* [CallMaterialName(M)] x [materials[M]]" l += "
[RDSCREEN_NOBREAK]" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index db943a2b96e..702d9cbdb33 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -18,7 +18,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser") + design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -27,7 +27,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker") + design_ids = list("piercesyringe", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 279767e9a29..1cf12e6d428 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( continue if(bounty_ship_item_and_contents(AM, dry_run = FALSE)) matched_bounty = TRUE - if(!AM.anchored) + if(!AM.anchored || istype(AM, /obj/mecha)) sold_atoms += export_item_and_contents(AM, contraband, emagged, dry_run = FALSE) if(sold_atoms) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 6bb413b338e..27cfc9208ba 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -60,10 +60,7 @@ target.visible_message("[target]'s [A] glows brightly as it wards off the spell!") user.visible_message("The feedback blows [user]'s arm off!","The spell bounces from [M]'s skin back into your arm!") user.flash_act() - var/obj/item/bodypart/part - var/index = user.get_held_index_of_item(src) - if(index) - part = user.hand_bodyparts[index] + var/obj/item/bodypart/part = user.get_holding_bodypart_of_item(src) if(part) part.dismember() ..() diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index a58e1951790..87e13955fee 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -199,7 +199,7 @@ /obj/item/bodypart/r_leg/drop_limb(special) if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(drop_location()) + owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace owner.legcuffed.dropped(owner) owner.legcuffed = null owner.update_inv_legcuffed() @@ -210,7 +210,7 @@ /obj/item/bodypart/l_leg/drop_limb(special) //copypasta if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(drop_location()) + owner.legcuffed.forceMove(owner.drop_location()) owner.legcuffed.dropped(owner) owner.legcuffed = null owner.update_inv_legcuffed() diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 05e6553b3ca..a9f2c63e133 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1412,6 +1412,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) limited_stock = 2 //you can't use more than two! restricted_roles = list("Shaft Miner") +/datum/uplink_item/role_restricted/blastcannon + name = "Blast Cannon" + desc = "A highly specialized weapon, the Blast Cannon is actually relatively simple. It contains an attachment for a tank transfer valve mounted to an angled pipe specially constructed \ + withstand extreme pressure and temperatures, and has a mechanical trigger for triggering the transfer valve. Essentially, it turns the explosive force of a bomb into a narrow-angle \ + blast wave \"projectile\". Aspiring scientists may find this highly useful, as forcing the pressure shockwave into a narrow angle seems to be able to bypass whatever quirk of physics \ + disallows explosive ranges above a certain distance, allowing for the device to use the theoretical yield of a transfer valve bomb, instead of the factual yield." + item = /obj/item/gun/blastcannon + cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist. + restricted_roles = list("Research Director", "Scientist") + /datum/uplink_item/device_tools/clown_bomb name = "Clown Bomb" desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 89bbee9d60d..b9112ddfded 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1,7 +1,3 @@ -#define STANDARD_CHARGE 1 -#define CONTRABAND_CHARGE 2 -#define COIN_CHARGE 3 - /* * Vending machine types - Can be found under /code/modules/vending/ */ @@ -21,7 +17,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C */ /datum/data/vending_product - var/product_name = "generic" + name = "generic" var/product_path = null var/amount = 0 var/max_amount = 0 @@ -74,7 +70,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/dish_quants = list() //used by the snack machine's custom compartment to count dishes. var/obj/item/vending_refill/refill_canister = null //The type of refill canisters used by this machine. - var/refill_count = 3 //The number of canisters the vending machine uses /obj/machinery/vending/Initialize() var/build_inv = FALSE @@ -84,9 +79,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . = ..() wires = new /datum/wires/vending(src) if(build_inv) //non-constructable vending machine - build_inventory(products) - build_inventory(contraband, 1) - build_inventory(premium, 0, 1) + build_inventory(products, product_records) + build_inventory(contraband, hidden_records) + build_inventory(premium, coin_records) slogan_list = splittext(product_slogans, ";") // So not all machines speak at the exact same time. @@ -102,17 +97,17 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C return ..() /obj/machinery/vending/RefreshParts() //Better would be to make constructable child - if(component_parts) - product_records = list() - hidden_records = list() - coin_records = list() - build_inventory(products, start_empty = 1) - build_inventory(contraband, 1, start_empty = 1) - build_inventory(premium, 0, 1, start_empty = 1) - for(var/obj/item/vending_refill/VR in component_parts) - refill_inventory(VR, product_records, STANDARD_CHARGE) - refill_inventory(VR, coin_records, COIN_CHARGE) - refill_inventory(VR, hidden_records, CONTRABAND_CHARGE) + if(!component_parts) + return + + product_records = list() + hidden_records = list() + coin_records = list() + build_inventory(products, product_records, start_empty = TRUE) + build_inventory(contraband, hidden_records, start_empty = TRUE) + build_inventory(premium, coin_records, start_empty = TRUE) + for(var/obj/item/vending_refill/VR in component_parts) + restock(VR) /obj/machinery/vending/deconstruct(disassembled = TRUE) if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame. @@ -124,25 +119,33 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/machinery/vending/obj_break(damage_flag) if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) - var/dump_amount = 0 - for(var/datum/data/vending_product/R in product_records) - if(R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if(!dump_path) - continue - - while(R.amount>0) - var/obj/O = new dump_path(loc) - step(O, pick(GLOB.alldirs)) //we only drop 20% of the total of each products and spread it - R.amount -= 5 //around to not fill the turf with too many objects. - dump_amount++ - if(dump_amount > 15) //so we don't drop too many items (e.g. ClothesMate) - break stat |= BROKEN icon_state = "[initial(icon_state)]-broken" -/obj/machinery/vending/proc/build_inventory(list/productlist, hidden=0, req_coin=0, start_empty = null) + var/dump_amount = 0 + var/found_anything = TRUE + while (found_anything) + found_anything = FALSE + for(var/record in shuffle(product_records)) + var/datum/data/vending_product/R = record + if(R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if(!dump_path) + continue + R.amount-- + // busting open a vendor will destroy some of the contents + if(found_anything && prob(80)) + continue + + var/obj/O = new dump_path(loc) + step(O, pick(GLOB.alldirs)) + found_anything = TRUE + dump_amount++ + if (dump_amount >= 16) + return + +/obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, start_empty = FALSE) for(var/typepath in productlist) var/amount = productlist[typepath] if(isnull(amount)) @@ -150,47 +153,54 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/atom/temp = typepath var/datum/data/vending_product/R = new /datum/data/vending_product() - R.product_name = initial(temp.name) + R.name = initial(temp.name) R.product_path = typepath if(!start_empty) R.amount = amount R.max_amount = amount - R.display_color = pick("red","blue","green") + R.display_color = pick("#ff8080","#80ff80","#8080ff") + recordlist += R - if(hidden) - hidden_records += R - else if(req_coin) - coin_records += R - else - product_records += R +/obj/machinery/vending/proc/restock(obj/item/vending_refill/canister) + if (!canister.products) + canister.products = products.Copy() + if (!canister.contraband) + canister.contraband = contraband.Copy() + if (!canister.premium) + canister.premium = premium.Copy() + . = 0 + . += refill_inventory(canister.products, product_records) + . += refill_inventory(canister.contraband, hidden_records) + . += refill_inventory(canister.premium, coin_records) -/obj/machinery/vending/proc/refill_inventory(obj/item/vending_refill/refill, datum/data/vending_product/machine, var/charge_type = STANDARD_CHARGE) - var/total = 0 - var/to_restock = 0 +/obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist) + . = 0 + for(var/R in recordlist) + var/datum/data/vending_product/record = R + var/diff = min(record.max_amount - record.amount, productlist[record.product_path]) + if (diff) + productlist[record.product_path] -= diff + record.amount += diff + . += diff - for(var/datum/data/vending_product/machine_content in machine) - if(machine_content.amount == 0 && refill.charges[charge_type] > 0) - machine_content.amount++ - refill.charges[charge_type]-- - total++ - to_restock += machine_content.max_amount - machine_content.amount - if(to_restock <= refill.charges[charge_type]) - for(var/datum/data/vending_product/machine_content in machine) - machine_content.amount = machine_content.max_amount - refill.charges[charge_type] -= to_restock - total += to_restock - else - var/tmp_charges = refill.charges[charge_type] - for(var/datum/data/vending_product/machine_content in machine) - if(refill.charges[charge_type] == 0) - break - var/restock = CEILING(((machine_content.max_amount - machine_content.amount)/to_restock)*tmp_charges, 1) - if(restock > refill.charges[charge_type]) - restock = refill.charges[charge_type] - machine_content.amount += restock - refill.charges[charge_type] -= restock - total += restock - return total +/obj/machinery/vending/proc/update_canister() + if (!component_parts) + return + + var/obj/item/vending_refill/R = locate() in component_parts + if (!R) + CRASH("Constructible vending machine did not have a refill canister") + return + + R.products = unbuild_inventory(product_records) + R.contraband = unbuild_inventory(hidden_records) + R.premium = unbuild_inventory(coin_records) + +/obj/machinery/vending/proc/unbuild_inventory(list/recordlist) + . = list() + for(var/R in recordlist) + var/datum/data/vending_product/record = R + .[record.product_path] += record.amount /obj/machinery/vending/crowbar_act(mob/living/user, obj/item/I) if(!component_parts) @@ -248,46 +258,52 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C bill = new S.type(src, 1) to_chat(user, "You insert [I] into [src].") return - else if(istype(I, refill_canister) && refill_canister != null) - if(stat & (BROKEN|NOPOWER)) - to_chat(user, "It does nothing.") - else if(panel_open) + else if(refill_canister && istype(I, refill_canister)) + if (!panel_open) + to_chat(user, "You should probably unscrew the service panel first.") + else if (stat & (BROKEN|NOPOWER)) + to_chat(user, "[src] does not respond.") + else //if the panel is open we attempt to refill the machine var/obj/item/vending_refill/canister = I - if(canister.charges[STANDARD_CHARGE] == 0) - to_chat(user, "This [canister.name] is empty!") + if(canister.get_part_rating() == 0) + to_chat(user, "[canister] is empty!") else - var/transfered = refill_inventory(canister,product_records,STANDARD_CHARGE) - transfered += refill_inventory(canister,coin_records,COIN_CHARGE) - transfered += refill_inventory(canister,hidden_records,CONTRABAND_CHARGE) - if(transfered) - to_chat(user, "You loaded [transfered] items in \the [name].") + // instantiate canister if needed + var/transferred = restock(canister) + if(transferred) + to_chat(user, "You loaded [transferred] items in [src].") else - to_chat(user, "The [name] is fully stocked.") + to_chat(user, "There's nothing to restock!") return - else - to_chat(user, "You should probably unscrew the service panel first.") else return ..() +/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W) + if(!istype(W)) + return FALSE + if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance) + return FALSE + if(!component_parts || !refill_canister) + return FALSE + + var/moved = 0 + if(panel_open || W.works_from_distance) + if(W.works_from_distance) + display_parts(user) + for(var/I in W) + if(istype(I, refill_canister)) + moved += restock(I) + else + display_parts(user) + if(moved) + to_chat(user, "[moved] items restocked.") + W.play_rped_sound() + return TRUE + /obj/machinery/vending/on_deconstruction() - var/product_list = list(product_records, hidden_records, coin_records) - for(var/i=1, i<=3, i++) - for(var/datum/data/vending_product/machine_content in product_list[i]) - while(machine_content.amount !=0) - var/safety = 0 //to avoid infinite loop - for(var/obj/item/vending_refill/VR in component_parts) - safety++ - if(VR.charges[i] < VR.init_charges[i]) - VR.charges[i]++ - machine_content.amount-- - if(!machine_content.amount) - break - else - safety-- - if(safety <= 0) // all refill canisters are full - break - ..() + update_canister() + . = ..() /obj/machinery/vending/emag_act(mob/user) if(obj_flags & EMAGGED) @@ -323,7 +339,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C dat += "Vend " else dat += "Sold out " - dat += "[sanitize(R.product_name)]:" + dat += "[sanitize(R.name)]:" dat += " [R.amount]" dat += "" dat += "" @@ -358,17 +374,11 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C to_chat(usr, "There is no money in this machine.") return if(coin) - if(!usr.get_active_held_item()) - usr.put_in_hands(coin) - else - coin.forceMove(get_turf(src)) + usr.put_in_hands(coin) to_chat(usr, "You remove [coin] from [src].") coin = null if(bill) - if(!usr.get_active_held_item()) - usr.put_in_hands(bill) - else - bill.forceMove(get_turf(src)) + usr.put_in_hands(bill) to_chat(usr, "You remove [bill] from [src].") bill = null @@ -545,7 +555,3 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/machinery/vending/onTransitZ() return - -#undef STANDARD_CHARGE -#undef CONTRABAND_CHARGE -#undef COIN_CHARGE diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 58ede4f25b3..95211a96005 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -122,8 +122,10 @@ /obj/item/skub = 1) refill_canister = /obj/item/vending_refill/autodrobe +/obj/machinery/vending/autodrobe/all_access + desc = "A vending machine for costumes. This model appears to have no access restrictions." + req_access = null + /obj/item/vending_refill/autodrobe machine_name = "AutoDrobe" icon_state = "refill_costume" - charges = list(32, 2, 3)// of 96 standard, 6 contraband, 9 premium - init_charges = list(32, 2, 3) diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 09a421d1d57..2f9a862508b 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -38,6 +38,10 @@ req_access = list(ACCESS_BAR) refill_canister = /obj/item/vending_refill/boozeomat +/obj/machinery/vending/boozeomat/all_access + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. This model appears to have no access restrictions." + req_access = null + /obj/machinery/vending/boozeomat/pubby_maint //abandoned bar on Pubbystation products = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1, /obj/item/reagent_containers/food/drinks/bottle/absinthe = 1, @@ -62,5 +66,3 @@ /obj/item/vending_refill/boozeomat machine_name = "Booze-O-Mat" icon_state = "refill_booze" - charges = list(61, 4, 0)//of 182 standard, 12 contraband - init_charges = list(61, 4, 0) diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index d81a0a01a64..6b9334362df 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -41,8 +41,6 @@ /obj/item/vending_refill/cigarette machine_name = "ShadyCigs Deluxe" icon_state = "refill_smoke" - charges = list(12, 3, 2)// of 36 standard, 9 contraband, 6 premium - init_charges = list(12, 3, 2) /obj/machinery/vending/cigarette/pre_throw(obj/item/I) if(istype(I, /obj/item/lighter)) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index f3ab636fb05..80e422c6a00 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -35,6 +35,7 @@ /obj/item/clothing/neck/tie/red = 1, /obj/item/clothing/neck/tie/black = 1, /obj/item/clothing/neck/tie/horrible = 1, + /obj/item/clothing/neck/scarf/pink = 1, /obj/item/clothing/neck/scarf/red = 1, /obj/item/clothing/neck/scarf/green = 1, /obj/item/clothing/neck/scarf/darkblue = 1, @@ -118,5 +119,3 @@ /obj/item/vending_refill/clothing machine_name = "ClothesMate" icon_state = "refill_clothes" - charges = list(37, 4, 4)// of 111 standard, 12 contraband, 10 premium(?) - init_charges = list(37, 4, 4) diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index d70cf4ae76a..6ac9dd648d1 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -4,8 +4,8 @@ product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" icon_state = "coffee" icon_vend = "coffee-vend" - products = list(/obj/item/reagent_containers/food/drinks/coffee = 25, - /obj/item/reagent_containers/food/drinks/mug/tea = 25, + products = list(/obj/item/reagent_containers/food/drinks/coffee = 25, + /obj/item/reagent_containers/food/drinks/mug/tea = 25, /obj/item/reagent_containers/food/drinks/mug/coco = 25) contraband = list(/obj/item/reagent_containers/food/drinks/ice = 12) refill_canister = /obj/item/vending_refill/coffee @@ -13,5 +13,3 @@ /obj/item/vending_refill/coffee machine_name = "Solar's Best Hot Drinks" icon_state = "refill_joe" - charges = list(25, 4, 0)//of 75 standard, 12 contraband - init_charges = list(25, 4, 0) diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index e675b29f811..f61c392ff71 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -22,8 +22,6 @@ /obj/item/vending_refill/cola machine_name = "Robust Softdrinks" icon_state = "refill_cola" - charges = list(30, 4, 1)//of 90 standard, 12 contraband, 1 premium - init_charges = list(30, 4, 1) /obj/machinery/vending/cola/random name = "\improper Random Drinkies" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 1bd3c9086d2..4e4d3365679 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -13,5 +13,3 @@ /obj/item/vending_refill/games machine_name = "\improper Good Clean Fun" icon_state = "refill_games" - charges = list(7, 3, 0) //of 21 standard, 9 contraband - init_charges = list(7, 3, 0) diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index 6213ebed351..92fd21e852f 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -2,7 +2,6 @@ name = "\improper Liberation Station" desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine." icon_state = "liberationstation" - req_access = list(ACCESS_SECURITY) product_slogans = "Liberation Station: Your one-stop shop for all things second ammendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!" product_ads = "Float like an astronaut, sting like a bullet!;Express your second ammendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?" vend_reply = "Remember the name: Liberation Station!" diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index d7a905f0d5d..3b387f69599 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -2,7 +2,6 @@ name = "\improper Syndicate Donksoft Toy Vendor" desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" icon_state = "syndi" - req_access = list(ACCESS_SECURITY) product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!" product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index bb857d85d7f..bea449845c8 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -5,24 +5,24 @@ icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access = list(ACCESS_MEDICAL) - products = list(/obj/item/reagent_containers/syringe = 12, - /obj/item/reagent_containers/dropper = 3, - /obj/item/healthanalyzer = 4, - /obj/item/sensor_device = 2, + products = list(/obj/item/reagent_containers/syringe = 12, + /obj/item/reagent_containers/dropper = 3, + /obj/item/healthanalyzer = 4, + /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2, /obj/item/reagent_containers/medspray/sterilizine = 1, - /obj/item/stack/medical/gauze = 8, - /obj/item/reagent_containers/pill/patch/styptic = 5, - /obj/item/reagent_containers/medspray/styptic = 2, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, + /obj/item/stack/medical/gauze = 8, + /obj/item/reagent_containers/pill/patch/styptic = 5, + /obj/item/reagent_containers/medspray/styptic = 2, + /obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/medspray/silver_sulf = 2, /obj/item/reagent_containers/pill/insulin = 10, - /obj/item/reagent_containers/pill/salbutamol = 2, - /obj/item/reagent_containers/glass/bottle/charcoal = 4, - /obj/item/reagent_containers/glass/bottle/epinephrine = 4, + /obj/item/reagent_containers/pill/salbutamol = 2, + /obj/item/reagent_containers/glass/bottle/charcoal = 4, + /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, - /obj/item/reagent_containers/glass/bottle/morphine = 4, - /obj/item/reagent_containers/glass/bottle/toxin = 3, + /obj/item/reagent_containers/glass/bottle/morphine = 4, + /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, @@ -36,7 +36,5 @@ refill_canister = /obj/item/vending_refill/medical /obj/item/vending_refill/medical - machine_name = "NanoMed" + machine_name = "NanoMed Plus" icon_state = "refill_medical" - charges = list(26, 5, 3)// of 76 standard, 13 contraband, 8 premium - init_charges = list(26, 5, 3) diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 6b5005eee42..ef19ce3b9b3 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -15,5 +15,8 @@ /obj/item/reagent_containers/pill/morphine = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF - refill_canister = /obj/item/vending_refill/medical - refill_count = 1 + refill_canister = /obj/item/vending_refill/wallmed + +/obj/item/vending_refill/wallmed + machine_name = "NanoMed" + icon_state = "refill_medical" diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 82c31d1439c..69e510ad5a0 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -17,8 +17,6 @@ /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" - charges = list(12, 2, 0)//of 36 standard, 6 contraband - init_charges = list(12, 2, 0) /obj/machinery/vending/snack/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/food/snacks)) diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index c55dfff0168..08bb4615bba 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -6,20 +6,22 @@ product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor - products = list(/obj/item/gun/ballistic/automatic/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10, - /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, - /obj/item/toy/sword = 10, - /obj/item/ammo_box/foambox = 20, - /obj/item/toy/foamblade = 10, - /obj/item/toy/syndicateballoon = 10, - /obj/item/clothing/suit/syndicatefake = 5, - /obj/item/clothing/head/syndicatefake = 5) - contraband = list(/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10, - /obj/item/toy/katana = 10, - /obj/item/twohanded/dualsaber/toy = 5) + products = list( + /obj/item/gun/ballistic/automatic/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10, + /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, + /obj/item/toy/sword = 10, + /obj/item/ammo_box/foambox = 20, + /obj/item/toy/foamblade = 10, + /obj/item/toy/syndicateballoon = 10, + /obj/item/clothing/suit/syndicatefake = 5, + /obj/item/clothing/head/syndicatefake = 5) + contraband = list( + /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, + /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10, + /obj/item/toy/katana = 10, + /obj/item/twohanded/dualsaber/toy = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft @@ -27,5 +29,3 @@ /obj/item/vending_refill/donksoft machine_name = "Donksoft Toy Vendor" icon_state = "refill_donksoft" - charges = list(32,28,0)// of 90 standard, 75 contraband, 0 premium - init_charges = list(32,28,0) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 69f3e4b168a..738c7e46003 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -26,8 +26,6 @@ /obj/item/vending_refill/wardrobe/sec_wardrobe machine_name = "SecDrobe" - charges = list(10, 0, 3) - init_charges = list(10, 0, 3) /obj/machinery/vending/wardrobe/medi_wardrobe name = "\improper MediDrobe" @@ -56,8 +54,6 @@ /obj/item/vending_refill/wardrobe/medi_wardrobe machine_name = "MediDrobe" - charges = list(10, 0, 0) - init_charges = list(10, 0, 0) /obj/machinery/vending/wardrobe/engi_wardrobe name = "EngiDrobe" @@ -78,8 +74,6 @@ /obj/item/vending_refill/wardrobe/engi_wardrobe machine_name = "EngiDrobe" - charges = list(7, 0, 0) - init_charges = list(7, 0, 0) /obj/machinery/vending/wardrobe/atmos_wardrobe name = "AtmosDrobe" @@ -98,8 +92,6 @@ /obj/item/vending_refill/wardrobe/atmos_wardrobe machine_name = "AtmosDrobe" - charges = list(5, 0, 0) - init_charges = list(5, 0, 0) /obj/machinery/vending/wardrobe/cargo_wardrobe name = "CargoDrobe" @@ -117,8 +109,6 @@ /obj/item/vending_refill/wardrobe/cargo_wardrobe machine_name = "CargoDrobe" - charges = list(5, 0, 0) - init_charges = list(5, 0, 0) /obj/machinery/vending/wardrobe/robo_wardrobe name = "RoboDrobe" @@ -137,8 +127,6 @@ /obj/item/vending_refill/wardrobe/robo_wardrobe machine_name = "RoboDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) /obj/machinery/vending/wardrobe/science_wardrobe name = "SciDrobe" @@ -159,8 +147,6 @@ /obj/item/vending_refill/wardrobe/science_wardrobe machine_name = "SciDrobe" - charges = list(8, 0, 0) - init_charges = list(8, 0, 0) /obj/machinery/vending/wardrobe/hydro_wardrobe name = "Hydrobe" @@ -179,8 +165,6 @@ /obj/item/vending_refill/wardrobe/hydro_wardrobe machine_name = "HyDrobe" - charges = list(6, 0, 0) - init_charges = list(6, 0, 0) /obj/machinery/vending/wardrobe/curator_wardrobe name = "CuraDrobe" @@ -198,8 +182,6 @@ /obj/item/vending_refill/wardrobe/curator_wardrobe machine_name = "CuraDrobe" - charges = list(3, 0, 0) - init_charges = list(3, 0, 0) /obj/machinery/vending/wardrobe/bar_wardrobe name = "BarDrobe" @@ -227,8 +209,6 @@ /obj/item/vending_refill/wardrobe/bar_wardrobe machine_name = "BarDrobe" - charges = list(8, 0, 0) - init_charges = list(8, 0, 0) /obj/machinery/vending/wardrobe/chef_wardrobe name = "ChefDrobe" @@ -251,8 +231,6 @@ /obj/item/vending_refill/wardrobe/chef_wardrobe machine_name = "ChefDrobe" - charges = list(6, 0, 0) - init_charges = list(6, 0, 0) /obj/machinery/vending/wardrobe/jani_wardrobe name = "JaniDrobe" @@ -279,8 +257,6 @@ /obj/item/vending_refill/wardrobe/jani_wardrobe machine_name = "JaniDrobe" - charges = list(7, 0, 0) - init_charges = list(7, 0, 0) /obj/machinery/vending/wardrobe/law_wardrobe name = "LawDrobe" @@ -303,8 +279,6 @@ /obj/item/vending_refill/wardrobe/law_wardrobe machine_name = "LawDrobe" - charges = list(5, 0, 0) - init_charges = list(5, 0, 0) /obj/machinery/vending/wardrobe/chap_wardrobe name = "ChapDrobe" @@ -325,8 +299,6 @@ /obj/item/vending_refill/wardrobe/chap_wardrobe machine_name = "ChapDrobe" - charges = list(6, 0, 0) - init_charges = list(6, 0, 0) /obj/machinery/vending/wardrobe/chem_wardrobe name = "ChemDrobe" @@ -344,8 +316,6 @@ /obj/item/vending_refill/wardrobe/chem_wardrobe machine_name = "ChemDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) /obj/machinery/vending/wardrobe/gene_wardrobe name = "GeneDrobe" @@ -362,8 +332,6 @@ /obj/item/vending_refill/wardrobe/gene_wardrobe machine_name = "GeneDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) /obj/machinery/vending/wardrobe/viro_wardrobe name = "ViroDrobe" @@ -381,5 +349,3 @@ /obj/item/vending_refill/wardrobe/viro_wardrobe machine_name = "ViroDrobe" - charges = list(4, 0, 0) - init_charges = list(4, 0, 0) diff --git a/config/admins.txt b/config/admins.txt index 6825a88aec0..a882f7caea3 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -10,6 +10,7 @@ # and will override any duplicate entries in the database. # ############################################################################################### Optimumtact = Host +CitrusGender = Game Master NewSta = Game Master Expletives = Game Master kingofkosmos = Game Master diff --git a/config/game_options.txt b/config/game_options.txt index 3eafb02ec5f..2387c0dfef4 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -16,9 +16,6 @@ REVIVAL_BRAIN_LIFE -1 ## RENAMING ### -## Uncomment to allow cyborgs to rename themselves at roundstart. Has no effect on roboticists renaming cyborgs the normal way. -#RENAME_CYBORG - ## OOC DURING ROUND ### ## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results. OOC_DURING_ROUND diff --git a/goon/icons/obj/chairs.dmi b/goon/icons/obj/chairs.dmi new file mode 100644 index 00000000000..462370ac377 Binary files /dev/null and b/goon/icons/obj/chairs.dmi differ diff --git a/html/changelog.html b/html/changelog.html index 04117703b82..d0b04201527 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,134 @@ -->
+

24 June 2018

+

CitrusGender updated:

+
    +
  • Fixed cyborgs not getting their names at round start
  • +
  • Fixed cyborgs and A.I.s being able to bypass appearance bans
  • +
+

SpaceManiac updated:

+
    +
  • The "Save Logs" option in the chat now actually works (IE 10+ only).
  • +
+

Time-Green updated:

+
    +
  • Soda is no longer intangible to the laws of physics
  • +
+

cinder1992 updated:

+
    +
  • The Captain can now go down with their station in style! Suicide animation added to the Officer's Sabre.
  • +
+

kevinz000 updated:

+
    +
  • Cyborgs now drop keys on deconstruction/detonation
  • +
+ +

23 June 2018

+

Dax Dupont updated:

+
    +
  • CHANGE PLACES, SHUTTLE CHAIRS HAVE BEEN CHANGED AGAIN.
  • +
  • Create antags now checks for people being on station before applying.
  • +
+

ExcessiveUseOfCobblestone updated:

+
    +
  • Plant disks with potency genes clarify the percent is for potency scaling and not relative to max volume on examine.
  • +
+

Kor updated:

+
    +
  • Bubblegum has regained his original (deadlier) move set.
  • +
+

SpaceManiac updated:

+
    +
  • Fire extinguishers on the emergency shuttle are no longer unclickable once removed from their cabinets.
  • +
+

kevinz000 updated:

+
    +
  • Blast cannons have been fixed and are now available for purchase by traitorous scientists for a low low price of 14TC.
  • +
  • Blast cannons take the explosive power of a TTV bomb and ejects a linear projectile that will apply what the bomb would do to a certain tile at that distance to that tile. However, this will not cause breaches, or gib mobs, unless the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. (Unless the admins so will it.)
  • +
+ +

21 June 2018

+

BlueNothing updated:

+
    +
  • Grabbers can no longer hold circuit assemblies
  • +
+

CitrusGender updated:

+
    +
  • Ruins air alarms will no longer be reported in the station tablets
  • +
  • added a clamp so you can't set a negative multiplier to create materials and create more than 50 items.
  • +
+

Cobby updated:

+
    +
  • Removed Advanced Mining Scanner from roundstart voucher kits.
  • +
  • Removed Explorer Webbing from all voucher kits besides the shelter capsule pack.
  • +
+

Denton updated:

+
    +
  • The public booze-o-mats and autodrobes on Box/Delta/Meta now have no access requirements, as previously intended.
  • +
  • Regular and advanced health analyzers can now be researched and printed.
  • +
+

McDonald072 updated:

+
    +
  • A few new circuits for dealing with atmospherics have been uploaded to your local printers.
  • +
+

NewSta updated:

+
    +
  • made it easier to see from the back whether someone is occupying the shuttle chair or not.
  • +
+

SpaceManiac updated:

+
    +
  • One canister is now suitable to fully stock a vending machine. Relevant cargo packs have been updated.
  • +
  • Deconstructing and reconstructing a vending machine no longer creates items from thin air.
  • +
  • Using a part replacer on a vending machine no longer empties its inventory.
  • +
  • Bluespace RPEDs can now be used to refill vending machines.
  • +
+

Tlaltecuhtli updated:

+
    +
  • anomaly cores no longer tend to dust
  • +
+

YPOQ updated:

+
    +
  • Watcher beams will freeze you again
  • +
+ +

19 June 2018

+

Cyberboss updated:

+
    +
  • Speaking in deadchat now shows your rank instead of ADMIN
  • +
+

Dax Dupont updated:

+
    +
  • Circuit lab no longer starts with super batteries, they have been replaced with high batteries.
  • +
  • Circuit labs now start with 20 sheets of metal instead of 50/100. Plenty of materials on the station you can gather.
  • +
  • Circuit labs no longer have their own protolathe and autolathe. Science has their own lathes already.
  • +
  • There's no more entire library worth of equipment, they can go publish the books like the rest of the station, in the library. At least give the librarians something other to do than screaming about lizard porn on the radio.
  • +
+

Hyacinth-OR updated:

+
    +
  • Added a pink scarf to vendomats
  • +
+

Irafas updated:

+
    +
  • Players can now ctrl-click the PDA to remove the item in its pen slot
  • +
+

JStheguy updated:

+
    +
  • Added the data card reader circuit, a circuit that is able to read data cards, as well as write to them.
  • +
  • Data cards are now longer inexplicably called data disks despite clearly being cards, and can be printed from the "tools" section of the integrated circuit printer.
  • +
  • Data cards no longer have a special "label card" verb and instead can have their names and descriptions changed with a pen.
  • +
  • Also, some aesthetically different variants of the data cards, because why not.
  • +
  • Data cards have new sprites, with support for coloring them via the assembly detailer.
  • +
+

Naksu updated:

+
    +
  • Sped up atmos very slightly
  • +
+

ninjanomnom updated:

+
    +
  • A plush that knows too much has found its way to the bus ruin.
  • +
+

18 June 2018

CitrusGender updated:

    @@ -1448,64 +1576,6 @@
  • the beer and soda dispenser now have their own circuitboards, as well as design ids. you can unlock them through techwebs under the biotech node.
  • beer and soda dispensers can no longer be turned into chem dispensers by deconstructing and reconstructing them.
- -

21 April 2018

-

SailorDave updated:

-
    -
  • A new manipulation circuit, the Seed Extractor. Extracts seeds from produce, and outputs a list of the extracted seeds.
  • -
  • A new list circuit, the List Filter. Searches through a list for anything matching the desired element and outputs two lists: one containing just the matches, and the other with matches filtered out.
  • -
  • A new list circuit, the Set circuit. Removes duplicate entries from a list.
  • -
  • The Plant Manipulation circuit can now plant seeds, and outputs a list of harvested plants.
  • -
  • Reagent circuits can now irrigate connected hydroponic trays and inject blood samples into Replica pods.
  • -
  • The Examiner circuit can now output worn items and other examined details of carbon and silicon mobs into the description pin, as well as the occupied turf of the scanned object, and can now scan turfs.
  • -
  • The locomotion circuit now allows drones to move at base human speed, but cannot be stacked, and assemblies can now open doors they have access to like bots by bumping into them.
  • -
  • List Advanced Locator circuit now accepts refs as well as strings.
  • -
  • Fixed the Power Transmitter circuit not properly displaying a message when activated.
  • -
  • Medical Analyzer circuit can now properly scan non-human mobs.
  • -
- -

20 April 2018

-

Astatineguy12 updated:

-
    -
  • Gygax construction now actually uses up the capacitor
  • -
-

Dax Dupont updated:

-
    -
  • A cat is fine too. You can select cat parts again!
  • -
  • Default lizard tail was never properly defaulted, now it is.
  • -
  • Fixes an exploit where tendrils/other spawners/anchored mobs in general could be buckled to things and thus moved around.
  • -
-

Denton updated:

-
    -
  • Due to space OSHA lobbying, the Syndicate's lavaland base now contains a radsuit and decontamination shower.
  • -
  • Suit storage units' suit/helmet compartments now accept non-spacesuit clothing (radsuits, EOD suits, firesuits and so on).
  • -
-

Naksu updated:

-
    -
  • Oingo-boingo punch-face and meteor shot can no longer move gateways or Reebe servant blocker effects
  • -
  • Mechas piloted by servants of Ratvar now teleport to the servant side of Reebe when entering a rift
  • -
  • Gravity generators can now be thrown in buildmode
  • -
-

ShizCalev updated:

-
    -
  • Fixed a number of conveyor belts leading to the incorrect direction.
  • -
  • Fixed shuttle conveyor belts being out of sync with cargo's conveyors on some maps.
  • -
-

SpaceManiac updated:

-
    -
  • Cycle-linking is no longer permanently disabled for airlocks on shuttles.
  • -
- -

17 April 2018

-

Dax Dupont updated:

-
    -
  • Fixed martial arts/spell granters breaking on interrupt in final stage.
  • -
-

Naksu updated:

-
    -
  • Welding tools now flash the user as the weld progresses, not just when the welding is started.
  • -
  • CentCom officials will now properly display the objectives the admin has assigned them.
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 2e2231d2670..5bd3b454158 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -18538,3 +18538,101 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. console. - admin: It is now possible to use the ".p" (Asay) and ".d" (Dsay) prefixes while an admin ghost. +2018-06-19: + Cyberboss: + - admin: Speaking in deadchat now shows your rank instead of ADMIN + Dax Dupont: + - balance: Circuit lab no longer starts with super batteries, they have been replaced + with high batteries. + - balance: Circuit labs now start with 20 sheets of metal instead of 50/100. Plenty + of materials on the station you can gather. + - balance: Circuit labs no longer have their own protolathe and autolathe. Science + has their own lathes already. + - tweak: There's no more entire library worth of equipment, they can go publish + the books like the rest of the station, in the library. At least give the librarians + something other to do than screaming about lizard porn on the radio. + Hyacinth-OR: + - rscadd: Added a pink scarf to vendomats + Irafas: + - rscadd: Players can now ctrl-click the PDA to remove the item in its pen slot + JStheguy: + - rscadd: Added the data card reader circuit, a circuit that is able to read data + cards, as well as write to them. + - tweak: Data cards are now longer inexplicably called data disks despite clearly + being cards, and can be printed from the "tools" section of the integrated circuit + printer. + - tweak: Data cards no longer have a special "label card" verb and instead can have + their names and descriptions changed with a pen. + - rscadd: Also, some aesthetically different variants of the data cards, because + why not. + - imageadd: Data cards have new sprites, with support for coloring them via the + assembly detailer. + Naksu: + - code_imp: Sped up atmos very slightly + ninjanomnom: + - rscadd: A plush that knows too much has found its way to the bus ruin. +2018-06-21: + BlueNothing: + - tweak: Grabbers can no longer hold circuit assemblies + CitrusGender: + - bugfix: Ruins air alarms will no longer be reported in the station tablets + - bugfix: added a clamp so you can't set a negative multiplier to create materials + and create more than 50 items. + Cobby: + - rscdel: Removed Advanced Mining Scanner from roundstart voucher kits. + - rscdel: Removed Explorer Webbing from all voucher kits besides the shelter capsule + pack. + Denton: + - bugfix: The public booze-o-mats and autodrobes on Box/Delta/Meta now have no access + requirements, as previously intended. + - rscadd: Regular and advanced health analyzers can now be researched and printed. + McDonald072: + - rscadd: A few new circuits for dealing with atmospherics have been uploaded to + your local printers. + NewSta: + - tweak: made it easier to see from the back whether someone is occupying the shuttle + chair or not. + SpaceManiac: + - tweak: One canister is now suitable to fully stock a vending machine. Relevant + cargo packs have been updated. + - bugfix: Deconstructing and reconstructing a vending machine no longer creates + items from thin air. + - bugfix: Using a part replacer on a vending machine no longer empties its inventory. + - rscadd: Bluespace RPEDs can now be used to refill vending machines. + Tlaltecuhtli: + - bugfix: anomaly cores no longer tend to dust + YPOQ: + - bugfix: Watcher beams will freeze you again +2018-06-23: + Dax Dupont: + - imageadd: CHANGE PLACES, SHUTTLE CHAIRS HAVE BEEN CHANGED AGAIN. + - admin: Create antags now checks for people being on station before applying. + ExcessiveUseOfCobblestone: + - spellcheck: Plant disks with potency genes clarify the percent is for potency + scaling and not relative to max volume on examine. + Kor: + - rscadd: Bubblegum has regained his original (deadlier) move set. + SpaceManiac: + - bugfix: Fire extinguishers on the emergency shuttle are no longer unclickable + once removed from their cabinets. + kevinz000: + - rscadd: Blast cannons have been fixed and are now available for purchase by traitorous + scientists for a low low price of 14TC. + - rscadd: 'Blast cannons take the explosive power of a TTV bomb and ejects a linear + projectile that will apply what the bomb would do to a certain tile at that + distance to that tile. However, this will not cause breaches, or gib mobs, unless + the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. + (Unless the admins so will it.)' +2018-06-24: + CitrusGender: + - bugfix: Fixed cyborgs not getting their names at round start + - bugfix: Fixed cyborgs and A.I.s being able to bypass appearance bans + SpaceManiac: + - bugfix: The "Save Logs" option in the chat now actually works (IE 10+ only). + Time-Green: + - bugfix: Soda is no longer intangible to the laws of physics + cinder1992: + - rscadd: The Captain can now go down with their station in style! Suicide animation + added to the Officer's Sabre. + kevinz000: + - rscadd: Cyborgs now drop keys on deconstruction/detonation diff --git a/html/changelogs/AutoChangeLog-pr-38555.yml b/html/changelogs/AutoChangeLog-pr-38555.yml deleted file mode 100644 index 1c27021e6b1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-38555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cyberboss" -delete-after: True -changes: - - admin: "Speaking in deadchat now shows your rank instead of ADMIN" diff --git a/html/changelogs/AutoChangeLog-pr-38564.yml b/html/changelogs/AutoChangeLog-pr-38564.yml deleted file mode 100644 index 5f511bce3ae..00000000000 --- a/html/changelogs/AutoChangeLog-pr-38564.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "Sped up atmos very slightly" diff --git a/html/changelogs/AutoChangeLog-pr-38644.yml b/html/changelogs/AutoChangeLog-pr-38644.yml new file mode 100644 index 00000000000..3683ed1b459 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38644.yml @@ -0,0 +1,4 @@ +author: "SpaceManiac" +delete-after: True +changes: + - refactor: "AI static now uses visual contents and should perform better in theory." diff --git a/html/changelogs/AutoChangeLog-pr-38681.yml b/html/changelogs/AutoChangeLog-pr-38681.yml new file mode 100644 index 00000000000..3cdbbd96179 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38681.yml @@ -0,0 +1,4 @@ +author: "MadmanMartian" +delete-after: True +changes: + - bugfix: "Cameras that are EMPed no longer sound an alarm" diff --git a/html/changelogs/AutoChangeLog-pr-38682.yml b/html/changelogs/AutoChangeLog-pr-38682.yml new file mode 100644 index 00000000000..439dcc80f3a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38682.yml @@ -0,0 +1,4 @@ +author: "Tlaltecuhtli" +delete-after: True +changes: + - tweak: "tourettes doesnt stack on itself anymore" diff --git a/html/changelogs/AutoChangeLog-pr-38690.yml b/html/changelogs/AutoChangeLog-pr-38690.yml new file mode 100644 index 00000000000..23f21fd4d64 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38690.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - rscadd: "R&D deconstructors can now destroy things regardless of if there's a point value or material" diff --git a/html/changelogs/AutoChangeLog-pr-38693.yml b/html/changelogs/AutoChangeLog-pr-38693.yml new file mode 100644 index 00000000000..2c1a826ed45 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38693.yml @@ -0,0 +1,4 @@ +author: "SpaceManiac" +delete-after: True +changes: + - bugfix: "URLs are no longer auto-linkified in character names and IC messages." diff --git a/html/changelogs/AutoChangeLog-pr-38696.yml b/html/changelogs/AutoChangeLog-pr-38696.yml new file mode 100644 index 00000000000..d9f613e1f28 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38696.yml @@ -0,0 +1,4 @@ +author: "Tlaltecuhtli" +delete-after: True +changes: + - bugfix: "fixes cult shuttle message repeating" diff --git a/html/changelogs/AutoChangeLog-pr-38697.yml b/html/changelogs/AutoChangeLog-pr-38697.yml new file mode 100644 index 00000000000..764069b6535 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38697.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - admin: "Malf AI machine overloads now are logged/admin messaged." diff --git a/html/changelogs/AutoChangeLog-pr-38699.yml b/html/changelogs/AutoChangeLog-pr-38699.yml new file mode 100644 index 00000000000..fef3befb466 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38699.yml @@ -0,0 +1,4 @@ +author: "Irafas" +delete-after: True +changes: + - bugfix: "Hardsuit helmets now protect the wearer from pepperspray" diff --git a/html/changelogs/AutoChangeLog-pr-38702.yml b/html/changelogs/AutoChangeLog-pr-38702.yml new file mode 100644 index 00000000000..5036847eefe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38702.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - code_imp: "Removed unused effect object that could be used to spawn a list of humans" diff --git a/html/changelogs/AutoChangeLog-pr-38709.yml b/html/changelogs/AutoChangeLog-pr-38709.yml new file mode 100644 index 00000000000..fba0f2d7d2a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38709.yml @@ -0,0 +1,4 @@ +author: "SpaceManiac" +delete-after: True +changes: + - bugfix: "It is once again possible for Cargo to export mechs." diff --git a/html/changelogs/AutoChangeLog-pr-38711.yml b/html/changelogs/AutoChangeLog-pr-38711.yml new file mode 100644 index 00000000000..27afc1fafb7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38711.yml @@ -0,0 +1,4 @@ +author: "SpaceManiac" +delete-after: True +changes: + - bugfix: "Deaths in the CTF arena are no longer announced to deadchat." diff --git a/html/changelogs/AutoChangeLog-pr-38725.yml b/html/changelogs/AutoChangeLog-pr-38725.yml new file mode 100644 index 00000000000..edb95ab6352 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38725.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - tweak: "The tree of liberty must be refreshed from time to time with the blood of patriots and tyrants. We've removed access requirements from liberation station vendors." diff --git a/html/changelogs/AutoChangeLog-pr-38727.yml b/html/changelogs/AutoChangeLog-pr-38727.yml new file mode 100644 index 00000000000..2cb089463c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38727.yml @@ -0,0 +1,4 @@ +author: "Irafas" +delete-after: True +changes: + - bugfix: "Bucket helmets cannot have reagents transferred into them until after they are removed" diff --git a/html/changelogs/AutoChangeLog-pr-38730.yml b/html/changelogs/AutoChangeLog-pr-38730.yml new file mode 100644 index 00000000000..ebc17960cef --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38730.yml @@ -0,0 +1,8 @@ +author: "Denton" +delete-after: True +changes: + - tweak: "Camera networks, monitor screens and telescreens have been standardized." + - tweak: "Motion-sensitive cameras now show a message when they trigger the alarm." + - bugfix: "The Box/Meta auxillary base camera now works." + - bugfix: "Bomb test site cameras now emit light, as intended." + - bugfix: "Meta: Replaced the RD telescreen in the CE office with the correct one." diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index e6778c51af5..507801844cc 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 9247e3ee967..137150bcd44 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index f0eb8175497..0bf89ab7446 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/sound/effects/comfyfire.ogg b/sound/effects/comfyfire.ogg index 9b796219b3b..1bc7fc02d02 100644 Binary files a/sound/effects/comfyfire.ogg and b/sound/effects/comfyfire.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 92078786f40..cefd5003d81 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -202,6 +202,7 @@ #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" +#include "code\controllers\subsystem\dcs.dm" #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fire_burning.dm" @@ -320,6 +321,7 @@ #include "code\datums\components\decal.dm" #include "code\datums\components\earhealing.dm" #include "code\datums\components\earprotection.dm" +#include "code\datums\components\edit_complainer.dm" #include "code\datums\components\empprotection.dm" #include "code\datums\components\forced_gravity.dm" #include "code\datums\components\forensics.dm" @@ -682,7 +684,6 @@ #include "code\game\objects\effects\forcefields.dm" #include "code\game\objects\effects\glowshroom.dm" #include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\manifest.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" #include "code\game\objects\effects\overlays.dm"