diff --git a/.dockerignore b/.dockerignore index 400701794cf..8e675af8cba 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,7 @@ TGS3.json cfg data SQL -tgui/node_modules +node_modules tgstation.dmb tgstation.int tgstation.rsc diff --git a/.editorconfig b/.editorconfig index 95e40c0cd3c..79c4b77c52b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,7 +11,3 @@ indent_size = 2 [*.py] indent_style = space - -[/tgui/**/*.{js,styl,ract,json,html}] -indent_style = space -indent_size = 2 diff --git a/.github/AUTODOC_GUIDE.md b/.github/AUTODOC_GUIDE.md new file mode 100644 index 00000000000..a17a8de3157 --- /dev/null +++ b/.github/AUTODOC_GUIDE.md @@ -0,0 +1,108 @@ +# dmdoc +[DOCUMENTATION]: http://codedocs.tgstation13.org + +[BYOND]: https://secure.byond.com/ + +[DMDOC]: https://github.com/SpaceManiac/SpacemanDMM/tree/master/src/dmdoc + +[DMDOC] is a documentation generator for DreamMaker, the scripting language +of the [BYOND] game engine. It produces simple static HTML files based on +documented files, macros, types, procs, and vars. + +We use **dmdoc** to generate [DOCUMENTATION] for our code, and that documentation +is automatically generated and built on every new commit to the master branch + +This gives new developers a clickable reference [DOCUMENTATION] they can browse to better help +gain understanding of the /tg/station codebase structure and api reference. + +## Documenting code on /tg/station +We use block comments to document procs and classes, and we use `///` line comments +when documenting individual variables. + +It is required that all new code be covered with DMdoc code, according to the [Requirements](#Required) + +We also require that when you touch older code, you must document the functions that you +have touched in the process of updating that code + +### Required +A class *must* always be autodocumented, and all public functions *must* be documented + +All class level defined variables *must* be documented + +Internal functions *should* be documented, but may not be + +A public function is any function that a developer might reasonably call while using +or interating with your object. Internal functions are helper functions that your +public functions rely on to implement logic + + +### Documenting a proc +When documenting a proc, we give a short one line description (as this is shown +next to the proc definition in the list of all procs for a type or global +namespace), then a longer paragraph which will be shown when the user clicks on +the proc to jump to it's definition +``` +/** + * Short description of the proc + * + * Longer detailed paragraph about the proc + * including any relevant detail + * Arguments: + * * arg1 - Relevance of this argument + * * arg2 - Relevance of this argument + */ +``` + +### Documenting a class +We first give the name of the class as a header, this can be omitted if the name is +just going to be the typepath of the class, as dmdoc uses that by default + +Then we give a short oneline description of the class + +Finally we give a longer multi paragraph description of the class and it's details +``` +/** + * # Classname (Can be omitted if it's just going to be the typepath) + * + * The short overview + * + * A longer + * paragraph of functionality about the class + * including any assumptions/special cases + * + */ +``` + +### Documenting a variable +Give a short explanation of what the variable is in the context of the class. +``` +/// Type path of item to go in suit slot +var/suit = null +``` + +## Module level description of code +Modules are the best way to describe the structure/intent of a package of code +where you don't want to be tied to the formal layout of the class structure. + +On /tg/station we do this by adding markdown files inside the `code` directory +that will also be rendered and added to the modules tree. The structure for +these is deliberately not defined, so you can be as freeform and as wheeling as +you would like. + +[Here is a representative example of what you might write](http://codedocs.tgstation13.org/code/modules/keybindings/readme.html) + +## Special variables +You can use certain special template variables in DM DOC comments and they will be expanded +``` + [DEFINE_NAME] - Expands to a link to the define definition if documented + [/mob] - Expands to a link to the docs for the /mob class + [/mob/proc/Dizzy] - Expands to a link that will take you to the /mob class and anchor you to the dizzy proc docs + [/mob/var/stat] - Expands to a link that will take you to the /mob class and anchor you to the stat var docs +``` + +You can customise the link name by using `[link name][link shorthand].` + +eg. `[see more about dizzy here] [/mob/proc/Dizzy]` + +This is very useful to quickly link to other parts of the autodoc code to expand +upon a comment made, or reasoning about code diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3def1e0390c..0aadbbdb6d8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -62,7 +62,11 @@ # ninjanomnom +/code/__DEFINES/dcs/ @ninjanomnom +/code/controllers/subsystem/dcs.dm @ninjanomnom /code/controllers/subsystem/shuttle.dm @ninjanomnom +/code/datums/components/ @ninjanomnom +/code/datums/elements/ @ninjanomnom /code/modules/shuttle/ @ninjanomnom # ShizCalev @@ -74,7 +78,6 @@ # stylemistake /tgui @stylemistake -/tgui-next @stylemistake # Qustinnus /code/datums/components/mood.dm @Qustinnus @@ -83,10 +86,7 @@ # Multiple Owners -/code/__DEFINES/components.dm @Cyberboss @ninjanomnom /code/controllers/subsystem/air.dm @duncathan @MrStonedOne -/code/datums/components/ @Cyberboss @ninjanomnom - #SIC SEMPER TYRANNIS /code/modules/hydroponics/grown/citrus.dm @optimumtact diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index aa699f25d85..817626d2287 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -258,11 +258,11 @@ This prevents nesting levels from getting deeper then they need to be. * Areas should not be var-edited on a map to change it's name or attributes. All areas of a single type and it's altered instances are considered the same area within the code, and editing their variables on a map can lead to issues with powernets and event subsystems which are difficult to debug. ### User Interfaces -* All new player-facing user interfaces must use TGUI-next; TGUI is deprecated. +* All new player-facing user interfaces must use TGUI. * Raw HTML is permitted for admin and debug UIs. -* Documentation for TGUI-next can be found at: - * [tgui-next/README.md](../tgui-next/README.md) - * [tgui-next/tutorial-and-examples.md](../tgui-next/docs/tutorial-and-examples.md) +* Documentation for TGUI can be found at: + * [tgui/README.md](../tgui/README.md) + * [tgui/tutorial-and-examples.md](../tgui/docs/tutorial-and-examples.md) ### Other Notes * Code should be modular where possible; if you are working on a new addition, then strongly consider putting it in its own file unless it makes sense to put it with similar ones (i.e. a new tool would go in the "tools.dm" file) @@ -343,7 +343,7 @@ for(var/obj/item/sword/S in bag_of_swords) if(!best_sword || S.damage > best_sword.damage) best_sword = S ``` -specifies a type for DM to filter by. +specifies a type for DM to filter by. With the previous example that's perfectly fine, we only want swords, but here the bag only contains swords? Is DM still going to try to filter because we gave it a type to filter by? YES, and here comes the inefficiency. Wherever a list (or other container, such as an atom (in which case you're technically accessing their special contents list, but that's irrelevant)) contains datums of the same datatype or subtypes of the datatype you require for your loop's body, you can circumvent DM's filtering and automatic ```istype()``` checks by writing the loop as such: @@ -380,7 +380,7 @@ mob ``` This does NOT mean that you can access it everywhere like a global var. Instead, it means that that var will only exist once for all instances of its type, in this case that var will only exist once for all mobs - it's shared across everything in its type. (Much more like the keyword `static` in other languages like PHP/C++/C#/Java) -Isn't that confusing? +Isn't that confusing? There is also an undocumented keyword called `static` that has the same behaviour as global but more correctly describes BYOND's behaviour. Therefore, we always use static instead of global where we need it, as it reduces suprise when reading BYOND code. diff --git a/.github/workflows/autobuild_tgui.yml b/.github/workflows/autobuild_tgui.yml index b680139f74a..226ea2b7cee 100644 --- a/.github/workflows/autobuild_tgui.yml +++ b/.github/workflows/autobuild_tgui.yml @@ -5,8 +5,8 @@ on: branches: - 'master' paths: - - 'tgui-next/**.js' - - 'tgui-next/**.scss' + - 'tgui/**.js' + - 'tgui/**.scss' jobs: build: @@ -23,7 +23,7 @@ jobs: node-version: '>=12.13' - name: Build TGUI run: bin/tgui --ci - working-directory: ./tgui-next + working-directory: ./tgui - name: Commit Artifacts run: | git config --local user.email "action@github.com" diff --git a/.travis.yml b/.travis.yml index 5ebfab3789a..880562ca659 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ matrix: - tools/travis/check_filedirs.sh tgstation.dme - tools/travis/check_changelogs.sh - find . -name "*.php" -print0 | xargs -0 -n1 php -l - - find . -name "*.json" -not -path "./tgui/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py + - find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py - tools/travis/build_tgui.sh - tools/travis/check_grep.sh - ~/dreamchecker diff --git a/Dockerfile b/Dockerfile index 50d5316df56..58be08fec1b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM tgstation/byond:513.1503 as base +FROM tgstation/byond:513.1511 as base FROM base as build_base diff --git a/README.md b/README.md index d522caa885a..99f824ca647 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## /tg/station codebase -[![Build Status](https://travis-ci.org/tgstation/tgstation.png)](https://travis-ci.org/tgstation/tgstation) [![Krihelimeter](https://www.krihelinator.xyz/badge/tgstation/tgstation)](https://www.krihelinator.xyz) -[![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) +[![Build Status](https://travis-ci.org/tgstation/tgstation.png)](https://travis-ci.org/tgstation/tgstation) [![Krihelimeter](https://www.krihelinator.xyz/badge/tgstation/tgstation)](https://www.krihelinator.xyz) +[![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://user-images.githubusercontent.com/8171642/50290880-ffef5500-043a-11e9-8270-a2e5b697c86c.png) [![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 @@ -9,7 +9,7 @@ * **Wiki** https://tgstation13.org/wiki/Main_Page * **Codedocs:** https://codedocs.tgstation13.org/ * **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 There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at https://www.tgstation13.org/wiki/Downloading_the_source_code @@ -95,7 +95,7 @@ the new version. ## HOSTING If you'd like a more robust server hosting option for tgstation and its -derivatives. Check out our server tools suite at +derivatives. Check out our server tools suite at https://github.com/tgstation/tgstation-server ## MAPS @@ -131,7 +131,7 @@ The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not su If you are hosting a testing server on windows you can use a standalone version of MariaDB pre load with a blank (but initialized) tgdb database. Find them here: https://tgstation13.download/database/ Just unzip and run for a working (but insecure) database server. Includes a zipped copy of the data folder for easy resetting back to square one. -## WEB/CDN RESOURCE DELIVERY +## WEB/CDN RESOURCE DELIVERY Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server. @@ -163,8 +163,6 @@ Font Awesome font files, used by tgui, are licensed under the SIL Open Font Lice tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/). The TGS3 API is licensed as a subproject under the MIT license. -See tgui/LICENSE.md for the MIT license. -See tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md for the SIL Open Font License. See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license. All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 028accc59ee..cb6c58f858c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -159,8 +159,25 @@ }, /obj/structure/chair/stool, /obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/red, +/obj/item/clothing/glasses/sunglasses, /turf/open/floor/wood, /area/ruin/powered/beach) +"bC" = ( +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = -7; + pixel_y = -2 + }, +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/bottle/rum{ + pixel_x = 4; + pixel_y = -3 + }, +/turf/open/floor/carpet/red, +/area/ruin/powered/beach) "bG" = ( /obj/structure/window/reinforced{ dir = 8 @@ -309,6 +326,9 @@ }, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) +"fB" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/ruin/powered/beach) "fL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -434,6 +454,7 @@ "kd" = ( /obj/structure/table/wood, /obj/item/storage/bag/tray, +/obj/item/reagent_containers/food/drinks/colocup, /turf/open/floor/wood, /area/ruin/powered/beach) "kg" = ( @@ -453,7 +474,7 @@ /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "kn" = ( -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ dir = 1 }, /obj/machinery/light, @@ -511,9 +532,7 @@ /turf/open/floor/pod/light, /area/ruin/powered/beach) "oQ" = ( -/obj/effect/mob_spawn/human/bartender/alive{ - dir = 4 - }, +/obj/structure/reagent_dispensers/beerkeg, /turf/open/floor/wood, /area/ruin/powered/beach) "oU" = ( @@ -624,10 +643,21 @@ /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) "sM" = ( -/obj/structure/reagent_dispensers/beerkeg, /obj/machinery/light{ dir = 4 }, +/obj/structure/closet/secure_closet{ + icon_state = "cabinet"; + name = "bartender's closet"; + req_access = list(25) + }, +/obj/item/clothing/shoes/sandal{ + desc = "A very fashionable pair of flip-flops."; + name = "flip-flops" + }, +/obj/item/clothing/neck/beads, +/obj/item/clothing/glasses/sunglasses/reagent, +/obj/item/clothing/suit/hawaiian, /turf/open/floor/wood, /area/ruin/powered/beach) "sV" = ( @@ -662,6 +692,30 @@ /obj/item/disk/plantgene, /turf/open/floor/plasteel/grimy, /area/ruin/powered/beach) +"tg" = ( +/obj/structure/closet/crate/freezer{ + name = "Cooler" + }, +/obj/item/reagent_containers/food/drinks/ice, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) "tn" = ( /obj/structure/chair/sofa/right, /turf/open/floor/wood, @@ -689,10 +743,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/table/wood/poker, /obj/item/storage/pill_bottle/dice, +/obj/item/stack/spacecash/c1000, /turf/open/floor/wood, /area/ruin/powered/beach) "vi" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ dir = 8 }, /turf/open/floor/plating/beach/coastline_b{ @@ -709,7 +764,7 @@ /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) "wW" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ dir = 8 }, /turf/open/floor/plating/beach/coastline_b{ @@ -943,7 +998,6 @@ /area/ruin/powered/beach) "EE" = ( /obj/structure/dresser, -/obj/item/storage/backpack/duffelbag, /turf/open/floor/wood, /area/ruin/powered/beach) "EF" = ( @@ -1003,6 +1057,8 @@ "Ga" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/head/chefhat, /turf/open/floor/wood, /area/ruin/powered/beach) "GB" = ( @@ -1029,7 +1085,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/plasteel/stairs/old, +/turf/open/floor/plasteel/stairs/left, /area/ruin/powered/beach) "HV" = ( /turf/open/floor/plating/beach/coastline_b{ @@ -1041,10 +1097,30 @@ /obj/item/reagent_containers/food/drinks/beer/light, /obj/item/reagent_containers/food/drinks/beer/light, /obj/item/reagent_containers/food/drinks/beer/light, -/obj/structure/closet/secure_closet/bar, /obj/item/vending_refill/cigarette, /obj/item/vending_refill/boozeomat, +/obj/structure/closet/secure_closet{ + icon_state = "cabinet"; + name = "booze storage"; + req_access = list(25) + }, /obj/item/storage/backpack/duffelbag, +/obj/item/etherealballdeployer, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, /turf/open/floor/wood, /area/ruin/powered/beach) "Il" = ( @@ -1065,6 +1141,9 @@ }, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) +"Iv" = ( +/turf/open/floor/plasteel/stairs/right, +/area/ruin/powered/beach) "IG" = ( /turf/open/floor/carpet/royalblue, /area/ruin/powered/beach) @@ -1152,11 +1231,6 @@ }, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"Mz" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/sand, -/turf/open/floor/sepia, -/area/ruin/powered/beach) "MO" = ( /obj/machinery/light{ dir = 4 @@ -1231,7 +1305,8 @@ /area/ruin/powered/beach) "PN" = ( /obj/effect/turf_decal/sand, -/obj/machinery/jukebox/disco, +/obj/machinery/jukebox, +/obj/item/coin/gold, /turf/open/floor/sepia, /area/ruin/powered/beach) "PY" = ( @@ -1261,11 +1336,16 @@ /turf/open/floor/wood, /area/ruin/powered/beach) "RB" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/beer{ - desc = "Beer advertised to be the best in space."; - name = "Masterbrand Beer" +/obj/structure/closet/cabinet, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/blue, +/obj/item/clothing/suit/ianshirt, +/obj/item/clothing/shoes/sandal{ + desc = "A very fashionable pair of flip-flops."; + name = "flip-flops" }, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/neck/beads, /turf/open/floor/wood, /area/ruin/powered/beach) "RE" = ( @@ -1302,6 +1382,10 @@ /area/ruin/powered/beach) "SZ" = ( /obj/item/storage/crayons, +/obj/structure/closet/crate/wooden, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXtwentythree, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "Ti" = ( @@ -1398,10 +1482,14 @@ /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) "VL" = ( -/obj/machinery/portable_atmospherics/canister/air, /obj/machinery/light/small{ dir = 4 }, +/obj/structure/closet/crate{ + name = "fuel crate" + }, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, /turf/open/floor/plating, /area/ruin/powered/beach) "VN" = ( @@ -1429,6 +1517,19 @@ /obj/machinery/computer/arcade/battle, /turf/open/floor/wood, /area/ruin/powered/beach) +"Wy" = ( +/obj/structure/closet/cabinet, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/purple, +/obj/item/clothing/suit/vapeshirt, +/obj/item/clothing/shoes/cookflops{ + desc = "A very fashionable pair of flip flops."; + name = "flip-flops" + }, +/obj/item/clothing/glasses/sunglasses/big, +/obj/item/clothing/neck/beads, +/turf/open/floor/wood, +/area/ruin/powered/beach) "WF" = ( /obj/effect/turf_decal/sand, /mob/living/simple_animal/crab{ @@ -1476,6 +1577,9 @@ /obj/structure/sign/poster/official/high_class_martini{ pixel_x = -32 }, +/obj/effect/mob_spawn/human/bartender/alive{ + dir = 4 + }, /turf/open/floor/wood, /area/ruin/powered/beach) "ZA" = ( @@ -1717,7 +1821,7 @@ xE zT ap ar -bM +fB lq uz uz @@ -1749,7 +1853,7 @@ ap ar ar ar -bM +fB lq uz uz @@ -1781,7 +1885,7 @@ ar ar ar ar -bM +fB lq uz uz @@ -1813,12 +1917,12 @@ ar ar ar DK -bM +Iv +lq lq lq lq lq -Mz Fr yc "} @@ -1842,7 +1946,7 @@ QS ar ar ER -ar +tg ar bR vi @@ -1873,7 +1977,7 @@ RE Uk ar ar -Ti +bC Ti ar bR @@ -2317,7 +2421,7 @@ aj aj EE aC -RB +Wy MZ Ut aA diff --git a/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm b/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm index 806bc9f7acd..71b8f516cbe 100644 --- a/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm +++ b/_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm @@ -9,87 +9,94 @@ /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav) "d" = ( +/turf/open/floor/grass, +/area/ruin/space/has_grav) +"e" = ( /obj/structure/marker_beacon{ light_color = "#FFE8AA"; light_range = 20 }, -/turf/open/floor/plating/asteroid/airless, -/area/ruin/space/has_grav) -"e" = ( -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "f" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/ruin/space/has_grav) +"g" = ( /obj/structure/flora/ausbushes/ywflowers, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "h" = ( /mob/living/simple_animal/pet/gondola, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "i" = ( /obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "j" = ( /obj/effect/overlay/coconut, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "k" = ( /obj/effect/overlay/palmtree_l, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "l" = ( /obj/structure/flora/ausbushes/stalkybush, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "m" = ( /obj/structure/flora/ausbushes/grassybush, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "n" = ( /obj/structure/flora/ausbushes/reedbush, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "o" = ( /obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "p" = ( /obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "q" = ( /obj/structure/flora/ausbushes/fernybush, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "r" = ( /obj/effect/overlay/palmtree_r, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "s" = ( /obj/structure/flora/junglebush/large, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "t" = ( /obj/structure/flora/ausbushes/sunnybush, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) "u" = ( +/obj/structure/sink/puddle, +/turf/open/floor/grass, +/area/ruin/space/has_grav) +"v" = ( /obj/machinery/door/airlock/survival_pod/glass{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) -"T" = ( +"w" = ( /obj/machinery/door/airlock/survival_pod/glass{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/grass, /area/ruin/space/has_grav) (1,1,1) = {" @@ -233,7 +240,7 @@ b b b b -c +d b b b @@ -266,13 +273,13 @@ b b b b -c -c -c -c -c -c -c +d +d +d +d +d +d +d b b b @@ -301,16 +308,16 @@ b b b b -c -c -c -c -f -c -c -c +d +d +d +d +g +d +d +d h -c +d b b "} @@ -336,14 +343,14 @@ b b b b -c -c -c -c +d +d +d +d o -c +d r -c +d b b b @@ -368,21 +375,21 @@ b b b b -c +d b -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d j -c -c -c -c +d +d +d +d b b b @@ -402,24 +409,24 @@ b b b b -c +d k -c -c +d +d q -c -c +d +d j -c -c +d +d k -c -c -c -c +d +d +d +d m -c -c +d +d b b b @@ -441,22 +448,22 @@ b b b b -c -c -c -c -c +d +d +d +d +d s -c -c -c -c -c -c +d +d +d +d +d +d i -c -c -c +d +d +d b b b @@ -477,23 +484,23 @@ b b b b -c +d i n -f -c -c +g +d +d +e +d d -c -c j -c -h -c -l -c d -c +h +d +l +d +e +d b b b @@ -512,25 +519,25 @@ b b b b -c -c -c -c +d +d +d +d o o -c +d h -c -c -c -c -c -c -c +d +d +d +d +d +d +d i o -c -c +d +d b b b @@ -549,24 +556,24 @@ b b b b -c -c -c -c +d +d +u +d i -c +d q -c -c -c -c -c -c +d +d +d +d +d +d s -c -c -c -c +d +d +d +d b b b @@ -586,23 +593,23 @@ b b b h -c -c -c -c +d +d +d +d l -c -c -c +d +d +d m i -c -c -c -c -c -c -c +d +d +d +d +d +u +d b b b @@ -626,21 +633,21 @@ b b b b -c -c -c -c -c +d +d +d +d +d i o -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d b b b @@ -665,20 +672,20 @@ b b b b -c -c -c +d +d +d o p -c -c -c -c +d +d +d +d r -c -c -c -c +d +d +d +d b b b @@ -703,20 +710,20 @@ b b b b -c -e +d +f n -c -c -c -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d +d +d +d b b c @@ -732,28 +739,28 @@ b b b b -c -e -c +d +f +d b b b b b -c -c -c -c -c -c +d +d +d +d +d +d i t -c -c -c +d +d +d i -c -c +d +d b b b @@ -768,32 +775,32 @@ b b b b -c -c -c -c -c -c +d +d +d +d +d +d b b b -b -c +d +d r j -c -c -c -f -c -c -c -c -c -c -u -c -T +d +d +d +g +d +d +d +d +d +d +v +d +w "} (20,1,1) = {" a @@ -806,27 +813,27 @@ b b b h -c -c d -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c +d +e +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d b b b @@ -842,29 +849,29 @@ b b b b -c -c -c -k -c -i -i -c -c -q -c -c -c -c -c d -c +d +d +k +d +i +i +d +d +q +d +d +d +d +d +e +d h -c -c -c -c -c +d +d +d +d +d b b b @@ -879,29 +886,29 @@ b b b b -c -c -c -c -c -c +d +d +d +d +d +d l -c -c -c -c -c -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d +d +d +d +d +d r -c -c +d +d b b b @@ -916,29 +923,29 @@ b b b b -c -c +d +d j -c -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +u +d h s -c -c -c +d +d +d s -c -c -c -c -c +d +d +d +d +d b b b @@ -952,30 +959,30 @@ b b b b -e -c -c -c -c -c +f +d +d +d +d +d h -c -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d +d m -c -c -c -c -c -c -c +d +d +d +d +d +d +d b b b @@ -988,30 +995,30 @@ c b b b -c -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d +d i l -c -c -c -c -c -c +d +d +d +d +d +d n m -c -c -c -c -c +d +d +d +d +d b b b @@ -1025,30 +1032,30 @@ c b b b -c -c -c -c -c -c -c -c +d +d +d +u +d +d +d +d m p i -c -f -c -c -c -c -c -c +d +g +d +d +d +d +d +d k -c -c +d +d j -c +d b b b @@ -1063,28 +1070,28 @@ b b b b -c -c -c -c -c -c -c -c -c -c -c d +d +d +d +d +d +d +d +d +d +d +e m i -c -c -c -c -c -c -c -c +d +d +d +d +d +d +d +d b b b @@ -1100,27 +1107,27 @@ c b b b -c -c -c -c -c -e -c -c -c -c -c -c +d +d +d +d +d +f +d +d +d +d +d +d i l p -c -c -c -c -c -c +d +d +d +d +u +d b b b @@ -1136,28 +1143,28 @@ c c b b -c -c -c -e -c -c -c -c -c -c -c -c -c -c -c -c -c -c +d +d +d +f +d +d +d +d +d +d +d +d +d +d +d +d +d +d i -c -c -c +d +d +d b b b @@ -1172,28 +1179,28 @@ a c b b -c d -f -c +e +g +d i -c -c -c +d +d +d b -c -c -c -c -c +d +d +d +d +d j -c -c -c -c -c -c -c +d +d +d +d +d +d +d b b b @@ -1210,25 +1217,25 @@ b b b b -c -c -c -c -c -c +d +d +d +d +d +d b b b -c -c -c +d +d +d r -c -c -c -c -c -c +d +d +d +d +d +d b b b @@ -1246,12 +1253,12 @@ a b b b -c -c -c -c -c -c +d +d +d +d +d +d b b b @@ -1282,10 +1289,10 @@ a a b b -c -c -c -c +d +d +d +d b b b diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm new file mode 100644 index 00000000000..6e973667359 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -0,0 +1,1773 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"ac" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"ad" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ae" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"af" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ag" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer3{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ah" = ( +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall" + }, +/area/ruin/space/has_grav/hellfactoryoffice) +"ai" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer3{ + dir = 8 + }, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall" + }, +/area/ruin/space/has_grav/hellfactoryoffice) +"aj" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/obj/structure/fluff/hedge/opaque, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ak" = ( +/obj/machinery/atmospherics/components/unary/tank/oxygen{ + gas_type = /datum/gas/water_vapor + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"al" = ( +/obj/structure/table/reinforced, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"am" = ( +/obj/machinery/paystand, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"an" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ao" = ( +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ap" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aq" = ( +/obj/item/pressure_plate/hologrid{ + name = "bossman's hologrid"; + reward = /obj/item/stack/spacecash/c10000 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ar" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/five, +/obj/item/grenade/firecracker, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"as" = ( +/obj/structure/holobox, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"at" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"au" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 6 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"av" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 4 + }, +/obj/structure/holobox, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aw" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"ax" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer3{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ay" = ( +/obj/structure/fluff/hedge/opaque, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"az" = ( +/obj/item/trash/raisins, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aA" = ( +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"aB" = ( +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"aC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aD" = ( +/obj/structure/holobox, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aE" = ( +/obj/machinery/photocopier, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aF" = ( +/obj/item/trash/can, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aG" = ( +/obj/structure/table/reinforced, +/obj/item/storage/cans/sixsoda, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aH" = ( +/obj/structure/table/reinforced, +/obj/item/trash/popcorn, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aI" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aJ" = ( +/obj/structure/table/reinforced, +/obj/item/trash/candle, +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aK" = ( +/obj/structure/table/reinforced, +/obj/item/rsf, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aL" = ( +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"aM" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 5 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aN" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aO" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 9 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aP" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aQ" = ( +/obj/item/trash/can, +/obj/item/trash/can, +/obj/structure/closet/crate/bin, +/obj/item/trash/chips, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aR" = ( +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/ammo_casing/spent{ + pixel_x = 4; + pixel_y = -10 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aS" = ( +/obj/structure/closet/crate, +/obj/item/stack/packageWrap, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"aT" = ( +/obj/effect/mine/gas/water_vapor, +/obj/machinery/door/window, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aU" = ( +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aV" = ( +/obj/effect/mine/gas/water_vapor, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aW" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"aX" = ( +/obj/item/ammo_casing/spent{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/item/ammo_casing/spent, +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aY" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"aZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"ba" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bb" = ( +/obj/structure/window/reinforced/fulltile, +/obj/structure/grille, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bc" = ( +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bd" = ( +/obj/structure/sign/warning/coldtemp{ + name = "\improper BLAST FREEZER" + }, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"be" = ( +/obj/structure/table, +/obj/item/paper_bin/carbon, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bf" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/chair/plastic{ + pixel_y = 4 + }, +/obj/item/chair/plastic{ + pixel_y = 8 + }, +/obj/item/chair/plastic{ + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bg" = ( +/obj/machinery/modular_computer/console/preset/civilian, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bh" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/keycard/office + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bi" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bj" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bk" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"bl" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/conveyor/auto, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bm" = ( +/obj/structure/table, +/obj/item/stamp/denied, +/obj/item/stamp{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bn" = ( +/obj/structure/closet/crate/trashcart, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bo" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bp" = ( +/obj/structure/chair/plastic, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bq" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"br" = ( +/obj/machinery/door/keycard/stockroom, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactory) +"bs" = ( +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bt" = ( +/obj/structure/holobox, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bu" = ( +/obj/structure/fermenting_barrel, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bv" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bw" = ( +/obj/structure/table, +/obj/structure/window{ + dir = 8 + }, +/obj/item/pen/fourcolor, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/structure/window{ + dir = 8 + }, +/obj/structure/window, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"by" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bz" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bA" = ( +/obj/structure/closet/crate, +/obj/item/stack/packageWrap, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bB" = ( +/obj/structure/fermenting_barrel, +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bC" = ( +/obj/structure/ore_box, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bD" = ( +/obj/effect/turf_decal/arrows, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bE" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bF" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bG" = ( +/obj/structure/closet/crate, +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/flask, +/obj/item/stack/sheet/glass, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bI" = ( +/obj/structure/fermenting_barrel, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bJ" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bK" = ( +/obj/machinery/light, +/obj/structure/rack, +/obj/item/book/manual/random, +/obj/item/poster/random_contraband, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bM" = ( +/obj/structure/grille/broken, +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/stack/spacecash/c500 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bN" = ( +/obj/structure/ore_box, +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bO" = ( +/obj/structure/closet/crate, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/plunger, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bP" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bQ" = ( +/obj/structure/mirror, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"bR" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/keycard/stockroom + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bS" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/stack/arcadeticket/thirty + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bT" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bU" = ( +/obj/structure/closet/crate/large, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bV" = ( +/obj/structure/closet/crate, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/stack/sheet/cardboard, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bW" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bX" = ( +/obj/structure/sign/warning/chemdiamond, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"bY" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bZ" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"ca" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cb" = ( +/obj/machinery/light/small, +/obj/structure/curtain, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"cc" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"cd" = ( +/obj/machinery/plumbing/synthesizer{ + desc = "Produces a single chemical at a given volume. This one appears to have been hotwired to generate universal enzyme."; + dir = 2; + dispensable_reagents = list(/datum/reagent/consumable/enzyme); + reagent_id = /datum/reagent/consumable/enzyme + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ce" = ( +/obj/machinery/plumbing/synthesizer{ + desc = "Produces a single chemical at a given volume. This one appears to have been hotwired to generate honey."; + dir = 2; + dispensable_reagents = list(/datum/reagent/consumable/honey); + reagent_id = /datum/reagent/consumable/honey + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cf" = ( +/obj/machinery/plumbing/synthesizer{ + desc = "Produces a single chemical at a given volume. This one seems to have been hotwired to produce... blood?"; + dir = 2; + dispensable_reagents = list(/datum/reagent/blood); + reagent_id = /datum/reagent/blood + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cg" = ( +/obj/structure/closet/crate, +/obj/item/stack/ore/glass, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ch" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/plumbing/tank, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ci" = ( +/obj/machinery/light/small, +/obj/effect/decal/remains/human, +/obj/structure/curtain, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"cj" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/cloth/five, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ck" = ( +/obj/machinery/plumbing/tank, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cl" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cm" = ( +/obj/structure/cable, +/obj/machinery/power/apc/highcap/ten_k{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cn" = ( +/obj/machinery/plumbing/output{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"co" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cp" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cq" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cr" = ( +/obj/structure/closet/crate/trashcart, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cs" = ( +/obj/structure/fermenting_barrel, +/obj/effect/turf_decal/box/white, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ct" = ( +/obj/machinery/light/built, +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cu" = ( +/obj/effect/turf_decal{ + dir = 9 + }, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cv" = ( +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cw" = ( +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/item/stack/tile/plasteel, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cx" = ( +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cy" = ( +/obj/effect/turf_decal{ + dir = 5 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cz" = ( +/obj/machinery/light/broken, +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cA" = ( +/obj/item/trash/raisins, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cB" = ( +/obj/item/stack/tile/plasteel, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cC" = ( +/obj/structure/sign/warning/vacuum, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cD" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cE" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"cF" = ( +/obj/effect/turf_decal/delivery/white, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cG" = ( +/obj/effect/turf_decal/delivery/white, +/obj/effect/turf_decal/delivery/red, +/obj/item/stack/tile/plasteel, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cH" = ( +/obj/effect/turf_decal/delivery/white, +/obj/structure/grille/broken, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cI" = ( +/obj/effect/turf_decal/delivery/white, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cJ" = ( +/obj/effect/turf_decal/delivery/white, +/obj/item/stack/tile/plasteel, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cK" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cL" = ( +/obj/item/bedsheet/brown, +/obj/structure/bed, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cM" = ( +/obj/item/storage/toolbox/emergency/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cN" = ( +/obj/machinery/door/keycard/entry, +/obj/machinery/door/airlock/public, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cO" = ( +/obj/structure/holobox, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cQ" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/ruin/space/has_grav/hellfactory) +"cR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/space/basic, +/area/ruin/space/has_grav/hellfactory) +"cS" = ( +/obj/structure/lattice/catwalk, +/obj/item/keycard/entry, +/turf/open/space/basic, +/area/ruin/space/has_grav/hellfactory) +"cU" = ( +/obj/machinery/door/keycard/office, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactoryoffice) +"cV" = ( +/obj/structure/table, +/obj/item/stack/ducts/fifty, +/obj/structure/window, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"fj" = ( +/obj/structure/cable, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall" + }, +/area/ruin/space/has_grav/hellfactoryoffice) +"hv" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"lv" = ( +/obj/structure/cable, +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"lR" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"nT" = ( +/obj/structure/rack, +/obj/item/stack/wrapping_paper, +/obj/item/stack/packageWrap, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"oH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"qB" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/skub + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"ry" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"rC" = ( +/obj/structure/sign/poster/random, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"uL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"wv" = ( +/obj/machinery/power/apc/highcap/ten_k{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"xK" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"zI" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"BC" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"EP" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"Fs" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"Gs" = ( +/obj/structure/cable, +/obj/structure/cable, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"GE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"Mv" = ( +/obj/structure/sign/poster/random, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"MR" = ( +/obj/item/pressure_plate/hologrid, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"OJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"PO" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"Sz" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"UK" = ( +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"UN" = ( +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"Wh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aW +ac +aW +aW +ac +ac +aW +ac +ac +ac +aW +ac +ac +ac +ac +aW +aW +ac +aW +aW +aW +aa +aa +"} +(4,1,1) = {" +aa +aa +aW +ad +au +aC +aM +aT +ba +bl +bl +bs +bB +bG +bN +bT +cd +ch +ck +ck +cs +cD +aW +aa +aa +"} +(5,1,1) = {" +aa +aa +ac +ae +av +ab +aN +hv +bb +aA +bL +bt +bb +bb +bb +bU +ce +aA +bL +aA +cn +cs +aW +aa +aa +"} +(6,1,1) = {" +aa +aa +aW +af +aw +aD +aN +aU +bb +bL +aA +bu +bb +bb +bb +bV +cf +aA +aA +UK +bL +cs +aW +aa +aa +"} +(7,1,1) = {" +aa +aa +aW +ag +ax +OJ +aO +aV +bc +bL +bL +bv +bC +bI +bO +bW +aA +aA +bL +aA +aA +cs +aW +cQ +aa +"} +(8,1,1) = {" +aa +aa +ah +ai +ah +ah +ah +ah +bd +aA +aA +aA +bD +bJ +bP +bX +aA +aA +bL +aA +ct +cE +aW +cR +cQ +"} +(9,1,1) = {" +aa +aa +ah +aj +az +aF +aQ +ah +be +bm +bw +bx +bE +by +by +bY +by +by +by +co +cu +cF +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +ah +ak +ao +ao +aF +ah +bf +aA +bp +cV +by +Wh +BC +by +Wh +ry +by +by +cv +cG +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +ah +al +ao +aG +ao +ah +bg +aA +bL +aA +Wh +Wh +by +by +by +by +Wh +by +cw +cH +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +ah +am +ao +aH +ao +ah +ac +ac +bq +by +by +by +lR +by +by +uL +by +Wh +cx +cI +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +ah +an +ao +aI +aR +cU +bh +qB +MR +by +bF +by +by +bZ +by +bZ +cl +cp +cy +cJ +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +ah +wv +UN +aJ +aX +fj +EP +zI +lv +by +by +bK +aL +ca +aL +ca +aL +by +cz +cE +ac +cR +cQ +"} +(15,1,1) = {" +aa +aa +ah +ap +ao +aK +ao +ah +aA +bn +zI +by +Wh +Fs +bQ +cb +bQ +ci +aL +cm +cq +cK +aW +cS +aa +"} +(16,1,1) = {" +aa +aa +ah +aq +ao +ao +ao +ah +aB +bL +br +by +by +nT +aL +cc +aL +xK +Gs +EP +aW +ac +aW +aa +aa +"} +(17,1,1) = {" +aa +aa +ah +ay +aE +aP +aP +ah +bi +aB +Gs +EP +EP +zI +EP +zI +EP +zI +lv +cr +cA +cC +ab +aa +aa +"} +(18,1,1) = {" +aa +aa +ah +ah +ah +ah +ah +ah +bj +bo +aL +bz +Mv +aB +bR +PO +ab +as +aL +cr +cB +cL +ab +aa +aa +"} +(19,1,1) = {" +aa +aa +ac +ar +aA +aB +aS +aL +bk +aB +ab +bA +aA +aB +ab +GE +cg +cj +by +Sz +by +cM +cN +aa +aa +"} +(20,1,1) = {" +aa +aa +aW +ab +bL +aB +aB +aY +aA +aB +ab +ab +ab +bM +ab +ab +rC +ab +Mv +Wh +Wh +by +ab +aa +aa +"} +(21,1,1) = {" +aa +aa +ac +as +aA +Mv +aB +aA +bL +aB +aB +aB +oH +aB +ab +aB +bL +aA +by +Wh +by +by +ab +aa +aa +"} +(22,1,1) = {" +aa +aa +ac +at +GE +aL +GE +aZ +aB +aB +aL +by +ab +aA +bS +aB +ab +as +aL +by +cl +cO +ab +aa +aa +"} +(23,1,1) = {" +aa +aa +aW +aW +aW +aW +aW +ac +aW +ac +ac +aW +aW +ac +ac +ac +ac +aW +aW +ab +ab +ab +ab +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 7fa61edd43b..7b0f7df9201 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -3139,7 +3139,7 @@ /area/awaymission/academy/academyengine) "mn" = ( /obj/structure/rack, -/obj/item/gun/magic/wand, +/obj/item/gun/magic/wand/nothing, /turf/open/floor/plating, /area/awaymission/academy/academyengine) "mo" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 68317dc6bd4..e84d7789b36 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -33330,6 +33330,10 @@ /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, /obj/item/reagent_containers/spray/cleaner, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -42254,18 +42258,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cjd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "cjf" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engine_smes) "cjg" = ( @@ -42720,6 +42716,10 @@ /obj/structure/table, /obj/item/stack/sheet/metal/fifty, /obj/item/stack/sheet/glass/fifty, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 6; + pixel_y = -2 + }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "ckF" = ( @@ -43447,13 +43447,17 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/structure/cable, /obj/structure/table, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cnB" = ( @@ -47262,10 +47266,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engine_smes) "cDg" = ( @@ -48764,7 +48768,6 @@ /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, -/obj/structure/cable, /obj/machinery/light{ dir = 1 }, @@ -50982,6 +50985,10 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"nsn" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "nsK" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -52080,6 +52087,7 @@ /obj/item/storage/box/lights/mixed, /obj/item/stack/cable_coil, /obj/item/stack/cable_coil, +/obj/item/stock_parts/cell/emproof, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "sdX" = ( @@ -81978,7 +81986,7 @@ bZB caC cjJ cSM -cjd +cSN cSW ckI rdP @@ -82232,8 +82240,8 @@ bVf bGN bYE bCq -bHE -cjJ +bUt +nsn cij cjf cSX diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 039c27845f8..3442eaaed63 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2139,7 +2139,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aiE" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aiF" = ( @@ -4303,7 +4303,7 @@ /area/vacant_room/office) "and" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/vacant_room/office) "ane" = ( @@ -5291,7 +5291,7 @@ /turf/open/floor/plasteel/grimy, /area/vacant_room/office) "apa" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel/grimy, /area/vacant_room/office) "apb" = ( @@ -9117,7 +9117,7 @@ }, /area/maintenance/port/fore) "awu" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/maintenance/port/fore) "awv" = ( @@ -9854,7 +9854,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port/fore) "axU" = ( @@ -20293,19 +20293,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aRB" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aRC" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -20369,7 +20356,7 @@ "aRK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood{ icon_state = "wood-broken5" }, @@ -24701,6 +24688,10 @@ pixel_x = 32 }, /obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 2 + }, /turf/open/floor/plasteel, /area/engine/atmos) "aYk" = ( @@ -27444,7 +27435,7 @@ /turf/open/floor/engine/o2, /area/engine/atmos) "bdo" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port/fore) "bdp" = ( @@ -63181,7 +63172,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/starboard) "cnh" = ( @@ -69601,6 +69592,10 @@ pixel_x = 26 }, /obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -3; + pixel_y = 5 + }, /turf/open/floor/plasteel, /area/engine/storage) "czA" = ( @@ -73268,6 +73263,10 @@ pixel_x = 32 }, /obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 1; + pixel_y = 3 + }, /turf/open/floor/plasteel, /area/engine/storage) "cFZ" = ( @@ -76973,7 +76972,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port) "cMV" = ( @@ -82289,10 +82288,6 @@ /obj/item/clothing/neck/stethoscope, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -3; - pixel_y = 2 - }, /obj/machinery/status_display/evac{ pixel_x = 32 }, @@ -82306,6 +82301,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -88525,7 +88529,7 @@ dir = 8 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel/dark, /area/crew_quarters/abandoned_gambling_den) "dhN" = ( @@ -91471,7 +91475,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) "dnN" = ( @@ -92513,7 +92517,7 @@ "dpQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) "dpR" = ( @@ -96194,7 +96198,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel/dark, /area/crew_quarters/abandoned_gambling_den) "dxH" = ( @@ -98374,7 +98378,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ name = "Morgue"; - req_access_txt = "9" + req_access_txt = "5;6" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, @@ -102139,7 +102143,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/crew_quarters/theatre/abandoned) "dJu" = ( @@ -102222,7 +102226,7 @@ /turf/open/floor/wood, /area/security/detectives_office/private_investigators_office) "dJE" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/security/detectives_office/private_investigators_office) "dJF" = ( @@ -106513,7 +106517,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port/aft) "dRH" = ( @@ -107564,7 +107568,7 @@ /turf/open/floor/plasteel/dark, /area/medical/virology) "dUc" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/library/abandoned) "dUd" = ( @@ -143191,7 +143195,7 @@ aLu aMG aOm aPR -aRB +aRw aTc aUV aWM diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 29d5daf1569..85ba5f61aa4 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -11771,11 +11771,15 @@ /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/effect/turf_decal/tile/blue, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/reagent_containers/spray/cleaner, /turf/open/floor/plasteel/white, /area/medical/storage) "aFN" = ( @@ -18035,8 +18039,8 @@ }, /area/medical/genetics) "aYg" = ( -/mob/living/carbon/monkey, /obj/effect/landmark/start/geneticist, +/mob/living/carbon/monkey, /turf/open/floor/plasteel, /area/medical/genetics) "aYh" = ( @@ -38808,7 +38812,7 @@ dir = 8 }, /obj/item/toy/figure/mime, -/obj/item/gun/magic/wand, +/obj/item/gun/magic/wand/nothing, /turf/open/floor/carpet, /area/crew_quarters/theatre) "cad" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 327d70b9304..61f9cf7dcbc 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -14333,6 +14333,14 @@ /obj/machinery/light_switch{ pixel_x = 24 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -6; + pixel_y = 5 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "awD" = ( @@ -15093,6 +15101,10 @@ /obj/item/grenade/chem_grenade/smart_metal_foam{ pixel_x = -2 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 6; + pixel_y = -6 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "axQ" = ( @@ -25609,6 +25621,10 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, /turf/open/floor/plasteel/dark, /area/medical/storage) "aOA" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 16cb0a247a1..201bb8dd8f8 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -928,11 +928,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/bodycontainer/morgue{ - dir = 8 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "acm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -10136,10 +10137,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"avr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "avs" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -14593,17 +14590,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aGp" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/extinguisher_cabinet{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "aGq" = ( /obj/machinery/door/firedoor, /obj/machinery/flasher{ @@ -14859,6 +14845,14 @@ /obj/effect/turf_decal/bot{ dir = 1 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 6 + }, /turf/open/floor/plasteel{ dir = 1 }, @@ -14883,6 +14877,10 @@ /obj/effect/turf_decal/bot{ dir = 1 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, /turf/open/floor/plasteel{ dir = 1 }, @@ -24449,21 +24447,21 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bcc" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair, -/obj/structure/sign/poster/official/build{ - pixel_y = 32 +/obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; + dir = 4; + name = "Morgue APC"; + pixel_y = 24 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "bcd" = ( /turf/closed/wall, /area/janitor) @@ -45641,6 +45639,11 @@ dir = 4 }, /obj/structure/closet/crate/freezer/surplus_limbs, +/obj/machinery/camera{ + c_tag = "Medbay Storage"; + dir = 8; + network = list("ss13","medbay") + }, /turf/open/floor/plasteel/white, /area/medical/storage) "bYY" = ( @@ -46087,11 +46090,6 @@ /turf/open/floor/plasteel/white, /area/medical/storage) "cad" = ( -/obj/machinery/camera{ - c_tag = "Medbay Storage"; - dir = 8; - network = list("ss13","medbay") - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -46804,13 +46802,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) -"cbp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/port/aft) "cbq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -47040,7 +47031,7 @@ pixel_y = 28 }, /obj/machinery/camera{ - c_tag = "Medbay Hallway Central"; + c_tag = "Medbay Clinic"; dir = 4; network = list("ss13","medbay") }, @@ -47715,12 +47706,10 @@ pixel_x = 1; pixel_y = 1 }, -/obj/item/reagent_containers/spray/cleaner, /obj/structure/table/glass, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, -/obj/item/gun/syringe, /obj/structure/window/reinforced{ dir = 1 }, @@ -47733,6 +47722,12 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/gun/syringe, +/obj/item/reagent_containers/spray/cleaner, /turf/open/floor/plasteel/white, /area/medical/storage) "cds" = ( @@ -49940,8 +49935,8 @@ /area/medical/medbay/central) "cit" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -49950,8 +49945,8 @@ dir = 4 }, /obj/effect/turf_decal/tile/yellow, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -50550,6 +50545,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cjS" = ( @@ -51935,14 +51933,14 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "cnl" = ( -/obj/machinery/door/airlock/wood{ - doorClose = 'sound/effects/doorcreaky.ogg'; - doorOpen = 'sound/effects/doorcreaky.ogg'; - name = "The Gobetting Barmaid" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/airlock/maintenance{ + name = "Medical Surplus Storeroom"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/port/aft) "cnm" = ( @@ -52243,24 +52241,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/medical/pharmacy) -"cnJ" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cnK" = ( /obj/machinery/chem_dispenser{ layer = 2.7 @@ -53505,17 +53485,6 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/pharmacy) -"cqt" = ( -/obj/machinery/chem_heater{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cqu" = ( /obj/machinery/chem_master, /obj/structure/noticeboard{ @@ -54645,13 +54614,13 @@ /turf/open/floor/plating, /area/maintenance/department/medical/central) "csD" = ( +/obj/machinery/power/apc/auto_name/north, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/power/apc/auto_name/north, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -54668,6 +54637,9 @@ }, /area/maintenance/department/medical/central) "csF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/structure/disposalpipe/sorting/mail{ dir = 8; sortType = 11 @@ -54675,10 +54647,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/structure/cable, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/department/medical/central) "csH" = ( @@ -54686,7 +54656,6 @@ dir = 8; sortType = 23 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -55102,23 +55071,10 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) -"ctA" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"ctC" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "6" - }, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) "ctD" = ( /obj/structure/sign/directions/evac, -/turf/closed/wall, -/area/medical/morgue) +/turf/closed/wall/r_wall, +/area/medical/chemistry) "ctE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -55455,11 +55411,14 @@ /turf/open/floor/grass, /area/science/genetics) "cus" = ( -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cut" = ( /obj/structure/flora/ausbushes/fernybush, /obj/effect/turf_decal/stripes/line{ @@ -55469,15 +55428,21 @@ /turf/open/floor/grass, /area/science/genetics) "cuu" = ( -/obj/machinery/camera{ - c_tag = "Morgue Fore"; - network = list("ss13","medbay") +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/obj/structure/bodycontainer/morgue{ - dir = 8 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/machinery/camera/autoname, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cuv" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -55489,11 +55454,17 @@ /turf/open/floor/plasteel/white, /area/science/genetics) "cuw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, /obj/machinery/airalarm{ pixel_y = 32 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cux" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/purple{ @@ -55753,48 +55724,43 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvs" = ( -/obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 28 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvu" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/closet/wardrobe/pjs, +/obj/structure/disposalpipe/trunk, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cvv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/light{ dir = 1 }, -/obj/structure/closet/wardrobe/mixed, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cvw" = ( -/obj/item/radio/intercom{ - pixel_x = 29 +/obj/structure/sign/poster/random{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/closet/wardrobe/pjs, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cvx" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/grass, @@ -55812,31 +55778,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/genetics) -"cvB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cvE" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cvF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/closed/wall, -/area/medical/morgue) "cvG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -56112,7 +56053,6 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cwu" = ( -/obj/structure/disposalpipe/segment, /obj/structure/sink{ dir = 8; pixel_x = 11 @@ -56120,46 +56060,36 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/junction/flip, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cwv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cww" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cwx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cwF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cwG" = ( @@ -56426,87 +56356,59 @@ dir = 8 }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxl" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/medical/medbay/aft) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cxm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cxn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cxo" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cxp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, /area/medical/morgue) -"cxq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cxr" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cxs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cxv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cxw" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cxz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; location = "10-Aft-To-Central" @@ -56514,6 +56416,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cxA" = ( @@ -56642,7 +56546,6 @@ /turf/closed/wall, /area/medical/medbay/aft) "cxV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, @@ -56652,104 +56555,48 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cxY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Storage"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxZ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/camera/autoname{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cya" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cyb" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cyc" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cyh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/medical/chemistry) "cyi" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cym" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "6" - }, -/turf/open/floor/plasteel, -/area/medical/morgue) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cyn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -57011,60 +56858,32 @@ /area/medical/medbay/aft) "cyU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 - }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cyV" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair/office/light{ dir = 8 }, -/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cyW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cyX" = ( -/obj/machinery/camera{ - c_tag = "Medbay Aux Storage"; - dir = 8; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cyY" = ( -/obj/structure/bodycontainer/morgue, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/medical/chemistry) "czf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/item/radio/intercom{ pixel_x = -26 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "czg" = ( @@ -57370,88 +57189,25 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "czW" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/medbay/aft"; - dir = 4; - name = "Medbay Aft APC"; - pixel_x = 24 - }, -/obj/structure/disposalpipe/junction, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/structure/disposalpipe/junction, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "czX" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/closet/secure_closet/personal/patient, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"czY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal/patient, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"czZ" = ( -/obj/structure/closet/secure_closet/personal/patient, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cAh" = ( /obj/machinery/airalarm{ dir = 4; @@ -57461,10 +57217,10 @@ c_tag = "Aft Primary Hallway - Middle"; dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel, @@ -57826,15 +57582,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cBb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/medical/medbay/aft) -"cBd" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall, -/area/hallway/primary/aft) "cBe" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -57912,7 +57659,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "cBs" = ( /turf/open/floor/plasteel/white, /area/science/mixing) @@ -58218,36 +57965,23 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/medical/medbay/aft) -"cCb" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white/corner, -/area/medical/medbay/aft) -"cCc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white/side, -/area/medical/medbay/aft) -"cCd" = ( -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCe" = ( /turf/closed/wall, /area/medical/morgue) "cCf" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cCg" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plasteel/dark, @@ -58534,102 +58268,47 @@ /turf/open/floor/plasteel/freezer, /area/medical/virology) "cCN" = ( -/obj/machinery/camera{ - c_tag = "Medbay Hallway Aft"; +/obj/machinery/firealarm{ dir = 4; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 + pixel_x = -24 }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCO" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/disposalpipe/sorting/mail{ sortType = 27 }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/medbay/aft) -"cCQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/medbay/aft) -"cCR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/medical/medbay/aft) -"cCS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cCT" = ( /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cCU" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cCV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cCX" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cCY" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, /obj/item/radio/intercom{ pixel_x = 29 }, -/obj/machinery/camera{ - c_tag = "Morgue Aft"; - dir = 8; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cCZ" = ( /obj/machinery/vending/cola/random, /turf/open/floor/plasteel/dark, @@ -59010,11 +58689,9 @@ }, /area/medical/medbay/aft) "cDR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cDS" = ( @@ -59022,77 +58699,65 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 8 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cDT" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/medical/medbay/aft) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cDU" = ( -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/medical/medbay/aft) -"cDV" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cDW" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/medbay/aft) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cDX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "5" - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cDY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cDZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cEb" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -59100,29 +58765,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEc" = ( -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEd" = ( -/obj/structure/table, -/obj/machinery/power/apc{ - areastring = "/area/medical/morgue"; - dir = 4; - name = "Morgue APC"; - pixel_x = 24 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/clothing/gloves/color/latex, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cEf" = ( /turf/closed/wall, /area/hallway/primary/aft) @@ -59480,82 +59124,34 @@ /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cEQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/turf/open/floor/plasteel/white/side{ - dir = 10 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cER" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/medical/medbay/aft) -"cES" = ( -/obj/item/healthanalyzer{ - pixel_x = 1; - pixel_y = 4 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = -30 - }, -/obj/structure/table/glass, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/medbay/aft) -"cET" = ( -/obj/machinery/vending/medical, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/medical/medbay/aft) -"cEU" = ( -/obj/machinery/light_switch{ - pixel_x = -23 - }, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cEV" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEX" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "6" - }, -/obj/machinery/navbeacon/wayfinding, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEZ" = ( -/turf/open/floor/plasteel/dark, -/area/hallway/primary/aft) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFa" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -59984,17 +59580,6 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cFQ" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) "cFR" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/aft) @@ -60008,17 +59593,8 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cFU" = ( -/obj/machinery/light/small, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cFV" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -60026,8 +59602,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFW" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -60035,18 +59615,22 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFX" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light_switch{ - pixel_x = 23 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFY" = ( /obj/structure/closet, /turf/open/floor/plasteel/dark, @@ -60564,68 +60148,47 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cGN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cGO" = ( -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/medbay/aft) -"cGP" = ( -/obj/machinery/door/airlock{ - name = "Medical Surplus Storeroom"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/aft) -"cGQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"cGR" = ( -/obj/structure/table, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/flashlight/pen{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) "cGS" = ( -/obj/structure/table, -/obj/item/retractor, -/obj/item/hemostat, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/eyepatch, -/obj/item/reagent_containers/food/drinks/bottle/vodka{ - pixel_x = 3; +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/reagent_containers/glass/bottle/multiver{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; pixel_y = 2 }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) +/obj/item/reagent_containers/dropper, +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cGT" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "6" + name = "Chemistry Maintenance"; + req_access_txt = "5; 69" }, /turf/open/floor/plating, /area/maintenance/aft) @@ -61012,18 +60575,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cHC" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = -30 - }, -/obj/item/storage/box/beakers{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/bodybags, -/obj/structure/table/glass, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) "cHD" = ( /obj/machinery/firealarm{ dir = 1; @@ -61050,40 +60601,49 @@ pixel_y = 8 }, /obj/structure/table/glass, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/aft"; + dir = 4; + name = "Medbay Aft APC"; + pixel_x = 24 + }, /turf/open/floor/plasteel/white/side{ dir = 10 }, /area/medical/medbay/aft) "cHF" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"cHG" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cHH" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 4; + pixel_y = -4 }, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/dropper, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cHI" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -61524,28 +61084,17 @@ /turf/open/floor/plating, /area/maintenance/aft) "cIA" = ( -/obj/structure/bed/roller, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"cIB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating, -/area/maintenance/aft) -"cIC" = ( -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/structure/rack, -/obj/item/clothing/suit/toggle/labcoat, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/mask/breath/medical, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/area/maintenance/aft) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/welding, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cID" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -61889,50 +61438,64 @@ /turf/open/floor/plating, /area/maintenance/aft) "cJt" = ( -/obj/structure/rack, -/obj/item/storage/pill_bottle, -/obj/effect/spawner/lootdrop/maintenance/three, -/turf/open/floor/plating, -/area/maintenance/aft) -"cJu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/obj/item/cigbutt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/aft) -"cJv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"cJw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Medical Surplus Storeroom"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/aft) -"cJx" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/plunger, +/obj/item/plunger, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cJu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 10 + }, +/obj/machinery/light, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cJv" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/construction/plumbing, +/obj/item/construction/plumbing, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cJx" = ( +/obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/aft) "cJy" = ( @@ -62562,10 +62125,10 @@ /turf/closed/wall/r_wall, /area/science/research) "cKJ" = ( +/obj/effect/spawner/lootdrop/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/spawner/lootdrop/maintenance, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -65123,6 +64686,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/item/radio/intercom{ + pixel_x = -28 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cQo" = ( @@ -65455,25 +65021,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/xenobiology) -"cRf" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"cRg" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cRh" = ( /obj/structure/sink{ dir = 4; @@ -66996,15 +66543,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"cZs" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cZv" = ( /turf/open/floor/circuit/telecomms, /area/science/xenobiology) @@ -68367,6 +67905,12 @@ }, /turf/closed/wall/r_wall, /area/engine/engineering) +"deh" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "dei" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -69828,23 +69372,13 @@ }, /area/science/research) "diF" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "diH" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -70121,20 +69655,6 @@ }, /turf/open/floor/plating, /area/chapel/main) -"djY" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dlI" = ( /turf/closed/wall/r_wall, /area/engine/supermatter) @@ -70216,26 +69736,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/fore) -"dnp" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/pen{ - pixel_y = 3 - }, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing Lobby"; - dir = 1; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dnr" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/port/fore"; @@ -70681,11 +70181,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dBe" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/aft) "dBu" = ( /turf/closed/wall, /area/engine/gravity_generator) @@ -70983,16 +70478,6 @@ icon_state = "panelscorched" }, /area/maintenance/port/fore) -"dCy" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dCz" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, @@ -71241,6 +70726,10 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dDw" = ( @@ -71268,28 +70757,16 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"dDB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/port/aft) "dDC" = ( +/obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dDE" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -71388,7 +70865,6 @@ dir = 4 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dLK" = ( @@ -71407,16 +70883,6 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) -"dVT" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -71426,12 +70892,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"dZG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ece" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -71504,6 +70964,14 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/security/warden) +"ejE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "enV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -71546,37 +71014,27 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/security/warden) -"eqt" = ( -/obj/structure/girder, -/obj/structure/grille, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port/aft) "eqG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/engine, /area/science/misc_lab/range) +"exA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "eyv" = ( /obj/structure/grille/broken, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"eAa" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eCT" = ( /obj/effect/turf_decal/delivery, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -71595,21 +71053,6 @@ icon_state = "wood-broken4" }, /area/maintenance/port/aft) -"eEi" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/table, -/obj/item/plunger, -/obj/item/plunger, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eEu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -71623,12 +71066,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/port) -"eEV" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eFN" = ( /obj/structure/bodycontainer/crematorium{ dir = 1; @@ -71646,34 +71083,22 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/break_room) +"eNA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "eOp" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck, /turf/open/floor/wood, /area/maintenance/port/aft) -"eRo" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eSm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "eSY" = ( /obj/structure/chair/stool, /turf/open/floor/wood{ @@ -71754,18 +71179,11 @@ /turf/closed/wall, /area/maintenance/department/science/central) "fkj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, /obj/structure/table, -/obj/item/construction/plumbing, -/obj/item/construction/plumbing, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "flJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -71777,6 +71195,37 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) +"fqC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"frA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"frX" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_y = -30 + }, +/obj/item/storage/box/beakers{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/bodybags, +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "ftu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -71818,11 +71267,16 @@ /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, /area/crew_quarters/kitchen/coldroom) "fwL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"fxT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "fCe" = ( /obj/machinery/door/airlock/security{ name = "Court Cell"; @@ -71831,6 +71285,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) +"fCG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "fDD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -71927,7 +71389,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "fMA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -71938,6 +71400,27 @@ }, /turf/open/floor/plating, /area/security/checkpoint/engineering) +"fRZ" = ( +/obj/machinery/power/apc{ + acted_explosions = 2; + areastring = "/area/medical/chemistry"; + name = "Chemistry APC"; + pixel_x = -26 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fSV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "fUt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -71974,12 +71457,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/maintenance/department/science) -"gcu" = ( +"gcr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 + dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"gfS" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) "gjC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, @@ -72003,24 +71490,38 @@ }, /turf/open/floor/plasteel/dark, /area/engine/break_room) +"gjP" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/obj/machinery/door/window/eastright{ + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/medical/chemistry) "gka" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/solar/port/aft) -"glz" = ( -/obj/structure/sign/poster/contraband/random{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/maintenance/port/aft) +"gkW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "gnd" = ( /turf/closed/wall, /area/maintenance/department/science/central) +"gnT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port/aft) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -72083,22 +71584,33 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/plasteel, /area/hallway/primary/central) -"gAj" = ( -/obj/structure/closet/secure_closet/chemical{ - pixel_x = -3 - }, +"gxB" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing Lab"; - network = list("ss13","medbay") + dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"gyL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"gDK" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/storage/backpack/duffelbag/med, +/obj/item/flashlight/pen{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "gGf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -72120,19 +71632,6 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, /area/maintenance/department/science) -"gNe" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft/secondary) -"gOM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "gPT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -72140,12 +71639,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"gUb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "gXY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -72173,23 +71666,22 @@ /turf/open/floor/plating, /area/maintenance/port) "hdX" = ( -/obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/port/aft) "hev" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/item/radio/intercom{ + pixel_x = 29 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "hfn" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -72235,6 +71727,24 @@ dir = 1 }, /area/engine/storage_shared) +"hkT" = ( +/obj/structure/rack, +/obj/item/storage/pill_bottle, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"hox" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "hql" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/westleft{ @@ -72271,32 +71781,11 @@ }, /turf/open/floor/plasteel/white, /area/science/genetics) -"hvf" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hvt" = ( /obj/structure/kitchenspike_frame, /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/maintenance/port/aft) -"hwW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing South"; - dir = 1; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hxX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -72313,6 +71802,14 @@ }, /turf/open/floor/plating, /area/security/prison) +"hAu" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/medical/medbay/aft) "hBB" = ( /obj/structure/table, /obj/item/reagent_containers/food/snacks/mint, @@ -72331,22 +71828,6 @@ icon_state = "panelscorched" }, /area/maintenance/port/aft) -"hFj" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/storage/box/matches, -/obj/structure/table, -/obj/item/folder/yellow{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/folder/yellow{ - pixel_x = -5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hFV" = ( /obj/machinery/door/window/westleft{ name = "safety door"; @@ -72378,9 +71859,11 @@ /turf/open/floor/plasteel, /area/engine/break_room) "hLm" = ( -/obj/structure/sign/poster/random, -/turf/closed/wall, -/area/medical/chemistry) +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "hMx" = ( /obj/structure/table, /obj/effect/turf_decal/tile/purple{ @@ -72454,15 +71937,6 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"ibr" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ibz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -72540,6 +72014,16 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"irZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/chem_master, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "ixj" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/blue{ @@ -72596,21 +72080,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/janitor) -"iGO" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastright{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Chemistry Hall"; - req_access_txt = "33" - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "iKA" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -72643,6 +72112,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"iUh" = ( +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "jah" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -72668,7 +72142,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "jnI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -72758,34 +72232,21 @@ /obj/structure/chair, /turf/open/floor/plating, /area/maintenance/port/aft) -"jOR" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28; - pixel_y = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"jPu" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "jQh" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/engine/engineering) +"jTg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "jUe" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -72794,12 +72255,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"jUk" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "jUn" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -72814,6 +72269,12 @@ /obj/item/storage/belt/utility, /turf/open/floor/plasteel, /area/engine/break_room) +"jVH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "jYJ" = ( /obj/item/reagent_containers/food/drinks/bottle/tequila, /obj/structure/table/wood, @@ -72858,13 +72319,16 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"khy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"khX" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plating, +/area/maintenance/port/aft) "kjh" = ( /obj/effect/decal/cleanable/dirt, /obj/vehicle/ridden/janicart, @@ -72872,21 +72336,30 @@ /turf/open/floor/plasteel, /area/janitor) "klh" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair, -/obj/machinery/light{ - dir = 1 +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"klB" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/biohazard{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "kqz" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -72928,19 +72401,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab/range) -"kyW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing North"; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "kzn" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -72998,6 +72458,17 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"kJl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "kKo" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -73017,6 +72488,13 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port) +"kNI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "kOt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -73037,6 +72515,12 @@ /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, /area/maintenance/port) +"kQx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "kRO" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/northleft{ @@ -73079,6 +72563,12 @@ }, /turf/open/floor/plasteel, /area/janitor) +"kWn" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "kWu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -73096,10 +72586,12 @@ }, /turf/open/floor/engine, /area/science/misc_lab/range) -"laN" = ( -/obj/structure/cable, +"lbB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/medbay/aft) "lce" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -73110,7 +72602,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "lci" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/tile/yellow, @@ -73136,6 +72628,16 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"lfv" = ( +/obj/effect/mob_spawn/human/corpse/assistant{ + belt = null; + husk = TRUE; + id = null; + l_pocket = /obj/item/pen + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/port/aft) "lfx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -73149,24 +72651,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"liQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"ljF" = ( -/obj/machinery/light{ +"lfR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/turf/open/floor/plating, +/area/medical/chemistry) +"ljG" = ( +/obj/machinery/vending/medical, +/turf/open/floor/plasteel/white/corner{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/medbay/aft) "lkf" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -73186,14 +72683,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"luh" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "lwx" = ( /obj/effect/turf_decal/delivery, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -73285,6 +72774,14 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"lMT" = ( +/obj/structure/bed/roller, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "lNZ" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -73352,7 +72849,7 @@ }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "lVD" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -73394,6 +72891,23 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"mci" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"meP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "mjJ" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = 2; @@ -73432,17 +72946,24 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"mrv" = ( -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ +"moz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/space_heater, +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"mrv" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "msD" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -73453,25 +72974,6 @@ /obj/machinery/photocopier, /turf/open/floor/plasteel, /area/engine/break_room) -"mtp" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28; - pixel_y = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -73481,17 +72983,12 @@ }, /turf/closed/wall, /area/hallway/secondary/service) -"mxt" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +"mvB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plating, /area/medical/chemistry) "mzh" = ( /obj/machinery/firealarm{ @@ -73565,6 +73062,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/checker, /area/engine/storage_shared) +"mKb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "mKO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/tank/toxins{ @@ -73596,6 +73098,11 @@ icon_state = "wood-broken3" }, /area/maintenance/port/aft) +"mUz" = ( +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/medbay/aft) "mWg" = ( /obj/structure/girder, /obj/structure/grille, @@ -73604,37 +73111,21 @@ }, /area/maintenance/port/aft) "mZA" = ( -/obj/machinery/light{ - dir = 1 +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/table, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nap" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 5 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nbv" = ( /turf/open/floor/plating, /area/maintenance/starboard/secondary) @@ -73643,13 +73134,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/engine/break_room) -"ndC" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "neo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -73661,6 +73145,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port) +"niB" = ( +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/plasteel/white/corner, +/area/medical/medbay/aft) "njJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -73673,22 +73161,30 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) -"nnV" = ( +"nnI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/camera/autoname{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair, -/obj/structure/sign/poster/official/here_for_your_safety{ - pixel_y = 32 - }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"nnV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/machinery/airalarm{ + pixel_y = 32 + }, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "noe" = ( /obj/structure/table/reinforced, /obj/machinery/microwave{ @@ -73699,18 +73195,6 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"npl" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "npx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -73718,6 +73202,14 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"nry" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "ntG" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -73742,12 +73234,19 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"nDf" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/closed/wall, +"nBI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, /area/medical/chemistry) +"nDf" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nEv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -73823,6 +73322,20 @@ "nMe" = ( /turf/closed/wall, /area/medical/surgery/room_b) +"nMs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"nOl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall, +/area/maintenance/port/aft) "nPC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -73835,17 +73348,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"nWX" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "nXA" = ( /obj/structure/rack{ icon = 'icons/obj/stationobjs.dmi'; @@ -73948,16 +73450,6 @@ "ojg" = ( /turf/closed/wall, /area/science/misc_lab/range) -"omB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ong" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -73978,6 +73470,14 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"ooS" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/medbay/aft) "ooY" = ( /obj/machinery/computer/warrant{ dir = 8 @@ -73985,6 +73485,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"oqv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "otq" = ( /obj/structure/closet/emcloset, /obj/structure/sign/warning/vacuum/external{ @@ -74015,7 +73521,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/machinery/vending/cola/random, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "owR" = ( /turf/closed/wall, /area/engine/storage_shared) @@ -74061,6 +73567,17 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"oBk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "oBU" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -74078,21 +73595,6 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engine/storage_shared) -"oFI" = ( -/obj/machinery/door/window/eastright{ - dir = 8; - name = "Chemistry Hall"; - req_access_txt = "33" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "oJL" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -74143,6 +73645,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/maintenance/port/aft) +"oLd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"oOy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "oRL" = ( /obj/docking_port/stationary{ dir = 2; @@ -74166,7 +73681,13 @@ }, /obj/machinery/vending/snack/random, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) +"oTW" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/medical/medbay/aft) "oVO" = ( /obj/machinery/airalarm{ dir = 4; @@ -74206,16 +73727,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port/aft) -"oZs" = ( -/obj/structure/cable, -/obj/structure/sign/poster/contraband/random{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "pai" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -74240,15 +73751,10 @@ "pcn" = ( /turf/open/floor/engine, /area/science/misc_lab/range) -"pcL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "pej" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/chem_heater{ + pixel_x = 4 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "peH" = ( @@ -74268,16 +73774,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"pjP" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "plI" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -74315,6 +73811,18 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"pvt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "pvK" = ( /obj/machinery/computer/security{ dir = 4 @@ -74335,6 +73843,22 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"pwn" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/aft) +"pyi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "pzj" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -74531,7 +74055,7 @@ "qit" = ( /obj/structure/sign/poster/ripped, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/morgue) "qkD" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -74540,27 +74064,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hydroponics) -"qnE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qom" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/research) -"qpg" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -74588,6 +74096,15 @@ }, /turf/open/floor/plasteel/white, /area/science/genetics) +"quD" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/medical/medbay/aft) "qxe" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -74602,6 +74119,10 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/maintenance/port/aft) +"qzx" = ( +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/plasteel/white/side, +/area/medical/medbay/aft) "qAO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -74666,18 +74187,6 @@ "qJB" = ( /turf/closed/wall/r_wall, /area/maintenance/solars/port/aft) -"qJK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qLf" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/library, @@ -74738,14 +74247,11 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "qUR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "qVp" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -74755,23 +74261,23 @@ dir = 5 }, /area/crew_quarters/kitchen) +"qVW" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "qZf" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, /obj/machinery/firealarm{ dir = 8; pixel_x = 28; pixel_y = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "qZU" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -74802,23 +74308,34 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) +"rdB" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "reI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/port/aft) -"rfi" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +"rhZ" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/turf/open/floor/plasteel/white/side{ + dir = 4 }, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/medbay/aft) +"rig" = ( +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"riD" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/aft) "riP" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -74828,12 +74345,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lobby"; - req_access_txt = null +/obj/machinery/door/airlock/grunge{ + name = "Morgue"; + req_access_txt = "6" }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "roZ" = ( /obj/machinery/computer/secure_data{ dir = 4 @@ -74888,6 +74405,10 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"ryw" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -74953,11 +74474,28 @@ /area/hallway/primary/starboard) "rLL" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"rMb" = ( +/obj/item/cigbutt, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/port/aft) +"rMg" = ( +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/structure/rack, +/obj/item/clothing/suit/toggle/labcoat, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/port/aft) "rOP" = ( /obj/structure/sign/poster/official/random, /turf/closed/wall, @@ -75089,6 +74627,11 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"sfI" = ( +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/medical/medbay/aft) "sfQ" = ( /obj/structure/closet, /obj/item/extinguisher, @@ -75132,10 +74675,46 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) +"sjZ" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall, +/area/maintenance/aft/secondary) +"slf" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"smJ" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/eyepatch, +/obj/item/reagent_containers/food/drinks/bottle/vodka{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"snq" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "snr" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/morgue) "snF" = ( /obj/structure/chair, /obj/effect/decal/cleanable/dirt, @@ -75143,11 +74722,36 @@ /area/security/brig) "sof" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plating, /area/maintenance/port/aft) +"spa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"sqe" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"sqL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "svg" = ( /obj/structure/lattice, /obj/structure/girder/reinforced, @@ -75165,28 +74769,13 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"sAd" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"sDj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/power/apc{ - areastring = "/area/medical/chemistry"; - name = "Chemistry APC"; - pixel_y = -23 - }, +"sEG" = ( /obj/structure/cable, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/head/welding, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "sFv" = ( /turf/closed/wall/r_wall, /area/science/explab) @@ -75224,6 +74813,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"sMV" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/port) "sPc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -75235,6 +74829,16 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/engine/engineering) +"sQR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "sRB" = ( /mob/living/carbon/monkey, /turf/open/floor/grass, @@ -75250,6 +74854,13 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/engine/engineering) +"sWX" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Chemistry Maintenance"; + req_access_txt = "5; 69" + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/central) "tay" = ( /turf/closed/wall, /area/medical/medbay/central) @@ -75358,6 +74969,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/starboard) +"tsU" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_one_access_txt = "12;47" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "twp" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -75375,12 +74997,14 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"tBC" = ( -/obj/effect/turf_decal/tile/yellow{ +"tCe" = ( +/obj/machinery/light/small{ dir = 8 }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/science/xenobiology) "tCB" = ( /obj/structure/closet/secure_closet/bar{ pixel_x = -3; @@ -75416,6 +75040,19 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"tNc" = ( +/obj/structure/table/glass, +/obj/item/healthanalyzer{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/medbay/aft) "tOc" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -75440,17 +75077,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hydroponics) -"tQS" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"tRO" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plasteel/white, +"tRK" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall, /area/medical/chemistry) "tSO" = ( /obj/structure/sign/poster/contraband/random{ @@ -75460,22 +75089,17 @@ icon_state = "platingdmg1" }, /area/maintenance/port/aft) +"tTj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/medical/chemistry) "tTw" = ( /obj/structure/chair/stool, /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/wood, /area/maintenance/port/aft) -"tTR" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "tVY" = ( /obj/structure/table, /obj/item/storage/bag/money, @@ -75500,12 +75124,23 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"ubF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +"uet" = ( +/obj/item/bot_assembly/floorbot{ + created_name = "FloorDiffBot"; + desc = "Why won't it work?"; + name = "FloorDiffBot" }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/wood, +/area/maintenance/port/aft) +"ulz" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_one_access_txt = "12;47" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "uow" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/bot, @@ -75556,15 +75191,16 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/engine/break_room) +"uzf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "uEH" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/engine/storage_shared) -"uFC" = ( -/obj/machinery/airalarm, -/turf/closed/wall, -/area/medical/chemistry) "uGa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -75586,6 +75222,11 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) +"uHM" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/aft/secondary) "uLY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ @@ -75671,6 +75312,17 @@ /obj/structure/cable, /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, /area/crew_quarters/kitchen/coldroom) +"vej" = ( +/obj/machinery/camera{ + c_tag = "Morgue"; + dir = 4; + network = list("ss13","medbay") + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "vgd" = ( /obj/item/taperecorder, /obj/item/camera, @@ -75724,22 +75376,17 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"vrW" = ( -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"vub" = ( +"vqw" = ( +/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light{ dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"vrW" = ( +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "vuY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -75756,6 +75403,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"vxU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/chemistry) "vyS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -75788,6 +75440,12 @@ dir = 5 }, /area/crew_quarters/kitchen) +"vBx" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/aft/secondary) "vDb" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/wood, @@ -75867,23 +75525,9 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) -"vQt" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -29 - }, -/turf/open/floor/plasteel/white, +"vQD" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, /area/medical/chemistry) "vQP" = ( /obj/structure/table, @@ -75894,12 +75538,6 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"vRF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/medical/chemistry) "vTD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -75930,9 +75568,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"vZx" = ( +"vXt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 6 + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"waj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 20 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -75994,6 +75646,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wgZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "wij" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -76016,13 +75675,21 @@ /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, -/obj/effect/spawner/lootdrop/maintenance/two, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) "wmt" = ( /obj/effect/decal/cleanable/food/flour, /turf/open/floor/plating, /area/maintenance/port/aft) +"woz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/port/aft) "woI" = ( /obj/structure/chair/stool/bar, /obj/effect/turf_decal/tile/bar, @@ -76035,13 +75702,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"wpK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "wtq" = ( /turf/closed/wall, /area/maintenance/aft/secondary) @@ -76067,6 +75727,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/port) +"wyn" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "wyV" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/cafeteria{ @@ -76102,7 +75771,7 @@ }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "wBp" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -76111,6 +75780,29 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"wDc" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"wDN" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/medical/medbay/aft) "wFH" = ( /obj/effect/landmark/blobstart, /obj/structure/cable, @@ -76184,17 +75876,6 @@ "wQA" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) -"wQV" = ( -/obj/machinery/door/airlock/medical{ - name = "Chemistry"; - req_access_txt = "33" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "wQZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -76245,6 +75926,17 @@ /obj/machinery/computer/rdconsole/experiment, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"xgL" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "xgQ" = ( /obj/machinery/chem_heater{ pixel_x = 4 @@ -76335,6 +76027,11 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/break_room) +"xyV" = ( +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/medical/medbay/aft) "xzi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -76367,11 +76064,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"xHr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "xIf" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -76379,15 +76071,27 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"xTm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +"xKe" = ( +/obj/machinery/door/airlock/wood{ + doorClose = 'sound/effects/doorcreaky.ogg'; + doorOpen = 'sound/effects/doorcreaky.ogg'; + name = "The Gobetting Barmaid" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"xLF" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/aft/secondary) +"xNX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/hand_labeler, /turf/open/floor/plasteel/white, /area/medical/chemistry) "xVl" = ( @@ -76430,33 +76134,6 @@ }, /turf/closed/wall, /area/medical/storage) -"xZy" = ( -/obj/structure/table/glass, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = 4; - pixel_y = -4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ybh" = ( /obj/structure/light_construct{ dir = 4 @@ -76525,16 +76202,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab/range) -"yih" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab"; - req_access_txt = "33" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) (1,1,1) = {" aaa @@ -86973,13 +86640,13 @@ aaa aaa aaa aaa -lMJ -lMJ aaa aaa -lMJ -lMJ -lMJ +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -87229,19 +86896,19 @@ aaa aaa aaa aaa -lMJ -dux -ckN -ckN -dux -dux -dux -ckN -ckN -ckN -ckN -ckN -lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -87485,21 +87152,21 @@ aaa aaa aaa aaa -lMJ -dux -ppz -cpQ -cnh -mTs -fht -kfZ -ckN -dwr -oKP -cjt -ckN -ckN -lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -87743,20 +87410,20 @@ aaa aaa aaa aaa -ckN -tCB -wOn -wOn -wfq -wOn -ckP -ckP -auR -cjt -crh -vDb -ckN -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -88000,20 +87667,20 @@ aaa aaa aaa aaa -ckN -eew -wfq -wOn -wOn -wOn -jYJ -cjt -dbq -ckQ -wYq -ckP -qNO -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -88256,21 +87923,21 @@ aaa aaa aaa aaa -lMJ -dux -cjs -tOc -tOc -ckR -cmh -cnj -tTw -ckP -ckP -ckP -ckP -eOp -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ aaa aaa @@ -88513,21 +88180,21 @@ aaa aaa aaa aaa -lMJ -dux -wGG -ckP -tTw -cjt -eSY -diJ -ckP -ckS -ckP -ckP -wYq -eSY -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ aaa aaf @@ -88771,20 +88438,20 @@ eyv gJK lMJ lMJ -ckN -eDt -eSY -ckP -ckP -dvt -csf -bXE -ckP -ckP -ckS -ckP -ckN -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ lMJ aaf @@ -89027,21 +88694,21 @@ aaa lMJ aaa aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -ckN -cxQ -cjt -ckS -ckP -ckP -cdg -ptP -ckP -ckP -ybh -ckP -wOA -dux aaa cej cej @@ -89285,20 +88952,20 @@ vrW vrW aaa nYJ -ckN -nZb -qNO -ckP -obv -ckP -glz -dux -qyH -vHP -dux -mnS -dux -dux +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ cej aaa @@ -89530,33 +89197,33 @@ alK otq qAO vAs -cga -rAF -odU -odU -odU -rAF -cga -lMJ -aaf -lMJ -lMJ -fwb -dux -ctn -tSO -diI -dux -uYL -jnW -dux -dux -dux -dux -dux -dux +dux +dux +ckN +ckN +dux +dux +dux +ckN +ckN +ckN +ckN +ckN lMJ aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa gka aaa cue @@ -89787,31 +89454,31 @@ alK alK lZn alK -cga -npl -cZs -cZs -cZs -dVT -snr -cga -odU -odU -odU -cga -cga -cga -cga -cga -cga -cga -cnl dux -aaf -aaf -aai -anT -nYJ +ppz +cpQ +cnh +mTs +fht +kfZ +ckN +dwr +oKP +cjt +ckN +ckN +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa gka @@ -90044,25 +89711,25 @@ alK kPN wVo alC -cga -ibr -cmB -cmB -cmB -tBC -vub -qJK -cZs -cZs -cZs -eRo -cZs -cZs -cZs -cZs -dVT -cga -eqt +dux +tCB +wOn +wOn +wfq +wOn +ckP +ckP +auR +cjt +crh +vDb +ckN +ckN +aaf +aaa +aaa +aaf +nOl dux bTn bTn @@ -90301,25 +89968,25 @@ nfn bbL bbL auF -cga -mxt -cmB -cmB -gcu -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -gcu -cmB -tQS -cga -nPC +dux +eew +wfq +wOn +wOn +wOn +jYJ +cjt +dbq +ckQ +wYq +ckP +qNO +ckN +aaf +aaf +aaf +dux +dux wkM bTn bUN @@ -90557,26 +90224,26 @@ ycH alC eEU aob -bXy -cga -ibr -cmB -cmB -fwL -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -fwL -cmB -wij -cga -nPC +sMV +dux +cjs +tOc +tOc +ckR +cmh +cnj +tTw +ckP +ckP +ckP +ckP +eOp +ckN +aaa +aaa +aaa +dux +bXE reI bTn bUO @@ -90815,25 +90482,25 @@ alK alK alK alK -hLm -ibr -cmB -cmB -fwL -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -fwL -cmB -wij -cga -nPC +dux +wGG +ckP +tTw +cjt +eSY +diJ +ckP +ckS +ckP +ckP +wYq +eSY +ckN +aaa +aaa +aaa +dux +bXE uqB bTp vhx @@ -91072,25 +90739,25 @@ alK hdh aob dix -cga -kyW -cmB -cmB -vZx -pej -pej -pej -pej -sAd -pej -pej -pej -pej -gUb -cmB -wij -snr -nPC +dux +eDt +eSY +ckP +ckP +dvt +csf +bXE +ckP +ckP +ckS +ckP +ckN +ckN +aaa +aaa +aaa +dux +bXE dux bTn bTn @@ -91329,25 +90996,25 @@ bTr bUQ bVT aob -cga -mxt -cmB -cmB -qnE -liQ -liQ -liQ -ubF -khy -liQ -liQ -liQ -liQ -qhK -cmB -hwW -cga -luh +dux +cxQ +cjt +ckS +ckP +ckP +cdg +ckP +ckP +ckP +ckP +ckP +wOA +dux +aaf +aaf +aaf +dux +bXE sof fvT uOc @@ -91586,24 +91253,24 @@ alK bJs bVU bXx -cga -ibr -cmB -cmB -dZG -cmB -cmB -cmB -flJ -fwL -cmB -cmB -cmB -cmB -dZG -cmB -jPu -cga +dux +nZb +qNO +ckP +obv +ckP +woz +ptP +ckP +ckP +ybh +uet +dux +dux +aaa +aaa +aaa +dux cxR nPC ceu @@ -91843,24 +91510,24 @@ alK bUR alK alK -cga -dCy -cjV -hOP -pjP -cjV -cjV -jOR -eAa -fwL -mRT -ljF -kBT -eEV -mRT -kBT -omB -cga +dux +ctn +tSO +diI +dux +uYL +jnW +dux +qyH +vHP +dux +mnS +dux +lMJ +aaa +aaa +aaa +dux ceu nPC dux @@ -92100,24 +91767,24 @@ alK alK alK bXy -cga -cga -cga -cga -cga -cga -cga -cga -pcL -wQV -avr -cga -tRO -oFI -iGO -tRO -cga -cga +dux +dux +dux +dux +dux +dux +xKe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +dux cLI nPC dux @@ -92125,6 +91792,11 @@ anT aaf aaf aaf +aaf +aaf +aaf +aaf +aaf aai anT anT @@ -92207,11 +91879,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (62,1,1) = {" aaa @@ -92363,17 +92030,17 @@ pai eEu uOc mSk -cbp -cga -rfi +jdp +cCe +cCk qUR -hFj -snr -eEi -kKo -tBC +cCj +cCj +cCj +vej +cCj fkj -cga +cCe sfQ bXE nPC @@ -92382,6 +92049,11 @@ aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa aaf aaa aaf @@ -92464,11 +92136,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (63,1,1) = {" aaa @@ -92621,24 +92288,29 @@ dux dux dux nPC -cga +cCe nnV fwL -dnp +cCj hLm mZA -clu -cmB -xTm -cga -ceu -dvt +aae +cCj +hLm +cCe +dux +pwn nPC ckN aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cBR cBR @@ -92721,11 +92393,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (64,1,1) = {" aaa @@ -92880,22 +92547,27 @@ wen jdp qit klh -jUk -qpg -uFC -djY -gcu -cmB -sDj -cga -cga -dux -oZs +cCj +cCj +hLm +mZA +cCj +cCg +hLm +cCe +slf +bXE +nPC ckN aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cCK cDA @@ -92978,11 +92650,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (65,1,1) = {" aaa @@ -93135,17 +92802,17 @@ dux cen dux cbq -cga +cCe bcc rLL -hvf -yih -tTR -gOM -laN -ndC -xZy -cga +cCj +hLm +mZA +cCj +cxw +hLm +cCe +cCe hdX nPC ckN @@ -93153,6 +92820,11 @@ aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cCL cDB @@ -93235,11 +92907,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (66,1,1) = {" aaa @@ -93392,17 +93059,17 @@ cdb ceo dux cdc -cga +cCe diF nap qZf nDf -nWX -xHr -xHr -wpK +cCj +cCj +cCj +cCj eSm -cga +cCe ceu nPC ckN @@ -93410,6 +93077,11 @@ aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa dBN dBO cDC @@ -93492,11 +93164,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (67,1,1) = {" aaa @@ -93649,17 +93316,17 @@ oZg dux dux csT -cga -vRF +cCe +cxp riP -cga -cga -gAj -cmB -cnJ -cmB -cqt -cga +cCe +cCe +cCX +cCj +cCj +cCj +cCj +cCe jNy nPC dux @@ -93667,6 +93334,11 @@ aaf aaf aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cCM cDD @@ -93749,11 +93421,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (68,1,1) = {" aaa @@ -93910,13 +93577,13 @@ snr ovU jkQ fJl -snr +cCe mrv -aGp +tFJ hev -mtp -vQt -cga +tFJ +tFJ +cCe oXP jUe dux @@ -93924,6 +93591,11 @@ dux dux aaf aaf +aaf +aaf +aaf +aaf +aaf cBR cCK cDA @@ -94006,11 +93678,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (69,1,1) = {" aaa @@ -94163,17 +93830,17 @@ cde dux dux cdc -cga +cCe oSw jkQ lVu -cga -cga -cga -cga -cga -cga -cga +cCe +cCe +cCe +cCe +cCe +cCe +cCe ceu jUe bXE @@ -94181,6 +93848,11 @@ dvq dux aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cBR cBS @@ -94211,11 +93883,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa aac aaa aaa @@ -94439,6 +94106,11 @@ dux aaf aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cDF cEI @@ -94520,11 +94192,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (71,1,1) = {" aaa @@ -94696,6 +94363,11 @@ dux aaf aaf aaf +aaf +aaf +aaf +aaf +aaf dBN cDG cEJ @@ -94777,11 +94449,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (72,1,1) = {" aaa @@ -94953,6 +94620,11 @@ dux aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cDH cEK @@ -95034,11 +94706,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (73,1,1) = {" aaa @@ -95210,6 +94877,11 @@ dux aaa aaa aaa +aaa +aaa +aaa +aaa +aaa dBN cDI cEL @@ -95291,11 +94963,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (74,1,1) = {" aaa @@ -95467,6 +95134,11 @@ dux aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cDJ cEM @@ -95548,11 +95220,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (75,1,1) = {" aaa @@ -95724,7 +95391,12 @@ dux aaf aaf aaf -cBR +aaf +dux +dux +dux +dux +cEE cBR cBR cFJ @@ -95805,11 +95477,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (76,1,1) = {" aaa @@ -95981,12 +95648,22 @@ dux aaa aaa aaa -aaf aaa +dux +rMg +wyn +lMT +hkT +dux aaa cFK cGC cBS +aaa +aaf +aaa +aaa +aaa cIy aaf aaa @@ -96001,16 +95678,6 @@ aaa aaa aaa aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -96238,8 +95905,13 @@ dux aaf aaa aaa -aaf aaa +dux +gDK +mci +bXE +rMb +dux aaa cFK cGD @@ -96319,11 +95991,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (78,1,1) = {" aaa @@ -96497,6 +96164,11 @@ dux dux dux dux +smJ +rig +bXE +sqe +dux aaa cFK cGE @@ -96576,11 +96248,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (79,1,1) = {" aaa @@ -96754,6 +96421,11 @@ ceu cBT cfF dux +dux +vXt +frA +dux +dux dzK cFJ cGF @@ -96833,11 +96505,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (80,1,1) = {" aaa @@ -97011,6 +96678,11 @@ cse cdj cdj cvl +dux +wgZ +klB +dux +lfv dzK cFL cGG @@ -97090,11 +96762,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (81,1,1) = {" aaa @@ -97267,7 +96934,12 @@ csr cxU cxU cxU -dyg +dyj +dux +cnl +nOl +dux +dux dzK cFM cGs @@ -97347,11 +97019,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (82,1,1) = {" aaa @@ -97524,7 +97191,12 @@ czO cAS cBU cxU -dDB +cNm +gnT +fqC +cdj +cdj +cvl dzK cFN cGH @@ -97604,11 +97276,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (83,1,1) = {" aaa @@ -97781,6 +97448,11 @@ czP cAT cBV cxU +cxU +cxU +khX +cxU +cxU dyj dzK cBR @@ -97861,11 +97533,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (84,1,1) = {" aaa @@ -98038,6 +97705,11 @@ czQ cAU diN cxU +niB +ooS +rhZ +ljG +cxU dyg dux cFO @@ -98118,11 +97790,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (85,1,1) = {" aaa @@ -98295,6 +97962,11 @@ czR cAV cBW cxU +qzx +cFR +lbB +tNc +cxU cDN cEN cFP @@ -98375,11 +98047,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (86,1,1) = {" aaa @@ -98552,6 +98219,11 @@ czS cAW cBX cxU +wDN +xyV +hAu +quD +cxU cDO cxU cxU @@ -98582,11 +98254,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa aac aaa aaa @@ -98809,9 +98476,14 @@ czT cAX cxU cxU +cxU +gfS +gfS +cxU +cxU cDP cxU -cFQ +jTg cGJ cHB cxU @@ -98889,11 +98561,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (88,1,1) = {" aaa @@ -99066,11 +98733,16 @@ czU cAY cBY cCN -cDQ +sfI +mUz +mUz cEO +sfI +cDQ +oTW cFR cGM -cHC +frX cxU cJq cKs @@ -99146,11 +98818,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (89,1,1) = {" aaa @@ -99317,11 +98984,16 @@ cup cvr cwt cxj -cxj +kNI cyT czV cAZ cBZ +uzf +uzf +uzf +uzf +uzf cCO cDR cEP @@ -99403,11 +99075,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (90,1,1) = {" aaa @@ -99579,11 +99246,16 @@ cyU czW cBa cCa +cyU +cyU +cyU +pyi +cyU cCP cDS cEQ cFT -cGO +cxj cHE cxU cJs @@ -99660,11 +99332,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (91,1,1) = {" aaa @@ -99828,23 +99495,28 @@ cmu csw cmu cmu -cxU -cxU +cga +nBI cxl -cxY -cxU -cxU -cxU -cxU -cCQ +mvB +gjP +cga +cga +tRK +cga +cga +cga +cga +cga +lfR cDT -cxU -bTs -cGP -bTs -bTs -bTs -bTs +odU +cga +cga +cga +rAF +rAF +rAF cgJ cLa cML @@ -99917,11 +99589,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (92,1,1) = {" aaa @@ -100090,18 +99757,23 @@ cwv cxm cxZ cyV +irZ +spa czX -cxU -cCb -cCR +czX +czX +pvt +spa +nnI +hox cDU cER -bTs -cGQ +fRZ +czX cHF cIA cJt -bTs +rAF cLg cMb cMM @@ -100174,11 +99846,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (93,1,1) = {" aaa @@ -100343,22 +100010,27 @@ csy cty cmu cvv -cww -cxn -cya -cyW -czY -cBb -cCc -cCS -cDV -cES -bTs -cGR -cHG -cIB +cmB +flJ +gcr +cmB +pej +cmB +cmB +cmB +cmB +cmB +cmB +cmB +oqv +cDW +cmB +clu +cmB +cmB +clu cJu -bTs +rAF ctK cLa cMN @@ -100431,11 +100103,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (94,1,1) = {" aaa @@ -100599,23 +100266,28 @@ crA csz ctz cmu -cvw -cwx +cus +cmB cxo -cyb -cyX -czZ -cxU -cCd -cCT -cDW -cET -bTs +xNX +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cya +eNA +cmB +mRT cGS cHH -cIC +kBT cJv -bTs +rAF cgJ cLa cMO @@ -100688,11 +100360,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (95,1,1) = {" aaa @@ -100854,25 +100521,30 @@ coR cqo crB csA -cCe -cCe -cCe -cCe -cxp -cyc -cCe -cCe -cCe -cCe -cCe +cga +cga +cus +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB cDX -cCe -cCe -cCe -bTs -bTs -cJw -bTs +cmB +vqw +rAF +rAF +rAF +rAF +rAF cLi cLa cMP @@ -100945,11 +100617,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (96,1,1) = {" aaa @@ -101111,21 +100778,26 @@ coS cqn crC csB -cCe +cga cCf -cCj -cCf -cxq -cCj -cyY -cCf -cCj -cCf -cCU -cDY -cEU -cCf -cCe +kKo +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDX +cmB +wij +rAF cHI cID cJx @@ -101202,11 +100874,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (97,1,1) = {" aaa @@ -101368,21 +101035,26 @@ cmu cqp cmu cmu -cCe +rAF cus -cCj -cCj +cmB +cmB cxr -cCj -cCj -cCj -cCj -cCg -cCV -cDZ -cCj -cCj -cCe +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDW +cmB +vqw +rAF cgJ bTs bTs @@ -101459,11 +101131,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (98,1,1) = {" aaa @@ -101625,21 +101292,26 @@ cbu cqq crD csC -cCe -cCj -cCj -cCj -cxs -cCj -cCj -cCj -cCj -cCj -cCj -cDY -aae -cCj -cCe +rAF +waj +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDW +cmB +vqw +rAF cHJ bTs cJy @@ -101716,11 +101388,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (99,1,1) = {" aaa @@ -101882,21 +101549,26 @@ uGS uGS uGS csD -cCe +rAF cuu -cCj -tFJ -acl -cCj -tFJ -tFJ -cCj -tFJ -tFJ +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB dDC -tFJ -cFU -cCe +cmB +vqw +rAF ctK bTs cJz @@ -101973,11 +101645,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (100,1,1) = {" aaa @@ -102139,21 +101806,26 @@ coT cqr uGS csE -cCe -cCf -cCj -cCf -cxq -cyh -cCf -cCf -cCj -cCf -cCf -cDY -cCf -cCf -cCe +rAF +meP +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDW +cmB +gxB +rAF diC bTs cJA @@ -102230,11 +101902,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (101,1,1) = {" aaa @@ -102396,21 +102063,26 @@ coU cqs crE csF -cCe -ctA -cCj -cCj -cxv +sWX +cus +cmB +cmB +cwx cyi -cvB -cCj -cCj -cCj -cCj +qhK +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB cEb cEV cFV -cCe +rAF cHK bTs cPb @@ -102487,11 +102159,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (102,1,1) = {" aaa @@ -102653,19 +102320,24 @@ coV xgQ uGS cKJ -cCe +rAF cuw -cCj -cCj -cxw -cCg -cxs -cCj -cCj -cCj -cCX -cEc -cEW +cmB +cmB +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB cFW cGT cHL @@ -102744,11 +102416,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (103,1,1) = {" aaa @@ -102910,21 +102577,26 @@ coW cqu uGS csH -ctC -cCj -cCj -cCj -cCj -cCj -cxs -cCj -cvE -cCk +rAF +cus +cmB +cmB +cmB +cmB +flJ +mRT +kBT +nMs cCY -cEd -cEX +sQR +kBT +cjV +cjV +oOy +cmB +mRT cFX -cCe +rAF cxL bTs cJC @@ -103001,11 +102673,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (104,1,1) = {" aaa @@ -103167,21 +102834,26 @@ coX cnL uGS cbC -cCe -tFJ -cvE -tFJ -tFJ -cCj +rAF +exA +hOP +cjV +cjV +cjV acl -tFJ -cCe -cCe -cCe -cCe -cEY -cCe -cCe +wDc +rAF +rAF +rAF +rAF +rAF +rAF +rAF +rdB +cjV +snq +rAF +rAF cgN bTs cJD @@ -103258,11 +102930,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (105,1,1) = {" aaa @@ -103425,19 +103092,24 @@ coY uGS csI ctD -cCe -cvF -cCe -cCe -cym -cxp -cCe -cBd +rAF +rAF +vQD +vxU +rAF +tTj +rAF +cIH cCl cCZ cEf -cEZ cFY +cFY +riD +vQD +vxU +rAF +rAF bTs cHM ctH @@ -103515,11 +103187,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (106,1,1) = {" aaa @@ -103695,6 +103362,11 @@ chg cEg cFa cFZ +chg +ejE +nry +chg +kJl cGU cHN cIE @@ -103772,11 +103444,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (107,1,1) = {" aaa @@ -103953,6 +103620,11 @@ car cFb car car +iUh +car +car +car +car car cIF cJF @@ -104029,11 +103701,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (108,1,1) = {" aaa @@ -104210,6 +103877,11 @@ cEh cFc chh chh +kQx +chh +fCG +chh +chh cvG cIG cJG @@ -104286,11 +103958,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (109,1,1) = {" aaa @@ -104468,9 +104135,14 @@ cCq cCq cCq cCq -cIH cCq cCq +cCq +wtq +wtq +sjZ +wtq +wtq cLv cPb cMZ @@ -104543,11 +104215,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (110,1,1) = {" aaa @@ -104728,6 +104395,11 @@ cHP cII cJH cCq +qVW +kWn +wOE +vBx +wtq cLw cPb cNa @@ -104800,11 +104472,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (111,1,1) = {" aaa @@ -104985,6 +104652,11 @@ cHQ cIJ cYc cCq +deh +uHM +wOE +gyL +wtq cLx cPb cNb @@ -105057,11 +104729,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (112,1,1) = {" aaa @@ -105242,6 +104909,11 @@ cHR cIK cJJ cCq +wtq +wtq +wtq +tsU +wtq cgM cPb cNc @@ -105314,11 +104986,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (113,1,1) = {" aaa @@ -105499,7 +105166,12 @@ cHR cIL cJK cCq -cgM +oBk +mKb +mKb +sqL +mKb +fSV cPb cNd cNS @@ -105571,11 +105243,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (114,1,1) = {" aaa @@ -105757,6 +105424,11 @@ cIM cJL cKG cLy +wtq +wtq +wtq +wtq +sEG cPb cPb cPb @@ -105828,11 +105500,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (115,1,1) = {" aaa @@ -106014,7 +105681,12 @@ cIN cJM cCq cgM -gNe +wtq +jVH +fxT +ulz +oLd +kWn cwc cNe cNT @@ -106085,11 +105757,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (116,1,1) = {" aaa @@ -106271,6 +105938,11 @@ cFh cFh cKH cLy +wtq +moz +wOE +wtq +ryw wFH cMk wtq @@ -106342,11 +106014,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (117,1,1) = {" aaa @@ -106528,6 +106195,11 @@ cIO cJN cCq pYC +wtq +gkW +xLF +wtq +wOE cMl wOE wtq @@ -106599,11 +106271,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (118,1,1) = {" aaa @@ -106788,11 +106455,11 @@ cLA wtq wtq wtq -aaf -aaa -aaa -aaa -aaa +wtq +wtq +wtq +wtq +wtq aaa aaa aaa @@ -107044,7 +106711,7 @@ cKI cQr cQR cRa -cSd +cRe cRe cRe cRe @@ -107301,9 +106968,9 @@ cPX cQt cQZ cRc -cRf +xgL cYT -cRg +tCe cYT cYT djg @@ -110386,7 +110053,7 @@ dvY dvY diW cNX -dBe +ciL cPj dvY aaa diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index cffdfbd732d..095f6cb8872 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -88,98 +88,88 @@ /turf/closed/wall, /area/mine/laborcamp) "ar" = ( -/obj/structure/table, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "as" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/white, +/obj/machinery/shower{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "at" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/machinery/camera{ - c_tag = "Labor Camp Medical"; - dir = 8; - network = list("labor") +/obj/machinery/shower{ + pixel_y = 22 }, -/turf/open/floor/plasteel/white, +/obj/item/soap/nanotrasen, +/obj/item/bikehorn/rubberducky/plasticducky, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "au" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/obj/item/mining_scanner, +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "av" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/flashlight, -/obj/item/pickaxe, -/obj/item/clothing/glasses/meson, -/obj/item/mining_scanner, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, /turf/open/floor/plasteel, /area/mine/laborcamp) "aw" = ( /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"ax" = ( -/turf/open/floor/plasteel/white, -/area/mine/laborcamp) "ay" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 8; + name = "old sink"; + pixel_x = 12 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "az" = ( /turf/open/floor/plasteel, /area/mine/laborcamp) "aA" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/light/small{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Library"; + dir = 8; + network = list("labor") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aB" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Infirmary" +/obj/machinery/door/airlock/public/glass{ + name = "Showers" }, -/turf/open/floor/plasteel/white, -/area/mine/laborcamp) -"aC" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "aD" = ( /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) "aE" = ( -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_y = 24; - prison_radio = 1 +/obj/machinery/vending/sustenance, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aF" = ( /obj/machinery/door/airlock{ - name = "Labor Camp Storage" + name = "Labor Camp Library" }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/laborcamp) "aG" = ( @@ -189,93 +179,63 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "aH" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 5 }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aI" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Labor Camp External Access" +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aJ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aK" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aL" = ( /obj/machinery/door/airlock{ - name = "Vending" - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aM" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/loading_area{ - dir = 4 + name = "Unisex Restroom" }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aN" = ( -/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/mine/laborcamp) "aO" = ( -/obj/machinery/camera{ - c_tag = "Labor Camp External"; - dir = 4; - network = list("labor") +/obj/structure/sign/poster/official/do_not_question{ + pixel_y = 32 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"aP" = ( -/obj/machinery/vending/sustenance, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aQ" = ( -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/mine/laborcamp) -"aR" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/white, +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/plasteel, /area/mine/laborcamp) "aS" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 1; - output_dir = 2 - }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/seeds/wheat, +/obj/item/seeds/wheat, +/obj/item/seeds/tomato, +/obj/item/seeds/onion, +/obj/item/seeds/garlic, +/obj/item/seeds/carrot, +/obj/item/seeds/ambrosia, +/obj/item/seeds/apple, +/turf/open/floor/plasteel, /area/mine/laborcamp) "aT" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"aU" = ( -/obj/machinery/flasher{ - id = "labor" - }, -/turf/closed/wall, -/area/mine/laborcamp) "aV" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -286,10 +246,18 @@ /turf/open/floor/plasteel, /area/mine/eva) "aW" = ( -/obj/machinery/conveyor{ - id = "gulag" +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "aX" = ( /obj/structure/closet/crate, @@ -315,6 +283,7 @@ pixel_y = 28; req_access_txt = "2" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "ba" = ( @@ -322,33 +291,36 @@ id = "labor"; name = "labor camp blast door" }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"bb" = ( -/obj/machinery/camera{ - c_tag = "Labor Camp Central"; - network = list("labor") - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "bc" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "gulag" +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/carrot, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bd" = ( /obj/machinery/mineral/processing_unit_console, /turf/closed/wall, /area/mine/laborcamp) "be" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green, +/obj/item/seeds/soya, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bf" = ( /turf/closed/wall, @@ -368,27 +340,44 @@ /obj/machinery/status_display/evac{ pixel_y = 32 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "bk" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "bl" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "gulag" +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/plant_analyzer, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bm" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "gulag" +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/onion, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bn" = ( /obj/structure/table, @@ -2328,6 +2317,16 @@ /obj/structure/stone_tile/block, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"gp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "gr" = ( /obj/structure/stone_tile{ dir = 1 @@ -2486,11 +2485,27 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"hN" = ( +"hL" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/warning/gasmask{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"hN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "ia" = ( @@ -2606,6 +2621,12 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "jg" = ( /obj/structure/stone_tile, /obj/structure/stone_tile/cracked{ @@ -2666,6 +2687,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "ju" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -2682,6 +2710,19 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "jF" = ( /obj/structure/stone_tile/surrounding_tile, /obj/structure/stone_tile/surrounding_tile{ @@ -2770,6 +2811,27 @@ /obj/structure/fluff/drake_statue/falling, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"km" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 1; + name = "old sink"; + pixel_y = -5 + }, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"kn" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "gulag"; + name = "labor camp conveyor" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "ko" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -3040,6 +3102,15 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Operations"; + dir = 8; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "lO" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -3486,11 +3557,88 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"nj" = ( +/obj/structure/chair/stool, +/obj/machinery/flasher{ + id = "GulagCell 1"; + pixel_x = -28 + }, +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"nm" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "old sink"; + pixel_y = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/laborcamp) +"nn" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"nt" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"nF" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Infirmary" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"nH" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External South"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) "nI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/mine/living_quarters) +"nU" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "gulag" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/mine/laborcamp) +"ob" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "oL" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -3506,6 +3654,14 @@ /obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) +"oS" = ( +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "oU" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -3533,6 +3689,21 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/production) +"pr" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/laborcamp) +"pR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "pV" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -3540,15 +3711,97 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"qk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + id_tag = "cellblock1"; + name = "Labor Camp Cellblock" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"qm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"qs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) "qt" = ( /obj/structure/table, /obj/item/cigbutt, /turf/open/floor/plasteel, /area/mine/living_quarters) +"qI" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"qP" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"ri" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "rj" = ( /obj/structure/cable, /turf/open/floor/plasteel, /area/mine/living_quarters) +"rG" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "gulag1"; + name = "Cell 1" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"rH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-05" + }, +/obj/machinery/camera{ + c_tag = "Labor Camp Cellblock"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "sa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -3562,6 +3815,14 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/mine/production) +"sq" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Labor Camp External Airlock"; + opacity = 0 + }, +/turf/open/floor/plating, +/area/mine/laborcamp) "ss" = ( /obj/machinery/button/door{ id = "miningbathroom"; @@ -3593,11 +3854,29 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/mine/production) +"sK" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) "sM" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/laborcamp/security) +"tw" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "tI" = ( /obj/machinery/light/small{ dir = 4 @@ -3607,11 +3886,40 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) -"tY" = ( -/turf/closed/mineral/random/labormineral/volcanic, -/area/lavaland/surface/outdoors/explored) -"tZ" = ( +"tL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"tP" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"tZ" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"ut" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"uB" = ( +/obj/structure/chair/stool, +/obj/structure/sign/poster/official/report_crimes{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "uG" = ( @@ -3637,16 +3945,55 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"vg" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "vh" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/sign/poster/official/twelve_gauge{ + pixel_y = 32 + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"vj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "vq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"vs" = ( +/obj/structure/sign/warning/docking{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"vH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"vM" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) "vW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -3660,10 +4007,60 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"wE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"wQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "xi" = ( /obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/mine/living_quarters) +"xW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"xX" = ( +/obj/structure/sign/departments/medbay/alt{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"yh" = ( +/obj/structure/sign/poster/official/safety_report{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Central"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"yi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "yk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -3674,6 +4071,21 @@ "yr" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp) +"yw" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Cell 3"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "za" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -3733,12 +4145,25 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"AH" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "AW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"Bd" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External West"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) "Be" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -3751,6 +4176,51 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"Bj" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "gulag2"; + name = "Cell 2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Bt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"BA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"BL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Co" = ( /obj/machinery/computer/shuttle/mining/common{ dir = 4 @@ -3774,6 +4244,54 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Di" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Dr" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) +"Dv" = ( +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Dw" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Cell 1"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Ef" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"En" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Es" = ( /obj/machinery/door/window/southright, /obj/machinery/shower{ @@ -3791,6 +4309,18 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/mine/living_quarters) +"EK" = ( +/obj/machinery/conveyor{ + id = "gulag" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) +"EY" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Fd" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red, @@ -3819,10 +4349,35 @@ /obj/structure/cable, /turf/open/floor/plating, /area/mine/laborcamp/security) +"FO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + id_tag = "cellblock1"; + name = "Labor Camp Operations" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Gf" = ( +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Gn" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Gz" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "gulag3"; + name = "Cell 3" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "GI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3852,6 +4407,24 @@ "Hd" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp/security) +"Hi" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) +"Hj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Ho" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -3890,12 +4463,57 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/laborcamp) +"IJ" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) "IK" = ( /obj/structure/toilet{ dir = 8 }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"Jd" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"Je" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Jf" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Jh" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/cultivator, +/obj/item/seeds/potato, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"Jx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Kb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3905,9 +4523,33 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Kv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"Kz" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External North"; + dir = 1; + network = list("labor") + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) +"KD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) "Lg" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/tile/brown{ @@ -3931,6 +4573,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/eva) +"Na" = ( +/turf/closed/wall/r_wall, +/area/lavaland/surface/outdoors/explored) "Nj" = ( /obj/machinery/door/airlock{ name = "Restroom" @@ -3960,6 +4605,60 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/mineral/labor_points_checker{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Oz" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Cell 2"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"OI" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"OQ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"OX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Pa" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red, @@ -3975,6 +4674,30 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Pp" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Labor Camp Infirmary"; + dir = 8; + network = list("labor") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"Pr" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Pt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -3985,10 +4708,48 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Px" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"PE" = ( +/obj/structure/closet/crate/internals, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "PL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/eva) +"Qg" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/flashlight, +/obj/item/pickaxe, +/obj/item/clothing/glasses/meson, +/obj/item/mining_scanner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Qo" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "QN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3998,6 +4759,13 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"QO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "QQ" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -4016,6 +4784,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"QX" = ( +/obj/structure/chair/stool, +/obj/machinery/flasher{ + id = "GulagCell 3"; + pixel_x = -28 + }, +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Rx" = ( /obj/structure/cable, /turf/open/floor/plasteel, @@ -4040,6 +4823,34 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"RY" = ( +/obj/structure/chair/stool, +/obj/machinery/flasher{ + id = "GulagCell 2"; + pixel_x = -28 + }, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Sd" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/redbeet, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) "SJ" = ( /obj/structure/statue{ desc = "A lifelike statue of a horrifying monster."; @@ -4050,6 +4861,16 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Tb" = ( +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_y = 24; + prison_radio = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Tn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -4065,6 +4886,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/living_quarters) +"TJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "TP" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -4091,6 +4925,21 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Ur" = ( +/obj/structure/bookcase, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Uv" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) "UA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -4117,6 +4966,16 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"UO" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 1; + output_dir = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) "UQ" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -4140,6 +4999,65 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"UV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"UX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"Vb" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"VA" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) "VP" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -4157,6 +5075,13 @@ /obj/structure/lattice/catwalk, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/living_quarters) +"We" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Wp" = ( /obj/docking_port/stationary{ dir = 8; @@ -4168,15 +5093,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"WA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock{ - name = "Labor Camp External Access" - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) "WB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -4185,6 +5101,7 @@ name = "Labor Camp Shuttle Security Airlock"; req_access_txt = "2" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "WC" = ( @@ -4194,6 +5111,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Prisoner Airlock" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "WD" = ( @@ -4219,6 +5137,17 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"Xb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Xx" = ( /obj/structure/sign/poster/official/random{ pixel_y = 32 @@ -4241,6 +5170,33 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"YG" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/mining, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"YJ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"YV" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson, +/obj/item/mining_scanner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "YY" = ( /obj/machinery/camera{ c_tag = "Crew Area Hallway West"; @@ -4262,10 +5218,38 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) -"Zn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 +"Zk" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "gulag" }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) +"Zn" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Zs" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/mine/laborcamp) +"ZD" = ( +/obj/machinery/light/small, +/obj/machinery/camera{ + c_tag = "Labor Camp Showers"; + dir = 1; + network = list("labor") + }, +/turf/open/floor/plasteel/freezer, +/area/mine/laborcamp) +"ZO" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) @@ -8837,7 +9821,7 @@ aj aj aj aj -ab +aD aj aj aj @@ -8846,18 +9830,18 @@ aj aj aj aj -aj -aq -aq -aq -aq -aq +yr +ap +ap +ap +ap +yr aY -aq -aq -aq +yr +yr +yr bx -aq +yr aw aw aj @@ -9092,29 +10076,29 @@ an an an an -an -an -ab -ab -an -ab +aD +aD +aD +aD +aD +aD aj aj aj aj aj -ab -aq -aG -aK -aP +yr +vj +Pr +Pr +vj aq aZ aq ao aq -aJ -aq +Je +yr aD bZ aj @@ -9349,21 +10333,21 @@ an an an an -an -an -an -an -an -an -ab +aD +aD +aD +aD +aD +aD +aD aj aj aj -ab -ab -aq +aD +yr +Dv aH -az +ZO aQ aq WB @@ -9371,7 +10355,7 @@ aq bi aq WC -aq +yr bZ bZ bZ @@ -9606,28 +10590,28 @@ an an an an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD ap ap ap -aq -aq -aq -aL -aq +yr +vj +OI +aG +vj aq ba aq bj -az -az +vs +vj yr Hd Hd @@ -9863,28 +10847,28 @@ an an an an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD ap ar -ar +ZD aq +vj +vj +tP +vj +yh az -az -az -az -az -az -az +vj su -az -az +vj +aQ yr cb UJ @@ -10120,28 +11104,28 @@ an an an an -an -an -an -an -an -an -an -an -aq +aD +aD +aD +aD +aD +aD +aD +Kz +yr as -ax +ar aB -az -az -az -az -aU -bb -tZ +vj +vj +ut +En +En +En +Di hN Iv -Iv +tL bL cc bw @@ -10378,27 +11362,27 @@ an an an an -an -an -an -an -an -an -an -aq +aD +aD +aD +aD +aD +aD +aX +yr at ay aq aE -az +vj Kv -tZ +vj tZ Zn -aQ +Qo bk -az -az +EY +EY yr vh bh @@ -10635,24 +11619,24 @@ an an an an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +ap +ap +yr aq aq aq aq -aq -az -az -aR -az +oS +BL +vj +VA bc -aq +Jh bl yr yr @@ -10892,25 +11876,25 @@ an an an an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +Vb +YJ aq au -au -au +uB +Xb aq -az -aM -aq -aq -bd -aq -bl +Tb +Kv +vj +sK +Jd +wE +km yr by pV @@ -11149,24 +12133,24 @@ an an an an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +Bt +OQ aq av -az -az +xW +yi aF -az +Iv aN aS aW be -aW +Sd bm yr bB @@ -11405,22 +12389,22 @@ an an an an -an -an -an -an -an -an -an -an -aq +aD +aD +aD +aD +aD +ap +BA +Pp aq +Ur aA -aC aq -aI aq aq +qk +aq aq aq aq @@ -11662,27 +12646,27 @@ an an an an -an -an -an -an -an -an -an -an -an -aq -aq -aq -aq -az -aq -aT -aX -aX aD aD aD +aD +aD +yr +UX +aq +aq +aq +aq +aq +pr +aq +UV +rH +aq +nj +Dw +ap +nH aw FF zo @@ -11919,26 +12903,26 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -aq -aJ -aq +aD +aD +aD +aD aT -aD -aD -aD -aD +yr +UX +aq +YV +YV +YV +aq +nm +aJ +gp +En +rG +Jx +qP +ap aD aw FF @@ -12175,27 +13159,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an aD -aq -WA -aq +aD +aD +aD +aD aT -aD -aD -aD -aD +yr +nF +aq +Qg +vj +vj +aq +aq +aq +OX +jt +aq +aq +aq +yr aD aj aj @@ -12432,27 +13416,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an aD aD +aD +Dr +yr +yr +yr +jz +xX +jc +vj +vj +vj +PE +aq aO -aD -aD -aD -aD -aD +vj +aq +RY +Oz +ap aj aj aj @@ -12689,27 +13673,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD -aD -aD -aD aD aD aD aD +sq +Zs +sq +vH +nt +tw +Jf +Px +vj +vj +aq +TJ +En +Bj +Hj +qP +ap aD aj aj @@ -12946,27 +13930,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD -aD -aD aD aD aD +Dr +yr +yr +yr +hL +nn +Ef +qI +pR +En +En +FO +aN +vj +aq +aq +aq +yr aD aj aj @@ -13203,27 +14187,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD -aD aD aD aD aD +aX +ap +AH +vj +az +vj +We +vj +vj +vj +aq +Om +ri +aq +QX +yw +ap aD aj aj @@ -13460,27 +14444,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD aD aD aD aD aD +ap +vj +vj +lK +vj +kn +wQ +az +QO +aq +qm +En +Gz +Jx +qP +ap aD aD aj @@ -13718,28 +14702,28 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an aD aD -aT -an aD -tY +aD +ap +Gf +ob +aq +aq +bd +aq +aq +nU +yr +qs +KD +yr +yr +yr +yr +aD +aD aj aj aj @@ -13975,29 +14959,29 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -tY -tY -tY +aD +aD +aD +aD +ap +Gf +vg +UO +EK +vM +EK +EK +Zk +yr +Uv +Hi +ap +aD +aD +aD +aD +aD +aD aj aj ai @@ -14232,29 +15216,29 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +ap +ap +yr +yr +yr +yr +yr +yr +yr +ap +ap +ap +aD +aD +aD +aD +aD +aD aj aj ai @@ -14489,30 +15473,30 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +Bd +aD +aD +IJ +aD +aD +aD +aD +aD +aD +aD +aD +aD +aj aj -aw aj aj cM @@ -14745,31 +15729,31 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +YG +aD +aD +aD +aD +aD +aD +aD +aj +aj aj aj -aw -aw aj aj cM @@ -15002,31 +15986,31 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -ab +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +IJ +aD +aD +aD +aD +aD +aD +aj +aj aj aj aj -aw -aw aj aj cM @@ -15259,31 +16243,31 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +IJ +aD +aD +aD +aD +aD +aj +aj +aj +aj +ab ab -aj -aj -aj -aj -aD -aD aj ab cM @@ -15516,30 +16500,30 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +Na +aD +aD +aD +aD aj aj aj ab -aD -aD +ab +ab ab ab ab @@ -15772,30 +16756,30 @@ aj aj ab an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aj +aj +aD +aD +aD +aj +aj +aj +ab +ab ab -aj -aj -an -an -an -aj -aj -aw -aD -aD -aD ab ab ab @@ -16035,22 +17019,22 @@ aj aj aj aj -an -an -an -an -an +aD +aD +aD +aD +aD aj aj aj aj aj +aD +aD +aj +aj ab ab -aw -aw -aD -aD ab ab ab diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 32d9183cc54..67a66a06642 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -18931,8 +18931,8 @@ /area/hydroponics) "aWT" = ( /obj/machinery/light_switch{ - pixel_x = -4; - pixel_y = 30 + pixel_x = -6; + pixel_y = 38 }, /obj/structure/sink/kitchen{ name = "utility sink"; @@ -27978,7 +27978,7 @@ }, /obj/machinery/door/airlock/research{ name = "Xenobiology Lab"; - req_one_access_txt = "55, 9" + req_one_access_txt = "9;55" }, /obj/structure/cable, /turf/open/floor/plasteel/dark, @@ -34644,7 +34644,6 @@ /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner, /obj/machinery/light_switch{ pixel_y = -24 }, @@ -34652,6 +34651,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/reagent_containers/spray/cleaner, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bIh" = ( @@ -40857,6 +40861,14 @@ dir = 4 }, /obj/structure/cable, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 6 + }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "bWA" = ( diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index eb8d233d0e8..63e7a22d273 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -1090,7 +1090,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/service) "eQ" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 4 }, @@ -1168,7 +1168,7 @@ /turf/open/floor/plating, /area/engine/storage) "hY" = ( -/obj/structure/fluff/railing/corner, +/obj/structure/railing/corner, /turf/open/floor/plating, /area/hallway/secondary/service) "ij" = ( @@ -1192,7 +1192,7 @@ /area/hallway/secondary/service) "iH" = ( /obj/effect/turf_decal/stripes/white/line, -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 4 }, @@ -1216,8 +1216,7 @@ /turf/open/floor/plating, /area/engine/storage) "jD" = ( -/obj/structure/fluff/railing/corner{ - icon_state = "railing_corner"; +/obj/structure/railing/corner{ dir = 4 }, /turf/open/floor/plating, @@ -1312,12 +1311,18 @@ "qo" = ( /turf/open/openspace, /area/engine/storage) +"qx" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/construction) "qR" = ( /obj/effect/turf_decal/stripes/white/line{ icon_state = "warningline_white"; dir = 9 }, -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 1 }, @@ -1346,7 +1351,7 @@ /turf/open/floor/plating, /area/construction) "su" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 8 }, @@ -1357,7 +1362,7 @@ icon_state = "warningline_white"; dir = 4 }, -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 8 }, @@ -1447,11 +1452,11 @@ /turf/open/floor/plasteel, /area/construction) "zd" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 4 }, -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 8 }, @@ -1475,7 +1480,7 @@ /turf/open/floor/plating, /area/engine/storage) "Ai" = ( -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 8 }, @@ -1531,8 +1536,7 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "CP" = ( -/obj/structure/fluff/railing{ - icon_state = "railing"; +/obj/structure/railing{ dir = 8 }, /turf/open/floor/plating, @@ -1555,7 +1559,7 @@ /area/engine/storage) "Eb" = ( /obj/effect/turf_decal/stripes/white/line, -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 1 }, @@ -1608,8 +1612,7 @@ /turf/open/floor/plasteel, /area/storage/primary) "In" = ( -/obj/structure/fluff/railing{ - icon_state = "railing"; +/obj/structure/railing{ dir = 4 }, /turf/open/floor/plating, @@ -1619,8 +1622,8 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "IL" = ( -/obj/structure/fluff/railing/corner, -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner, +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 8 }, @@ -1668,7 +1671,7 @@ /turf/open/floor/plating, /area/maintenance/department/bridge) "Lu" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 4 }, @@ -1699,8 +1702,7 @@ /turf/open/floor/plating, /area/engine/storage) "Pm" = ( -/obj/structure/fluff/railing/corner{ - icon_state = "railing_corner"; +/obj/structure/railing/corner{ dir = 1 }, /turf/open/floor/plating, @@ -1744,8 +1746,7 @@ /turf/open/floor/plasteel, /area/construction) "Tf" = ( -/obj/structure/fluff/railing{ - icon_state = "railing"; +/obj/structure/railing{ dir = 1 }, /turf/open/floor/plating, @@ -1795,7 +1796,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/service) "XN" = ( -/obj/structure/fluff/railing, +/obj/structure/railing, /turf/open/floor/plating, /area/hallway/secondary/service) "XQ" = ( @@ -1809,6 +1810,10 @@ }, /turf/open/floor/plating, /area/hallway/secondary/service) +"Zv" = ( +/obj/structure/railing/corner, +/turf/open/floor/plating, +/area/construction) "ZH" = ( /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, @@ -2884,7 +2889,7 @@ dn dn dn dn -dn +Zv In jD dL @@ -2992,7 +2997,7 @@ dn dn dn dn -dn +qx CP Pm ij diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index a3e11abe7b6..e8a474161e7 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -2,5 +2,5 @@ "map_name": "MultiZ Debug", "map_path": "map_files/debug", "map_file": "multiz.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1, "Baseturf" : "/turf/open/openspace"}, {"Down": -1, "Baseturf" : "/turf/open/openspace"}] + "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}] } diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 1a2ed41c69e..c922a86887e 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -146,6 +146,8 @@ #define SPACE_HELM_MAX_TEMP_PROTECT 1500 /// what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. #define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 +/// The min cold protection of a space suit without the heater active +#define SPACE_SUIT_MIN_TEMP_PROTECT_OFF 72 #define SPACE_SUIT_MAX_TEMP_PROTECT 1500 /// Cold protection for firesuits diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm new file mode 100644 index 00000000000..128c9f19387 --- /dev/null +++ b/code/__DEFINES/dcs/flags.dm @@ -0,0 +1,41 @@ +/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// `parent` must not be modified if this is to be returned. +/// This will be noted in the runtime logs +#define COMPONENT_INCOMPATIBLE 1 +/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` +#define COMPONENT_NOTRANSFER 2 + +/// Return value to cancel attaching +#define ELEMENT_INCOMPATIBLE 1 + +// /datum/element flags +/// Causes the detach proc to be called when the host object is being deleted +#define ELEMENT_DETACH (1 << 0) +/** + * Only elements created with the same arguments given after `id_arg_index` share an element instance + * The arguments are the same when the text and number values are the same and all other values have the same ref + */ +#define ELEMENT_BESPOKE (1 << 1) + +// How multiple components of the exact same type are handled in the same datum +/// old component is deleted (default) +#define COMPONENT_DUPE_HIGHLANDER 0 +/// duplicates allowed +#define COMPONENT_DUPE_ALLOWED 1 +/// new component is deleted +#define COMPONENT_DUPE_UNIQUE 2 +/// old component is given the initialization args of the new +#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 +/// each component of the same type is consulted as to whether the duplicate should be allowed +#define COMPONENT_DUPE_SELECTIVE 5 + +//Redirection component init flags +#define REDIRECT_TRANSFER_WITH_TURF 1 + +//Arch +#define ARCH_PROB "probability" //Probability for each item +#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount + +//Ouch my toes! +#define CALTROP_BYPASS_SHOES 1 +#define CALTROP_IGNORE_WALKERS 2 diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm new file mode 100644 index 00000000000..144e94f1fe0 --- /dev/null +++ b/code/__DEFINES/dcs/helpers.dm @@ -0,0 +1,15 @@ +/// Used to trigger signals and call procs registered for that signal +/// The datum hosting the signal is automaticaly added as the first argument +/// Returns a bitfield gathered from all registered procs +/// Arguments given here are packaged in a list and given to _SendSignal +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) + +#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) + +/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments +#define AddElement(arguments...) _AddElement(list(##arguments)) +/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments +#define RemoveElement(arguments...) _RemoveElement(list(##arguments)) + +/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments +#define AddComponent(arguments...) _AddComponent(list(##arguments)) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/dcs/signals.dm similarity index 91% rename from code/__DEFINES/components.dm rename to code/__DEFINES/dcs/signals.dm index eed6589f7f2..08b31193143 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -1,438 +1,392 @@ -/// Used to trigger signals and call procs registered for that signal -/// The datum hosting the signal is automaticaly added as the first argument -/// Returns a bitfield gathered from all registered procs -/// Arguments given here are packaged in a list and given to _SendSignal -#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) - -#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) - -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. -/// `parent` must not be modified if this is to be returned. -/// This will be noted in the runtime logs -#define COMPONENT_INCOMPATIBLE 1 -/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` -#define COMPONENT_NOTRANSFER 2 - -/// Return value to cancel attaching -#define ELEMENT_INCOMPATIBLE 1 - -// /datum/element flags -/// Causes the detach proc to be called when the host object is being deleted -#define ELEMENT_DETACH (1 << 0) -/** - * Only elements created with the same arguments given after `id_arg_index` share an element instance - * The arguments are the same when the text and number values are the same and all other values have the same ref - */ -#define ELEMENT_BESPOKE (1 << 1) - -// How multiple components of the exact same type are handled in the same datum -/// old component is deleted (default) -#define COMPONENT_DUPE_HIGHLANDER 0 -/// duplicates allowed -#define COMPONENT_DUPE_ALLOWED 1 -/// new component is deleted -#define COMPONENT_DUPE_UNIQUE 2 -/// old component is given the initialization args of the new -#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 -/// each component of the same type is consulted as to whether the duplicate should be allowed -#define COMPONENT_DUPE_SELECTIVE 5 - -// All signals. Format: -// When the signal is called: (signal arguments) -// All signals send the source datum of the signal as the first argument - -// global signals -// These are signals which can be listened to by any component on any parent -// start global signals with "!", this used to be necessary but now it's just a formatting choice -/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) -#define COMSIG_GLOB_NEW_Z "!new_z" -/// called after a successful var edit somewhere in the world: (list/args) -#define COMSIG_GLOB_VAR_EDIT "!var_edit" -/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) -#define COMSIG_GLOB_EXPLOSION "!explosion" -/// mob was created somewhere : (mob) -#define COMSIG_GLOB_MOB_CREATED "!mob_created" -/// mob died somewhere : (mob , gibbed) -#define COMSIG_GLOB_MOB_DEATH "!mob_death" -/// global living say plug - use sparingly: (mob/speaker , message) -#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" -/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) -#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" - #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 -/// ingame button pressed (/obj/machinery/button/button) -#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed" - -// signals from globally accessible objects -/// from SSsun when the sun changes position : (azimuth) -#define COMSIG_SUN_MOVED "sun_moved" - -////////////////////////////////////////////////////////////////// - -// /datum signals -/// when a component is added to a datum: (/datum/component) -#define COMSIG_COMPONENT_ADDED "component_added" -/// before a component is removed from a datum because of RemoveComponent: (/datum/component) -#define COMSIG_COMPONENT_REMOVING "component_removing" -/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation -#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" -/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called -#define COMSIG_PARENT_QDELETING "parent_qdeleting" -/// generic topic handler (usr, href_list) -#define COMSIG_TOPIC "handle_topic" - -// /atom signals -#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) - #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called -#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) -#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) -#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) - //Positions for overrides list - #define EXAMINE_POSITION_ARTICLE 1 - #define EXAMINE_POSITION_BEFORE 2 - //End positions - #define COMPONENT_EXNAME_CHANGED 1 -#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () - #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 - #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 -#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) -#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) -#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) -#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) - #define COMPONENT_ATOM_BLOCK_EXIT 1 -#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) -#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) -#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) -#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) -#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) -#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/projectile, def_zone) -#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) -#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) -#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): (/mob/user) -#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity) -#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () -#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) -#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) -#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () - #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 -#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color) -#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities) -#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): () - #define COMPONENT_BLOCK_RADIATION 1 -#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength) - #define COMPONENT_BLOCK_CONTAMINATION 1 -#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) - #define COMPONENT_RAD_WAVE_HANDLED 1 -#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) - #define COMPONENT_BLOCK_REACH 1 -#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act" //from base of atom/wrench_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act" //from base of atom/multitool_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WELDER_ACT "atom_welder_act" //from base of atom/welder_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act" //from base of atom/wirecutter_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act" //from base of atom/crowbar_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act" //from base of atom/analyser_act(): (mob/living/user, obj/item/I) - #define COMPONENT_BLOCK_TOOL_ATTACK 1 -#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) - #define COMPONENT_BLOCK_TELEPORT 1 -#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers) -#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) -#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) -///////////////// -#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) -#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) -#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) - #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. -//This signal return value bitflags can be found in __DEFINES/misc.dm -#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) -#define COMSIG_ATOM_START_PULL "movable_start_pull" //called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force) -#define COMSIG_LIVING_START_PULL "living_start_pull" //called on /living when someone starts pulling it (atom/movable/puller, state, force) - -///////////////// - -#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) -#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) - -#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) -#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) - #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye. -#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) -#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) -#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) -#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) - #define COMPONENT_NO_MOUSEDROP 1 -#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) - -// /area signals -#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) -#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) - -// /turf signals -#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) -#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) -#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) - -// /atom/movable signals -#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) - #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 -#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) -#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) -#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) -#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) - #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 -#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) -#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) -#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) -#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) -#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) -#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) -#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args) - #define COMPONENT_CANCEL_THROW 1 -#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) -#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) -#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () -#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)) - #define HEARING_MESSAGE 1 - #define HEARING_SPEAKER 2 -// #define HEARING_LANGUAGE 3 - #define HEARING_RAW_MESSAGE 4 - /* #define HEARING_RADIO_FREQ 5 - #define HEARING_SPANS 6 - #define HEARING_MESSAGE_MODE 7 */ -#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) - -// /mob signals -#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) -#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) -#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) -#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A) -#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A) - #define COMSIG_MOB_CANCEL_CLICKON 1 - -#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj -#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) - #define COMPONENT_BLOCK_MAGIC 1 -#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () -#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of -#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) - #define COMPONENT_ITEM_NO_ATTACK 1 -#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) -#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) -#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) -#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) -#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) -#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) -#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () -#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () - #define COMPONENT_UPPERCASE_SPEECH 1 - // used to access COMSIG_MOB_SAY argslist - #define SPEECH_MESSAGE 1 - // #define SPEECH_BUBBLE_TYPE 2 - #define SPEECH_SPANS 3 - /* #define SPEECH_SANITIZE 4 - #define SPEECH_LANGUAGE 5 - #define SPEECH_IGNORE_SPAM 6 - #define SPEECH_FORCED 7 */ -#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) - #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 -#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () - -// /mob/living signals -#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) -#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) -#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) -#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) -#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () -#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) -#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) -#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) -#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) -#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) - -//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! -#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) - #define COMPONENT_NO_STUN 1 //For all of them -#define COMSIG_LIVING_CAN_TRACK "mob_cantrack" //from base of /mob/living/can_track(): (mob/user) - #define COMPONENT_CANT_TRACK 1 - -// /mob/living/carbon signals -#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) -#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) -#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) - -// /mob/living/simple_animal/hostile signals -#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" - #define COMPONENT_HOSTILE_NO_ATTACK 1 - -// /obj signals -#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) -#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) -#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //from base of code/game/machinery - -// /obj/machinery signals -#define COMSIG_MACHINERY_BROKEN "machinery_broken" //from /obj/machinery/obj_break(damage_flag): (damage_flag) -#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" //from base power_change() when power is lost -#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" //from base power_change() when power is restored - -// /obj/item signals -#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) -#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) - #define COMPONENT_NO_INTERACT 1 -#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) - #define COMPONENT_NO_ATTACK_OBJ 1 -#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) - #define COMPONENT_NO_ATTACK 1 -#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) -#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) -#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) -#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) -#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) -#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) -#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) - #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 -#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) -#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed) -#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) - - -// /obj/item/clothing signals -#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () - -// /obj/item/implant signals -#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () -#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) - #define COMPONENT_STOP_IMPLANTING 1 -#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) - //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both - #define COMPONENT_DELETE_NEW_IMPLANT 2 - #define COMPONENT_DELETE_OLD_IMPLANT 4 -#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) - //This uses all return values of COMSIG_IMPLANT_OTHER - -// /obj/item/pda signals -#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) - #define COMPONENT_STOP_RINGTONE_CHANGE 1 -#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" - #define COMPONENT_PDA_NO_DETONATE 1 - -// /obj/item/radio signals -#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) - -// /obj/item/pen signals -#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) - -// /obj/item/gun signals -#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override) - -// /obj/projectile signals (sent to the firer) -#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) -#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target) -#define COMSIG_PROJECTILE_FIRE "projectile_fire" // from the base of /obj/projectile/proc/fire(): () -#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles - -// /obj/mecha signals -#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to - -// /mob/living/carbon/human signals -#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) -#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) -#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set - -// /datum/species signals -#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) -#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) - -/*******Component Specific Signals*******/ -//Janitor -#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. -#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. -#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) - -//Creamed -#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength) - -//Food -#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) - -//Gibs -#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) - -//Mood -#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. -#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" //Mood event that only RnD members listen for -#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. - -//NTnet -#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) - -//Nanites -#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found -#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth -#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component -#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list -#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount -#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount -#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount -#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount -#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount -#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable -#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount -#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount -#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. -#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. -#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected -#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs -#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component - #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful - #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites -#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component - -// /datum/component/storage signals -#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. -#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool -#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. -#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool -#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool -#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) -#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! -#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. -#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. -#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool -#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. -#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) -#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool - -// /datum/action signals -#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) - #define COMPONENT_ACTION_BLOCK_TRIGGER 1 - -/*******Non-Signal Component Related Defines*******/ - -//Redirection component init flags -#define REDIRECT_TRANSFER_WITH_TURF 1 - -//Arch -#define ARCH_PROB "probability" //Probability for each item -#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount - -//Ouch my toes! -#define CALTROP_BYPASS_SHOES 1 -#define CALTROP_IGNORE_WALKERS 2 - -//Xenobio hotkeys -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) +// All signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +// global signals +// These are signals which can be listened to by any component on any parent +// start global signals with "!", this used to be necessary but now it's just a formatting choice +/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) +#define COMSIG_GLOB_NEW_Z "!new_z" +/// called after a successful var edit somewhere in the world: (list/args) +#define COMSIG_GLOB_VAR_EDIT "!var_edit" +/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) +#define COMSIG_GLOB_EXPLOSION "!explosion" +/// mob was created somewhere : (mob) +#define COMSIG_GLOB_MOB_CREATED "!mob_created" +/// mob died somewhere : (mob , gibbed) +#define COMSIG_GLOB_MOB_DEATH "!mob_death" +/// global living say plug - use sparingly: (mob/speaker , message) +#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" +/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) +#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" + #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 +/// ingame button pressed (/obj/machinery/button/button) +#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed" + +// signals from globally accessible objects +/// from SSsun when the sun changes position : (azimuth) +#define COMSIG_SUN_MOVED "sun_moved" + +////////////////////////////////////////////////////////////////// + +// /datum signals +/// when a component is added to a datum: (/datum/component) +#define COMSIG_COMPONENT_ADDED "component_added" +/// before a component is removed from a datum because of RemoveComponent: (/datum/component) +#define COMSIG_COMPONENT_REMOVING "component_removing" +/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation +#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" +/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called +#define COMSIG_PARENT_QDELETING "parent_qdeleting" +/// generic topic handler (usr, href_list) +#define COMSIG_TOPIC "handle_topic" + +// /atom signals +#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) + #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called +#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) +#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) + //Positions for overrides list + #define EXAMINE_POSITION_ARTICLE 1 + #define EXAMINE_POSITION_BEFORE 2 + //End positions + #define COMPONENT_EXNAME_CHANGED 1 +#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () + #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 + #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 +#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) +#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) +#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) +#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) + #define COMPONENT_ATOM_BLOCK_EXIT 1 +#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) +#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) +#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) +#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) +#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) +#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/projectile, def_zone) +#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) +#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) +#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): (/mob/user) +#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity) +#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () +#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) +#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) +#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () + #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color) +#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir) +#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted) +#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities) +#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): () + #define COMPONENT_BLOCK_RADIATION 1 +#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength) + #define COMPONENT_BLOCK_CONTAMINATION 1 +#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) + #define COMPONENT_RAD_WAVE_HANDLED 1 +#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) + #define COMPONENT_BLOCK_REACH 1 +#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act" //from base of atom/wrench_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act" //from base of atom/multitool_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WELDER_ACT "atom_welder_act" //from base of atom/welder_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act" //from base of atom/wirecutter_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act" //from base of atom/crowbar_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act" //from base of atom/analyser_act(): (mob/living/user, obj/item/I) + #define COMPONENT_BLOCK_TOOL_ATTACK 1 +#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) + #define COMPONENT_BLOCK_TELEPORT 1 +#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers) +#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) +#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) +///////////////// +#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) +#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) +#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) + #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +//This signal return value bitflags can be found in __DEFINES/misc.dm +#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) +#define COMSIG_ATOM_START_PULL "movable_start_pull" //called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force) +#define COMSIG_LIVING_START_PULL "living_start_pull" //called on /living when someone starts pulling it (atom/movable/puller, state, force) + +///////////////// + +#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) +#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) + +#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) +#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) + #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye. +#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) +#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) + #define COMPONENT_NO_MOUSEDROP 1 +#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) + +// /area signals +#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) +#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) + +// /turf signals +#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) +#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) +#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) + +// /atom/movable signals +#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) + #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 +#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) +#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) +#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) +#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) + #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 +#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) +#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) +#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) +#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) +#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) +#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) +#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args) + #define COMPONENT_CANCEL_THROW 1 +#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) +#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) +#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () +#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)) + #define HEARING_MESSAGE 1 + #define HEARING_SPEAKER 2 +// #define HEARING_LANGUAGE 3 + #define HEARING_RAW_MESSAGE 4 + /* #define HEARING_RADIO_FREQ 5 + #define HEARING_SPANS 6 + #define HEARING_MESSAGE_MODE 7 */ +#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) + +// /mob signals +#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) +#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) +#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) +#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A) +#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A) + #define COMSIG_MOB_CANCEL_CLICKON 1 + +#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj +#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) + #define COMPONENT_BLOCK_MAGIC 1 +#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () +#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of +#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) + #define COMPONENT_ITEM_NO_ATTACK 1 +#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) +#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) +#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) +#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) +#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () +#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () + #define COMPONENT_UPPERCASE_SPEECH 1 + // used to access COMSIG_MOB_SAY argslist + #define SPEECH_MESSAGE 1 + // #define SPEECH_BUBBLE_TYPE 2 + #define SPEECH_SPANS 3 + /* #define SPEECH_SANITIZE 4 + #define SPEECH_LANGUAGE 5 + #define SPEECH_IGNORE_SPAM 6 + #define SPEECH_FORCED 7 */ +#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) + #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 +#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () + +// /mob/living signals +#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) +#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) +#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) +#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) +#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" //sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) +#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) +#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) +#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) +#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) +#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) + +//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! +#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) + #define COMPONENT_NO_STUN 1 //For all of them +#define COMSIG_LIVING_CAN_TRACK "mob_cantrack" //from base of /mob/living/can_track(): (mob/user) + #define COMPONENT_CANT_TRACK 1 + +// /mob/living/carbon signals +#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) +#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) +#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) + +// /mob/living/simple_animal/hostile signals +#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" + #define COMPONENT_HOSTILE_NO_ATTACK 1 + +// /obj signals +#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) +#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) +#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //from base of code/game/machinery + +// /obj/machinery signals +#define COMSIG_MACHINERY_BROKEN "machinery_broken" //from /obj/machinery/obj_break(damage_flag): (damage_flag) +#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" //from base power_change() when power is lost +#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" //from base power_change() when power is restored + +// /obj/item signals +#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) +#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) + #define COMPONENT_NO_INTERACT 1 +#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) + #define COMPONENT_NO_ATTACK_OBJ 1 +#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) + #define COMPONENT_NO_ATTACK 1 +#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) +#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) +#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) +#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) +#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) +#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) +#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) +#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) + #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 +#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) +#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed) +#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) + + +// /obj/item/clothing signals +#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () +#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle" //from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit) + +// /obj/item/implant signals +#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () +#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) + #define COMPONENT_STOP_IMPLANTING 1 +#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) + //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both + #define COMPONENT_DELETE_NEW_IMPLANT 2 + #define COMPONENT_DELETE_OLD_IMPLANT 4 +#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) + //This uses all return values of COMSIG_IMPLANT_OTHER + +// /obj/item/pda signals +#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) + #define COMPONENT_STOP_RINGTONE_CHANGE 1 +#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" + #define COMPONENT_PDA_NO_DETONATE 1 + +// /obj/item/radio signals +#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) + +// /obj/item/pen signals +#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) + +// /obj/item/gun signals +#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override) + +// /obj/projectile signals (sent to the firer) +#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) +#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target) +#define COMSIG_PROJECTILE_FIRE "projectile_fire" // from the base of /obj/projectile/proc/fire(): () +#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles + +// /obj/mecha signals +#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to + +// /mob/living/carbon/human signals +#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) +#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) +#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set + +// /datum/species signals +#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) +#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) + +// /datum/song signals +#define COMSIG_SONG_START "song_start" //sent to the instrument when a song starts playing +#define COMSIG_SONG_END "song_end" //sent to the instrument when a song stops playing + +/*******Component Specific Signals*******/ +//Janitor +#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. +#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. +#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) + +//Creamed +#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength) + +//Food +#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) + +//Gibs +#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) + +//Mood +#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. +#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" //Mood event that only RnD members listen for +#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. + +//NTnet +#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) + +//Nanites +#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found +#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth +#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component +#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list +#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount +#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount +#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount +#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount +#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount +#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable +#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount +#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount +#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. +#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. +#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected +#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs +#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component + #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful + #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites +#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component + +// /datum/component/storage signals +#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. +#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool +#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. +#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool +#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool +#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) +#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! +#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. +#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. +#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool +#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. +#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) +#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool + +// /datum/action signals +#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) + #define COMPONENT_ACTION_BLOCK_TRIGGER 1 + +//Xenobio hotkeys +#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) +#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index f7430cfe273..dfb6a68c6a5 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,17 +1,7 @@ // simple is_type and similar inline helpers -#if DM_VERSION < 513 -#define islist(L) (istype(L, /list)) -#endif - #define in_range(source, user) (get_dist(source, user) <= 1 && (get_step(source, 0)?:z) == (get_step(user, 0)?:z)) -#if DM_VERSION < 513 -#define ismovableatom(A) (istype(A, /atom/movable)) -#else -#define ismovableatom(A) ismovable(A) -#endif - #define isatom(A) (isloc(A)) #define isweakref(D) (istype(D, /datum/weakref)) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 2f8039de9ba..e6c8211cb09 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -30,11 +30,7 @@ // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) -#if DM_VERSION < 513 -#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) -#else #define CLAMP(CLVALUE,CLMIN,CLMAX) clamp(CLVALUE, CLMIN, CLMAX) -#endif // Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive #define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ) @@ -43,12 +39,7 @@ #define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) // Tangent -#if DM_VERSION < 513 -#define TAN(x) (sin(x) / cos(x)) -#else #define TAN(x) tan(x) -#endif - // Cotangent #define COT(x) (1 / TAN(x)) diff --git a/code/__DEFINES/radiation.dm b/code/__DEFINES/radiation.dm index a56a648e878..2e734c1fb72 100644 --- a/code/__DEFINES/radiation.dm +++ b/code/__DEFINES/radiation.dm @@ -44,10 +44,8 @@ Ask ninjanomnom if they're around #define RAD_FULL_INSULATION 0 // Unused // WARNING: The defines below could have disastrous consequences if tweaked incorrectly. See: The great SM purge of Oct.6.2017 -// contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1)) // contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT #define RAD_MINIMUM_CONTAMINATION 350 // How strong does a radiation wave have to be to contaminate objects -#define RAD_CONTAMINATION_CHANCE_COEFFICIENT 0.01 // Higher means higher strength scaling contamination chance #define RAD_CONTAMINATION_STR_COEFFICIENT 0.25 // Higher means higher strength scaling contamination strength #define RAD_DISTANCE_COEFFICIENT 1 // Lower means further rad spread diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index bfba80a80cb..af6a9ac51b1 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -65,6 +65,7 @@ #define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange #define FREQ_SECURITY 1359 // Security comms frequency, red +#define FREQ_HOLOGRID_SOLUTION 1433 #define FREQ_STATUS_DISPLAYS 1435 #define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers #define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index ec5d9e155ae..ea11de883de 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -29,6 +29,7 @@ #define ROLE_HIVE "Hivemind Host" //Role removed, left here for safety. #define ROLE_OBSESSED "Obsessed" #define ROLE_SENTIENCE "Sentience Potion Spawn" +#define ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime" #define ROLE_MIND_TRANSFER "Mind Transfer Potion" #define ROLE_POSIBRAIN "Posibrain" #define ROLE_DRONE "Drone" diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index ab6268c2a8a..e61cb51ab77 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -24,5 +24,10 @@ #define GetSkillRef(A) (SSskills.all_skills[A]) //number defines -#define CLEAN_SKILL_BEAUTY_ADJUSTMENT 15//It's a denominator so no 0. Higher number = less cleaning xp per cleanable +#define CLEAN_SKILL_BEAUTY_ADJUSTMENT -15//It's a denominator so no 0. Higher number = less cleaning xp per cleanable. Negative value means cleanables with negative beauty give xp. #define CLEAN_SKILL_GENERIC_WASH_XP 1.5//Value. Higher number = more XP when cleaning non-cleanables (walls/floors/lips) + +#define MEDICAL_SKILL_EASY 3 //Cannot be 0 +#define MEDICAL_SKILL_MEDIUM (MEDICAL_SKILL_EASY*5) +#define MEDICAL_SKILL_ORGAN_FIX (MEDICAL_SKILL_MEDIUM*1.75) +#define MEDICAL_SKILL_ADVANCED (MEDICAL_SKILL_MEDIUM*2.5) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index c2b75a0bf0f..59a0a4c22a7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -95,7 +95,7 @@ #define STATUS_EFFECT_GO_AWAY /datum/status_effect/go_away //makes you launch through walls in a single direction for a while -#define STATUS_EFFECT_STASIS /datum/status_effect/incapacitating/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc +#define STATUS_EFFECT_STASIS /datum/status_effect/grouped/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc #define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus @@ -125,6 +125,10 @@ #define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic #define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor +// Grouped effect sources, see also code/__DEFINES/traits.dm + +#define STASIS_MACHINE_EFFECT "stasis_machine" + // Stasis helpers #define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS)) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index f00146d7848..299b829edec 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -157,6 +157,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOFLASH "noflash" //Makes you immune to flashes #define TRAIT_XENO_IMMUNE "xeno_immune"//prevents xeno huggies implanting skeletons #define TRAIT_NAIVE "naive" +#define TRAIT_GUNFLIP "gunflip" //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 7e52fbe2735..801a2cd4319 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -61,7 +61,7 @@ var/adjacencies = 0 var/atom/movable/AM - if(ismovableatom(A)) + if(ismovable(A)) AM = A if(AM.can_be_unanchored && !AM.anchored) return 0 diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index 8238a2e8af0..e96a5509f66 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -54,8 +54,9 @@ if(!GLOB.chemical_reactions_list) return for(var/reagent in GLOB.chemical_reactions_list) - for(var/datum/chemical_reaction/R in GLOB.chemical_reactions_list[reagent]) - if(R.id == id) + for(var/R in GLOB.chemical_reactions_list[reagent]) + var/datum/reac = R + if(reac.type == id) return R /proc/remove_chemical_reaction(datum/chemical_reaction/R) @@ -66,7 +67,7 @@ //see build_chemical_reactions_list in holder.dm for explanations /proc/add_chemical_reaction(datum/chemical_reaction/R) - if(!GLOB.chemical_reactions_list || !R.id || !R.required_reagents || !R.required_reagents.len) + if(!GLOB.chemical_reactions_list || !R.required_reagents || !R.required_reagents.len) return var/primary_reagent = R.required_reagents[1] if(!GLOB.chemical_reactions_list[primary_reagent]) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bb3a7136815..88f5d5130e8 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -445,15 +445,6 @@ Turf and target are separate in case you want to teleport some distance from a t var/y = min(world.maxy, max(1, A.y + dy)) return locate(x,y,A.z) -#if DM_VERSION > 513 -#warn 513 is definitely stable now, remove this -#endif -#if DM_VERSION < 513 -/proc/arctan(x) - var/y=arcsin(x/sqrt(1+x*x)) - return y -#endif - /* Gets all contents of contents and returns them all in a list. */ diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 15aa07c7b9d..b07bb6fdb84 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -32,31 +32,12 @@ #endif //Update this whenever you need to take advantage of more recent byond features -#define MIN_COMPILER_VERSION 512 -#if DM_VERSION < MIN_COMPILER_VERSION +#define MIN_COMPILER_VERSION 513 +#define MIN_COMPILER_BUILD 1493 +#if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. -#error You need version 512 or higher -#endif - -//Compatability -- These procs were added in 513.1493, not 513.1490 -//Which really shoulda bumped us up to 514 right then and there but instead Lummox is a dumb dumb -#if DM_BUILD < 1493 -#define length_char(args...) length(args) -#define text2ascii_char(args...) text2ascii(args) -#define copytext_char(args...) copytext(args) -#define splittext_char(args...) splittext(args) -#define spantext_char(args...) spantext(args) -#define nonspantext_char(args...) nonspantext(args) -#define findtext_char(args...) findtext(args) -#define findtextEx_char(args...) findtextEx(args) -#define findlasttext_char(args...) findlasttext(args) -#define findlasttextEx_char(args...) findlasttextEx(args) -#define replacetext_char(args...) replacetext(args) -#define replacetextEx_char(args...) replacetextEx(args) -// /regex procs -#define Find_char(args...) Find(args) -#define Replace_char(args...) Replace(args) +#error You need version 513.1493 or higher #endif //Additional code for the above flags. diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index c388a8a5713..f21bfce4c9f 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -38,7 +38,26 @@ GLOBAL_LIST_EMPTY(moth_wings_list) GLOBAL_LIST_EMPTY(moth_markings_list) GLOBAL_LIST_EMPTY(caps_list) -GLOBAL_LIST_INIT(color_list_ethereal, list("F Class(Green)" = "97ee63", "F2 Class (Light Green)" = "00fa9a", "F3 Class (Dark Green)" = "37835b", "M Class (Red)" = "9c3030", "M1 Class (Purple)" = "ee82ee", "G Class (Yellow)" = "fbdf56", "O Class (Blue)" = "3399ff", "A Class (Cyan)" = "00ffff")) +GLOBAL_LIST_INIT(color_list_ethereal, list( + "Red" = "ff4d4d", + "Faint Red" = "ffb3b3", + "Dark Red" = "9c3030", + "Orange" = "ffa64d", + "Burnt Orange" = "cc4400", + "Bright Yellow" = "ffff99", + "Dull Yellow" = "fbdf56", + "Faint Green" = "ddff99", + "Green" = "97ee63", + "Seafoam Green" = "00fa9a", + "Dark Green" = "37835b", + "Cyan Blue" = "00ffff", + "Faint Blue" = "b3d9ff", + "Blue" = "3399ff", + "Dark Blue" = "6666ff", + "Purple" = "ee82ee", + "Dark Fuschia" = "cc0066", + "Pink" = "ff99cc", + "White" = "f2f2f2",)) GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list( "ghost", diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 87dd36803df..d70564bc151 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -78,6 +78,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/geiger_counter = 1, /obj/item/analyzer = 1, /obj/item/mop = 1, + /obj/item/twohanded/broom = 1, /obj/item/reagent_containers/glass/bucket = 1, /obj/item/toy/crayon/spraycan = 1, ) = 1, diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 83ea9fefb6c..1fbfb67d821 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -97,7 +97,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, "TRAIT_NOFLASH" = TRAIT_NOFLASH, "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, - "TRAIT_NAIVE" = TRAIT_NAIVE + "TRAIT_NAIVE" = TRAIT_NAIVE, + "TRAIT_GUNFLIP" = TRAIT_GUNFLIP ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 0233a4e0274..4db5fbe9095 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -17,21 +17,6 @@ Therefore, the top right corner (except during admin shenanigans) is at "15,15" */ -//Lower left, persistent menu -#define ui_inventory "WEST:6,SOUTH:5" - -//Middle left indicators -#define ui_lingchemdisplay "WEST,CENTER-1:15" -#define ui_lingstingdisplay "WEST:6,CENTER-3:11" - -#define ui_devilsouldisplay "WEST:6,CENTER-1:15" - -//Lower center, persistent menu -#define ui_sstore1 "CENTER-5:10,SOUTH:5" -#define ui_id "CENTER-4:12,SOUTH:5" -#define ui_belt "CENTER-3:14,SOUTH:5" -#define ui_back "CENTER-2:14,SOUTH:5" - /proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) var/x_off = -(!(i % 2)) var/y_off = round((i-1) / 2) @@ -46,35 +31,22 @@ var/y_off = round((M.held_items.len-1) / 2) return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5" +//Lower left, persistent menu +#define ui_inventory "WEST:6,SOUTH:5" + +//Middle left indicators +#define ui_lingchemdisplay "WEST,CENTER-1:15" +#define ui_lingstingdisplay "WEST:6,CENTER-3:11" +#define ui_devilsouldisplay "WEST:6,CENTER-1:15" + +//Lower center, persistent menu +#define ui_sstore1 "CENTER-5:10,SOUTH:5" +#define ui_id "CENTER-4:12,SOUTH:5" +#define ui_belt "CENTER-3:14,SOUTH:5" +#define ui_back "CENTER-2:14,SOUTH:5" #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs -#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs -#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //borgs -#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs -#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs -#define ui_inv3 "CENTER :16,SOUTH:5" //borgs -#define ui_borg_module "CENTER+1:16,SOUTH:5" //borgs -#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs -#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs -#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs -#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" //borgs - -#define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey -#define ui_monkey_mask "CENTER-4:14,SOUTH:5" //monkey -#define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey -#define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey - -//#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien -#define ui_alien_language_menu "EAST-3:26,SOUTH:5" //alien - -#define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones -#define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones -#define ui_drone_storage "CENTER-2:14,SOUTH:5" //maintenance drones -#define ui_drone_head "CENTER-3:14,SOUTH:5" //maintenance drones - //Lower right, persistent menu #define ui_drop_throw "EAST-1:28,SOUTH+1:7" #define ui_above_movement "EAST-2:26,SOUTH+1:7" @@ -88,11 +60,6 @@ #define ui_language_menu "EAST-4:6,SOUTH:21" #define ui_skill_menu "EAST-4:22,SOUTH:5" -#define ui_borg_pull "EAST-2:26,SOUTH+1:7" -#define ui_borg_radio "EAST-1:28,SOUTH+1:7" -#define ui_borg_intents "EAST-2:26,SOUTH:5" - - //Upper-middle right (alerts) #define ui_alert1 "EAST-1:28,CENTER+5:27" #define ui_alert2 "EAST-1:28,CENTER+4:25" @@ -100,35 +67,69 @@ #define ui_alert4 "EAST-1:28,CENTER+2:21" #define ui_alert5 "EAST-1:28,CENTER+1:19" - //Middle right (status indicators) #define ui_healthdoll "EAST-1:28,CENTER-2:13" #define ui_health "EAST-1:28,CENTER-1:15" -#define ui_internal "EAST-1:28,CENTER:17" -#define ui_mood "EAST-1:28,CENTER-3:10" +#define ui_internal "EAST-1:28,CENTER-3:10" +#define ui_mood "EAST-1:28,CENTER:17" +#define ui_spacesuit "EAST-1:28,CENTER-4:10" -//living +//Pop-up inventory +#define ui_shoes "WEST+1:8,SOUTH:5" +#define ui_iclothing "WEST:6,SOUTH+1:7" +#define ui_oclothing "WEST+1:8,SOUTH+1:7" +#define ui_gloves "WEST+2:10,SOUTH+1:7" +#define ui_glasses "WEST:6,SOUTH+3:11" +#define ui_mask "WEST+1:8,SOUTH+2:9" +#define ui_ears "WEST+2:10,SOUTH+2:9" +#define ui_neck "WEST:6,SOUTH+2:9" +#define ui_head "WEST+1:8,SOUTH+3:11" + +//Generic living #define ui_living_pull "EAST-1:28,CENTER-3:15" -#define ui_living_health "EAST-1:28,CENTER:15" -#define ui_living_healthdoll "EAST-1:28,CENTER-2:13" +#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" -//borgs -#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. +//Monkeys +#define ui_monkey_head "CENTER-5:13,SOUTH:5" +#define ui_monkey_mask "CENTER-4:14,SOUTH:5" +#define ui_monkey_neck "CENTER-3:15,SOUTH:5" +#define ui_monkey_back "CENTER-2:16,SOUTH:5" -//aliens -#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. +//Drones +#define ui_drone_drop "CENTER+1:18,SOUTH:5" +#define ui_drone_pull "CENTER+2:2,SOUTH:5" +#define ui_drone_storage "CENTER-2:14,SOUTH:5" +#define ui_drone_head "CENTER-3:14,SOUTH:5" + +//Cyborgs +#define ui_borg_health "EAST-1:28,CENTER-1:15" +#define ui_borg_pull "EAST-2:26,SOUTH+1:7" +#define ui_borg_radio "EAST-1:28,SOUTH+1:7" +#define ui_borg_intents "EAST-2:26,SOUTH:5" +#define ui_borg_sensor "CENTER-3:16, SOUTH:5" +#define ui_borg_lamp "CENTER-4:16, SOUTH:5" +#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" +#define ui_inv1 "CENTER-2:16,SOUTH:5" +#define ui_inv2 "CENTER-1 :16,SOUTH:5" +#define ui_inv3 "CENTER :16,SOUTH:5" +#define ui_borg_module "CENTER+1:16,SOUTH:5" +#define ui_borg_store "CENTER+2:16,SOUTH:5" +#define ui_borg_camera "CENTER+3:21,SOUTH:5" +#define ui_borg_album "CENTER+4:21,SOUTH:5" +#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" + +//Aliens +#define ui_alien_health "EAST,CENTER-1:15" #define ui_alienplasmadisplay "EAST,CENTER-2:15" #define ui_alien_queen_finder "EAST,CENTER-3:15" +#define ui_alien_storage_r "CENTER+1:18,SOUTH:5" +#define ui_alien_language_menu "EAST-3:26,SOUTH:5" -//constructs +//Constructs #define ui_construct_pull "EAST,CENTER-2:15" -#define ui_construct_health "EAST,CENTER:15" //same as humans and slimes - -//slimes -#define ui_slime_health "EAST,CENTER:15" //same as humans and constructs +#define ui_construct_health "EAST,CENTER:15" // AI - #define ui_ai_core "SOUTH:6,WEST" #define ui_ai_camera_list "SOUTH:6,WEST+1" #define ui_ai_track_with_camera "SOUTH:6,WEST+2" @@ -148,7 +149,6 @@ #define ui_ai_add_multicam "SOUTH+1:6,WEST+14" // pAI - #define ui_pai_software "SOUTH:6,WEST" #define ui_pai_shell "SOUTH:6,WEST+1" #define ui_pai_chassis "SOUTH:6,WEST+2" @@ -163,21 +163,7 @@ #define ui_pai_take_picture "SOUTH:6,WEST+12" #define ui_pai_view_images "SOUTH:6,WEST+13" -//Pop-up inventory -#define ui_shoes "WEST+1:8,SOUTH:5" - -#define ui_iclothing "WEST:6,SOUTH+1:7" -#define ui_oclothing "WEST+1:8,SOUTH+1:7" -#define ui_gloves "WEST+2:10,SOUTH+1:7" - -#define ui_glasses "WEST:6,SOUTH+3:11" -#define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_ears "WEST+2:10,SOUTH+2:9" -#define ui_neck "WEST:6,SOUTH+2:9" -#define ui_head "WEST+1:8,SOUTH+3:11" - //Ghosts - #define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24" #define ui_ghost_orbit "SOUTH:6,CENTER-1:24" #define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index abcf107d202..a833d1c6859 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -57,6 +57,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/obj/screen/healths var/obj/screen/healthdoll var/obj/screen/internals + var/obj/screen/spacesuit // subtypes can override this to force a specific UI style var/ui_style @@ -101,6 +102,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healths = null healthdoll = null internals = null + spacesuit = null lingchemdisplay = null devilsouldisplay = null lingstingdisplay = null diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index fcdc69d4c1c..c2d0b0526ee 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -315,6 +315,10 @@ internals.hud = src infodisplay += internals + spacesuit = new /obj/screen/spacesuit + spacesuit.hud = src + infodisplay += spacesuit + healths = new /obj/screen/healths() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm index 277ea8b898a..9389d25f427 100644 --- a/code/_onclick/hud/lavaland_elite.dm +++ b/code/_onclick/hud/lavaland_elite.dm @@ -1,7 +1,7 @@ /datum/hud/lavaland_elite ui_style = 'icons/mob/screen_elite.dmi' -/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) +/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite/owner) ..() pull_icon = new /obj/screen/pull() @@ -11,6 +11,6 @@ pull_icon.hud = src static_inventory += pull_icon - healths = new /obj/screen/healths/lavaland_elite() - healths.hud = src - infodisplay += healths + healthdoll = new /obj/screen/healthdoll/lavaland_elite() + healthdoll.hud = src + infodisplay += healthdoll diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index d605995f489..84b91263dec 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -342,6 +342,11 @@ return C.update_action_buttons_icon() +/obj/screen/spacesuit + name = "Space suit cell status" + icon_state = "spacesuit_0" + screen_loc = ui_spacesuit + /obj/screen/mov_intent name = "run/walk toggle" icon = 'icons/mob/screen_midnight.dmi' @@ -406,7 +411,6 @@ var/mob/living/user = hud?.mymob if(!istype(user)) return - if(!user.resting) icon_state = "act_rest" else @@ -609,21 +613,19 @@ /obj/screen/healths/blob/naut/core name = "overmind health" - screen_loc = ui_health icon_state = "corehealth" + screen_loc = ui_health /obj/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' icon_state = "base" - screen_loc = ui_living_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/screen/healths/revenant name = "essence" icon = 'icons/mob/actions/backgrounds.dmi' icon_state = "bg_revenant" - screen_loc = ui_living_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/screen/healths/construct @@ -632,18 +634,6 @@ screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/slime - icon = 'icons/mob/screen_slime.dmi' - icon_state = "slime_health0" - screen_loc = ui_slime_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/lavaland_elite - icon = 'icons/mob/screen_elite.dmi' - icon_state = "elite_health0" - screen_loc = ui_living_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - /obj/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll @@ -658,6 +648,16 @@ screen_loc = ui_living_healthdoll var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update +/obj/screen/healthdoll/slime + icon = 'icons/mob/screen_slime.dmi' + icon_state = "slime_health0" + screen_loc = ui_living_healthdoll + +/obj/screen/healthdoll/lavaland_elite + icon = 'icons/mob/screen_elite.dmi' + icon_state = "elite_health0" + screen_loc = ui_living_healthdoll + /obj/screen/mood name = "mood" icon_state = "mood5" diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm index 46df28799bf..a70f2d32ef5 100644 --- a/code/_onclick/hud/slime.dm +++ b/code/_onclick/hud/slime.dm @@ -11,6 +11,6 @@ pull_icon.hud = src static_inventory += pull_icon - healths = new /obj/screen/healths/slime() - healths.hud = src - infodisplay += healths + healthdoll = new /obj/screen/healthdoll/slime() + healthdoll.hud = src + infodisplay += healthdoll diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 4dc647b8cea..589de62f61f 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -8,7 +8,7 @@ return // seems legit. // Things you might plausibly want to follow - if(ismovableatom(A)) + if(ismovable(A)) ManualFollow(A) // Otherwise jump diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index ac6ab78afb3..41eaba33c61 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -66,6 +66,8 @@ /datum/config_entry/flag/disable_peaceborg +/datum/config_entry/flag/disable_warops + /datum/config_entry/flag/economy //money money money money money money money money money money money money /datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors @@ -383,4 +385,8 @@ config_entry_value = 64 min_val = 0 +/datum/config_entry/number/maxfine + config_entry_value = 1000 + min_val = 0 + /datum/config_entry/flag/dynamic_config_enabled diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 811937deb13..210b3e8cacb 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -284,12 +284,6 @@ /datum/config_entry/flag/maprotation -/datum/config_entry/number/maprotatechancedelta - config_entry_value = 0.75 - min_val = 0 - max_val = 1 - integer = FALSE - /datum/config_entry/number/soft_popcap config_entry_value = null min_val = 0 diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 53c4b7fa311..8b068e5d675 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -7,22 +7,47 @@ PROCESSING_SUBSYSTEM_DEF(dcs) /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(datum/element/eletype, ...) +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) + var/datum/element/eletype = arguments[1] var/element_id = eletype - + + if(!ispath(eletype, /datum/element)) + CRASH("Attempted to instantiate [eletype] as a /datum/element") + if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - var/list/fullid = list("[eletype]") - for(var/i in initial(eletype.id_arg_index) to length(args)) - var/argument = args[i] - if(istext(argument) || isnum(argument)) - fullid += "[argument]" - else - fullid += "[REF(argument)]" - element_id = fullid.Join("&") - + element_id = GetIdFromArguments(arguments) + . = elements_by_type[element_id] if(.) return - if(!ispath(eletype, /datum/element)) - CRASH("Attempted to instantiate [eletype] as a /datum/element") . = elements_by_type[element_id] = new eletype + +/**** + * Generates an id for bespoke elements when given the argument list + * Generating the id here is a bit complex because we need to support named arguments + * Named arguments can appear in any order and we need them to appear after ordered arguments + * We assume that no one will pass in a named argument with a value of null + **/ +/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) + var/datum/element/eletype = arguments[1] + var/list/fullid = list("[eletype]") + var/list/named_arguments = list() + for(var/i in initial(eletype.id_arg_index) to length(arguments)) + var/key = arguments[i] + var/value + if(istext(key)) + value = arguments[key] + if(!(istext(key) || isnum(key))) + key = REF(key) + key = "[key]" // Key is stringified so numbers dont break things + if(!isnull(value)) + if(!(istext(value) || isnum(value))) + value = REF(value) + named_arguments["[key]"] = value + else + fullid += "[key]" + + if(length(named_arguments)) + named_arguments = sortList(named_arguments) + fullid += named_arguments + return list2params(fullid) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 54bbabdb005..dcb03dcf50b 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -338,7 +338,7 @@ SUBSYSTEM_DEF(persistence) var/datum/chemical_reaction/randomized/R = new randomized_type var/loaded = FALSE if(R.persistent && json) - var/list/recipe_data = json[R.id] + var/list/recipe_data = json[R.type] if(recipe_data) if(R.LoadOldRecipe(recipe_data) && (daysSince(R.created) <= R.persistence_period)) loaded = TRUE @@ -354,9 +354,8 @@ SUBSYSTEM_DEF(persistence) //asert globchems done for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) - var/datum/chemical_reaction/randomized/R = randomized_type - R = get_chemical_reaction(initial(R.id)) //ew, would be nice to add some simple tracking - if(R && R.persistent && R.id) + var/datum/chemical_reaction/randomized/R = get_chemical_reaction(randomized_type) //ew, would be nice to add some simple tracking + if(R && R.persistent) var/recipe_data = list() recipe_data["timestamp"] = R.created recipe_data["required_reagents"] = R.required_reagents @@ -365,7 +364,7 @@ SUBSYSTEM_DEF(persistence) recipe_data["is_cold_recipe"] = R.is_cold_recipe recipe_data["results"] = R.results recipe_data["required_container"] = "[R.required_container]" - file_data["[R.id]"] = recipe_data + file_data["[R.type]"] = recipe_data fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index ec8b243073e..019945b3d16 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -5,7 +5,7 @@ SUBSYSTEM_DEF(profiler) init_order = INIT_ORDER_PROFILER runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY wait = 3000 - flags = SS_NO_TICK_CHECK + flags = SS_NO_TICK_CHECK var/fetch_cost = 0 var/write_cost = 0 @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(profiler) return ..() /datum/controller/subsystem/profiler/proc/StartProfiling() -#if DM_BUILD < 1506 || DM_VERSION < 513 +#if DM_BUILD < 1506 stack_trace("Auto profiling unsupported on this byond version") CONFIG_SET(flag/auto_profile, FALSE) #else @@ -39,12 +39,12 @@ SUBSYSTEM_DEF(profiler) #endif /datum/controller/subsystem/profiler/proc/StopProfiling() -#if DM_BUILD >= 1506 && DM_VERSION >= 513 +#if DM_BUILD >= 1506 world.Profile(PROFILE_STOP) #endif /datum/controller/subsystem/profiler/proc/DumpFile() -#if DM_BUILD < 1506 || DM_VERSION < 513 +#if DM_BUILD < 1506 stack_trace("Auto profiling unsupported on this byond version") CONFIG_SET(flag/auto_profile, FALSE) #else diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index c687a3b20e0..17caad9b77e 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui) var/basehtml // The HTML base used for all UIs. /datum/controller/subsystem/tgui/PreInit() - basehtml = file2text('tgui-next/packages/tgui/public/tgui-main.html') + basehtml = file2text('tgui/packages/tgui/public/tgui.html') /datum/controller/subsystem/tgui/Shutdown() close_all_uis() diff --git a/code/datums/action.dm b/code/datums/action.dm index 7d9f5a5e593..cf98e7316e7 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -272,14 +272,29 @@ if(istype(H)) H.toggle_welding_screen(owner) -/datum/action/item_action/toggle_headphones - name = "Toggle Headphones" - desc = "UNTZ UNTZ UNTZ" +/datum/action/item_action/toggle_spacesuit + name = "Toggle Suit Thermal Regulator" + icon_icon = 'icons/mob/actions/actions_spacesuit.dmi' + button_icon_state = "thermal_off" -/datum/action/item_action/toggle_headphones/Trigger() - var/obj/item/clothing/ears/headphones/H = target - if(istype(H)) - H.toggle(owner) +/datum/action/item_action/toggle_spacesuit/New(Target) + . = ..() + RegisterSignal(target, COMSIG_SUIT_SPACE_TOGGLE, .proc/toggle) + +/datum/action/item_action/toggle_spacesuit/Destroy() + UnregisterSignal(target, COMSIG_SUIT_SPACE_TOGGLE) + return ..() + +/datum/action/item_action/toggle_spacesuit/Trigger() + var/obj/item/clothing/suit/space/suit = target + if(!istype(suit)) + return + suit.toggle_spacesuit() + +/// Toggle the action icon for the space suit thermal regulator +/datum/action/item_action/toggle_spacesuit/proc/toggle(obj/item/clothing/suit/space/suit) + button_icon_state = "thermal_[suit.thermal_on ? "on" : "off"]" + UpdateButtonIcon() /datum/action/item_action/toggle_unfriendly_fire name = "Toggle Friendly Fire \[ON\]" diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 8c21179b03a..57e968c4b5c 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -47,7 +47,7 @@ if(prob(2)) switch(rand(1,2)) if(1) - to_chat(owner, "...[lowertext(hypnotic_phrase)]...") + to_chat(owner, "...[lowertext(hypnotic_phrase)]...") if(2) new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase]") diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index f5a0d1134e8..2cf49b17548 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -264,3 +264,37 @@ ..() if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance)) owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) + +/datum/brain_trauma/severe/hypnotic_trigger + name = "Hypnotic Trigger" + desc = "Patient has a trigger phrase set in their subconscious that will trigger a suggestible trance-like state." + scan_desc = "oneiric feedback loop" + gain_text = "You feel odd, like you just forgot something important." + lose_text = "You feel like a weight was lifted from your mind." + random_gain = FALSE + var/trigger_phrase = "Nanotrasen" + +/datum/brain_trauma/severe/hypnotic_trigger/New(phrase) + ..() + if(phrase) + trigger_phrase = phrase + +/datum/brain_trauma/severe/hypnotic_trigger/on_lose() //hypnosis must be cleared separately, but brain surgery should get rid of both anyway + ..() + owner.remove_status_effect(/datum/status_effect/trance) + +/datum/brain_trauma/severe/hypnotic_trigger/handle_hearing(datum/source, list/hearing_args) + if(!owner.can_hear()) + return + if(owner == hearing_args[HEARING_SPEAKER]) + return + + var/regex/reg = new("(\\b[REGEX_QUOTE(trigger_phrase)]\\b)","ig") + + if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg)) + addtimer(CALLBACK(src, .proc/hypnotrigger), 10) //to react AFTER the chat message + hearing_args[HEARING_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_MESSAGE], "*********") + +/datum/brain_trauma/severe/hypnotic_trigger/proc/hypnotrigger() + to_chat(owner, "The words trigger something deep within you, and you feel your consciousness slipping away...") + owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index c743bf200da..c2c644fba41 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -120,6 +120,87 @@ user.visible_message("[user] [slip_in_message].", null, null, null, user) user.visible_message("[user] [slip_out_message].", "...and find your way to the other side.") +/datum/brain_trauma/special/quantum_alignment + name = "Quantum Alignment" + desc = "Patient is prone to frequent spontaneous quantum entanglement, against all odds, causing spatial anomalies." + scan_desc = "quantum alignment" + gain_text = "You feel faintly connected to everything around you..." + lose_text = "You no longer feel connected to your surroundings." + var/atom/linked_target = null + var/linked = FALSE + var/returning = FALSE + var/snapback_time = 0 + +/datum/brain_trauma/special/quantum_alignment/on_life() + if(linked) + if(QDELETED(linked_target)) + linked_target = null + linked = FALSE + else if(!returning && world.time > snapback_time) + start_snapback() + return + if(prob(4)) + try_entangle() + +/datum/brain_trauma/special/quantum_alignment/proc/try_entangle() + //Check for pulled mobs + if(ismob(owner.pulling)) + entangle(owner.pulling) + return + //Check for adjacent mobs + for(var/mob/living/L in oview(1, owner)) + if(owner.Adjacent(L)) + entangle(L) + return + //Check for pulled objects + if(isobj(owner.pulling)) + entangle(owner.pulling) + return + + //Check main hand + var/obj/item/held_item = owner.get_active_held_item() + if(held_item && !(HAS_TRAIT(held_item, TRAIT_NODROP))) + entangle(held_item) + return + + //Check off hand + held_item = owner.get_inactive_held_item() + if(held_item && !(HAS_TRAIT(held_item, TRAIT_NODROP))) + entangle(held_item) + return + + //Just entangle with the turf + entangle(get_turf(owner)) + +/datum/brain_trauma/special/quantum_alignment/proc/entangle(atom/target) + to_chat(owner, "You start feeling a strong sense of connection to [target].") + linked_target = target + linked = TRUE + snapback_time = world.time + rand(450, 6000) + +/datum/brain_trauma/special/quantum_alignment/proc/start_snapback() + if(QDELETED(linked_target)) + linked_target = null + linked = FALSE + return + to_chat(owner, "Your connection to [linked_target] suddenly feels extremely strong... you can feel it pulling you!") + owner.playsound_local(owner, 'sound/magic/lightning_chargeup.ogg', 75, FALSE) + returning = TRUE + addtimer(CALLBACK(src, .proc/snapback), 100) + +/datum/brain_trauma/special/quantum_alignment/proc/snapback() + returning = FALSE + if(QDELETED(linked_target)) + to_chat(owner, "The connection fades abruptly, and the pull with it.") + linked_target = null + linked = FALSE + return + to_chat(owner, "You're pulled through spacetime!") + do_teleport(owner, get_turf(linked_target), null, TRUE, channel = TELEPORT_CHANNEL_QUANTUM) + owner.playsound_local(owner, 'sound/magic/repulse.ogg', 100, FALSE) + linked_target = null + linked = FALSE + /datum/brain_trauma/special/psychotic_brawling name = "Violent Psychosis" desc = "Patient fights in unpredictable ways, ranging from helping his target to hitting them with brutal strength." diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 8a4c8f682ff..7a03d87fc4d 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -13,15 +13,15 @@ /// Defines how duplicate existing components are handled when added to a datum /// See `COMPONENT_DUPE_*` definitions for available options var/dupe_mode = COMPONENT_DUPE_HIGHLANDER - + /// The type to check for duplication /// `null` means exact match on `type` (default) /// Any other type means that and all subtypes var/dupe_type - + /// The datum this components belongs to var/datum/parent - + /// Only set to true if you are able to properly transfer this component /// At a minimum RegisterWithParent and UnregisterFromParent should be used /// Make sure you also implement PostTransfer for any post transfer handling @@ -34,14 +34,14 @@ * Arguments: * * datum/P the parent datum this component reacts to signals from */ -/datum/component/New(datum/P, ...) - parent = P - var/list/arguments = args.Copy(2) +/datum/component/New(list/raw_args) + parent = raw_args[1] + var/list/arguments = raw_args.Copy(2) if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE) qdel(src, TRUE, TRUE) - CRASH("Incompatible [type] assigned to a [P.type]! args: [json_encode(arguments)]") + CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") - _JoinParent(P) + _JoinParent(parent) /** * Called during component creation with the same arguments as in new excluding parent. @@ -361,7 +361,8 @@ * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it * Properly handles duplicate situations based on the `dupe_mode` var */ -/datum/proc/AddComponent(new_type, ...) +/datum/proc/_AddComponent(list/raw_args) + var/new_type = raw_args[1] var/datum/component/nt = new_type var/dm = initial(nt.dupe_mode) var/dt = initial(nt.dupe_type) @@ -376,7 +377,7 @@ new_comp = nt nt = new_comp.type - args[1] = src + raw_args[1] = src if(dm != COMPONENT_DUPE_ALLOWED) if(!dt) @@ -387,24 +388,25 @@ switch(dm) if(COMPONENT_DUPE_UNIQUE) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) old_comp.InheritComponent(new_comp, TRUE) QDEL_NULL(new_comp) if(COMPONENT_DUPE_HIGHLANDER) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) new_comp.InheritComponent(old_comp, FALSE) QDEL_NULL(old_comp) if(COMPONENT_DUPE_UNIQUE_PASSARGS) if(!new_comp) - var/list/arguments = args.Copy(2) - old_comp.InheritComponent(null, TRUE, arguments) + var/list/arguments = raw_args.Copy(2) + arguments.Insert(1, null, TRUE) + old_comp.InheritComponent(arglist(arguments)) else old_comp.InheritComponent(new_comp, TRUE) if(COMPONENT_DUPE_SELECTIVE) - var/list/arguments = args.Copy() + var/list/arguments = raw_args.Copy() arguments[1] = new_comp var/make_new_component = TRUE for(var/i in GetComponents(new_type)) @@ -414,11 +416,11 @@ QDEL_NULL(new_comp) break if(!new_comp && make_new_component) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) else if(!new_comp) - new_comp = new nt(arglist(args)) // There's a valid dupe mode but there's no old component, act like normal + new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal else if(!new_comp) - new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal + new_comp = new nt(raw_args) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) @@ -437,7 +439,7 @@ /datum/proc/LoadComponent(component_type, ...) . = GetComponent(component_type) if(!.) - return AddComponent(arglist(args)) + return _AddComponent(args) /** * Removes the component from parent, ends up with a null parent diff --git a/code/datums/components/beauty.dm b/code/datums/components/beauty.dm index 1be21cf0cb5..8d36cf0294b 100644 --- a/code/datums/components/beauty.dm +++ b/code/datums/components/beauty.dm @@ -2,13 +2,13 @@ var/beauty = 0 /datum/component/beauty/Initialize(beautyamount) - if(!ismovableatom(parent)) + if(!isatom(parent)) return COMPONENT_INCOMPATIBLE beauty = beautyamount RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/enter_area) RegisterSignal(parent, COMSIG_EXIT_AREA, .proc/exit_area) var/area/A = get_area(parent) - if(A) + if(A) enter_area(null, A) /datum/component/beauty/proc/enter_area(datum/source, area/A) diff --git a/code/datums/components/beetlejuice.dm b/code/datums/components/beetlejuice.dm index 2ae78ad3ac9..8df118565a3 100644 --- a/code/datums/components/beetlejuice.dm +++ b/code/datums/components/beetlejuice.dm @@ -10,7 +10,7 @@ var/regex/R /datum/component/beetlejuice/Initialize() - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE first_heard = list() diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 7dda2b1ac45..a187366c9b9 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -217,6 +217,16 @@ time = 40 category = CAT_ROBOT +/datum/crafting_recipe/Vibebot + name = "Vibebot" + result = /mob/living/simple_animal/bot/vibebot + reqs = list(/obj/item/light/bulb = 2, + /obj/item/bodypart/head/robot = 1, + /obj/item/assembly/prox_sensor = 1, + /obj/item/toy/crayon = 1) + time = 40 + category = CAT_ROBOT + /datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but name = "Pneumatic Cannon" result = /obj/item/pneumatic_cannon/ghetto diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm index bf52296e2cb..e2cca2eb50c 100644 --- a/code/datums/components/edit_complainer.dm +++ b/code/datums/components/edit_complainer.dm @@ -3,7 +3,7 @@ var/list/say_lines /datum/component/edit_complainer/Initialize(list/text) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE var/static/list/default_lines = list( diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 962e1d2080c..f5126ccc69d 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -5,15 +5,17 @@ var/light_impact_range = 2 var/flash_range = 3 var/equipped_slot //For items, lets us determine where things should be hit. + ///wheter we always delete. useful for nukes turned plasma and such, so they don't default delete and can survive + var/always_delete -/datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override) +/datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override, _always_delete = TRUE) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/explodable_attack) RegisterSignal(parent, COMSIG_TRY_STORAGE_INSERT, .proc/explodable_insert_item) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/detonate) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, .proc/explodable_impact) RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/explodable_bump) if(isitem(parent)) @@ -31,6 +33,7 @@ light_impact_range = light_impact_range_override if(flash_range_override) flash_range = flash_range_override + always_delete = _always_delete /datum/component/explodable/proc/explodable_insert_item(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE) check_if_detonate(I) @@ -105,6 +108,7 @@ if(light_impact_range < 1) log = FALSE explosion(A, devastation_range, heavy_impact_range, light_impact_range, flash_range, log) //epic explosion time - qdel(A) + if(always_delete) + qdel(A) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index 86e016784ad..a203264fae0 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -37,17 +37,16 @@ /datum/component/fantasy/UnregisterFromParent() unmodify() -/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments) +/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, quality, list/affixes, canFail, announce) unmodify() if(newComp) - quality += newComp.quality - canFail = newComp.canFail - announce = newComp.announce + src.quality += newComp.quality + src.canFail = newComp.canFail + src.announce = newComp.announce else - arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given - quality += arguments[1] - canFail = arguments[4] || canFail - announce = arguments[5] || announce + src.quality += quality + src.canFail = canFail || src.canFail + src.announce = announce || src.announce modify() /datum/component/fantasy/proc/randomQuality() diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index bf39c32f7d6..930c72d590f 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -13,7 +13,7 @@ expire_time = world.time + expire_in QDEL_IN(src, expire_in) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle) diff --git a/code/datums/components/knockback.dm b/code/datums/components/knockback.dm index 110c82ad068..7ff9caa6f4e 100644 --- a/code/datums/components/knockback.dm +++ b/code/datums/components/knockback.dm @@ -32,7 +32,7 @@ do_knockback(target, null, angle2dir(Angle)) /datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir) - if(!ismovableatom(target) || throw_dir == null) + if(!ismovable(target) || throw_dir == null) return var/atom/movable/throwee = target if(throwee.anchored && !throw_anchored) diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index 4defe936e5e..20cd8e1d78f 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -2,7 +2,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/crossed_react) RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/uncrossed_react) for(var/i in get_turf(parent)) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 9b5ae3572ba..b98fa8d87e8 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -192,15 +192,12 @@ ///Sets sanity to the specified amount and applies effects. /datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_GREAT, override = FALSE) - // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.5 + // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.7 // If the new amount would move towards the acceptable range faster then use it instead if(amount < minimum) - amount += CLAMP(minimum - sanity, 0, 0.7) - else - if(!override && HAS_TRAIT(parent, TRAIT_UNSTABLE)) - maximum = sanity - if(amount > maximum) - amount = min(maximum, sanity) + amount += clamp(minimum - amount, 0, 0.7) + if((!override && HAS_TRAIT(parent, TRAIT_UNSTABLE)) || amount > maximum) + amount = min(sanity, amount) if(amount == sanity) //Prevents stuff from flicking around. return sanity = amount diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index dc1e73dd264..64870dfca6d 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -101,11 +101,11 @@ host_mob = null return ..() -/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, list/arguments) +/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, amount, cloud) if(new_nanites) adjust_nanites(null, new_nanites.nanite_volume) else - adjust_nanites(null, arguments[1]) //just add to the nanite volume + adjust_nanites(null, amount) //just add to the nanite volume /datum/component/nanites/process() if(!IS_IN_STASIS(host_mob)) diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 44665479192..474d5049c5d 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -21,7 +21,7 @@ var/atom/target = parent target.orbiters = src - if(ismovableatom(target)) + if(ismovable(target)) tracker = new(target, CALLBACK(src, .proc/move_react)) /datum/component/orbiter/UnregisterFromParent() @@ -37,9 +37,9 @@ orbiters = null return ..() -/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments) - if(arguments) - begin_orbit(arglist(arguments)) +/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) + if(!newcomp) + begin_orbit(arglist(args.Copy(3))) return // The following only happens on component transfers orbiters += newcomp.orbiters diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 17105b0c5de..2bc2fc3c86b 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -17,7 +17,7 @@ var/turn_connects = TRUE /datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes - if(parent && !ismovableatom(parent)) + if(parent && !ismovable(parent)) return COMPONENT_INCOMPATIBLE var/atom/movable/AM = parent if(!AM.reagents) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index ed34ac90074..0b9b62eb7c6 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -18,7 +18,7 @@ hl3_release_date = _half_life can_contaminate = _can_contaminate - if(istype(parent, /atom)) + if(istype(parent, /atom)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine) if(istype(parent, /obj/item)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack) @@ -47,7 +47,7 @@ qdel(src) return PROCESS_KILL -/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, list/arguments) +/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, _strength, _source, _half_life, _can_contaminate) if(!i_am_original) return if(!hl3_release_date) // Permanently radioactive things don't get to grow stronger @@ -56,7 +56,7 @@ var/datum/component/radioactive/other = C strength = max(strength, other.strength) else - strength = max(strength, arguments[1]) + strength = max(strength, _strength) /datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing) var/atom/master = parent diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index ab5dd224733..e4faab361a6 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -54,11 +54,22 @@ handles linking back and forth. /datum/component/remote_materials/proc/_MakeLocal() silo = null - mat_container = parent.AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - local_size, - FALSE, - /obj/item/stack) + + var/static/list/allowed_mats = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + + mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, allowed_types=/obj/item/stack) /datum/component/remote_materials/proc/set_local_size(size) local_size = size diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index cfc5d4682d1..2bd1f1b938f 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -25,7 +25,7 @@ var/respect_mob_mobility = TRUE /datum/component/riding/Initialize() - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle) RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 97dd6e008bd..1a95ec16ef3 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -14,7 +14,7 @@ var/default_rotation_direction = ROTATION_CLOCKWISE /datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE //throw if no rotation direction is specificed ? diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 1482a26305f..285566edf98 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -17,7 +17,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_crossed) RegisterSignal(parent, COMSIG_ITEM_WEARERCROSSED, .proc/play_squeak_crossed) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 51d67e10e20..f8a7a4d44e4 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -5,7 +5,7 @@ var/allow_death = FALSE /datum/component/stationloving/Initialize(inform_admins = FALSE, allow_death = FALSE) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds) RegisterSignal(parent, list(COMSIG_MOVABLE_SECLUDED_LOCATION), .proc/relocate) @@ -16,13 +16,13 @@ src.allow_death = allow_death check_in_bounds() // Just in case something is being created outside of station/centcom -/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, list/arguments) +/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, inform_admins, allow_death) if (original) - if (istype(newc)) + if (newc) inform_admins = newc.inform_admins allow_death = newc.allow_death - else if (LAZYLEN(arguments)) - inform_admins = arguments[1] + else + inform_admins = inform_admins /datum/component/stationloving/proc/relocate() var/targetturf = find_safe_turf() diff --git a/code/datums/components/stationstuck.dm b/code/datums/components/stationstuck.dm index 5fd00d30119..b9027ef8115 100644 --- a/code/datums/components/stationstuck.dm +++ b/code/datums/components/stationstuck.dm @@ -15,11 +15,13 @@ stuck_zlevel = L.z -/datum/component/stationstuck/InheritComponent(datum/component/stationstuck/newc, original, list/arguments) - if(original) - if(istype(newc)) - murder = newc.murder - message = newc.message +/datum/component/stationstuck/InheritComponent(datum/component/stationstuck/newc, original, _murder, _message) + if(newc) + murder = newc.murder + message = newc.message + else + murder = _murder + message = _message /datum/component/stationstuck/proc/punish() var/mob/living/L = parent diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index c9d20f1f702..16ddc66280e 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -5,7 +5,7 @@ var/list/swarm_members = list() /datum/component/swarming/Initialize(max_x = 24, max_y = 24) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE offset_x = rand(-max_x, max_x) offset_y = rand(-max_y, max_y) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index ce397f9fea5..b745e740571 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -52,13 +52,13 @@ master.cut_overlay(overlay) return ..() -/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, list/arguments) +/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, _amount) if(!i_am_original) return if(newC) amount += newC.amount else - amount += arguments[1] + amount += _amount /datum/component/thermite/proc/thermite_melt(mob/user) var/turf/master = parent diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 715c20e4219..fd2a82ce042 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -12,9 +12,9 @@ var/permanent = FALSE var/last_process = 0 -/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, argslist) +/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, strength, duration_minimum, duration_add, duration_maximum, _permanent) if(!newcomp) //We are getting passed the arguments of a would-be new component, but not a new component - add_wet(arglist(argslist)) + add_wet(arglist(args.Copy(3))) else //We are being passed in a full blown component var/datum/component/wet_floor/WF = newcomp //Lets make an assumption if(WF.gc()) //See if it's even valid, still. Also does LAZYLEN and stuff for us. diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index bf510e0f56f..f74dcd0b6e1 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -36,16 +36,16 @@ //DATUM PROCS /// Finds the singleton for the element type given and attaches it to src -/datum/proc/AddElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) - args[1] = src - if(ele.Attach(arglist(args)) == ELEMENT_INCOMPATIBLE) - CRASH("Incompatible [eletype] assigned to a [type]! args: [json_encode(args)]") +/datum/proc/_AddElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) + arguments[1] = src + if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) + CRASH("Incompatible [arguments[1]] assigned to a [type]! args: [json_encode(args)]") /** * Finds the singleton for the element type given and detaches it from src * You only need additional arguments beyond the type if you're using ELEMENT_BESPOKE */ -/datum/proc/RemoveElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) +/datum/proc/_RemoveElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) ele.Detach(src) diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index 03c448c14a5..fa563129390 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -1,6 +1,6 @@ /datum/element/cleaning/Attach(datum/target) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/Clean) diff --git a/code/datums/elements/firestacker.dm b/code/datums/elements/firestacker.dm index 8d440f2ca68..928ca275205 100644 --- a/code/datums/elements/firestacker.dm +++ b/code/datums/elements/firestacker.dm @@ -10,7 +10,7 @@ /datum/element/firestacker/Attach(datum/target, amount) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE src.amount = amount diff --git a/code/datums/elements/snail_crawl.dm b/code/datums/elements/snail_crawl.dm index a3ce8213387..9352ab7beda 100644 --- a/code/datums/elements/snail_crawl.dm +++ b/code/datums/elements/snail_crawl.dm @@ -3,7 +3,7 @@ /datum/element/snailcrawl/Attach(datum/target) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE var/P if(iscarbon(target)) diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index a7a141afcbd..894d33455cb 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -2,7 +2,7 @@ /datum/element/waddling/Attach(datum/target) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE if(isliving(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/LivingWaddle) diff --git a/code/datums/keybinding/carbon.dm b/code/datums/keybinding/carbon.dm index e8059da5dd3..abf84c9aadf 100644 --- a/code/datums/keybinding/carbon.dm +++ b/code/datums/keybinding/carbon.dm @@ -6,8 +6,7 @@ return iscarbon(user.mob) /datum/keybinding/carbon/toggle_throw_mode - hotkey_keys = list("R") - classic_keys = list("Southwest") // END + hotkey_keys = list("R", "Southwest") // END name = "toggle_throw_mode" full_name = "Toggle throw mode" description = "Toggle throwing the current item or not." diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index 693b740513c..f194c7fd2fe 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -5,7 +5,6 @@ /datum/keybinding/mob/face_north hotkey_keys = list("CtrlW", "CtrlNorth") - classic_keys = list("CtrlNorth") name = "face_north" full_name = "Face North" description = "" @@ -18,7 +17,6 @@ /datum/keybinding/mob/face_east hotkey_keys = list("CtrlD", "CtrlEast") - classic_keys = list("CtrlEast") name = "face_east" full_name = "Face East" description = "" @@ -31,7 +29,6 @@ /datum/keybinding/mob/face_south hotkey_keys = list("CtrlS", "CtrlSouth") - classic_keys = list("CtrlSouth") name = "face_south" full_name = "Face South" description = "" @@ -43,7 +40,6 @@ /datum/keybinding/mob/face_west hotkey_keys = list("CtrlA", "CtrlWest") - classic_keys = list("CtrlWest") name = "face_west" full_name = "Face West" description = "" @@ -55,7 +51,6 @@ /datum/keybinding/mob/stop_pulling hotkey_keys = list("H", "Delete") - classic_keys = list("Delete") name = "stop_pulling" full_name = "Stop pulling" description = "" @@ -91,8 +86,7 @@ return TRUE /datum/keybinding/mob/swap_hands - hotkey_keys = list("X") - classic_keys = list("Northeast") // PAGEUP + hotkey_keys = list("X", "Northeast") // PAGEUP name = "swap_hands" full_name = "Swap hands" description = "" @@ -103,8 +97,7 @@ return TRUE /datum/keybinding/mob/activate_inhand - hotkey_keys = list("Z") - classic_keys = list("Southeast") // PAGEDOWN + hotkey_keys = list("Z", "Southeast") // PAGEDOWN name = "activate_inhand" full_name = "Activate in-hand" description = "Uses whatever item you have inhand" diff --git a/code/datums/keybinding/movement.dm b/code/datums/keybinding/movement.dm index c021ca928ed..ca199b5eb4d 100644 --- a/code/datums/keybinding/movement.dm +++ b/code/datums/keybinding/movement.dm @@ -4,28 +4,24 @@ /datum/keybinding/movement/north hotkey_keys = list("W", "North") - classic_keys = list("North") name = "North" full_name = "Move North" description = "Moves your character north" /datum/keybinding/movement/south hotkey_keys = list("S", "South") - classic_keys = list("South") name = "South" full_name = "Move South" description = "Moves your character south" /datum/keybinding/movement/west hotkey_keys = list("A", "West") - classic_keys = list("West") name = "West" full_name = "Move West" description = "Moves your character left" /datum/keybinding/movement/east hotkey_keys = list("D", "East") - classic_keys = list("East") name = "East" full_name = "Move East" description = "Moves your character east" diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 7ab9e3587f8..dc95d24ea37 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -89,12 +89,14 @@ /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D) if(D.stat || D.IsParalyzed()) return 0 + var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST) + var/armor_block = D.run_armor_check(affecting, "melee") D.visible_message("[A] leg sweeps [D]!", \ "Your legs are sweeped by [A]!", "You hear a sickening sound of flesh hitting flesh!", null, A) to_chat(A, "You leg sweep [D]!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - D.apply_damage(5, BRUTE) - D.Paralyze(40) + D.apply_damage(rand(20,30), STAMINA, affecting, armor_block) + D.Knockdown(60) log_combat(A, D, "leg sweeped") return 1 @@ -130,12 +132,14 @@ if(check_streak(A,D)) return 1 log_combat(A, D, "punched") + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") var/picked_hit_type = pick("punch", "kick") - var/bonus_damage = 10 + var/bonus_damage = 0 if(!(D.mobility_flags & MOBILITY_STAND)) bonus_damage += 5 picked_hit_type = "stomp" - D.apply_damage(bonus_damage, A.dna.species.attack_type) + D.apply_damage(rand(5,10) + bonus_damage, A.dna.species.attack_type, affecting, armor_block) if(picked_hit_type == "kick" || picked_hit_type == "stomp") A.do_attack_animation(D, ATTACK_EFFECT_KICK) playsound(get_turf(D), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) @@ -151,22 +155,27 @@ /datum/martial_art/krav_maga/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(check_streak(A,D)) return 1 - var/obj/item/I = null - if(prob(60)) - I = D.get_active_held_item() - if(I) - if(D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) - D.visible_message("[A] disarms [D]!", \ - "You're disarmed by [A]!", "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, A) - to_chat(A, "You disarm [D]!") - playsound(D, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - else - D.visible_message("[A] fails to disarm [D]!", \ - "You're nearly disarmed by [A]!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, A) - to_chat(A, "You fail to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - log_combat(A, D, "disarmed (Krav Maga)", "[I ? " removing \the [I]" : ""]") + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") + if((D.mobility_flags & MOBILITY_STAND)) + D.visible_message("[A] reprimands [D]!", \ + "You're slapped by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You jab [D]!") + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + D.apply_damage(rand(5,10), STAMINA, affecting, armor_block) + log_combat(A, D, "punched nonlethally") + if(!(D.mobility_flags & MOBILITY_STAND)) + D.visible_message("[A] reprimands [D]!", \ + "You're manhandled by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You stomp [D]!") + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + D.apply_damage(rand(10,15), STAMINA, affecting, armor_block) + log_combat(A, D, "stomped nonlethally") + if(prob(D.getStaminaLoss())) + D.visible_message("[D] sputters and recoils in pain!", "You recoil in pain as you are jabbed in a nerve!") + D.drop_all_held_items() return 1 //Krav Maga Gloves diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index b5ba7246967..5e5a2eaca34 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -41,7 +41,7 @@ Simple datum which is instanced once per type and is used for every object of sa source.name = "[name] [source.name]" if(beauty_modifier) - addtimer(CALLBACK(source, /datum.proc/AddComponent, /datum/component/beauty, beauty_modifier * amount), 0) + addtimer(CALLBACK(source, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty_modifier * amount)), 0) if(istype(source, /obj)) //objs on_applied_obj(source, amount, material_flags) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 2f86e777029..ccbcb6de65f 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -98,13 +98,13 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() - if(ismovableatom(source)) - source.AddElement(/datum/element/firestacker, 1) + if(ismovable(source)) + source.AddElement(/datum/element/firestacker, amount=1) source.AddComponent(/datum/component/explodable, 0, 0, amount / 2500, amount / 1250) /datum/material/plasma/on_removed(atom/source, material_flags) . = ..() - source.RemoveElement(/datum/element/firestacker, 1) + source.RemoveElement(/datum/element/firestacker, amount=1) qdel(source.GetComponent(/datum/component/explodable)) ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 189e41c5061..128346d7c37 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -19,6 +19,11 @@ /datum/mood_event/besthug/add_effects(mob/friend) description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!\n" +/datum/mood_event/warmhug + description = "Warm cozy hugs are the best!\n" + mood_change = 1 + timeout = 2 MINUTES + /datum/mood_event/arcade description = "I beat the arcade game!\n" mood_change = 3 @@ -165,11 +170,11 @@ description = "The bottle landing like that was satisfying.\n" mood_change = 2 timeout = 3 MINUTES - + /datum/mood_event/hope_lavaland description = "What a peculiar emblem. It makes me feel hopeful for my future.\n" mood_change = 5 - + /datum/mood_event/nanite_happiness description = "+++++++HAPPINESS ENHANCEMENT+++++++\n" mood_change = 7 diff --git a/code/datums/movement_detector.dm b/code/datums/movement_detector.dm index ff40d6bb1d9..d5df0184097 100644 --- a/code/datums/movement_detector.dm +++ b/code/datums/movement_detector.dm @@ -19,7 +19,7 @@ tracked = target src.listener = listener - while(ismovableatom(target)) + while(ismovable(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react) target = target.loc @@ -28,7 +28,7 @@ if(!tracked) return var/atom/movable/target = tracked - while(ismovableatom(target)) + while(ismovable(target)) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = target.loc @@ -41,12 +41,12 @@ if(oldloc && !isturf(oldloc)) var/atom/target = oldloc - while(ismovableatom(target)) + while(ismovable(target)) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = target.loc if(tracked.loc != newturf) var/atom/target = mover.loc - while(ismovableatom(target)) + while(ismovable(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE) target = target.loc diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 0acf4d19ecf..7781b0a3d44 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -368,17 +368,29 @@ /datum/mutation/human/extrastun name = "Two Left Feet" - desc = "A mutation that replaces the right foot with another left foot. It makes standing up after getting knocked down very difficult." + desc = "A mutation that replaces the right foot with another left foot. Symptoms include kissing the floor when taking a step." quality = NEGATIVE text_gain_indication = "Your right foot feels... left." text_lose_indication = "Your right foot feels alright." difficulty = 16 - var/stun_cooldown = 0 -/datum/mutation/human/extrastun/on_life() - if(world.time > stun_cooldown) - if(owner.AmountKnockdown() || owner.AmountStun()) - owner.SetKnockdown(owner.AmountKnockdown()*2) - owner.SetStun(owner.AmountStun()*2) - owner.visible_message("[owner] tries to stand up, but trips!", "You trip over your own feet!") - stun_cooldown = world.time + 300 +/datum/mutation/human/extrastun/on_acquiring() + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move) + +/datum/mutation/human/extrastun/on_losing() + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + +///Triggers on moved(). Randomly makes the owner trip +/datum/mutation/human/extrastun/proc/on_move() + if(prob(99.5)) //The brawl mutation + return + if(owner.buckled || owner.lying || !((owner.mobility_flags & (MOBILITY_STAND | MOBILITY_MOVE)) == (MOBILITY_STAND | MOBILITY_MOVE)) || owner.throwing || owner.movement_type & (VENTCRAWLING | FLYING | FLOATING)) + return //remove the 'edge' cases + to_chat(owner, "You trip over your own feet.") + owner.Knockdown(30) diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 7dae69c230e..b27b044ad2c 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -1,11 +1,21 @@ /datum/radiation_wave + /// The thing that spawned this radiation wave var/source - var/turf/master_turf //The center of the wave - var/steps=0 //How far we've moved - var/intensity //How strong it was originaly - var/range_modifier //Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc - var/move_dir //The direction of movement - var/list/__dirs //The directions to the side of the wave, stored for easy looping + /// The center of the wave + var/turf/master_turf + /// How far we've moved + var/steps=0 + /// How strong it was originaly + var/intensity + /// How much contaminated material it still has + var/remaining_contam + /// Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc + var/range_modifier + /// The direction of movement + var/move_dir + /// The directions to the side of the wave, stored for easy looping + var/list/__dirs + /// Whether or not this radiation wave can create contaminated objects var/can_contaminate /datum/radiation_wave/New(atom/_source, dir, _intensity=0, _range_modifier=RAD_DISTANCE_COEFFICIENT, _can_contaminate=TRUE) @@ -20,6 +30,7 @@ __dirs+=turn(dir, -90) intensity = _intensity + remaining_contam = intensity range_modifier = _range_modifier can_contaminate = _can_contaminate @@ -47,9 +58,7 @@ if(strength= RAD_MINIMUM_CONTAMINATION + var/contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT + contamination_strength = max(contamination_strength, RAD_BACKGROUND_RADIATION) + // It'll never reach 100% chance but the further out it gets the more likely it'll contaminate + var/contamination_chance = 100 - (90 / (1 + steps * 0.1)) + for(var/k in atoms) + var/atom/thing = k + if(QDELETED(thing)) continue thing.rad_act(strength) @@ -110,10 +123,18 @@ /obj/item/implant, /obj/singularity )) - if(!can_contaminate || blacklisted[thing.type]) + if(!can_contaminate || !can_contam || blacklisted[thing.type]) continue - if(prob(contamination_chance)) // Only stronk rads get to have little baby rads - if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) - continue - var/rad_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT - thing.AddComponent(/datum/component/radioactive, rad_strength, source) + if(thing.rad_flags & RAD_NO_CONTAMINATE || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) + continue + + if(contamination_strength > remaining_contam) + contamination_strength = remaining_contam + if(!prob(contamination_chance)) + continue + if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) + continue + remaining_contam -= contamination_strength + if(remaining_contam < RAD_BACKGROUND_RADIATION) + can_contaminate = FALSE + thing.AddComponent(/datum/component/radioactive, contamination_strength, source) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index d3465ca1476..880b4d709e7 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -295,3 +295,10 @@ description = "Well wish you luck." allow_duplicates = FALSE unpickable = TRUE + +/datum/map_template/ruin/space/hellfactory + id = "hellfactory" + suffix = "hellfactory.dmm" + name = "Heck Brewery" + description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive." + diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 51794087288..6bb0bc4b6e9 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -98,43 +98,42 @@ icon_state = "asleep" //STASIS -/datum/status_effect/incapacitating/stasis - id = "stasis" - duration = -1 - tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/stasis - var/last_dead_time +/datum/status_effect/grouped/stasis + id = "stasis" + duration = -1 + tick_interval = 10 + alert_type = /obj/screen/alert/status_effect/stasis + var/last_dead_time -/datum/status_effect/incapacitating/stasis/proc/update_time_of_death() - if(last_dead_time) - var/delta = world.time - last_dead_time - var/new_timeofdeath = owner.timeofdeath + delta - owner.timeofdeath = new_timeofdeath - owner.tod = station_time_timestamp(wtime=new_timeofdeath) - last_dead_time = null - if(owner.stat == DEAD) - last_dead_time = world.time +/datum/status_effect/grouped/stasis/proc/update_time_of_death() + if(last_dead_time) + var/delta = world.time - last_dead_time + var/new_timeofdeath = owner.timeofdeath + delta + owner.timeofdeath = new_timeofdeath + owner.tod = station_time_timestamp(wtime=new_timeofdeath) + last_dead_time = null + if(owner.stat == DEAD) + last_dead_time = world.time -/datum/status_effect/incapacitating/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) - . = ..() - update_time_of_death() - owner.reagents?.end_metabolization(owner, FALSE) +/datum/status_effect/grouped/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) + . = ..() + if(.) + update_time_of_death() + owner.reagents?.end_metabolization(owner, FALSE) + owner.update_mobility() -/datum/status_effect/incapacitating/stasis/tick() - update_time_of_death() +/datum/status_effect/grouped/stasis/tick() + update_time_of_death() -/datum/status_effect/incapacitating/stasis/on_remove() - update_time_of_death() - return ..() - -/datum/status_effect/incapacitating/stasis/be_replaced() - update_time_of_death() - return ..() +/datum/status_effect/grouped/stasis/on_remove() + owner.update_mobility() + update_time_of_death() + return ..() /obj/screen/alert/status_effect/stasis - name = "Stasis" - desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." - icon_state = "stasis" + name = "Stasis" + desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." + icon_state = "stasis" //GOLEM GANG diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 112d17c4e72..891102a291d 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -63,6 +63,9 @@ owner = null qdel(src) +/datum/status_effect/proc/before_remove() //! Called before being removed; returning FALSE will cancel removal + return TRUE + /datum/status_effect/proc/refresh() var/original_duration = initial(duration) if(original_duration == -1) @@ -107,12 +110,13 @@ S1 = new effect(arguments) . = S1 -/mob/living/proc/remove_status_effect(effect) //removes all of a given status effect from this mob, returning TRUE if at least one was removed +/mob/living/proc/remove_status_effect(effect, ...) //removes all of a given status effect from this mob, returning TRUE if at least one was removed . = FALSE + var/list/arguments = args.Copy(2) if(status_effects) var/datum/status_effect/S1 = effect for(var/datum/status_effect/S in status_effects) - if(initial(S1.id) == S.id) + if(initial(S1.id) == S.id && S.before_remove(arguments)) qdel(S) . = TRUE @@ -238,3 +242,22 @@ owner.underlays -= status_underlay QDEL_NULL(status_overlay) return ..() + +/// Status effect from multiple sources, when all sources are removed, so is the effect +/datum/status_effect/grouped + status_type = STATUS_EFFECT_MULTIPLE //! Adds itself to sources and destroys itself if one exists already, there are never multiple + var/list/sources = list() + +/datum/status_effect/grouped/on_creation(mob/living/new_owner, source) + var/datum/status_effect/grouped/existing = new_owner.has_status_effect(type) + if(existing) + existing.sources |= source + qdel(src) + return FALSE + else + sources |= source + return ..() + +/datum/status_effect/grouped/before_remove(source) + sources -= source + return !length(sources) diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 853587888ff..c69d13d1792 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -128,7 +128,7 @@ /datum/quirk/phobia/post_add() var/mob/living/carbon/human/H = quirk_holder - H.gain_trauma(new /datum/brain_trauma/mild/phobia(H.client.prefs.phobia), TRAUMA_RESILIENCE_ABSOLUTE) + H.gain_trauma(new /datum/brain_trauma/mild/phobia(H.client?.prefs.phobia), TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/phobia/remove() var/mob/living/carbon/human/H = quirk_holder diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index da0ee2cfadc..9f171b15a3a 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -419,3 +419,13 @@ /area/ruin/space/has_grav/powered/ancient_shuttle name = "Ancient Shuttle" icon_state = "yellow" + +//HELL'S FACTORY OPERATING FACILITY +/area/ruin/space/has_grav/hellfactory + name = "Hell Factory" + icon_state = "yellow" + +/area/ruin/space/has_grav/hellfactoryoffice + name = "Hell Factory Office" + icon_state = "red" + noteleport = TRUE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1913399760f..f5845c25252 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -337,7 +337,7 @@ reagents = new() reagents.reagent_list.Add(A) reagents.conditional_update() - else if(ismovableatom(A)) + else if(ismovable(A)) var/atom/movable/M = A if(isliving(M.loc)) var/mob/living/L = M.loc @@ -889,7 +889,7 @@ /atom/vv_get_dropdown() . = ..() VV_DROPDOWN_OPTION("", "---------") - if(!ismovableatom(src)) + if(!ismovable(src)) var/turf/curturf = get_turf(src) if(curturf) . += "" diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 56d031f30a0..334e0447855 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -133,7 +133,6 @@ name = "Syndicate Leader - Basic" id = /obj/item/card/id/syndicate/nuke_leader gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus - r_hand = /obj/item/nuclear_challenge command_radio = TRUE /datum/outfit/syndicate/no_crystals diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 84dbcf8f59e..c515e9798b6 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -166,6 +166,12 @@ return 1 return 0 +/datum/objective_item/steal/blackbox + name = "The Blackbox." + targetitem = /obj/item/blackbox + difficulty = 10 + excludefromjob = list("Chief Engineer","Station Engineer","Atmospheric Technician") + //Unique Objectives /datum/objective_item/unique/docs_red name = "the \"Red\" secret documents." diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 32cf77212bf..8179e7f227c 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -48,23 +48,24 @@ ) /obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, - /datum/material/glass, - /datum/material/gold, - /datum/material/silver, - /datum/material/diamond, - /datum/material/uranium, - /datum/material/plasma, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/runite, - /datum/material/plastic, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/wood - ), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) + var/static/list/allowed_types = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/gold, + /datum/material/silver, + /datum/material/diamond, + /datum/material/uranium, + /datum/material/plasma, + /datum/material/bluespace, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/runite, + /datum/material/plastic, + /datum/material/adamantine, + /datum/material/mythril, + /datum/material/wood, + ) + AddComponent(/datum/component/material_container, allowed_types, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e3ab9d96c58..2873cd670dc 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -17,7 +17,6 @@ //Sorting Variables var/sortBy = "name" var/order = 1 // -1 = Descending - 1 = Ascending - var/maxFine = 1000 light_color = LIGHT_COLOR_RED @@ -730,18 +729,19 @@ What a mess.*/ GLOB.data_core.removeMajorCrime(active1.fields["id"], href_list["cdataid"]) if("citation_add") if(istype(active1, /datum/data/record)) + var/maxFine = CONFIG_GET(number/maxfine) + var/t1 = stripped_input(usr, "Please input citation crime:", "Secure. records", "", null) - var/fine = FLOOR(input(usr, "Please input citation fine:", "Secure. records", 50) as num|null, 1) + var/fine = FLOOR(input(usr, "Please input citation fine, up to [maxFine]:", "Secure. records", 50) as num|null, 1) if (isnull(fine)) return + fine = min(fine, maxFine) if(fine < 0) to_chat(usr, "You're pretty sure that's not how money works.") return - fine = min(fine, maxFine) - if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 9b59c5c5df1..addce4d0be1 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -452,7 +452,9 @@ return ..() /obj/structure/firelock_frame/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if((constructionStep == CONSTRUCTION_NOCIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) + if(the_rcd.mode == RCD_DECONSTRUCT) + return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) + else if((constructionStep == CONSTRUCTION_NOCIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) return FALSE @@ -464,6 +466,10 @@ constructionStep = CONSTRUCTION_GUTTED update_icon() return TRUE + else if(RCD_DECONSTRUCT) + to_chat(user, "You deconstruct [src].") + qdel(src) + return TRUE return FALSE /obj/structure/firelock_frame/heavy diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm new file mode 100644 index 00000000000..ff8f1698d65 --- /dev/null +++ b/code/game/machinery/hypnochair.dm @@ -0,0 +1,206 @@ +/obj/machinery/hypnochair + name = "enhanced interrogation chamber" + desc = "A device used to perform \"enhanced interrogation\" through invasive mental conditioning." + icon = 'icons/obj/machines/implantchair.dmi' + icon_state = "hypnochair" + circuit = /obj/item/circuitboard/machine/hypnochair + density = TRUE + opacity = 0 + ui_x = 375 + ui_y = 480 + var/mob/living/carbon/victim = null ///Keeps track of the victim to apply effects if it teleports away + var/interrogating = FALSE ///Is the device currently interrogating someone? + var/start_time = 0 ///Time when the interrogation was started, to calculate effect in case of interruption + var/trigger_phrase = "" ///Trigger phrase to implant + var/timerid = 0 ///Timer ID for interrogations + + var/message_cooldown = 0 ///Cooldown for breakout message + +/obj/machinery/hypnochair/Initialize() + . = ..() + open_machine() + update_icon() + +/obj/machinery/hypnochair/attackby(obj/item/I, mob/user, params) + if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I)) + update_icon() + return + + if(default_pry_open(I)) + return + + if(default_deconstruction_crowbar(I)) + return + + return ..() + +/obj/machinery/hypnochair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "hypnochair", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/hypnochair/ui_data() + var/list/data = list() + data["occupied"] = occupant ? 1 : 0 + data["open"] = state_open + data["interrogating"] = interrogating + + data["occupant"] = list() + if(occupant) + var/mob/living/mob_occupant = occupant + data["occupant"]["name"] = mob_occupant.name + data["occupant"]["stat"] = mob_occupant.stat + + data["trigger"] = trigger_phrase + + return data + +/obj/machinery/hypnochair/ui_act(action, params) + if(..()) + return + switch(action) + if("door") + if(state_open) + close_machine() + else + if(!interrogating) + open_machine() + . = TRUE + if("set_phrase") + set_phrase(params["phrase"]) + . = TRUE + if("interrogate") + if(!interrogating) + interrogate() + else + interrupt_interrogation() + . = TRUE + +/obj/machinery/hypnochair/proc/set_phrase(phrase) + trigger_phrase = phrase + +/obj/machinery/hypnochair/proc/interrogate() + if(!trigger_phrase) + playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + return + var/mob/living/carbon/C = occupant + if(!istype(C)) + playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + return + victim = C + if(!(C.get_eye_protection() > 0)) + to_chat(C, "Strobing coloured lights assault you relentlessly! You're losing your ability to think straight!") + C.become_blind("hypnochair") + ADD_TRAIT(C, TRAIT_DEAF, "hypnochair") + interrogating = TRUE + START_PROCESSING(SSobj, src) + start_time = world.time + update_icon() + timerid = addtimer(CALLBACK(src, .proc/finish_interrogation), 450, TIMER_STOPPABLE) + +/obj/machinery/hypnochair/process() + var/mob/living/carbon/C = occupant + if(!istype(C) || C != victim) + interrupt_interrogation() + return + if(prob(10) && !(C.get_eye_protection() > 0)) + to_chat(C, "[pick(\ + "...blue... red... green... blue, red, green, blueredgreenblueredgreen",\ + "...pretty colors...",\ + "...you keep hearing words, but you can't seem to understand them...",\ + "...so peaceful...",\ + "...an annoying buzz in your ears..."\ + )]") + +/obj/machinery/hypnochair/proc/finish_interrogation() + interrogating = FALSE + STOP_PROCESSING(SSobj, src) + update_icon() + var/temp_trigger = trigger_phrase + trigger_phrase = "" //Erase evidence, in case the subject is able to look at the panel afterwards + audible_message("[src] pings!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + + if(QDELETED(victim) || victim != occupant) + victim = null + return + victim.cure_blind("hypnochair") + REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair") + if(!(victim.get_eye_protection() > 0)) + victim.cure_trauma_type(/datum/brain_trauma/severe/hypnotic_trigger, TRAUMA_RESILIENCE_SURGERY) + if(prob(90)) + victim.gain_trauma(new /datum/brain_trauma/severe/hypnotic_trigger(temp_trigger), TRAUMA_RESILIENCE_SURGERY) + else + victim.gain_trauma(new /datum/brain_trauma/severe/hypnotic_stupor(), TRAUMA_RESILIENCE_SURGERY) + victim = null + +/obj/machinery/hypnochair/proc/interrupt_interrogation() + deltimer(timerid) + interrogating = FALSE + STOP_PROCESSING(SSobj, src) + update_icon() + + if(QDELETED(victim)) + victim = null + return + victim.cure_blind("hypnochair") + REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair") + if(!(victim.get_eye_protection() > 0)) + var/time_diff = world.time - start_time + switch(time_diff) + if(0 to 100) + victim.confused += 10 + victim.Dizzy(100) + victim.blur_eyes(5) + if(101 to 200) + victim.confused += 15 + victim.Dizzy(200) + victim.blur_eyes(10) + if(prob(25)) + victim.apply_status_effect(/datum/status_effect/trance, rand(50,150), FALSE) + if(201 to INFINITY) + victim.confused += 20 + victim.Dizzy(300) + victim.blur_eyes(15) + if(prob(65)) + victim.apply_status_effect(/datum/status_effect/trance, rand(50,150), FALSE) + victim = null + +/obj/machinery/hypnochair/update_icon_state() + icon_state = initial(icon_state) + if(state_open) + icon_state += "_open" + if(occupant) + if(interrogating) + icon_state += "_active" + else + icon_state += "_occupied" + +/obj/machinery/hypnochair/container_resist(mob/living/user) + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message("You see [user] kicking against the door of [src]!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(600)].)", \ + "You hear a metallic creaking from [src].") + if(do_after(user,(600), target = src)) + if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) + return + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") + open_machine() + +/obj/machinery/hypnochair/relaymove(mob/user) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") + +/obj/machinery/hypnochair/MouseDrop_T(mob/target, mob/user) + if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser()) + return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return + close_machine(target) + diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm new file mode 100644 index 00000000000..1182440f2d0 --- /dev/null +++ b/code/game/machinery/medipen_refiller.dm @@ -0,0 +1,96 @@ +/obj/machinery/medipen_refiller + name = "Medipen Refiller" + desc = "A machine that refills used medipens with chemicals." + icon = 'icons/obj/machines/medipen_refiller.dmi' + icon_state = "medipen_refiller" + density = TRUE + circuit = /obj/item/circuitboard/machine/medipen_refiller + idle_power_usage = 100 + /// list of medipen subtypes it can refill + var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine, + /obj/item/reagent_containers/hypospray/medipen/atropine = /datum/reagent/medicine/atropine, + /obj/item/reagent_containers/hypospray/medipen/salbutamol = /datum/reagent/medicine/salbutamol, + /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone, + /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid, + /obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid) + /// var to prevent glitches in the animation + var/busy = FALSE + +/obj/machinery/medipen_refiller/Initialize() + . = ..() + create_reagents(100, TRANSPARENT) + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + reagents.maximum_volume += 100 * B.rating + AddComponent(/datum/component/plumbing/simple_demand) + + +/obj/machinery/medipen_refiller/RefreshParts() + var/new_volume = 100 + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + new_volume += 100 * B.rating + if(!reagents) + create_reagents(new_volume, TRANSPARENT) + reagents.maximum_volume = new_volume + return TRUE + +/// handles the messages and animation, calls refill to end the animation +/obj/machinery/medipen_refiller/attackby(obj/item/I, mob/user, params) + if(busy) + to_chat(user, "The machine is busy.") + return + if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) + var/obj/item/reagent_containers/RC = I + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user) + if(units) + to_chat(user, "You transfer [units] units of the solution to the [name].") + return + else + to_chat(user, "The [name] is full.") + return + if(istype(I, /obj/item/reagent_containers/hypospray/medipen)) + var/obj/item/reagent_containers/hypospray/medipen/P = I + if(!(LAZYFIND(allowed, P.type))) + to_chat(user, "Error! Unknown schematics.") + return + if(P.reagents?.reagent_list.len) + to_chat(user, "The medipen is already filled.") + return + if(reagents.has_reagent(allowed[P.type], 10)) + busy = TRUE + add_overlay("active") + addtimer(CALLBACK(src, .proc/refill, P, user), 20) + qdel(P) + return + to_chat(user, "There aren't enough reagents to finish this operation.") + return + ..() + +/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.reaction(get_turf(src), TOUCH) + reagents.clear_reagents() + +/obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/medipen_refiller/crowbar_act(mob/user, obj/item/I) + ..() + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/medipen_refiller/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "medipen_refiller_open", "medipen_refiller", I) + +/// refills the medipen +/obj/machinery/medipen_refiller/proc/refill(obj/item/reagent_containers/hypospray/medipen/P, mob/user) + new P.type(loc) + reagents.remove_reagent(allowed[P.type], 10) + cut_overlays() + busy = FALSE + to_chat(user, "Medipen refilled.") diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index b62be915735..f7410c45cdb 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -90,11 +90,13 @@ eat(AM) . = ..() -/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) +/obj/machinery/recycler/proc/eat(atom/movable/AM0, sound=TRUE) if(machine_stat & (BROKEN|NOPOWER)) return if(safety_mode) return + if(!isturf(AM0.loc)) + return //I don't know how you called Crossed() but stop it. var/list/to_eat if(istype(AM0, /obj/item)) @@ -102,54 +104,66 @@ else to_eat = list(AM0) - var/items_recycled = 0 + var/living_detected = FALSE //technically includes silicons as well but eh + var/list/nom = list() + var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times. for(var/i in to_eat) var/atom/movable/AM = i - var/obj/item/bodypart/head/as_head = AM - var/obj/item/mmi/as_mmi = AM - if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) || istype(AM, /obj/item/dullahan_relay)) - emergency_stop(AM) + if(istype(AM, /obj/item)) + var/obj/item/bodypart/head/as_head = AM + var/obj/item/mmi/as_mmi = AM + if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)) + living_detected = TRUE + nom += AM else if(isliving(AM)) - if(obj_flags & EMAGGED) - crush_living(AM) - else - emergency_stop(AM) - else if(istype(AM, /obj/item)) - recycle_item(AM) - items_recycled++ - else - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - if(items_recycled && sound) - playsound(src, item_recycle_sound, 50, TRUE) + living_detected = TRUE + crunchy_nom += AM + var/not_eaten = to_eat.len - nom.len - crunchy_nom.len + if(living_detected) // First, check if we have any living beings detected. + if(obj_flags & EMAGGED) + for(var/CRUNCH in crunchy_nom) // Eat them and keep going because we don't care about safety. + if(isliving(CRUNCH)) // MMIs and brains will get eaten like normal items + crush_living(CRUNCH) + else // Stop processing right now without eating anything. + emergency_stop() + return + for(var/nommed in nom) + recycle_item(nommed) + if(nom.len && sound) + playsound(src, item_recycle_sound, (50 + nom.len*5), TRUE, nom.len, ignore_walls = (nom.len - 10)) // As a substitute for playing 50 sounds at once. + if(not_eaten) + playsound(src, 'sound/machines/buzz-sigh.ogg', (50 + not_eaten*5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto. + if(!ismob(AM0)) + AM0.moveToNullspace() + qdel(AM0) + else // Lets not move a mob to nullspace and qdel it, yes? + for(var/i in AM0.contents) + var/atom/movable/content = i + content.moveToNullspace() + qdel(content) /obj/machinery/recycler/proc/recycle_item(obj/item/I) - I.forceMove(loc) var/obj/item/grown/log/L = I if(istype(L)) var/seed_modifier = 0 if(L.seed) seed_modifier = round(L.seed.potency / 25) - new L.plank_type(src.loc, 1 + seed_modifier) - qdel(L) - return + new L.plank_type(loc, 1 + seed_modifier) else var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(I) if(!material_amount) - qdel(I) return materials.insert_item(I, multiplier = (amount_produced / 100)) - qdel(I) materials.retrieve_all() -/obj/machinery/recycler/proc/emergency_stop(mob/living/L) +/obj/machinery/recycler/proc/emergency_stop() playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) safety_mode = TRUE update_icon() - L.forceMove(loc) addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN) /obj/machinery/recycler/proc/reboot() @@ -175,12 +189,6 @@ blood = TRUE update_icon() - // Remove and recycle the equipped items - if(eat_victim_items) - for(var/obj/item/I in L.get_equipped_items(TRUE)) - if(L.dropItemToGround(I)) - eat(I, sound=FALSE) - // Instantly lie down, also go unconscious from the pain, before you die. L.Unconscious(100) L.adjustBruteLoss(crush_damage) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 5392608670e..8daab3a9e16 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -109,12 +109,12 @@ return var/freq = rand(24750, 26550) playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq) - target.apply_status_effect(STATUS_EFFECT_STASIS, null, TRUE) + target.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT) target.ExtinguishMob() use_power = ACTIVE_POWER_USE /obj/machinery/stasis/proc/thaw_them(mob/living/target) - target.remove_status_effect(STATUS_EFFECT_STASIS) + target.remove_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT) if(target == occupant) use_power = IDLE_POWER_USE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 6cfb708cbd0..7507d89bf8b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -4,6 +4,9 @@ desc = "An industrial unit made to hold and decontaminate irradiated equipment. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit." icon = 'icons/obj/machines/suit_storage.dmi' icon_state = "close" + use_power = ACTIVE_POWER_USE + active_power_usage = 60 + power_channel = EQUIP density = TRUE max_integrity = 250 ui_x = 400 @@ -46,6 +49,8 @@ var/message_cooldown /// How long it takes to break out of the SSU. var/breakout_time = 300 + /// How fast it charges cells in a suit + var/charge_rate = 500 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -302,6 +307,18 @@ if(occupant) dump_contents() +/obj/machinery/suit_storage_unit/process() + if(!suit) + return + if(!istype(suit, /obj/item/clothing/suit/space)) + return + if(!suit.cell) + return + + var/obj/item/stock_parts/cell/C = suit.cell + use_power(charge_rate) + C.give(charge_rate) + /obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) if(!prob(prb)) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 694669775be..e07708b93ba 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -5,7 +5,7 @@ require the message server. */ -// A decorational representation of SSblackbox, usually placed alongside the message server. +// A decorational representation of SSblackbox, usually placed alongside the message server. Also contains a traitor theft item. /obj/machinery/blackbox_recorder icon = 'icons/obj/stationobjs.dmi' icon_state = "blackbox" @@ -15,7 +15,60 @@ idle_power_usage = 10 active_power_usage = 100 armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) + var/obj/item/stored +/obj/machinery/blackbox_recorder/Initialize() + . = ..() + stored = new /obj/item/blackbox(src) + +/obj/machinery/blackbox_recorder/attack_hand(mob/living/user) + . = ..() + if(stored) + user.put_in_hands(stored) + stored = null + to_chat(user, "You remove the blackbox from [src]. The tapes stop spinning.") + update_icon() + return + else + to_chat(user, "It seems that the blackbox is missing...") + return + +/obj/machinery/blackbox_recorder/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(istype(I, /obj/item/blackbox)) + if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src)) + to_chat(user, "[I] is stuck to your hand!") + return + user.visible_message("[user] clicks [I] into [src]!", \ + "You press the device into [src], and it clicks into place. The tapes begin spinning again.") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + stored = I + update_icon() + return ..() + return ..() + +/obj/machinery/blackbox_recorder/Destroy() + if(stored) + stored.forceMove(loc) + new /obj/effect/decal/cleanable/oil(loc) + return ..() + +/obj/machinery/blackbox_recorder/update_icon() + . = ..() + if(!stored) + icon_state = "blackbox_b" + else + icon_state = "blackbox" + +/obj/item/blackbox + name = "the blackbox" + desc = "A strange relic, capable of recording data on extradimensional vertices. It lives inside the blackbox recorder for safe keeping." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "blackcube" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF #define MESSAGE_SERVER_FUNCTIONING_MESSAGE "This is an automated message. The messaging system is functioning correctly." @@ -95,7 +148,7 @@ /obj/machinery/telecomms/message_server/update_overlays() . = ..() - + if(calibrating) . += "message_server_calibrate" diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index 4dd3af036cd..0d2fe60e8e1 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -1,7 +1,7 @@ /* The receiver idles and receives messages from subspace-compatible radio equipment; - primarily headsets. They then just relay this information to all linked devices, - which can would probably be network hubs. + primarily headsets. Then they just relay this information to all linked devices, + which would probably be network hubs. Link to Processor Units in case receiver can't send to bus units. */ diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 6830c8f18c9..987899dc3ea 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -70,7 +70,7 @@ com.target = null visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return - if (ismovableatom(M)) + if (ismovable(M)) if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE)) use_power(5000) if(!calibrated && prob(30 - ((accuracy) * 10))) //oh dear a problem diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 3e3fdb9ba92..24197a34f45 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -26,10 +26,11 @@ name = "\improper Dark Gygax" icon_state = "darkgygax" max_integrity = 300 - deflect_chance = 15 + deflect_chance = 20 armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" =20, "fire" = 100, "acid" = 100) max_temperature = 35000 leg_overload_coeff = 70 + force = 30 operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/gygax/dark @@ -40,11 +41,11 @@ . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang + ME = new /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/teleporter + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay ME.attach(src) @@ -55,7 +56,7 @@ C.forceMove(src) cell = C return - cell = new /obj/item/stock_parts/cell/hyper(src) + cell = new /obj/item/stock_parts/cell/bluespace(src) /obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index adde836b741..c276ed5f790 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -487,7 +487,7 @@ /obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) - if(ismovableatom(hit_atom)) + if(ismovable(hit_atom)) var/atom/movable/AM = hit_atom AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), 7, 2) qdel(src) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ce88021154d..7f19c69ca78 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -242,16 +242,8 @@ return output /obj/machinery/mecha_part_fabricator/proc/sync() - temp = "Updating local R&D database..." - updateUsrDialog() - sleep(30) //only sleep if called by user - for(var/obj/machinery/computer/rdconsole/RDC in oview(7,src)) RDC.stored_research.copy_research_to(stored_research) - temp = "Processed equipment designs.
" - //check if the tech coefficients have changed - temp += "Return" - updateUsrDialog() say("Successfully synchronized with R&D server.") return diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 7fb300b5449..5cd21715164 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -4,6 +4,26 @@ /datum/component/construction/mecha var/base_icon + // Component typepaths. + // most must be defined unless + // get_steps is overriden. + + // Circuit board typepaths. + // circuit_control and circuit_periph must be defined + // unless get_circuit_steps is overriden. + var/circuit_control + var/circuit_periph + var/circuit_weapon + + // Armor plating typepaths. both must be defined + // unless relevant step procs are overriden. amounts + // must be defined if using /obj/item/stack/sheet types + var/inner_plating + var/inner_plating_amount + + var/outer_plating + var/outer_plating_amount + /datum/component/construction/mecha/spawn_result() if(!result) return @@ -19,7 +39,14 @@ SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) QDEL_NULL(parent) +// Default proc to generate mech steps. +// Override if the mech needs an entirely custom process (See HONK mech) +// Otherwise override specific steps as needed (Ripley, firefighter, Phazon) +/datum/component/construction/mecha/proc/get_steps() + return get_frame_steps() + get_circuit_steps() + (circuit_weapon ? get_circuit_weapon_steps() : list()) + get_stockpart_steps() + get_inner_plating_steps() + get_outer_plating_steps() + /datum/component/construction/mecha/update_parent(step_index) + steps = get_steps() ..() // By default, each step in mech construction has a single icon_state: // "[base_icon][index - 1]" @@ -43,6 +70,188 @@ parent_atom.cut_overlays() ..() +// Default proc for the first steps of mech construction. +/datum/component/construction/mecha/proc/get_frame_steps() + return list( + list( + "key" = TOOL_WRENCH, + "desc" = "The hydraulic systems are disconnected." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_WRENCH, + "desc" = "The hydraulic systems are connected." + ), + list( + "key" = /obj/item/stack/cable_coil, + "amount" = 5, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The hydraulic systems are active." + ), + list( + "key" = TOOL_WIRECUTTER, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The wiring is added." + ) + ) + +// Default proc for the circuit board steps of a mech. +// Second set of steps by default. +/datum/component/construction/mecha/proc/get_circuit_steps() + return list( + list( + "key" = circuit_control, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The wiring is adjusted." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Central control module is installed." + ), + list( + "key" = circuit_periph, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Central control module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Peripherals control module is installed." + ) + ) + +// Default proc for weapon circuitboard steps +// Used by combat mechs +/datum/component/construction/mecha/proc/get_circuit_weapon_steps() + return list( + list( + "key" = circuit_weapon, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Peripherals control module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Weapons control module is installed." + ) + ) + +// Default proc for stock part installation +// Third set of steps by default +/datum/component/construction/mecha/proc/get_stockpart_steps() + var/prevstep_text = circuit_weapon ? "Weapons control module is secured." : "Peripherals control module is secured." + return list( + list( + "key" = /obj/item/stock_parts/scanning_module, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = prevstep_text + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Scanner module is installed." + ), + list( + "key" = /obj/item/stock_parts/capacitor, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanner module is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Capacitor is installed." + ), + list( + "key" = /obj/item/stock_parts/cell, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured." + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "The power cell is installed." + ) + ) + +// Default proc for inner armor plating +// Fourth set of steps by default +/datum/component/construction/mecha/proc/get_inner_plating_steps() + var/list/first_step + if(ispath(inner_plating, /obj/item/stack/sheet)) + first_step = list( + list( + "key" = inner_plating, + "amount" = inner_plating_amount, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The power cell is secured." + ) + ) + else + first_step = list( + list( + "key" = inner_plating, + "action" = ITEM_DELETE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The power cell is secured." + ) + ) + + return first_step + list( + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "Inner plating is installed." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "Inner Plating is wrenched." + ) + ) + +// Default proc for outer armor plating +// Fifth set of steps by default +/datum/component/construction/mecha/proc/get_outer_plating_steps() + var/list/first_step + if(ispath(outer_plating, /obj/item/stack/sheet)) + first_step = list( + list( + "key" = outer_plating, + "amount" = outer_plating_amount, + "back_key" = TOOL_WELDER, + "desc" = "Inner plating is welded." + ) + ) + else + first_step = list( + list( + "key" = outer_plating, + "action" = ITEM_DELETE, + "back_key" = TOOL_WELDER, + "desc" = "Inner plating is welded." + ) + ) + + return first_step + list( + list( + "key" = TOOL_WRENCH, + "back_key" = TOOL_CROWBAR, + "desc" = "External armor is installed." + ), + list( + "key" = TOOL_WELDER, + "back_key" = TOOL_WRENCH, + "desc" = "External armor is wrenched." + ) + ) + /datum/component/construction/unordered/mecha_chassis/ripley result = /datum/component/construction/mecha/ripley @@ -57,141 +266,24 @@ /datum/component/construction/mecha/ripley result = /obj/mecha/working/ripley base_icon = "ripley" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/ripley/main + circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), + inner_plating=/obj/item/stack/sheet/metal + inner_plating_amount = 5 - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), + outer_plating=/obj/item/stack/rods + outer_plating_amount = 10 - //5 - list( - "key" = /obj/item/circuitboard/mecha/ripley/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/ripley/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //15 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //16 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Outer plating is installed." - ), - - //17 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Outer Plating is wrenched." - ), - - //18 +/datum/component/construction/mecha/ripley/get_outer_plating_steps() + return list( list( "key" = /obj/item/stack/rods, "amount" = 10, "back_key" = TOOL_WELDER, "desc" = "Outer Plating is welded." ), - - //19 list( "key" = TOOL_WELDER, "back_key" = TOOL_WIRECUTTER, @@ -317,170 +409,16 @@ /datum/component/construction/mecha/gygax result = /obj/mecha/combat/gygax base_icon = "gygax" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/gygax/main + circuit_periph = /obj/item/circuitboard/mecha/gygax/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/gygax/targeting - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/gygax/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/gygax/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/gygax/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //17 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //18 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //19 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //20 - list( - "key" = /obj/item/mecha_parts/part/gygax_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - - ) + outer_plating=/obj/item/mecha_parts/part/gygax_armor + outer_plating_amount=1 /datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user) return check_step(used_atom,user) @@ -613,155 +551,32 @@ /datum/component/construction/mecha/firefighter result = /obj/mecha/working/ripley/firefighter base_icon = "fireripley" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/ripley/main + circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), + inner_plating = /obj/item/stack/sheet/plasteel + inner_plating_amount = 5 - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/ripley/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/ripley/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - //9 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //15 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //16 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //13 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //17 +/datum/component/construction/mecha/firefighter/get_outer_plating_steps() + return list( list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, "back_key" = TOOL_WELDER, "desc" = "Internal armor is welded." ), - - //18 list( "key" = /obj/item/stack/sheet/plasteel, "amount" = 5, "back_key" = TOOL_CROWBAR, "desc" = "External armor is being installed." ), - - //19 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, "desc" = "External armor is installed." ), - - //20 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, @@ -893,100 +708,70 @@ /datum/component/construction/mecha/honker result = /obj/mecha/combat/honker steps = list( - //1 list( "key" = /obj/item/bikehorn ), - - //2 list( "key" = /obj/item/circuitboard/mecha/honker/main, "action" = ITEM_DELETE ), - - //3 list( "key" = /obj/item/bikehorn ), - - //4 list( "key" = /obj/item/circuitboard/mecha/honker/peripherals, "action" = ITEM_DELETE ), - - //5 list( "key" = /obj/item/bikehorn ), - - //6 list( "key" = /obj/item/circuitboard/mecha/honker/targeting, "action" = ITEM_DELETE ), - - //7 list( "key" = /obj/item/bikehorn ), - - //6 list( "key" = /obj/item/stock_parts/scanning_module, "action" = ITEM_MOVE_INSIDE ), - - //8 list( "key" = /obj/item/bikehorn ), - - //9 list( "key" = /obj/item/stock_parts/capacitor, "action" = ITEM_MOVE_INSIDE ), - - //10 list( "key" = /obj/item/bikehorn ), - - //11 list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE ), - - //12 list( "key" = /obj/item/bikehorn ), - - //13 list( "key" = /obj/item/clothing/mask/gas/clown_hat, "action" = ITEM_DELETE ), - - //14 list( "key" = /obj/item/bikehorn ), - - //15 list( "key" = /obj/item/clothing/shoes/clown_shoes, "action" = ITEM_DELETE ), - - //16 list( "key" = /obj/item/bikehorn ), ) +/datum/component/construction/mecha/honker/get_steps() + return steps + // HONK doesn't have any construction step icons, so we just set an icon once. /datum/component/construction/mecha/honker/update_parent(step_index) if(step_index == 1) @@ -1037,170 +822,16 @@ /datum/component/construction/mecha/durand result = /obj/mecha/combat/durand base_icon = "durand" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/durand/main + circuit_periph = /obj/item/circuitboard/mecha/durand/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/durand/targeting - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/durand/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/durand/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/durand/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //14 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //15 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //16 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //17 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //18 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //19 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //20 - list( - "key" = /obj/item/mecha_parts/part/durand_armor, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - ) + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 + outer_plating = /obj/item/mecha_parts/part/durand_armor + outer_plating_amount = 1 /datum/component/construction/mecha/durand/custom_action(obj/item/I, mob/living/user, diff) if(!..()) @@ -1333,211 +964,101 @@ /datum/component/construction/mecha/phazon result = /obj/mecha/combat/phazon base_icon = "phazon" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/phazon/main + circuit_periph = /obj/item/circuitboard/mecha/phazon/peripherals + circuit_weapon = /obj/item/circuitboard/mecha/phazon/targeting - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), + inner_plating = /obj/item/stack/sheet/plasteel + inner_plating_amount = 5 - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), + outer_plating = /obj/item/mecha_parts/part/phazon_armor + outer_plating_amount = 1 - //5 - list( - "key" = /obj/item/circuitboard/mecha/phazon/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/phazon/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed" - ), - - //9 - list( - "key" = /obj/item/circuitboard/mecha/phazon/targeting, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapon control is installed." - ), - - //11 +/datum/component/construction/mecha/phazon/get_stockpart_steps() + return list( list( "key" = /obj/item/stock_parts/scanning_module, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, "desc" = "Weapon control module is secured." ), - - //12 list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Scanner module is installed." ), - - //13 list( "key" = /obj/item/stock_parts/capacitor, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, "desc" = "Scanner module is secured." ), - - //14 list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Capacitor is installed." ), - - //15 list( "key" = /obj/item/stack/ore/bluespace_crystal, "amount" = 1, "back_key" = TOOL_SCREWDRIVER, "desc" = "Capacitor is secured." ), - - //16 list( "key" = /obj/item/stack/cable_coil, "amount" = 5, "back_key" = TOOL_CROWBAR, "desc" = "The bluespace crystal is installed." ), - - //17 list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_WIRECUTTER, "desc" = "The bluespace crystal is connected." ), - - //18 list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, "desc" = "The bluespace crystal is engaged." ), - - //19 list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "The power cell is installed.", "icon_state" = "phazon17" // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. - ), + ) + ) - //20 +/datum/component/construction/mecha/phazon/get_outer_plating_steps() + return list( list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured.", - "icon_state" = "phazon18" - ), - - //21 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Phase armor is installed.", - "icon_state" = "phazon19" - ), - - //22 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Phase armor is wrenched.", - "icon_state" = "phazon20" - ), - - //23 - list( - "key" = /obj/item/mecha_parts/part/phazon_armor, + "key" = outer_plating, + "amount" = 1, "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, - "desc" = "Phase armor is welded.", - "icon_state" = "phazon21" + "desc" = "Internal armor is welded." ), - - //24 list( "key" = TOOL_WRENCH, "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed.", - "icon_state" = "phazon22" + "desc" = "External armor is installed." ), - - //25 list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched.", - "icon_state" = "phazon23" + "desc" = "External armor is wrenched." ), - - //26 list( "key" = /obj/item/assembly/signaler/anomaly, "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, "desc" = "Anomaly core socket is open.", "icon_state" = "phazon24" - ), + ) ) - /datum/component/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE @@ -1688,153 +1209,15 @@ /datum/component/construction/mecha/odysseus result = /obj/mecha/medical/odysseus base_icon = "odysseus" - steps = list( - //1 - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - //2 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), + circuit_control = /obj/item/circuitboard/mecha/odysseus/main + circuit_periph = /obj/item/circuitboard/mecha/odysseus/peripherals - //3 - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), + inner_plating = /obj/item/stack/sheet/metal + inner_plating_amount = 5 - //4 - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ), - - //5 - list( - "key" = /obj/item/circuitboard/mecha/odysseus/main, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - - //6 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - - //7 - list( - "key" = /obj/item/circuitboard/mecha/odysseus/peripherals, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - - //8 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ), - //9 - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - - //10 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - - //11 - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - - //12 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - - //13 - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - - //11 - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ), - - //12 - list( - "key" = /obj/item/stack/sheet/metal, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ), - - //13 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Internal armor is installed." - ), - - //14 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Internal armor is wrenched." - ), - - //15 - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - //16 - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - //17 - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - ) + outer_plating = /obj/item/stack/sheet/plasteel + outer_plating_amount = 5 /datum/component/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff) if(!..()) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 96e7b6f35be..98fb613af02 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -276,11 +276,17 @@ S.rabid = TRUE S.amount_grown = SLIME_EVOLUTION_THRESHOLD S.Evolve() + var/datum/action/innate/slime/reproduce/A = new + A.Grant(S) - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_PAI, null, null, 100, S, POLL_IGNORE_PYROSLIME) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENCE, null, null, 100, S, POLL_IGNORE_PYROSLIME) if(LAZYLEN(candidates)) var/mob/dead/observer/chosen = pick(candidates) S.key = chosen.key + S.mind.special_role = ROLE_PYROCLASTIC_SLIME + var/policy = get_policy(ROLE_PYROCLASTIC_SLIME) + if (policy) + to_chat(S, policy) log_game("[key_name(S.key)] was made into a slime by pyroclastic anomaly at [AREACOORD(T)].") ///////////////////// diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index bf7ff0818c0..c19561c22c5 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -68,7 +68,7 @@ name = "poster - [name]" desc = "A large piece of space-resistant printed paper. [desc]" - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 300), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 300)), 0) /obj/structure/sign/poster/proc/randomise(base_type) var/list/poster_types = subtypesof(base_type) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index c988704828b..b197c758c97 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -26,7 +26,7 @@ if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, beauty), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty)), 0) var/turf/T = get_turf(src) if(T && is_station_level(T.z)) diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index 7a702bf354f..5444e3ba32d 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -30,6 +30,7 @@ name = "salt pile" desc = "A sizable pile of table salt. Someone must be upset." icon_state = "salt_pile" + var/safepasses = 3 //how many times can this salt pile be passed before dissipating /obj/effect/decal/cleanable/food/salt/CanAllowThrough(atom/movable/AM, turf/target) . = ..() @@ -41,6 +42,18 @@ if(is_species(AM, /datum/species/snail)) to_chat(AM, "Your path is obstructed by salt.") +/obj/effect/decal/cleanable/food/salt/Crossed(atom/movable/AM) + ..() + if(!isliving(AM)) + return + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + if(C.m_intent == MOVE_INTENT_WALK) + return + safepasses-- + if(safepasses <= 0 && !QDELETED(src)) + qdel(src) + /obj/effect/decal/cleanable/food/flour name = "flour" desc = "It's still good. Four second rule!" diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 2aeabfbad58..c6461b6baac 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -39,9 +39,10 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.air - var/plas_amt = min(30,G.gases[/datum/gas/plasma][MOLES]) //Absorb some plasma - G.gases[/datum/gas/plasma][MOLES] -= plas_amt - absorbed_plasma += plas_amt + if(G.gases[/datum/gas/plasma]) + var/plas_amt = min(30,G.gases[/datum/gas/plasma][MOLES]) //Absorb some plasma + G.gases[/datum/gas/plasma][MOLES] -= plas_amt + absorbed_plasma += plas_amt if(G.temperature > T20C) G.temperature = max(G.temperature/2,T20C) G.garbage_collect() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 32998fbfd9e..30f28343fff 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -78,6 +78,11 @@ gas_type = "n2o" +/obj/effect/mine/gas/water_vapor + name = "chilled vapor mine" + gas_amount = 500 + gas_type = "water_vapor" + /obj/effect/mine/sound name = "honkblaster 1000" var/sound = 'sound/items/bikehorn.ogg' diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index ce15a77c89e..3722218113b 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -9,9 +9,8 @@ /obj/effect/spawner/bundle/Initialize(mapload) ..() if(items && items.len) - var/turf/T = get_turf(src) for(var/path in items) - new path(T) + new path(loc) return INITIALIZE_HINT_QDEL /obj/effect/spawner/bundle/costume/chicken @@ -168,3 +167,31 @@ items = list( /obj/item/clothing/mask/gas/sexymime, /obj/item/clothing/under/rank/civilian/mime/sexy) + +/obj/effect/spawner/bundle/costume/mafia + name = "black mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora, + /obj/item/clothing/under/suit/blacktwopiece, + /obj/item/clothing/shoes/laceup) + +/obj/effect/spawner/bundle/costume/mafia/white + name = "white mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora/white, + /obj/item/clothing/under/suit/white, + /obj/item/clothing/shoes/laceup) + +/obj/effect/spawner/bundle/costume/mafia/checkered + name = "checkered mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora, + /obj/item/clothing/under/suit/checkered, + /obj/item/clothing/shoes/laceup) + +/obj/effect/spawner/bundle/costume/mafia/beige + name = "beige mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora/beige, + /obj/item/clothing/under/suit/beige, + /obj/item/clothing/shoes/laceup) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 97461b7148c..5bc486a523f 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -10,7 +10,6 @@ /obj/effect/spawner/lootdrop/Initialize(mapload) ..() if(loot && loot.len) - var/turf/T = get_turf(src) var/loot_spawned = 0 while((lootcount-loot_spawned) && loot.len) var/lootspawn = pickweight(loot) @@ -20,7 +19,7 @@ loot.Remove(lootspawn) if(lootspawn) - var/atom/movable/spawned_loot = new lootspawn(T) + var/atom/movable/spawned_loot = new lootspawn(loc) if (!fan_out_items) if (pixel_x != 0) spawned_loot.pixel_x = pixel_x @@ -372,6 +371,15 @@ /obj/item/circuitboard/computer/robotics ) +/obj/effect/spawner/lootdrop/mafia_outfit + name = "mafia outfit spawner" + loot = list( + /obj/effect/spawner/bundle/costume/mafia = 20, + /obj/effect/spawner/bundle/costume/mafia/white = 5, + /obj/effect/spawner/bundle/costume/mafia/checkered = 2, + /obj/effect/spawner/bundle/costume/mafia/beige = 5 + ) + //finds the probabilities of items spawning from a loot spawner's loot pool /obj/item/loot_table_maker icon = 'icons/effects/landmarks_static.dmi' diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index b2d81dce0a6..a91b66a7c52 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -52,7 +52,7 @@ var/list/affecting = list() /obj/effect/step_trigger/thrower/Trigger(atom/A) - if(!A || !ismovableatom(A)) + if(!A || !ismovable(A)) return var/atom/movable/AM = A var/curtiles = 0 diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index a2557d56879..082e02c587b 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -172,9 +172,12 @@ var/mutable_appearance/mob_underlay var/preloaded = 0 var/RPpos = null + var/attached = TRUE //if the gun arg isn't included initially, then the chronofield will work without one /obj/structure/chrono_field/Initialize(mapload, mob/living/target, obj/item/gun/energy/chrono_gun/G) - if(target && isliving(target) && G) + if(target && isliving(target)) + if(!G) + attached = FALSE target.forceMove(src) captured = target var/icon/mob_snapshot = getFlatIcon(target) @@ -234,6 +237,8 @@ else gun = null return .() + else if(!attached) + tickstokill-- else tickstokill++ else diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index cd7b950b864..0f9cdfbb014 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -758,6 +758,13 @@ /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/capacitor = 1) +/obj/item/circuitboard/machine/medipen_refiller + name = "Medipen Refiller (Machine Board)" + icon_state = "medical" + build_path = /obj/machinery/medipen_refiller + req_components = list( + /obj/item/stock_parts/matter_bin = 1) + /obj/item/circuitboard/machine/techfab/department/medical name = "\improper Departmental Techfab (Machine Board) - Medical" icon_state = "medical" @@ -1165,15 +1172,6 @@ icon_state = "supply" build_path = /obj/machinery/rnd/production/techfab/department/cargo -/obj/item/circuitboard/machine/pump - name = "Portable Liquid Pump (Machine Board)" - icon_state = "supply" - build_path = /obj/machinery/power/liquid_pump - needs_anchored = FALSE - req_components = list( - /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/matter_bin = 2) - //Misc @@ -1200,3 +1198,12 @@ /obj/item/stock_parts/manipulator = /obj/item/stock_parts/manipulator/femto, /obj/item/stock_parts/micro_laser = /obj/item/stock_parts/micro_laser/quadultra, /obj/item/stock_parts/scanning_module = /obj/item/stock_parts/scanning_module/triphasic) + +/obj/item/circuitboard/machine/hypnochair + name = "Enhanced Interrogation Chamber (Machine Board)" + icon_state = "security" + build_path = /obj/machinery/hypnochair + req_components = list( + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/scanning_module = 2 + ) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 73204a43162..0200811a33f 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -80,6 +80,11 @@ cleanspeed = 3 //Only the truest of mind soul and body get one of these uses = 301 +/obj/item/soap/omega/suicide_act(mob/user) + user.visible_message("[user] is using [src] to scrub themselves from the timeline! It looks like [user.p_theyre()] trying to commit suicide!") + new /obj/structure/chrono_field(user.loc, user) + return MANUAL_SUICIDE + /obj/item/paper/fluff/stations/soap name = "ancient janitorial poem" desc = "An old paper that has passed many hands." diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 76317bf19c4..7133e4d56ab 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -10,10 +10,11 @@ var/datum/song/handheld/song var/instrumentId = "generic" var/instrumentExt = "mid" + var/instrumentRange = 15 /obj/item/instrument/Initialize() . = ..() - song = new(instrumentId, src, instrumentExt) + song = new(instrumentId, src, instrumentExt, instrumentRange) /obj/item/instrument/Destroy() QDEL_NULL(song) @@ -44,6 +45,12 @@ user.set_machine(src) song.interact(user) +/obj/item/instrument/proc/start_playing() + return + +/obj/item/instrument/proc/stop_playing() + return + /obj/item/instrument/violin name = "space violin" desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" @@ -79,6 +86,44 @@ return return changeInstrument(chosen) +/obj/item/instrument/piano_synth/headphones + name = "headphones" + desc = "Unce unce unce unce. Boop!" + icon = 'icons/obj/clothing/accessories.dmi' + lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' + icon_state = "headphones" + item_state = "headphones" + slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD + force = 0 + w_class = WEIGHT_CLASS_SMALL + custom_price = 125 + instrumentRange = 1 + +/obj/item/instrument/piano_synth/headphones/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + RegisterSignal(src, COMSIG_SONG_START, .proc/start_playing) + RegisterSignal(src, COMSIG_SONG_END, .proc/stop_playing) + +/obj/item/instrument/piano_synth/headphones/start_playing() + icon_state = "[initial(icon_state)]_on" + update_icon() + +/obj/item/instrument/piano_synth/headphones/stop_playing() + icon_state = "[initial(icon_state)]" + update_icon() + +/obj/item/instrument/piano_synth/headphones/spacepods + name = "nanotrasen space pods" + desc = "Flex your money, AND ignore what everyone else says, all at once!" + icon_state = "spacepods" + item_state = "spacepods" + slot_flags = ITEM_SLOT_EARS + strip_delay = 100 //air pods don't fall out + instrumentRange = 0 //you're paying for quality here + custom_premium_price = 1800 + /obj/item/instrument/banjo name = "banjo" desc = "A 'Mura' brand banjo. It's pretty much just a drum with a neck and strings." @@ -266,7 +311,8 @@ /obj/item/instrument/saxophone, /obj/item/instrument/trombone, /obj/item/instrument/recorder, - /obj/item/instrument/harmonica + /obj/item/instrument/harmonica, + /obj/item/instrument/piano_synth/headphones ) for(var/V in templist) var/atom/A = V diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 202bdcede17..60fa1fbadb4 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -1,13 +1,14 @@ - /obj/item/pressure_plate name = "pressure plate" - desc = "An electronic device that triggers when stepped on." - icon = 'icons/obj/device.dmi' + desc = "An electronic device that triggers when stepped on. Ctrl-Click to toggle the pressure plate off and on." + icon = 'icons/obj/puzzle_small.dmi' item_state = "flash" icon_state = "pressureplate" level = 1 + layer = LOW_OBJ_LAYER var/trigger_mob = TRUE var/trigger_item = FALSE + var/specific_item = null var/trigger_silent = FALSE var/sound/trigger_sound = 'sound/effects/pressureplate.ogg' var/obj/item/assembly/signaler/sigdev = null @@ -20,6 +21,7 @@ var/image/tile_overlay = null var/can_trigger = TRUE var/trigger_delay = 10 + var/protected = FALSE /obj/item/pressure_plate/Initialize() . = ..() @@ -35,6 +37,8 @@ . = ..() if(!can_trigger || !active) return + if(trigger_item && !istype(AM, specific_item)) + return if(trigger_mob && isliving(AM)) var/mob/living/L = AM to_chat(L, "You feel something click beneath you!") @@ -62,6 +66,16 @@ sigdev = null return ..() +/obj/item/pressure_plate/CtrlClick(mob/user) + if(protected) + to_chat(user, "You can't quite seem to turn this pressure plate off...") + return + active = !active + if (active == TRUE) + to_chat(user, "You turn [src] on.") + else + to_chat(user, "You turn [src] off.") + /obj/item/pressure_plate/hide(yes) if(yes) invisibility = INVISIBILITY_MAXIMUM diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index b08f83b3618..aab031c0e4a 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -81,7 +81,7 @@ //Gets the topmost teleportable container /obj/item/swapper/proc/get_teleportable_container() var/atom/movable/teleportable = src - while(ismovableatom(teleportable.loc)) + while(ismovable(teleportable.loc)) var/atom/movable/AM = teleportable.loc if(AM.anchored) break diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 8c48673331c..24abd8fdc00 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -70,11 +70,13 @@ effective or pretty fucking useless. /obj/item/healthanalyzer/rad_laser custom_materials = list(/datum/material/iron=400) - var/irradiate = 1 + var/ui_x = 320 + var/ui_y = 335 + var/irradiate = TRUE + var/stealth = FALSE + var/used = FALSE // is it cooling down? var/intensity = 10 // how much damage the radiation does var/wavelength = 10 // time it takes for the radiation to kick in, in seconds - var/used = 0 // is it cooling down? - var/stealth = FALSE /obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user) if(!stealth || !irradiate) @@ -83,8 +85,8 @@ effective or pretty fucking useless. return if(!used) log_combat(user, M, "irradiated", src) - var/cooldown = GetCooldown() - used = 1 + var/cooldown = get_cooldown() + used = TRUE icon_state = "health1" handle_cooldown(cooldown) // splits off to handle the cooldown while handling wavelength to_chat(user, "Successfully irradiated [M].") @@ -98,78 +100,94 @@ effective or pretty fucking useless. /obj/item/healthanalyzer/rad_laser/proc/handle_cooldown(cooldown) spawn(cooldown) - used = 0 + used = FALSE icon_state = "health" +/obj/item/healthanalyzer/rad_laser/proc/get_cooldown() + return round(max(10, (stealth*30 + intensity*5 - wavelength/4))) + /obj/item/healthanalyzer/rad_laser/attack_self(mob/user) interact(user) -/obj/item/healthanalyzer/rad_laser/proc/GetCooldown() - return round(max(10, (stealth*30 + intensity*5 - wavelength/4))) - /obj/item/healthanalyzer/rad_laser/interact(mob/user) ui_interact(user) -/obj/item/healthanalyzer/rad_laser/ui_interact(mob/user) - . = ..() +/obj/item/healthanalyzer/rad_laser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "radioactive_microlaser", "Radioactive Microlaser", ui_x, ui_y, master_ui, state) + ui.open() - var/dat = "Irradiation: [irradiate ? "On" : "Off"]
" - dat += "Stealth Mode (NOTE: Deactivates automatically while Irradiation is off): [stealth ? "On" : "Off"]
" - dat += "Scan Mode: " - if(!scanmode) - dat += "Scan Health" - else if(scanmode == 1) - dat += "Scan Reagents" - else - dat += "Disabled" - dat += "

" +/obj/item/healthanalyzer/rad_laser/ui_data(mob/user) + var/list/data = list() + data["irradiate"] = irradiate + data["stealth"] = stealth + data["scanmode"] = scanmode + data["intensity"] = intensity + data["wavelength"] = wavelength + data["on_cooldown"] = used + data["cooldown"] = DisplayTimeText(get_cooldown()) + return data - dat += {" - Radiation Intensity: - -- - [intensity] - ++
+/obj/item/healthanalyzer/rad_laser/ui_act(action, params) + if(..()) + return - Radiation Wavelength: - -- - [(wavelength+(intensity*4))] - ++
- Laser Cooldown: [DisplayTimeText(GetCooldown())]
- "} - - var/datum/browser/popup = new(user, "radlaser", "Radioactive Microlaser Interface", 400, 240) - popup.set_content(dat) - popup.open() - -/obj/item/healthanalyzer/rad_laser/Topic(href, href_list) - if(!usr.canUseTopic(src)) - return 1 - - usr.set_machine(src) - if(href_list["rad"]) - irradiate = !irradiate - - else if(href_list["stealthy"]) - stealth = !stealth - - else if(href_list["mode"]) - scanmode += 1 - if(scanmode > 2) - scanmode = 0 - - else if(href_list["radint"]) - var/amount = text2num(href_list["radint"]) - amount += intensity - intensity = max(1,(min(20,amount))) - - else if(href_list["radwav"]) - var/amount = text2num(href_list["radwav"]) - amount += wavelength - wavelength = max(0,(min(120,amount))) - - attack_self(usr) - add_fingerprint(usr) - return + switch(action) + if("irradiate") + irradiate = !irradiate + . = TRUE + if("stealth") + stealth = !stealth + . = TRUE + if("scanmode") + scanmode = !scanmode + . = TRUE + if("radintensity") + var/target = params["target"] + var/adjust = text2num(params["adjust"]) + if(target == "input") + target = input("New output target (1-20):", name, intensity) as num|null + if(!isnull(target) && !..()) + . = TRUE + else if(target == "min") + target = 1 + . = TRUE + else if(target == "max") + target = 20 + . = TRUE + else if(adjust) + target = intensity + adjust + . = TRUE + else if(text2num(target) != null) + target = text2num(target) + . = TRUE + if(.) + target = round(target) + intensity = clamp(target, 1, 20) + if("radwavelength") + var/target = params["target"] + var/adjust = text2num(params["adjust"]) + if(target == "input") + target = input("New output target (0-120):", name, wavelength) as num|null + if(!isnull(target) && !..()) + . = TRUE + else if(target == "min") + target = 0 + . = TRUE + else if(target == "max") + target = 120 + . = TRUE + else if(adjust) + target = wavelength + adjust + . = TRUE + else if(text2num(target) != null) + target = text2num(target) + . = TRUE + if(.) + target = round(target) + wavelength = clamp(target, 0, 120) /obj/item/shadowcloak name = "cloaker belt" diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm index cf7dc928ae0..a4bc207be03 100644 --- a/code/game/objects/items/grenades/antigravity.dm +++ b/code/game/objects/items/grenades/antigravity.dm @@ -12,6 +12,6 @@ for(var/turf/T in view(range,src)) T.AddElement(/datum/element/forced_gravity, forced_value) - addtimer(CALLBACK(T, /datum/.proc/RemoveElement, forced_value), duration) + addtimer(CALLBACK(T, /datum/.proc/_RemoveElement, list(forced_value)), duration) qdel(src) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 7241849b008..bd79c3dffc8 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -285,8 +285,8 @@ shield_icon = "shield-old" /obj/item/nullrod/claymore - icon_state = "claymore" - item_state = "claymore" + icon_state = "claymore_gold" + item_state = "claymore_gold" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' name = "holy claymore" diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 90b4f798977..78732e7e944 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -22,9 +22,10 @@ ADD_TRAIT(target, TRAIT_MINDSHIELD, "implant") target.sec_hud_set_implants() return TRUE - + var/deconverted = FALSE if(target.mind.has_antag_datum(/datum/antagonist/brainwashed)) target.mind.remove_antag_datum(/datum/antagonist/brainwashed) + deconverted = TRUE if(target.mind.has_antag_datum(/datum/antagonist/rev/head)|| target.mind.unconvertable) if(!silent) @@ -35,6 +36,7 @@ var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev) if(rev) + deconverted = TRUE rev.remove_revolutionary(FALSE, user) if(!silent) if(target.mind in SSticker.mode.cult) @@ -43,6 +45,9 @@ to_chat(target, "You feel a sense of peace and security. You are now protected from brainwashing.") ADD_TRAIT(target, TRAIT_MINDSHIELD, "implant") target.sec_hud_set_implants() + if(deconverted) + if(prob(1) || SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + target.say("I'm out! I quit! Whose kidneys are these?", forced = "They're out! They quit! Whose kidneys do they have?") return TRUE return FALSE diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 0222c818e01..fea94ced1c1 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -107,6 +107,9 @@ if(istype(A, /obj/item/gun/energy)) to_chat(user, "Error unable to interface with device.") return FALSE + if(istype(A, /obj/item/clothing/suit/space)) + to_chat(user, "Error unable to interface with device.") + return FALSE if(istype(A, /obj)) O = A if(C) @@ -181,3 +184,10 @@ /obj/item/inducer/sci/Initialize() . = ..() update_icon() + +/obj/item/inducer/syndicate + icon_state = "inducer-syndi" + item_state = "inducer-syndi" + desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate." + powertransfer = 2000 + cell_type = /obj/item/stock_parts/cell/super diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 32f280b385d..a33d70fbf37 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -145,3 +145,65 @@ user.gib() playsound(src, 'sound/items/eatfood.ogg', 50, TRUE, -1) return MANUAL_SUICIDE + +/obj/item/virgin_mary + name = "A picture of the virgin mary" + desc = "A small, cheap icon depicting the virgin mother." + icon = 'icons/obj/blackmarket.dmi' + icon_state = "madonna" + resistance_flags = FLAMMABLE + ///Has this item been used already. + var/used_up = FALSE + ///List of mobs that have already been mobbed. + var/static/list/mob_mobs = list() + +#define NICKNAME_CAP (MAX_NAME_LEN/2) +/obj/item/virgin_mary/attackby(obj/item/W, mob/user, params) + . = ..() + var/ignition_msg = W.ignition_effect(src, user) + if(!ignition_msg) + return + if(resistance_flags & ON_FIRE) + return + user.dropItemToGround(src) + user.visible_message("[user] lights [src] ablaze with [W]!", "You light [src] on fire!") + fire_act() + if(used_up) + return + if(!isliving(user) || !user.mind) //A sentient mob needs to be burning it, ya cheezit. + return + var/mob/living/joe = user + + if(joe in mob_mobs) //Only one nickname fuckhead + to_chat(joe, "You have already been initiated into the mafioso life.") + return + + to_chat(joe, "As you burn the picture, a nickname comes to mind...") + var/nickname = stripped_input(joe, "Pick a nickname", "Mafioso Nicknames", null, NICKNAME_CAP, TRUE) + nickname = reject_bad_name(nickname, allow_numbers = FALSE, max_length = NICKNAME_CAP, ascii_only = TRUE) + if(!nickname) + return + var/new_name + var/space_position = findtext(joe.real_name, " ") + if(space_position)//Can we find a space? + new_name = "[copytext(joe.real_name, 1, space_position)] \"[nickname]\" [copytext(joe.real_name, space_position)]" + else //Append otherwise + new_name = "[joe.real_name] \"[nickname]\"" + joe.real_name = new_name + used_up = TRUE + mob_mobs += joe + joe.say("My soul will burn like this saint if I betray my familiy. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) + to_chat(joe, "Being inducted into the mafia does not grant antagonist status.") + +#undef NICKNAME_CAP + +/obj/item/virgin_mary/suicide_act(mob/living/user) + user.visible_message("[user] starts saying their Hail Mary's at a terrifying pace! It looks like [user.p_theyre()] trying to enter the afterlife!") + user.say("Hail Mary, full of grace, the Lord is with thee. Blessed are thou amongst women, and blessed is the fruit of thy womb, Jesus. Holy Mary, mother of God, pray for us sinners, now and at the hour of our death. Amen. ", forced = /obj/item/virgin_mary) + addtimer(CALLBACK(src, .proc/manual_suicide, user), 75) + addtimer(CALLBACK(user, /atom/movable/proc/say, "O my Mother, preserve me this day from mortal sin..."), 50) + return MANUAL_SUICIDE + +/obj/item/virgin_mary/proc/manual_suicide(mob/living/user) + user.adjustOxyLoss(200) + user.death(0) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm new file mode 100644 index 00000000000..5e0dbc421a1 --- /dev/null +++ b/code/game/objects/items/puzzle_pieces.dm @@ -0,0 +1,135 @@ +//************** +//*****Keys******************* +//************** ** ** +/obj/item/keycard + name = "security keycard" + desc = "This feels like it belongs to a door." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "keycard" + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_speed = 1 + throw_range = 7 + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + var/puzzle_id = null + +//Two test keys for use alongside the two test doors. +/obj/item/keycard/cheese + name = "cheese keycard" + desc = "Look, I still don't understand the reference. What the heck is a keyzza?" + color = "#f0da12" + puzzle_id = "cheese" + +/obj/item/keycard/swordfish + name = "titanic keycard" + desc = "Smells like it was at the bottom of a harbor." + color = "#3bbbdb" + puzzle_id = "swordfish" + +//*************** +//*****Doors***** +//*************** + +/obj/machinery/door/keycard + name = "locked door" + desc = "This door only opens when a keycard is swiped. It looks virtually indestructable." + icon = 'icons/obj/doors/doorpuzzle.dmi' + icon_state = "door_closed" + explosion_block = 3 + heat_proof = TRUE + max_integrity = 600 + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + damage_deflection = 70 + var/puzzle_id = null //Make sure that the key has the same puzzle_id as the keycard door! + +//Standard Expressions to make keycard doors basically un-cheeseable +/obj/machinery/door/keycard/Bumped(atom/movable/AM) + return !density && ..() + +/obj/machinery/door/keycard/emp_act(severity) + return + +/obj/machinery/door/keycard/ex_act(severity, target) + return + +/obj/machinery/door/keycard/try_to_activate_door(mob/user) + add_fingerprint(user) + if(operating) + return + +/obj/machinery/door/keycard/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I,/obj/item/keycard)) + var/obj/item/keycard/key = I + if((!puzzle_id || puzzle_id == key.puzzle_id) && density) + to_chat(user, "The door beeps, and slides opens.") + open() + return + else if(puzzle_id != key.puzzle_id) + to_chat(user, "[src] buzzes. This must not be the right key.") + return + else + to_chat(user, "This door doesn't appear to close.") + return + +//Test doors. Gives admins a few doors to use quickly should they so choose. +/obj/machinery/door/keycard/cheese + name = "blue airlock" + desc = "Smells like... pizza?" + puzzle_id = "cheese" + +/obj/machinery/door/keycard/swordfish + name = "blue airlock" + desc = "If nautical nonsense be something you wish." + puzzle_id = "swordfish" + +//************************* +//***Box Pushing Puzzles*** +//************************* +//We're working off a subtype of pressureplates, which should work just a BIT better now. +/obj/structure/holobox + name = "holobox" + desc = "A hard-light box, containing a secure decryption key." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "laserbox" + density = TRUE + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + +//Uses the pressure_plate settings for a pretty basic custom pattern that waits for a specific item to trigger. Easy enough to retool for mapping purposes or subtypes. +/obj/item/pressure_plate/hologrid + name = "hologrid" + desc = "A high power, electronic input port for a holobox, which can unlock the hologrid's storage compartment. Safe to stand on." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "lasergrid" + anchored = TRUE + trigger_mob = FALSE + trigger_item = TRUE + specific_item = /obj/structure/holobox + removable_signaller = FALSE //Being a pressure plate subtype, this can also use signals. + roundstart_signaller_freq = FREQ_HOLOGRID_SOLUTION //Frequency is kept on it's own default channel however. + active = TRUE + trigger_delay = 10 + protected = TRUE + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + var/reward = /obj/item/reagent_containers/food/snacks/cookie + var/claimed = FALSE + +/obj/item/pressure_plate/hologrid/examine(mob/user) + . = ..() + if(claimed) + . += "This one appears to be spent already." + +/obj/item/pressure_plate/hologrid/trigger() + reward = new reward(loc) + flick("lasergrid_a",src) + icon_state = "lasergrid_full" + +/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) + . = ..() + if(trigger_item && istype(AM, specific_item) && !claimed) + claimed = TRUE + flick("laserbox_burn", AM) + sleep(15) + qdel(AM) diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index d36ae41d627..3a9f29f6bc8 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -36,7 +36,7 @@ /obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder) for(var/atom/X in orange(5,pull)) - if(ismovableatom(X)) + if(ismovable(X)) var/atom/movable/A = X if(A == wielder) continue diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 9a71ffe16fe..99d8eb402dc 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -12,6 +12,7 @@ var/blink_range = 8 // The teleport range when crushed/thrown at someone. refined_type = /obj/item/stack/sheet/bluespace_crystal grind_results = list(/datum/reagent/bluespace = 20) + scan_state = "rock_BScrystal" /obj/item/stack/ore/bluespace_crystal/refined name = "refined bluespace crystal" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index d1aafe990ab..d7fb0893305 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -508,16 +508,15 @@ for(var/i in 1 to 9) new /obj/item/ammo_box/magazine/smgm45(src) -/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax +/obj/item/storage/backpack/duffelbag/syndie/ammo/mech desc = "A large duffel bag, packed to the brim with various exosuit ammo." -/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax/PopulateContents() - new /obj/item/mecha_ammo/incendiary(src) - new /obj/item/mecha_ammo/incendiary(src) - new /obj/item/mecha_ammo/incendiary(src) - new /obj/item/mecha_ammo/flashbang(src) - new /obj/item/mecha_ammo/flashbang(src) - new /obj/item/mecha_ammo/flashbang(src) +/obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents() + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/storage/belt/utility/syndicate(src) /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler desc = "A large duffel bag, packed to the brim with various exosuit ammo." diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3015efbe45a..543ba33bcf0 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -111,6 +111,15 @@ new /obj/item/t_scanner(src) new /obj/item/extinguisher/mini(src) +/obj/item/storage/belt/utility/syndicate/PopulateContents() + new /obj/item/screwdriver/nuke(src) + new /obj/item/wrench/combat(src) + new /obj/item/weldingtool/largetank(src) + new /obj/item/crowbar(src) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + new /obj/item/inducer/syndicate(src) + /obj/item/storage/belt/medical name = "medical belt" desc = "Can hold various medical equipment." @@ -177,7 +186,7 @@ /obj/item/storage/belt/medical/paramedic/PopulateContents() new /obj/item/sensor_device(src) - new /obj/item/flashlight/pen(src) + new /obj/item/pinpointer/crew/prox(src) new /obj/item/stack/medical/gauze/twelve(src) new /obj/item/reagent_containers/syringe(src) new /obj/item/reagent_containers/glass/bottle/epinephrine(src) @@ -529,7 +538,8 @@ /obj/item/clothing/gloves, /obj/item/melee/flyswatter, /obj/item/assembly/mousetrap, - /obj/item/paint/paint_remover + /obj/item/paint/paint_remover, + /obj/item/twohanded/broom )) /obj/item/storage/belt/janitor/full/PopulateContents() @@ -554,31 +564,6 @@ /obj/item/ammo_casing/shotgun )) -/obj/item/storage/belt/holster - name = "shoulder holster" - desc = "A holster to carry a handgun and ammo. WARNING: Badasses only." - icon_state = "holster" - item_state = "holster" - alternate_worn_layer = UNDER_SUIT_LAYER - -/obj/item/storage/belt/holster/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 3 - STR.max_w_class = WEIGHT_CLASS_NORMAL - STR.set_holdable(list( - /obj/item/gun/ballistic/automatic/pistol, - /obj/item/gun/ballistic/revolver, - /obj/item/ammo_box, - /obj/item/gun/energy/e_gun/mini - )) - -/obj/item/storage/belt/holster/full/PopulateContents() - var/static/items_inside = list( - /obj/item/gun/ballistic/revolver/detective = 1, - /obj/item/ammo_box/c38 = 2) - generate_items_inside(items_inside,src) - /obj/item/storage/belt/fannypack name = "fannypack" desc = "A dorky fannypack for keeping small items in." diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 2de1c004eb7..93cac7e6b45 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -833,6 +833,7 @@ name = "box of rubber shots" desc = "A box full of rubber shots, designed for riot shotguns." icon_state = "rubbershot_box" + illustration = null /obj/item/storage/box/rubbershot/PopulateContents() for(var/i in 1 to 7) @@ -842,6 +843,7 @@ name = "box of lethal shotgun shots" desc = "A box full of lethal shots, designed for riot shotguns." icon_state = "lethalshot_box" + illustration = null /obj/item/storage/box/lethalshot/PopulateContents() for(var/i in 1 to 7) @@ -851,6 +853,7 @@ name = "box of beanbags" desc = "A box full of beanbag shells." illustration = "rubbershot_box" + illustration = null /obj/item/storage/box/beanbag/PopulateContents() for(var/i in 1 to 6) @@ -877,6 +880,7 @@ desc = "A sack neatly crafted out of paper." icon_state = "paperbag_None" item_state = "paperbag_None" + illustration = null resistance_flags = FLAMMABLE foldable = null var/design = NODESIGN diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm new file mode 100644 index 00000000000..39bd034a156 --- /dev/null +++ b/code/game/objects/items/storage/holsters.dm @@ -0,0 +1,119 @@ + +/obj/item/storage/belt/holster + name = "shoulder holster" + desc = "A rather plain but still badass looking holster with a single pouch that can hold a small firearm." + icon_state = "holster" + item_state = "holster" + alternate_worn_layer = UNDER_SUIT_LAYER + +/obj/item/storage/belt/holster/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_BELT) + ADD_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) + +/obj/item/storage/belt/holster/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) + +/obj/item/storage/belt/holster/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 1 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.set_holdable(list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/pulse/carbine, + /obj/item/gun/energy/dueling + )) + +/obj/item/storage/belt/holster/detective + name = "detective's holster" + desc = "A holster to carry a handgun and ammo. WARNING: Badasses only." + +/obj/item/storage/belt/holster/detective/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 3 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.set_holdable(list( + /obj/item/gun/ballistic/revolver, + /obj/item/ammo_box, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/dueling + )) + +/obj/item/storage/belt/holster/detective/full/PopulateContents() + var/static/items_inside = list( + /obj/item/gun/ballistic/revolver/detective = 1, + /obj/item/ammo_box/c38 = 2) + generate_items_inside(items_inside,src) + +/obj/item/storage/belt/holster/chameleon + name = "syndicate holster" + desc = "A two pouched hip holster that uses chameleon technology to disguise itself and any guns in it." + icon_state = "syndicate_holster" + item_state = "syndicate_holster" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/holster/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/obj/item/storage/belt/chameleon/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.silent = TRUE + +/obj/item/storage/belt/holster/chameleon/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + chameleon_action.emp_randomise() + +/obj/item/storage/belt/holster/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/holster/chameleon/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 2 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.set_holdable(list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/pulse/carbine, + /obj/item/gun/energy/dueling + )) + +/obj/item/storage/belt/holster/nukie + name = "operative holster" + desc = "A deep shoulder holster capable of holding almost any form of ballistic weaponry." + icon_state = "syndicate_holster" + item_state = "syndicate_holster" + w_class = WEIGHT_CLASS_BULKY + +/obj/item/storage/belt/holster/nukie/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 2 + STR.max_w_class = WEIGHT_CLASS_BULKY + STR.set_holdable(list( + /obj/item/gun/ballistic/automatic, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/pulse/carbine, + /obj/item/gun/energy/dueling, + /obj/item/gun/ballistic/shotgun, + /obj/item/gun/ballistic/rocketlauncher + )) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 0d7fb018a32..f76f2725173 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -516,6 +516,7 @@ new /obj/item/clothing/mask/chameleon/broken(src) new /obj/item/clothing/neck/chameleon/broken(src) new /obj/item/storage/backpack/chameleon/broken(src) + new /obj/item/storage/belt/chameleon/broken(src) new /obj/item/radio/headset/chameleon/broken(src) new /obj/item/stamp/chameleon/broken(src) new /obj/item/pda/chameleon/broken(src) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index fa395e32a98..9cc2bac1b19 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -170,12 +170,14 @@ playsound(src, stun_sound, 75, TRUE, -1) user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \ "You accidentally hit yourself with [src]!") - user.Knockdown(stun_time*3) + user.Knockdown(stun_time*3) //should really be an equivalent to attack(user,user) deductcharge(cell_hit_cost) - return + return TRUE + return FALSE /obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user) - clumsy_check(user) + if(clumsy_check(user)) + return FALSE if(iscyborg(M)) ..() @@ -206,7 +208,8 @@ /obj/item/melee/baton/proc/baton_effect(mob/living/L, mob/user) - check_shields(L, user) + if(shields_blocked(L, user)) + return FALSE if(iscyborg(loc)) var/mob/living/silicon/robot/R = loc if(!R || !R.cell || !R.cell.use(cell_hit_cost)) @@ -257,12 +260,13 @@ if (!(. & EMP_PROTECT_SELF)) deductcharge(1000 / severity) -/obj/item/melee/baton/proc/check_shields(mob/living/L, mob/user) +/obj/item/melee/baton/proc/shields_blocked(mob/living/L, mob/user) if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that - playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE) - return FALSE + playsound(H, 'sound/weapons/genhit.ogg', 50, TRUE) + return TRUE + return FALSE //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/cattleprod diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 4d0f7697853..08bfeca3fc7 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -234,7 +234,7 @@ . = ..() if(!sliver) return - if(proximity && ismovableatom(O) && O != sliver) + if(proximity && ismovable(O) && O != sliver) Consume(O, user) /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 800bdf9ea0d..8438c799d00 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -74,3 +74,46 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "wrench_cyborg" toolspeed = 0.5 + +/obj/item/wrench/combat + name = "combat wrench" + desc = "It's like a normal wrench but edgier. Can be found on the battlefield." + icon_state = "wrench_combat" + item_state = "wrench_combat" + attack_verb = list("devastated", "brutalized", "committed a war crime against", "obliterated", "humiliated") + tool_behaviour = null + toolspeed = null + var/on = FALSE + +/obj/item/wrench/combat/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + +/obj/item/wrench/combat/attack_self(mob/living/user) + if(on) + on = FALSE + force = initial(force) + w_class = initial(w_class) + throwforce = initial(throwforce) + tool_behaviour = initial(tool_behaviour) + toolspeed = initial(toolspeed) + playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE) + to_chat(user, "[src] can now be kept at bay.") + else + on = TRUE + force = 6 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 8 + tool_behaviour = TOOL_WRENCH + toolspeed = 1 + playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE) + to_chat(user, "[src] is now active. Woe onto your enemies!") + update_icon() + +/obj/item/wrench/combat/update_icon_state() + if(on) + icon_state = "[initial(icon_state)]_on" + item_state = "[initial(item_state)]1" + else + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index a3267218453..8ecefff8186 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -487,15 +487,17 @@ name = "explosive lance" var/obj/item/grenade/explosive = null -/obj/item/twohanded/spear/explosive/Initialize(mapload, obj/item/grenade/G) +/obj/item/twohanded/spear/explosive/Initialize(mapload) . = ..() - if (!G) - G = new /obj/item/grenade/iedcasing() //For admin-spawned explosive lances + set_explosive(new /obj/item/grenade/iedcasing()) //For admin-spawned explosive lances + + +/obj/item/twohanded/spear/explosive/proc/set_explosive(obj/item/grenade/G) + if(explosive) + QDEL_NULL(explosive) G.forceMove(src) explosive = G desc = "A makeshift spear with [G] attached to it" - update_icon() - /obj/item/twohanded/spear/explosive/CheckParts(list/parts_list) var/obj/item/grenade/G = locate() in parts_list @@ -507,7 +509,7 @@ icon_prefix = lancePart.icon_prefix parts_list -= G parts_list -= lancePart - Initialize(src.loc, G) + set_explosive(G) qdel(lancePart) ..() @@ -850,3 +852,66 @@ C.change_view(CONFIG_GET(string/default_view)) user.client.pixel_x = 0 user.client.pixel_y = 0 + +/obj/item/twohanded/broom + name = "broom" + desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." + icon = 'icons/obj/janitor.dmi' + icon_state = "broom0" + lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' + force = 8 + throwforce = 10 + throw_speed = 3 + throw_range = 7 + w_class = WEIGHT_CLASS_NORMAL + force_unwielded = 8 + force_wielded = 12 + attack_verb = list("swept", "brushed off", "bludgeoned", "whacked") + resistance_flags = FLAMMABLE + +/obj/item/twohanded/broom/update_icon_state() + icon_state = "broom[wielded]" + +/obj/item/twohanded/broom/wield(mob/user) + . = ..() + if(!wielded) + return + to_chat(user, "You brace the [src] against the ground in a firm sweeping stance.") + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep) + +/obj/item/twohanded/broom/unwield(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + +/obj/item/twohanded/broom/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!proximity) + return + sweep(user, A, FALSE) + +/obj/item/twohanded/broom/proc/sweep(mob/user, atom/A, moving = TRUE) + var/turf/target + if (!moving) + if (isturf(A)) + target = A + else + target = A.loc + else + target = user.loc + if (locate(/obj/structure/table) in target.contents) + return + var/i = 0 + for(var/obj/item/garbage in target.contents) + if(!garbage.anchored) + garbage.Move(get_step(target, user.dir), user.dir) + i++ + if(i >= 20) + break + if(i >= 1) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) + +/obj/item/twohanded/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta + J.put_in_cart(src, user) + J.mybroom=src + J.update_icon() diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 19e1eb3b1aa..cdc16465bcf 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -196,7 +196,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 "YOU FEEL THE POWER OF VALHALLA FLOWING THROUGH YOU! THERE CAN BE ONLY ONE!!!") user.update_icons() new_name = "GORE-DRENCHED CLAYMORE OF [pick("THE WHIMSICAL SLAUGHTER", "A THOUSAND SLAUGHTERED CATTLE", "GLORY AND VALHALLA", "ANNIHILATION", "OBLITERATION")]" - icon_state = "claymore_valhalla" + icon_state = "claymore_gold" item_state = "cultblade" remove_atom_colour(ADMIN_COLOUR_PRIORITY) @@ -475,7 +475,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/statuebust/Initialize() . = ..() AddComponent(/datum/component/art, impressiveness) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 1000), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 1000)), 0) /obj/item/statuebust/hippocratic name = "hippocrates bust" @@ -633,7 +633,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/cockroach, + /mob/living/simple_animal/hostile/cockroach, /obj/item/queen_bee )) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 9174ca2e8d4..11e8aa881f6 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -388,7 +388,7 @@ /obj/structure/closet/container_resist(mob/living/user) if(opened) return - if(ismovableatom(loc)) + if(ismovable(loc)) user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT var/atom/movable/AM = loc diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 43db503b2c0..d8aefab7a1f 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -200,7 +200,7 @@ new /obj/item/holosign_creator/security(src) new /obj/item/reagent_containers/spray/pepper(src) new /obj/item/clothing/suit/armor/vest/det_suit(src) - new /obj/item/storage/belt/holster/full(src) + new /obj/item/storage/belt/holster/detective/full(src) new /obj/item/pinpointer/crew(src) new /obj/item/twohanded/binoculars(src) new /obj/item/storage/box/rxglasses/spyglasskit(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 94d1b03fdb0..05f07ecdc46 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -16,6 +16,7 @@ new /obj/item/storage/belt/military(src) new /obj/item/crowbar/red(src) new /obj/item/clothing/glasses/night(src) + new /obj/item/storage/belt/holster/nukie(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 5791d9527ba..6e70a13a261 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -323,3 +323,17 @@ var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") new mineral_path(T, 2) qdel(src) + + +/obj/structure/door_assembly/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if(the_rcd.mode == RCD_DECONSTRUCT) + return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) + return FALSE + +/obj/structure/door_assembly/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, "You deconstruct [src].") + qdel(src) + return TRUE + return FALSE diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e6da6eaf8a0..5f18b4478b9 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -316,7 +316,7 @@ /obj/item/twohanded/required/kirbyplants/Initialize() . = ..() AddComponent(/datum/component/tactical) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 500), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 500)), 0) /obj/item/twohanded/required/kirbyplants/random icon = 'icons/obj/flora/_flora.dmi' diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index f823f59f8f5..3f9acdb7ae6 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -178,19 +178,6 @@ density = TRUE deconstructible = FALSE -/obj/structure/fluff/railing - name = "railing" - desc = "Basic railing meant to protect idiots like you from falling." - icon = 'icons/obj/fluff.dmi' - icon_state = "railing" - density = TRUE - anchored = TRUE - deconstructible = FALSE - -/obj/structure/fluff/railing/corner - icon_state = "railing_corner" - density = FALSE - /obj/structure/fluff/beach_towel name = "beach towel" desc = "A towel decorated in various beach-themed designs." diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index e31a7333f1f..678d6184f2a 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -285,7 +285,7 @@ /obj/structure/girder/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSGRILLE) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3228dc13107..2a242487af2 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -123,7 +123,7 @@ /obj/structure/grille/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSGRILLE) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 26006d1cb7f..bf527d70be6 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -7,10 +7,11 @@ density = TRUE //copypaste sorry var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite - var/obj/item/storage/bag/trash/mybag = null - var/obj/item/mop/mymop = null - var/obj/item/reagent_containers/spray/cleaner/myspray = null - var/obj/item/lightreplacer/myreplacer = null + var/obj/item/storage/bag/trash/mybag + var/obj/item/mop/mymop + var/obj/item/twohanded/broom/mybroom + var/obj/item/reagent_containers/spray/cleaner/myspray + var/obj/item/lightreplacer/myreplacer var/signs = 0 var/const/max_signs = 4 @@ -50,7 +51,12 @@ m.janicart_insert(user, src) else to_chat(user, fail_msg) - + else if(istype(I, /obj/item/twohanded/broom)) + if(!mybroom) + var/obj/item/twohanded/broom/b=I + b.janicart_insert(user,src) + else + to_chat(user, fail_msg) else if(istype(I, /obj/item/storage/bag/trash)) if(!mybag) var/obj/item/storage/bag/trash/t=I @@ -98,6 +104,8 @@ dat += "[mybag.name]
" if(mymop) dat += "[mymop.name]
" + if(mybroom) + dat += "[mybroom.name]
" if(myspray) dat += "[myspray.name]
" if(myreplacer) @@ -125,6 +133,11 @@ user.put_in_hands(mymop) to_chat(user, "You take [mymop] from [src].") mymop = null + if(href_list["broom"]) + if(mybroom) + user.put_in_hands(mybroom) + to_chat(user, "You take [mybroom] from [src].") + mybroom = null if(href_list["spray"]) if(myspray) user.put_in_hands(myspray) @@ -156,6 +169,8 @@ . += "cart_garbage" if(mymop) . += "cart_mop" + if(mybroom) + . += "cart_broom" if(myspray) . += "cart_spray" if(myreplacer) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 350a560c85b..22c32986b01 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -27,8 +27,8 @@ add_overlay(I) /obj/structure/geyser/process() - if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive and should be avoided in continous - reagents.add_reagent(reagent_id, potency) //processes + if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive + reagents.add_reagent(reagent_id, potency) /obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced) if(!_reinforced) @@ -39,12 +39,12 @@ return to_chat(user, "You start vigorously plunging [src]!") - if(do_after(user, 50*P.plunge_mod, target = src) && !activated) + if(do_after(user, 50 * P.plunge_mod, target = src) && !activated) start_chemming() /obj/structure/geyser/random erupting_state = null - var/list/options = list(/datum/reagent/fuel/oil = 2, /datum/reagent/clf3 = 1) //fucking add more + var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1) /obj/structure/geyser/random/Initialize() . = ..() @@ -72,3 +72,5 @@ reinforced = TRUE plunge_mod = 0.8 + + custom_premium_price = 1200 diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index bc1e54686c5..4c2e3fd296d 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -342,7 +342,7 @@ GLOBAL_LIST_EMPTY(crematoriums) to_chat(user, "That's not connected to anything!") /obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user) - if(!ismovableatom(O) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) + if(!ismovable(O) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) return if(!ismob(O)) if(!istype(O, /obj/structure/closet/body_bag)) @@ -387,6 +387,6 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/tray/m_tray/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index fa49049e603..83e368b13a2 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -16,15 +16,17 @@ var/instrumentDir = "piano" // the folder with the sounds var/instrumentExt = "ogg" // the file extension + var/instrumentRange = 15 // how far the sound can be heard var/obj/instrumentObj = null // the associated obj playing the sound var/last_hearcheck = 0 var/list/hearing_mobs -/datum/song/New(dir, obj, ext = "ogg") +/datum/song/New(dir, obj, ext = "ogg", range) tempo = sanitize_tempo(tempo) instrumentDir = dir instrumentObj = obj instrumentExt = ext + instrumentRange = range /datum/song/Destroy() instrumentObj = null @@ -66,7 +68,7 @@ var/turf/source = get_turf(instrumentObj) if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) LAZYCLEARLIST(hearing_mobs) - for(var/mob/M in get_hearers_in_view(15, source)) + for(var/mob/M in get_hearers_in_view(instrumentRange, source)) LAZYADD(hearing_mobs, M) last_hearcheck = world.time @@ -104,8 +106,7 @@ var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case - playing = FALSE - hearing_mobs = null + toggle_playing(user, FALSE) return if(!length(note)) continue @@ -138,8 +139,7 @@ else sleep(tempo) repeat-- - hearing_mobs = null - playing = FALSE + toggle_playing(user, FALSE) repeat = 0 updateDialog(user) @@ -270,8 +270,7 @@ tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) else if(href_list["play"]) - playing = TRUE - INVOKE_ASYNC(src, .proc/playsong, usr) + toggle_playing(usr, TRUE) else if(href_list["newline"]) var/newline = html_encode(input("Enter your line: ", instrumentObj.name) as text|null) @@ -299,8 +298,7 @@ lines[num] = content else if(href_list["stop"]) - playing = FALSE - hearing_mobs = null + toggle_playing(usr, FALSE) updateDialog(usr) return @@ -309,6 +307,15 @@ new_tempo = abs(new_tempo) return max(round(new_tempo, world.tick_lag), world.tick_lag) +/datum/song/proc/toggle_playing(user, new_play_state) + playing = new_play_state + if(playing) + INVOKE_ASYNC(src, .proc/playsong, user) + SEND_SIGNAL(instrumentObj, COMSIG_SONG_START) + else + hearing_mobs = null + SEND_SIGNAL(instrumentObj, COMSIG_SONG_END) + // subclass for handheld instruments, like violin /datum/song/handheld @@ -321,7 +328,6 @@ else return TRUE - ////////////////////////////////////////////////////////////////////////// diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm new file mode 100644 index 00000000000..422d7a06524 --- /dev/null +++ b/code/game/objects/structures/railings.dm @@ -0,0 +1,60 @@ +/obj/structure/railing + name = "railing" + desc = "Basic railing meant to protect idiots like you from falling." + icon = 'icons/obj/fluff.dmi' + icon_state = "railing" + density = TRUE + anchored = TRUE + climbable = TRUE + +/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch + icon_state = "railing_corner" + density = FALSE + climbable = FALSE + +/obj/structure/railing/attackby(obj/item/I, mob/living/user, params) + add_fingerprint(user) + + if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + to_chat(user, "You repair [src].") + else + to_chat(user, "[src] is already in good condition!") + return + + if(!(flags_1&NODECONSTRUCT_1)) + if(I.tool_behaviour == TOOL_WRENCH) + to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...") + if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) + setAnchored(!anchored) + to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") + return + +/obj/structure/railing/proc/check_anchored(checked_anchored) + if(anchored == checked_anchored) + return TRUE + +/obj/structure/railing/CanPass(atom/movable/mover, turf/target) + ..() + if(get_dir(loc, target) & dir) + return !density + return TRUE + +/obj/structure/railing/corner/CanPass() + ..() + return TRUE + +/obj/structure/railing/CheckExit(atom/movable/O, turf/target) + ..() + if(get_dir(loc, target) & dir) + return 0 + return 1 + +/obj/structure/railing/corner/CheckExit() + return 1 diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 11b5b51ba0f..548831ea061 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -15,7 +15,7 @@ /obj/structure/statue/Initialize() . = ..() AddComponent(art_type, impressiveness) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, impressiveness * 75), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, impressiveness * 75)), 0) /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 33cddb13e2c..092eda73383 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -101,7 +101,7 @@ /obj/structure/table/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) @@ -167,6 +167,9 @@ if(istype(I, /obj/item/storage/bag/tray)) var/obj/item/storage/bag/tray/T = I if(T.contents.len > 0) // If the tray isn't empty + for(var/x in T.contents) + var/obj/item/item = x + AfterPutItemOnTable(item, user) SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) user.visible_message("[user] empties [I] on [src].") return @@ -181,10 +184,13 @@ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) - return 1 + AfterPutItemOnTable(I, user) + return TRUE else return ..() +/obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) + return /obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) if(!(flags_1 & NODECONSTRUCT_1)) @@ -208,6 +214,36 @@ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS buildstack = null //No buildstack, so generate from mat datums +///Table on wheels +/obj/structure/table/rolling + name = "Rolling table" + desc = "A NT brand \"Rolly poly\" rolling table. It can and will move." + anchored = FALSE + smooth = SMOOTH_FALSE + canSmoothWith = list() + icon = 'icons/obj/smooth_structures/rollingtable.dmi' + icon_state = "rollingtable" + var/list/attached_items = list() + +/obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) + . = ..() + attached_items += I + RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/RemoveItemFromTable) //Listen for the pickup event, unregister on pick-up so we aren't moved + +/obj/structure/table/rolling/proc/RemoveItemFromTable(datum/source, newloc, dir) + if(newloc != loc) //Did we not move with the table? because that shit's ok + return FALSE + attached_items -= source + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/obj/structure/table/rolling/Moved(atom/OldLoc, Dir) + for(var/mob/M in OldLoc.contents)//Kidnap everyone on top + M.forceMove(loc) + for(var/x in attached_items) + var/atom/movable/AM = x + if(!AM.Move(loc)) + RemoveItemFromTable(AM, AM.loc) + return TRUE /* * Glass tables @@ -516,7 +552,7 @@ /obj/structure/rack/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 08a435634e9..666ea864260 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -315,13 +315,8 @@ /obj/structure/windoor_assembly/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, - null, - CALLBACK(src, .proc/can_be_rotated), - CALLBACK(src,.proc/after_rotation) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, can_be_rotated=CALLBACK(src, .proc/can_be_rotated), after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) if(anchored) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 9edef593c18..01e1403521e 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -17,8 +17,6 @@ var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless var/obj/item/stack/ore/mineralType = null var/mineralAmt = 3 - var/spread = 0 //will the seam spread? - var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles var/last_act = 0 var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner var/defer_change = 0 @@ -31,12 +29,24 @@ transform = M icon = smooth_icon . = ..() - if (mineralType && mineralAmt && spread && spreadChance) + +/turf/closed/mineral/proc/Spread_Vein() + var/spreadChance = initial(mineralType.spreadChance) + if(spreadChance) for(var/dir in GLOB.cardinals) if(prob(spreadChance)) var/turf/T = get_step(src, dir) - if(istype(T, /turf/closed/mineral/random)) - Spread(T) + var/turf/closed/mineral/random/M = T + if(istype(M) && !M.mineralType) + M.Change_Ore(mineralType) + +/turf/closed/mineral/proc/Change_Ore(var/ore_type, random = 0) + if(random) + mineralAmt = rand(1, 5) + if(ispath(ore_type, /obj/item/stack/ore)) //If it has a scan_state, switch to it + var/obj/item/stack/ore/the_ore = ore_type + scan_state = initial(the_ore.scan_state) // I SAID. SWITCH. TO. IT. + mineralType = ore_type // Everything else assumes that this is typed correctly so don't set it to non-ores thanks. /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) if(turf_type) @@ -134,48 +144,50 @@ gets_drilled(null, FALSE) return -/turf/closed/mineral/Spread(turf/T) - T.ChangeTurf(type) - /turf/closed/mineral/random - var/list/mineralSpawnChanceList = list(/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10, - /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, - /turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 2, /turf/closed/mineral/bscrystal = 1) + var/list/mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11, + /turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 2, /obj/item/stack/ore/bluespace_crystal = 1) //Currently, Adamantine won't spawn as it has no uses. -Durandan var/mineralChance = 13 - var/display_icon_state = "rock" /turf/closed/mineral/random/Initialize() mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList) - if (display_icon_state) - icon_state = display_icon_state . = ..() if (prob(mineralChance)) var/path = pickweight(mineralSpawnChanceList) - var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) + if(ispath(path, /turf)) + var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) - if(T && ismineralturf(T)) - var/turf/closed/mineral/M = T - M.mineralAmt = rand(1, 5) - M.environment_type = src.environment_type - M.turf_type = src.turf_type - M.baseturfs = src.baseturfs - src = M - M.levelupdate() + T.baseturfs = src.baseturfs + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.turf_type = src.turf_type + M.mineralAmt = rand(1, 5) + M.environment_type = src.environment_type + src = M + M.levelupdate() + else + src = T + T.levelupdate() + + else + Change_Ore(path, 1) + Spread_Vein(path) /turf/closed/mineral/random/no_caves - mineralSpawnChanceList = list(/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10, - /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, - /turf/closed/mineral/gibtonite = 4, /turf/closed/mineral/bscrystal = 1) + mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11, + /turf/closed/mineral/gibtonite = 4, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 35, /turf/closed/mineral/diamond = 30, /turf/closed/mineral/gold = 45, /turf/closed/mineral/titanium = 45, - /turf/closed/mineral/silver = 50, /turf/closed/mineral/plasma = 50, /turf/closed/mineral/bscrystal = 20) + /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, + /obj/item/stack/ore/silver = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal = 20) /turf/closed/mineral/random/high_chance/volcanic environment_type = "basalt" @@ -184,18 +196,17 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45, - /turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20) - + /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, + /obj/item/stack/ore/silver = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal) /turf/closed/mineral/random/low_chance icon_state = "rock_lowchance" mineralChance = 6 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4, /turf/closed/mineral/titanium = 4, - /turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40, - /turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1) + /obj/item/stack/ore/uranium = 2, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 4, /obj/item/stack/ore/titanium = 4, + /obj/item/stack/ore/silver = 6, /obj/item/stack/ore/plasma = 15, /obj/item/stack/ore/iron = 40, + /turf/closed/mineral/gibtonite = 2, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/volcanic @@ -207,15 +218,15 @@ mineralChance = 10 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium/volcanic = 5, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 10, /turf/closed/mineral/titanium/volcanic = 11, - /turf/closed/mineral/silver/volcanic = 12, /turf/closed/mineral/plasma/volcanic = 20, /turf/closed/mineral/iron/volcanic = 40, - /turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/closed/mineral/bscrystal/volcanic = 1) + /obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, /obj/item/stack/ore/titanium = 11, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, + /turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/labormineral mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 3, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 8, /turf/closed/mineral/titanium = 8, - /turf/closed/mineral/silver = 20, /turf/closed/mineral/plasma = 30, /turf/closed/mineral/iron = 95, + /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/plasma = 30, /obj/item/stack/ore/iron = 95, /turf/closed/mineral/gibtonite = 2) icon_state = "rock_labor" @@ -227,16 +238,14 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium/volcanic = 3, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 8, /turf/closed/mineral/titanium/volcanic = 8, - /turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2, - /turf/closed/mineral/iron/volcanic = 95) - + /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/plasma = 30, /obj/item/stack/ore/bluespace_crystal = 1, /turf/closed/mineral/gibtonite/volcanic = 2, + /obj/item/stack/ore/iron = 95) +// Subtypes for mappers placing ores manually. /turf/closed/mineral/iron mineralType = /obj/item/stack/ore/iron - spreadChance = 20 - spread = 1 scan_state = "rock_Iron" /turf/closed/mineral/iron/volcanic @@ -258,8 +267,6 @@ /turf/closed/mineral/uranium mineralType = /obj/item/stack/ore/uranium - spreadChance = 5 - spread = 1 scan_state = "rock_Uranium" /turf/closed/mineral/uranium/volcanic @@ -272,8 +279,6 @@ /turf/closed/mineral/diamond mineralType = /obj/item/stack/ore/diamond - spreadChance = 0 - spread = 1 scan_state = "rock_Diamond" /turf/closed/mineral/diamond/volcanic @@ -295,8 +300,6 @@ /turf/closed/mineral/gold mineralType = /obj/item/stack/ore/gold - spreadChance = 5 - spread = 1 scan_state = "rock_Gold" /turf/closed/mineral/gold/volcanic @@ -309,8 +312,6 @@ /turf/closed/mineral/silver mineralType = /obj/item/stack/ore/silver - spreadChance = 5 - spread = 1 scan_state = "rock_Silver" /turf/closed/mineral/silver/volcanic @@ -323,8 +324,6 @@ /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium - spreadChance = 5 - spread = 1 scan_state = "rock_Titanium" /turf/closed/mineral/titanium/volcanic @@ -337,8 +336,6 @@ /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma - spreadChance = 8 - spread = 1 scan_state = "rock_Plasma" /turf/closed/mineral/plasma/volcanic @@ -362,16 +359,12 @@ /turf/closed/mineral/bananium mineralType = /obj/item/stack/ore/bananium mineralAmt = 3 - spreadChance = 0 - spread = 0 scan_state = "rock_Bananium" /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal mineralAmt = 1 - spreadChance = 0 - spread = 0 scan_state = "rock_BScrystal" /turf/closed/mineral/bscrystal/volcanic @@ -435,8 +428,6 @@ /turf/closed/mineral/gibtonite mineralAmt = 1 - spreadChance = 0 - spread = 0 scan_state = "rock_Gibtonite" var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 2f2c03b530e..599a2359557 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me return if(is_mining_level(z)) SpawnFlora(T) //No space mushrooms, cacti. - // SpawnTerrain(T) + SpawnTerrain(T) SpawnMonster(T) //Checks for danger area. T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) @@ -305,7 +305,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me new randumb(T) /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T) - if(prob(2)) + if(prob(1)) if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) return var/randumb = pickweight(terrain_spawn_list) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7130a640f52..639b756c40c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -424,7 +424,7 @@ for(var/V in contents) var/atom/A = V if(!QDELETED(A) && A.level >= affecting_level) - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A if(!AM.ex_check(explosion_id)) continue diff --git a/code/game/world.dm b/code/game/world.dm index 322a77c7508..fde55ed6749 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -22,7 +22,7 @@ GLOBAL_VAR(restart_counter) enable_debugger() //Early profile for auto-profiler - will be stopped on profiler init if necessary. -#if DM_VERSION >= 513 && DM_BUILD >= 1506 +#if DM_BUILD >= 1506 world.Profile(PROFILE_START) #endif diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7f73f384a6b..bb3c9df152d 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -1176,7 +1176,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null char = query_text[i] if(char == "\"") - if(query_text[i + length(char)] == "'") + if((i + length(char) <= len) && query_text[i + length(char)] == "'") word += "\"" i += length(query_text[i + length(char)]) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index 32f385f8ec0..1c26cd7932f 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -482,14 +482,6 @@ temp_expression_list = list() i = expression(i, temp_expression_list) -#if MIN_COMPILER_VERSION > 512 -#warn Remove this outdated workaround -#elif DM_BUILD < 1467 - // http://www.byond.com/forum/post/2445083 - var/dummy = src.type - dummy = dummy -#endif - while(token(i) && token(i) != "]") if (temp_expression_list) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index b7db80e2f10..53a64926715 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -175,7 +175,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) id = ++ticket_counter opened_at = world.time - name = msg + name = copytext_char(msg, 1, 100) initiator = C initiator_ckey = initiator.ckey @@ -484,10 +484,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) // Used for methods where input via arg doesn't work /client/proc/get_adminhelp() - var/msg = input(src, "Please describe your problem concisely and an admin will help as soon as they're able.", "Adminhelp contents") as text|null + var/msg = input(src, "Please describe your problem concisely and an admin will help as soon as they're able.", "Adminhelp contents") as message|null adminhelp(msg) -/client/verb/adminhelp(msg as text) +/client/verb/adminhelp(msg as message) set category = "Admin" set name = "Adminhelp" diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 2a1d4c7a6ff..79d7379b8bf 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -69,10 +69,10 @@ lst.Insert(1, result) if(result in componentsubtypes) datumname = "component" - target.AddComponent(arglist(lst)) + target._AddComponent(lst) else datumname = "element" - target.AddElement(arglist(lst)) + target._AddElement(lst) log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") if(href_list[VV_HK_CALLPROC]) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 574520bce26..f7d82891c9d 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -110,9 +110,6 @@ if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE - if(!user.onSyndieBase()) - to_chat(user, "[src] is out of range! It can only be used at your base!") - return FALSE return TRUE diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 6018b497931..5cc9ce2ce0a 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -510,7 +510,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} /obj/item/melee/baton/abductor/attack(mob/target, mob/living/user) if(!AbductorCheck(user)) - return + return FALSE if(!deductcharge(cell_hit_cost)) to_chat(user, "[src] [cell ? "is out of charge" : "does not have a power source installed"].") @@ -522,16 +522,20 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(iscyborg(target)) if(BATON_STUN) ..() - return + return FALSE if(!isliving(target)) - return + return FALSE + + if(clumsy_check(user)) + return FALSE var/mob/living/L = target user.do_attack_animation(L) - check_shields(L, user) + if(shields_blocked(L, user)) + return FALSE switch (mode) if(BATON_STUN) diff --git a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm index 649ca4d44c4..67f47a4b806 100644 --- a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm +++ b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm @@ -34,5 +34,5 @@ /datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() M.apply_damage(0.6*reac_volume, BRUTE) - if(M) + if(!QDELETED(M)) M.apply_damage(0.6*reac_volume, BURN) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index cc238587560..966290d1509 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -77,7 +77,7 @@ /obj/structure/blob/CanAStarPass(ID, dir, caller) . = 0 - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSBLOB) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 9b358956594..807ec65b7e0 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -22,6 +22,8 @@ var/end_message = "." var/rendered = begin_message + obj_message + end_message deadchat_broadcast(rendered, "[L]", follow_target = L, turf_target = get_turf(L), message_type=DEADCHAT_REGULAR) + if(prob(1) || SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + L.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in.") /datum/antagonist/brainwashed name = "Brainwashed Victim" diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index e0ec4cfab7f..740f9d04e65 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -476,6 +476,8 @@ clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. + actions_types = list() + cell = null /obj/item/clothing/suit/space/changeling/Initialize() . = ..() @@ -484,10 +486,15 @@ loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") START_PROCESSING(SSobj, src) +// seal the cell door +/obj/item/clothing/suit/space/changeling/toggle_spacesuit_cell(mob/user) + return + /obj/item/clothing/suit/space/changeling/process() if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM) + H.adjust_bodytemperature(temperature_setting - H.bodytemperature) // force changelings to normal temp step mode played badly /obj/item/clothing/head/helmet/space/changeling name = "flesh mass" diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 26483160071..3d1422e3bb2 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -348,7 +348,7 @@ /datum/objective/sacrifice/update_explanation_text() if(target) - explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking a Sacrifice rune with [target.p_them()] on it and three acolytes around it." + explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking an Offer rune with [target.p_them()] on it and three acolytes around it." else explanation_text = "The veil has already been weakened here, proceed to the final objective." diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 82f0f6e885d..61c727cf7d0 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -256,6 +256,8 @@ structure_check() searches for nearby cultist structures required for the invoca H.uncuff() H.stuttering = 0 H.cultslurring = 0 + if(prob(1) || SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + H.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in.") return 1 /obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) @@ -520,7 +522,7 @@ structure_check() searches for nearby cultist structures required for the invoca icon_state = "1" color = RUNE_COLOR_MEDIUMRED var/static/sacrifices_used = -SOULS_TO_REVIVE // Cultists get one "free" revive - + /obj/effect/rune/raise_dead/examine(mob/user) . = ..() if(iscultist(user) || user.stat == DEAD) diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index 4ac85175861..7d48e3f4d89 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -10,6 +10,7 @@ roundend_category = "clown operatives" antagpanel_category = "ClownOp" nukeop_outfit = /datum/outfit/syndicate/clownop/leader + challengeitem = /obj/item/nuclear_challenge/clownops /datum/antagonist/nukeop/leader/clownop/give_alias() title = pick("Head Honker", "Slipmaster", "Clown King", "Honkbearer") diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index db541ccbeb5..a4acc3492fd 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -154,6 +154,7 @@ nukeop_outfit = /datum/outfit/syndicate/leader always_new_team = TRUE var/title + var/challengeitem = /obj/item/nuclear_challenge /datum/antagonist/nukeop/leader/memorize_code() ..() @@ -179,7 +180,14 @@ owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + if(!CONFIG_GET(flag/disable_warops)) + to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + var/obj/item/dukinuki = new challengeitem + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + dukinuki.forceMove(H.drop_location()) + else + H.put_in_hands(dukinuki, TRUE) owner.announce_objectives() addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index 526646d975d..8c993da7dc5 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -15,5 +15,5 @@ . = ..() /datum/antagonist/heartbreaker/greet() - to_chat(owner, "You didn't get a date! They're all having fun without you! you'll show them though...") + to_chat(owner, "You didn't get a date! They're all having fun without you! You'll show them though...") owner.announce_objectives() diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 5478fb639f7..c388537aac2 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -191,6 +191,8 @@ to_chat(user, "They must be conscious before you can convert [H.p_them()]!") return if(converter.add_revolutionary(H.mind)) + if(prob(1) || SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + H.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in.") times_used -- //Flashes less likely to burn out for headrevs when used for conversion else to_chat(user, "This mind seems resistant to the flash!") diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 3dddae32abc..eb31d9faf27 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -16,9 +16,8 @@ /obj/item/assembly_holder/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags) /obj/item/assembly_holder/IsAssemblyHolder() return TRUE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 811fccf0e05..8099d18fb93 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -4,7 +4,10 @@ icon_state = "infrared" custom_materials = list(/datum/material/iron=1000, /datum/material/glass=500) is_position_sensitive = TRUE - + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + var/ui_x = 225 + var/ui_y = 110 var/on = FALSE var/visible = FALSE var/maxlength = 8 @@ -12,8 +15,6 @@ var/olddir = 0 var/turf/listeningTo var/hearing_range = 3 - drop_sound = 'sound/items/handling/component_drop.ogg' - pickup_sound = 'sound/items/handling/component_pickup.ogg' /obj/item/assembly/infra/Initialize() . = ..() @@ -22,13 +23,8 @@ /obj/item/assembly/infra/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS, - null, - null, - CALLBACK(src,.proc/after_rotation) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/item/assembly/infra/proc/after_rotation() refreshBeam() @@ -45,7 +41,7 @@ /obj/item/assembly/infra/activate() if(!..()) - return FALSE//Cooldown check + return FALSE //Cooldown check on = !on refreshBeam() update_icon() @@ -183,54 +179,53 @@ return return refreshBeam() -/obj/item/assembly/infra/ui_interact(mob/user)//TODO: change this this to the wire control panel - . = ..() - if(is_secured(user)) - user.set_machine(src) - var/dat = "Infrared Laser" - dat += "
Status: [on ? "On" : "Off"]" - dat += "
Visibility: [visible ? "Visible" : "Invisible"]" - dat += "

Refresh" - dat += "

Close" - user << browse(dat, "window=infra") - onclose(user, "infra") - return - -/obj/item/assembly/infra/Topic(href, href_list) - ..() - if(!usr.canUseTopic(src, BE_CLOSE)) - usr << browse(null, "window=infra") - onclose(usr, "infra") - return - - if(href_list["state"]) - on = !(on) - update_icon() - refreshBeam() - if(href_list["visible"]) - visible = !(visible) - update_icon() - refreshBeam() - if(href_list["close"]) - usr << browse(null, "window=infra") - return - if(usr) - attack_self(usr) - /obj/item/assembly/infra/setDir() . = ..() refreshBeam() +/obj/item/assembly/infra/ui_status(mob/user) + if(is_secured(user)) + return ..() + return UI_CLOSE + +/obj/item/assembly/infra/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "infrared_emitter", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/item/assembly/infra/ui_data(mob/user) + var/list/data = list() + data["on"] = on + data["visible"] = visible + return data + +/obj/item/assembly/infra/ui_act(action, params) + if(..()) + return + + switch(action) + if("power") + on = !on + . = TRUE + if("visibility") + visible = !visible + . = TRUE + + update_icon() + refreshBeam() + /***************************IBeam*********************************/ /obj/effect/beam/i_beam name = "infrared beam" icon = 'icons/obj/projectiles.dmi' icon_state = "ibeam" - var/obj/item/assembly/infra/master anchored = TRUE density = FALSE pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW + var/obj/item/assembly/infra/master /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) if(istype(AM, /obj/effect/beam)) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index be75a725c17..648a015d168 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -4,15 +4,15 @@ icon_state = "prox" custom_materials = list(/datum/material/iron=800, /datum/material/glass=200) attachable = TRUE - + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + var/ui_x = 250 + var/ui_y = 185 var/scanning = FALSE var/timing = FALSE var/time = 10 var/sensitivity = 1 var/hearing_range = 3 - drop_sound = 'sound/items/handling/component_drop.ogg' - pickup_sound = 'sound/items/handling/component_pickup.ogg' - /obj/item/assembly/prox_sensor/Initialize() . = ..() @@ -29,7 +29,7 @@ /obj/item/assembly/prox_sensor/activate() if(!..()) - return FALSE//Cooldown check + return FALSE //Cooldown check if(!scanning) timing = !timing else @@ -44,7 +44,6 @@ else proximity_monitor.SetHost(src,src) - /obj/item/assembly/prox_sensor/toggle_secure() secured = !secured if(!secured) @@ -59,8 +58,6 @@ update_icon() return secured - - /obj/item/assembly/prox_sensor/HasProximity(atom/movable/AM as mob|obj) if (istype(AM, /obj/effect/beam)) return @@ -78,7 +75,6 @@ next_activate = world.time + 30 return TRUE - /obj/item/assembly/prox_sensor/process() if(!timing) return @@ -114,49 +110,48 @@ holder.update_icon() return -/obj/item/assembly/prox_sensor/ui_interact(mob/user)//TODO: Change this to the wires thingy - . = ..() +/obj/item/assembly/prox_sensor/ui_status(mob/user) if(is_secured(user)) - var/second = time % 60 - var/minute = (time - second) / 60 - var/dat = "Proximity Sensor" - if(!scanning) - dat += "
[(timing ? "Arming" : "Not Arming")] [minute]:[second]" - dat += "
- - + +" - dat += "
Armed":"1'>Unarmed (Movement sensor active when armed!)"]" - dat += "
Detection range: - [sensitivity] +" - dat += "

Refresh" - dat += "

Close" - user << browse(dat, "window=prox") - onclose(user, "prox") + return ..() + return UI_CLOSE + +/obj/item/assembly/prox_sensor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "proximity_sensor", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/item/assembly/prox_sensor/ui_data(mob/user) + var/list/data = list() + var/time_left = time + data["seconds"] = round(time_left % 60) + data["minutes"] = round((time_left - data["seconds"]) / 60) + data["timing"] = timing + data["scanning"] = scanning + data["sensitivity"] = sensitivity + return data + +/obj/item/assembly/prox_sensor/ui_act(action, params) + if(..()) return - -/obj/item/assembly/prox_sensor/Topic(href, href_list) - ..() - if(!usr.canUseTopic(src, BE_CLOSE)) - usr << browse(null, "window=prox") - onclose(usr, "prox") - return - - if(href_list["sense"]) - sensitivity_change(((href_list["sense"] == "up") ? 1 : -1)) - - if(href_list["scanning"]) - toggle_scan(text2num(href_list["scanning"])) - - if(href_list["time"]) - timing = text2num(href_list["time"]) - update_icon() - - if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 600) - - if(href_list["close"]) - usr << browse(null, "window=prox") - return - - if(usr) - attack_self(usr) + switch(action) + if("scanning") + toggle_scan(!scanning) + . = TRUE + if("sense") + var/value = text2num(params["range"]) + if(value) + sensitivity_change(value) + . = TRUE + if("time") + timing = !timing + update_icon() + . = TRUE + if("input") + var/value = text2num(params["adjust"]) + if(value) + var/newtime = round(time+value) + time = CLAMP(newtime, 0, 600) + . = TRUE diff --git a/code/modules/buildmode/submodes/copy.dm b/code/modules/buildmode/submodes/copy.dm index ba415c50fc7..4aed8ac700d 100644 --- a/code/modules/buildmode/submodes/copy.dm +++ b/code/modules/buildmode/submodes/copy.dm @@ -23,6 +23,6 @@ DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T) log_admin("Build Mode: [key_name(c)] copied [stored] to [AREACOORD(object)]") else if(right_click) - if(ismovableatom(object)) // No copying turfs for now. + if(ismovable(object)) // No copying turfs for now. to_chat(c, "[object] set as template.") stored = object diff --git a/code/modules/cargo/exports/organs.dm b/code/modules/cargo/exports/organs.dm new file mode 100644 index 00000000000..83d650e729b --- /dev/null +++ b/code/modules/cargo/exports/organs.dm @@ -0,0 +1,38 @@ +/datum/export/organ + include_subtypes = FALSE //Centcom doesn't need organs from non-humans. + export_category = EXPORT_CONTRABAND + +/datum/export/organ/heart + cost = 10 //For the man who has everything and nothing. + unit_name = "humanoid heart" + export_types = list(/obj/item/organ/heart) + +/datum/export/organ/eyes + cost = 5 + unit_name = "humanoid eyes" + export_types = list(/obj/item/organ/eyes) + +/datum/export/organ/ears + cost = 5 + unit_name = "humanoid ears" + export_types = list(/obj/item/organ/ears) + +/datum/export/organ/liver + cost = 5 + unit_name = "humanoid liver" + export_types = list(/obj/item/organ/liver) + +/datum/export/organ/lungs + cost = 5 + unit_name = "humanoid lungs" + export_types = list(/obj/item/organ/lungs) + +/datum/export/organ/stomach + cost = 5 + unit_name = "humanoid stomach" + export_types = list(/obj/item/organ/stomach) + +/datum/export/organ/tongue + cost = 5 + unit_name = "humanoid tounge" + export_types = list(/obj/item/organ/tongue) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index e60fb620344..276882e0f64 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1452,12 +1452,13 @@ /datum/supply_pack/service/janitor name = "Janitorial Supplies Crate" - desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, and trash bag." + desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, broom, spray cleaner, rag, and trash bag." cost = 1000 contains = list(/obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, + /obj/item/twohanded/broom, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, @@ -2365,6 +2366,22 @@ /obj/item/vending_refill/wardrobe/law_wardrobe) crate_name = "security department supply crate" +/datum/supply_pack/costumes_toys/mafia + name = "Cosa Nostra Starter Pack" + desc = "This crate contains everything you need to set up your own ethnicity-based racketeering operation." + cost = 1000 + contains = list() + contraband = TRUE + +/datum/supply_pack/costumes_toys/mafia/fill(obj/structure/closet/crate/C) + for(var/i in 1 to 4) + new /obj/effect/spawner/lootdrop/mafia_outfit(C) + new /obj/item/virgin_mary(C) + if(prob(30)) //Not all mafioso have mustaches, some people also find this item annoying. + new /obj/item/clothing/mask/fakemoustache/italian(C) + if(prob(10)) //A little extra sugar every now and then to shake things up. + new /obj/item/switchblade(C) + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Miscellaneous /////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 68911fa5af3..6010d282bf1 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -388,18 +388,12 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/simple/tgui assets = list( - // tgui - "tgui.css" = 'tgui/assets/tgui.css', - "tgui.js" = 'tgui/assets/tgui.js', - // tgui-next - "tgui-main.html" = 'tgui-next/packages/tgui/public/tgui-main.html', - "tgui-fallback.html" = 'tgui-next/packages/tgui/public/tgui-fallback.html', - "tgui.bundle.js" = 'tgui-next/packages/tgui/public/tgui.bundle.js', - "tgui.bundle.css" = 'tgui-next/packages/tgui/public/tgui.bundle.css', - "shim-html5shiv.js" = 'tgui-next/packages/tgui/public/shim-html5shiv.js', - "shim-ie8.js" = 'tgui-next/packages/tgui/public/shim-ie8.js', - "shim-dom4.js" = 'tgui-next/packages/tgui/public/shim-dom4.js', - "shim-css-om.js" = 'tgui-next/packages/tgui/public/shim-css-om.js', + "tgui.bundle.js" = 'tgui/packages/tgui/public/tgui.bundle.js', + "tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css', + "shim-html5shiv.js" = 'tgui/packages/tgui/public/shim-html5shiv.js', + "shim-ie8.js" = 'tgui/packages/tgui/public/shim-ie8.js', + "shim-dom4.js" = 'tgui/packages/tgui/public/shim-dom4.js', + "shim-css-om.js" = 'tgui/packages/tgui/public/shim-css-om.js', ) /datum/asset/group/tgui diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f153623ad24..1e363479a64 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -275,10 +275,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if(matches) if(C) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(C)].") - log_access("Notice: [key_name(src)] has the same [matches] as [key_name(C)].") + log_admin_private("Notice: [key_name(src)] has the same [matches] as [key_name(C)].") else message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(C)] (no longer logged in). ") - log_access("Notice: [key_name(src)] has the same [matches] as [key_name(C)] (no longer logged in).") + log_admin_private("Notice: [key_name(src)] has the same [matches] as [key_name(C)] (no longer logged in).") if(GLOB.player_details[ckey]) player_details = GLOB.player_details[ckey] diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 14509f250cf..b27e33cc063 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1815,3 +1815,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) return else custom_names[name_id] = sanitized_name + +//Used in savefile update 32, can be removed once that is no longer relevant. +/datum/preferences/proc/force_reset_keybindings() + var/choice = tgalert(parent.mob, "Your basic keybindings need to be reset, emotes will remain as before. Would you prefer 'hotkey' or 'classic' mode?", "Reset keybindings", "Hotkey", "Classic") + hotkeys = (choice != "Classic") + var/list/oldkeys = key_bindings + key_bindings = (hotkeys) ? deepCopyList(GLOB.hotkey_keybinding_list_by_key) : deepCopyList(GLOB.classic_keybinding_list_by_key) + + for(var/key in oldkeys) + if(!key_bindings[key]) + key_bindings[key] = oldkeys[key] + parent.update_movement_keys() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 6231006c5bb..b458d28841f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 31 +#define SAVEFILE_VERSION_MAX 32 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -42,11 +42,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //if your savefile is 3 months out of date, then 'tough shit'. /datum/preferences/proc/update_preferences(current_version, savefile/S) - if(current_version < 29) - key_bindings = (hotkeys) ? deepCopyList(GLOB.hotkey_keybinding_list_by_key) : deepCopyList(GLOB.classic_keybinding_list_by_key) - parent.update_movement_keys(src) - to_chat(parent, "Empty keybindings, setting default to [hotkeys ? "Hotkey" : "Classic"] mode") - if(current_version < 30) if(clientfps == 0) clientfps = 60 @@ -55,6 +50,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(clientfps == 60) clientfps = 0 + if(current_version < 32) //If you remove this, remove force_reset_keybindings() too. + addtimer(CALLBACK(src, .proc/force_reset_keybindings), 30) //No mob available when this is run, timer allows user choice. + /datum/preferences/proc/update_character(current_version, savefile/S) if(current_version < 19) pda_style = "mono" diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 49954956000..16745badb17 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -30,45 +30,3 @@ /obj/item/clothing/ears/earmuffs/dropped(mob/user) . = ..() REMOVE_TRAIT(user, TRAIT_DEAF, CLOTHING_TRAIT) - -/obj/item/clothing/ears/earmuffs/spacepods - name = "nanotrasen space pods" - desc = "Flex your money, AND ignore what everone else says, all at once!" - icon = 'icons/obj/clothing/accessories.dmi' - icon_state = "spacepods" - item_state = "spacepods" - strip_delay = 100 //air pods don't fall out - custom_premium_price = 1800 - -/obj/item/clothing/ears/headphones - name = "headphones" - desc = "Unce unce unce unce. Boop!" - icon = 'icons/obj/clothing/accessories.dmi' - icon_state = "headphones" - item_state = "headphones" - slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want! - actions_types = list(/datum/action/item_action/toggle_headphones) - var/headphones_on = FALSE - custom_price = 125 - -/obj/item/clothing/ears/headphones/Initialize() - . = ..() - update_icon() - -/obj/item/clothing/ears/headphones/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/clothing/ears/headphones/update_icon_state() - icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" - item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" - -/obj/item/clothing/ears/headphones/proc/toggle(owner) - headphones_on = !headphones_on - update_icon() - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.update_inv_ears() - H.update_inv_neck() - H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 67eb8435656..e4ea0fba14d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -12,6 +12,53 @@ custom_price = 1200 custom_premium_price = 1200 +/obj/item/toy/sprayoncan + name = "spray-on insulation applicator" + desc = "What is the number one problem facing our station today?" + icon = 'icons/obj/clothing/gloves.dmi' + icon_state = "sprayoncan" + +/obj/item/toy/sprayoncan/afterattack(atom/target, mob/living/carbon/user, proximity) + if(iscarbon(target) && proximity) + var/mob/living/carbon/C = target + var/mob/living/carbon/U = user + var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE) + if(success) + if(C == user) + C.visible_message("[U] sprays their hands with glittery rubber!") + else + C.visible_message("[U] sprays glittery rubber on the hands of [C]!") + else + C.visible_message("The rubber fails to stick to [C]'s hands!") + + qdel(src) + +/obj/item/clothing/gloves/color/yellow/sprayon + desc = "How're you gonna get 'em off, nerd?" + name = "spray-on insulated gloves" + icon_state = "sprayon" + item_state = "sprayon" + permeability_coefficient = 0 + resistance_flags = ACID_PROOF + var/shocks_remaining = 10 + +/obj/item/clothing/gloves/color/yellow/sprayon/Initialize() + .=..() + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + +/obj/item/clothing/gloves/color/yellow/sprayon/equipped(mob/user, slot) + . = ..() + RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked) + +/obj/item/clothing/gloves/color/yellow/sprayon/proc/Shocked() + shocks_remaining-- + if(shocks_remaining < 0) + qdel(src) //if we run out of uses, the gloves crumble away into nothing, just like my dreams after working with .dm + +/obj/item/clothing/gloves/color/yellow/sprayon/dropped() + .=..() + qdel(src) //loose nodrop items bad + /obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." name = "budget insulated gloves" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 69dbbcbd3a2..ac1c8c53727 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -97,6 +97,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF /obj/item/clothing/head/hardhat/weldhat name = "welding hard hat" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 06aa84ec612..2738563313e 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -319,7 +319,7 @@ item_state = "rus_ushanka" body_parts_covered = HEAD cold_protection = HEAD - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50) //LightToggle diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index ca690f9273a..edcc706e5ba 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -208,6 +208,16 @@ desc = "A really cool hat if you're a mobster. A really lame hat if you're not." pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/fedora +/obj/item/clothing/head/fedora/white + name = "white fedora" + icon_state = "fedora_white" + item_state = "fedora_white" + +/obj/item/clothing/head/fedora/beige + name = "beige fedora" + icon_state = "fedora_beige" + item_state = "fedora_beige" + /obj/item/clothing/head/fedora/suicide_act(mob/user) if(user.gender == FEMALE) return 0 diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 1cbc765a642..8e9cdd441db 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -1,3 +1,5 @@ +#define THERMAL_REGULATOR_COST 18 // the cost per tick for the thermal regulator + //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. // Meaning the the suit is defined directly after the corrisponding helmet. Just like below! /obj/item/clothing/head/helmet/space @@ -37,9 +39,176 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT strip_delay = 80 equip_delay_other = 80 resistance_flags = NONE + actions_types = list(/datum/action/item_action/toggle_spacesuit) + var/temperature_setting = BODYTEMP_NORMAL /// The default temperature setting + var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high /// If this is a path, this gets created as an object in Initialize. + var/cell_cover_open = FALSE /// Status of the cell cover on the suit + var/thermal_on = FALSE /// Status of the thermal regulator + +/obj/item/clothing/suit/space/Initialize(mapload) + . = ..() + if(ispath(cell)) + cell = new cell(src) + +/// Start Processing on the space suit when it is worn to heat the wearer +/obj/item/clothing/suit/space/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_OCLOTHING) // Check that the slot is valid + START_PROCESSING(SSobj, src) + +// On removal stop processing, save battery +/obj/item/clothing/suit/space/dropped(mob/user) + . = ..() + STOP_PROCESSING(SSobj, src) + var/mob/living/carbon/human/human = user + if(istype(human)) + human.update_spacesuit_hud_icon("0") + +// Space Suit temperature regulation and power usage +/obj/item/clothing/suit/space/process() + var/mob/living/carbon/human/user = src.loc + if(!user || !ishuman(user) || !(user.wear_suit == src)) + return + if(!cell && thermal_on) + toggle_spacesuit() + if(!cell) + user.update_spacesuit_hud_icon("missing") + else + var/cell_percent = cell.percent() + if(cell_percent > 0.6) + user.update_spacesuit_hud_icon("high") + else if(cell_percent > 0.20) + user.update_spacesuit_hud_icon("mid") + else if(cell_percent > 0.01 && cell.charge > THERMAL_REGULATOR_COST) + user.update_spacesuit_hud_icon("low") + else + user.update_spacesuit_hud_icon("empty") + + if(thermal_on && cell.charge >= THERMAL_REGULATOR_COST) + user.adjust_bodytemperature((temperature_setting - user.bodytemperature), use_steps=TRUE, capped=FALSE) + cell.use(THERMAL_REGULATOR_COST) + +// Clean up the cell on destroy +/obj/item/clothing/suit/space/Destroy() + if(cell) + QDEL_NULL(cell) + var/mob/living/carbon/human/human = src.loc + if(istype(human)) + human.update_spacesuit_hud_icon("0") + STOP_PROCESSING(SSobj, src) + return ..() + +// Clean up the cell on destroy +/obj/item/clothing/suit/space/handle_atom_del(atom/A) + if(A == cell) + cell = null + thermal_on = FALSE + return ..() + +// support for items that interact with the cell +/obj/item/clothing/suit/space/get_cell() + return cell + +// Show the status of the suit and the cell +/obj/item/clothing/suit/space/examine(mob/user) + . = ..() + if(in_range(src, user) || isobserver(user)) + . += "The thermal regulator is [thermal_on ? "on" : "off"] and the temperature is set to \ + [round(temperature_setting-T0C,0.1)] °C ([round(temperature_setting*1.8-459.67,0.1)] °F)" + . += "The power meter shows [cell ? "[round(cell.percent(), 0.1)]%" : "!invalid!"] charge remaining." + if(cell_cover_open) + . += "The cell cover is open exposing the cell and setting knobs." + if(!cell) + . += "The slot for a cell is empty." + else + . += "\The [cell] is firmly in place." + +// object handling for accessing features of the suit +/obj/item/clothing/suit/space/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_CROWBAR) + toggle_spacesuit_cell(user) + return + else if(cell_cover_open && I.tool_behaviour == TOOL_SCREWDRIVER) + var/range_low = 20 // Default min temp c + var/range_high = 45 // default max temp c + if(obj_flags & EMAGGED) + range_low = -20 // emagged min temp c + range_high = 120 // emagged max temp c + + var/deg_c = input(user, "What temperature would you like to set the thermal regulator to? \ + ([range_low]-[range_high] degrees celcius)") as null|num + if(deg_c && deg_c >= range_low && deg_c <= range_high) + temperature_setting = round(T0C + deg_c, 0.1) + to_chat(user, "You see the readout change to [deg_c] c.") + return + else if(cell_cover_open && istype(I, /obj/item/stock_parts/cell)) + if(cell) + to_chat(user, "[src] already has a cell installed.") + return + if(user.transferItemToLoc(I, src)) + cell = I + to_chat(user, "You successfully install \the [cell] into [src].") + return + return ..() + +/// Open the cell cover when ALT+Click on the suit +/obj/item/clothing/suit/space/AltClick(mob/living/user) + if(!user || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return ..() + toggle_spacesuit_cell(user) + +/// Remove the cell whent he cover is open on CTRL+Click +/obj/item/clothing/suit/space/CtrlClick(mob/living/user) + if(user && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + if(cell_cover_open && cell) + remove_cell(user) + return + return ..() + +// Remove the cell when using the suit on its self +/obj/item/clothing/suit/space/attack_self(mob/user) + remove_cell(user) + +/// Remove the cell from the suit if the cell cover is open +/obj/item/clothing/suit/space/proc/remove_cell(mob/user) + if(cell_cover_open && cell) + user.visible_message("[user] removes \the [cell] from [src]!", \ + "You remove [cell].") + cell.add_fingerprint(user) + user.put_in_hands(cell) + cell = null + +/// Toggle the space suit's cell cover +/obj/item/clothing/suit/space/proc/toggle_spacesuit_cell(mob/user) + cell_cover_open = !cell_cover_open + to_chat(user, "You [cell_cover_open ? "open" : "close"] the cell cover on \the [src].") + +/// Toggle the space suit's thermal regulator status +/obj/item/clothing/suit/space/proc/toggle_spacesuit() + thermal_on = !thermal_on + min_cold_protection_temperature = thermal_on ? SPACE_SUIT_MIN_TEMP_PROTECT : SPACE_SUIT_MIN_TEMP_PROTECT_OFF + SEND_SIGNAL(src, COMSIG_SUIT_SPACE_TOGGLE) + +// let emags override the temperature settings +/obj/item/clothing/suit/space/emag_act(mob/user) + if(!(obj_flags & EMAGGED)) + obj_flags |= EMAGGED + user.visible_message("You emag [src], overwriting thermal regulator restrictions.") + log_game("[key_name(user)] emagged [src] at [AREACOORD(src)], overwriting thermal regulator restrictions.") + playsound(src, "sparks", 50, TRUE) + +// zap the cell if we get hit with an emp +/obj/item/clothing/suit/space/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_CONTENTS) + return + if(cell) + cell.emp_act(severity) + +#undef THERMAL_REGULATOR_COST diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 7889c0a7cd4..b400d9f7806 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -23,7 +23,7 @@ desc = "An advanced spacesuit equipped with time-bluespace teleportation and anti-compression technology." icon_state = "chronosuit" item_state = "chronosuit" - actions_types = list(/datum/action/item_action/toggle) + actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle) armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000) resistance_flags = FIRE_PROOF | ACID_PROOF var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) @@ -166,6 +166,7 @@ finish_chronowalk(user, to_turf) /obj/item/clothing/suit/space/chronos/process() + . = ..() if(activated) var/mob/living/carbon/human/user = src.loc if(user && ishuman(user) && (user.wear_suit == src)) @@ -178,8 +179,6 @@ camera.remove_target_ui() else new_camera(user) - else - STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/chronos/proc/activate() if(!activating && !activated && !teleporting) @@ -199,7 +198,6 @@ to_chat(user, "\[ ok \] Starting ui display driver") to_chat(user, "\[ ok \] Initializing chronowalk4-view") new_camera(user) - START_PROCESSING(SSobj, src) activated = 1 else to_chat(user, "\[ fail \] Mounting /dev/helm") diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index ca9c2e1a720..37274476003 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -1,3 +1,6 @@ +/// How much damage you take from an emp when wearing a hardsuit +#define HARDSUIT_EMP_BURN 2 // a very orange number + //Baseline hardsuits /obj/item/clothing/head/helmet/space/hardsuit name = "hardsuit helmet" @@ -101,7 +104,7 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet - actions_types = list(/datum/action/item_action/toggle_helmet) + actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle_helmet) var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit var/obj/item/tank/jetpack/suit/jetpack = null var/hardsuit_type @@ -134,7 +137,7 @@ jetpack = I to_chat(user, "You successfully install the jetpack into [src].") return - else if(I.tool_behaviour == TOOL_SCREWDRIVER) + else if(!cell_cover_open && I.tool_behaviour == TOOL_SCREWDRIVER) if(!jetpack) to_chat(user, "[src] has no jetpack installed.") return @@ -165,7 +168,6 @@ new /obj/item/light/bulb/broken(drop_location()) return ..() - /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) ..() if(jetpack) @@ -185,6 +187,18 @@ if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. return 1 +/// Burn the person inside the hard suit just a little, the suit got really hot for a moment +/obj/item/clothing/suit/space/emp_act(severity) + . = ..() + var/mob/living/carbon/human/user = src.loc + if(istype(user)) + user.apply_damage(HARDSUIT_EMP_BURN, BURN, spread_damage=TRUE) + to_chat(user, "You feel \the [src] heat up from the EMP burning you slightly.") + + // Chance to scream + if (user.stat < UNCONSCIOUS && prob(10)) + user.emote("scream") + //Engineering /obj/item/clothing/head/helmet/space/hardsuit/engine name = "engineering hardsuit helmet" @@ -247,6 +261,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite jetpack = /obj/item/tank/jetpack/suit + cell = /obj/item/stock_parts/cell/super //Mining hardsuit /obj/item/clothing/head/helmet/space/hardsuit/mining @@ -373,6 +388,7 @@ allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi jetpack = /obj/item/tank/jetpack/suit + cell = /obj/item/stock_parts/cell/hyper //Elite Syndie suit /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite @@ -403,6 +419,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF + cell = /obj/item/stock_parts/cell/bluespace /obj/item/clothing/suit/space/hardsuit/syndi/elite/debug helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug @@ -453,6 +470,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard + cell = /obj/item/stock_parts/cell/hyper /obj/item/clothing/suit/space/hardsuit/wizard/Initialize() . = ..() @@ -529,8 +547,7 @@ /obj/item/hand_tele, /obj/item/aicard) armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd - - + cell = /obj/item/stock_parts/cell/super //Security hardsuit /obj/item/clothing/head/helmet/space/hardsuit/security @@ -570,6 +587,7 @@ armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos jetpack = /obj/item/tank/jetpack/suit + cell = /obj/item/stock_parts/cell/super //SWAT MKII /obj/item/clothing/head/helmet/space/hardsuit/swat @@ -597,6 +615,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat +// SWAT and Captain get EMP Protection /obj/item/clothing/suit/space/hardsuit/swat/Initialize() . = ..() allowed = GLOB.security_hardsuit_allowed @@ -614,6 +633,7 @@ icon_state = "caparmor" item_state = "capspacesuit" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat/captain + cell = /obj/item/stock_parts/cell/super //Clown /obj/item/clothing/head/helmet/space/hardsuit/clown @@ -726,8 +746,6 @@ s.start() owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") current_charges-- - if(recharge_rate) - START_PROCESSING(SSobj, src) if(current_charges <= 0) owner.visible_message("[owner]'s shield overloads!") shield_state = "broken" @@ -737,16 +755,15 @@ /obj/item/clothing/suit/space/hardsuit/shielded/Destroy() - STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/suit/space/hardsuit/shielded/process() - if(world.time > recharge_cooldown && current_charges < max_charges) + . = ..() + if(recharge_rate && world.time > recharge_cooldown && current_charges < max_charges) current_charges = CLAMP((current_charges + recharge_rate), 0, max_charges) playsound(loc, 'sound/magic/charge.ogg', 50, TRUE) if(current_charges == max_charges) playsound(loc, 'sound/machines/ding.ogg', 50, TRUE) - STOP_PROCESSING(SSobj, src) shield_state = "[shield_on]" if(ishuman(loc)) var/mob/living/carbon/human/C = loc @@ -887,3 +904,5 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() + +#undef HARDSUIT_EMP_BURN diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index aff8f601fe7..ce4b4213dc9 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -42,6 +42,7 @@ Contains: resistance_flags = FIRE_PROOF | ACID_PROOF helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad dog_fashion = /datum/dog_fashion/back/deathsquad + cell = /obj/item/stock_parts/cell/bluespace //NEW SWAT suit /obj/item/clothing/suit/space/swat @@ -186,6 +187,12 @@ Contains: strip_delay = 130 resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + cell = /obj/item/stock_parts/cell/bluespace + +// ERT suit's gets EMP Protection +/obj/item/clothing/suit/space/hardsuit/ert/Initialize() + . = ..() + AddComponent(/datum/component/empprotection, EMP_PROTECT_CONTENTS) //ERT Security /obj/item/clothing/head/helmet/space/hardsuit/ert/sec @@ -426,3 +433,4 @@ Contains: armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF + cell = /obj/item/stock_parts/cell/hyper diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 9c9950e06c8..e1c40d2c011 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -14,7 +14,7 @@ w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85) - + cell = /obj/item/stock_parts/cell/hyper //Green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/green diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 206402a4360..e38c0d11f57 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -766,3 +766,9 @@ icon_state = "capformal" item_state = "capspacesuit" armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + +/obj/item/clothing/suit/hawaiian + name = "hawaiian overshirt" + desc = "A cool shirt for chilling on the beach." + icon_state = "hawaiian_blue" + item_state = "hawaiian_blue" diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 5c0312ce926..e728709f046 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -118,3 +118,9 @@ desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!" icon_state = "white_suit" item_state = "white_suit" + +/obj/item/clothing/under/suit/beige + name = "beige suit" + desc = "An excellent light colored suit, experts in the field stress that it should not to be confused with the inferior tan suit." + icon_state = "beige_suit" + item_state = "beige_suit" diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 9c713d74af8..d947d76d33c 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -44,7 +44,7 @@ var/cockroaches = prob(33) ? 3 : 0 while(cockroaches) - new /mob/living/simple_animal/cockroach(get_turf(vent)) + new /mob/living/simple_animal/hostile/cockroach(get_turf(vent)) cockroaches-- CHECK_TICK diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 8c98ba1dd68..b2719c03a78 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -10,7 +10,7 @@ for(var/obj/item/I in world) CHECK_TICK - if(!(I.flags_1 & INITIALIZED_1)) + if(!(I.flags_1 & INITIALIZED_1) || QDELETED(I)) continue I.AddComponent(/datum/component/fantasy) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index ce114d8b91a..8d3955e57df 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -67,7 +67,7 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to if(!(ismecha(M) && mech_sized)) return - if(ismovableatom(M)) + if(ismovable(M)) if(GLOB.all_wormholes.len) var/obj/effect/portal/wormhole/P = pick(GLOB.all_wormholes) if(P && isturf(P.loc)) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index fc146281b6e..5f331e5df74 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -15,10 +15,6 @@ resistance_flags = NONE var/isGlass = TRUE //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it -/obj/item/reagent_containers/food/drinks/on_reagent_change(changetype) - . = ..() - gulp_size = max(round(reagents.total_volume / 5), 5) - /obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 8e93b8b4782..c512db31902 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -411,10 +411,10 @@ icon_state = "powercrepe" bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/iron = 10) list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/cherryjelly = 5) - force = 20 - throwforce = 10 - block_chance = 50 - armour_penetration = 75 + force = 30 + throwforce = 15 + block_chance = 55 + armour_penetration = 80 attack_verb = list("slapped", "slathered") w_class = WEIGHT_CLASS_BULKY tastes = list("cherry" = 1, "crepe" = 1) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 8cb44059ad6..3e886d061b4 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -2,753 +2,519 @@ /datum/chemical_reaction/goldschlager - name = "Goldschlager" - id = /datum/reagent/consumable/ethanol/goldschlager results = list(/datum/reagent/consumable/ethanol/goldschlager = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/gold = 1) /datum/chemical_reaction/patron - name = "Patron" - id = /datum/reagent/consumable/ethanol/patron results = list(/datum/reagent/consumable/ethanol/patron = 10) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 10, /datum/reagent/silver = 1) /datum/chemical_reaction/bilk - name = "Bilk" - id = /datum/reagent/consumable/ethanol/bilk results = list(/datum/reagent/consumable/ethanol/bilk = 2) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ethanol/beer = 1) /datum/chemical_reaction/icetea - name = "Iced Tea" - id = /datum/reagent/consumable/icetea results = list(/datum/reagent/consumable/icetea = 4) required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/tea = 3) /datum/chemical_reaction/icecoffee - name = "Iced Coffee" - id = /datum/reagent/consumable/icecoffee results = list(/datum/reagent/consumable/icecoffee = 4) required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/coffee = 3) /datum/chemical_reaction/nuka_cola - name = "Nuka Cola" - id = /datum/reagent/consumable/nuka_cola results = list(/datum/reagent/consumable/nuka_cola = 6) required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6) /datum/chemical_reaction/moonshine - name = "Moonshine" - id = /datum/reagent/consumable/ethanol/moonshine results = list(/datum/reagent/consumable/ethanol/moonshine = 10) required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/wine - name = "Wine" - id = /datum/reagent/consumable/ethanol/wine results = list(/datum/reagent/consumable/ethanol/wine = 10) required_reagents = list(/datum/reagent/consumable/grapejuice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/spacebeer - name = "Space Beer" - id = "spacebeer" results = list(/datum/reagent/consumable/ethanol/beer = 10) required_reagents = list(/datum/reagent/consumable/flour = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/vodka - name = "Vodka" - id = /datum/reagent/consumable/ethanol/vodka results = list(/datum/reagent/consumable/ethanol/vodka = 10) required_reagents = list(/datum/reagent/consumable/potato_juice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/kahlua - name = "Kahlua" - id = /datum/reagent/consumable/ethanol/kahlua results = list(/datum/reagent/consumable/ethanol/kahlua = 5) required_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/gin_tonic - name = "Gin and Tonic" - id = /datum/reagent/consumable/ethanol/gintonic results = list(/datum/reagent/consumable/ethanol/gintonic = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/tonic = 1) /datum/chemical_reaction/rum_coke - name = "Rum and Coke" - id = /datum/reagent/consumable/ethanol/rum_coke results = list(/datum/reagent/consumable/ethanol/rum_coke = 3) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/space_cola = 1) /datum/chemical_reaction/cuba_libre - name = "Cuba Libre" - id = /datum/reagent/consumable/ethanol/cuba_libre results = list(/datum/reagent/consumable/ethanol/cuba_libre = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum_coke = 3, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/martini - name = "Classic Martini" - id = /datum/reagent/consumable/ethanol/martini results = list(/datum/reagent/consumable/ethanol/martini = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/vodkamartini - name = "Vodka Martini" - id = /datum/reagent/consumable/ethanol/vodkamartini results = list(/datum/reagent/consumable/ethanol/vodkamartini = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/white_russian - name = "White Russian" - id = /datum/reagent/consumable/ethanol/white_russian results = list(/datum/reagent/consumable/ethanol/white_russian = 5) required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 3, /datum/reagent/consumable/cream = 2) /datum/chemical_reaction/whiskey_cola - name = "Whiskey Cola" - id = /datum/reagent/consumable/ethanol/whiskey_cola results = list(/datum/reagent/consumable/ethanol/whiskey_cola = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/space_cola = 1) /datum/chemical_reaction/screwdriver - name = "Screwdriver" - id = /datum/reagent/consumable/ethanol/screwdrivercocktail results = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/orangejuice = 1) /datum/chemical_reaction/bloody_mary - name = "Bloody Mary" - id = /datum/reagent/consumable/ethanol/bloody_mary results = list(/datum/reagent/consumable/ethanol/bloody_mary = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/gargle_blaster - name = "Pan-Galactic Gargle Blaster" - id = /datum/reagent/consumable/ethanol/gargle_blaster results = list(/datum/reagent/consumable/ethanol/gargle_blaster = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/brave_bull - name = "Brave Bull" - id = /datum/reagent/consumable/ethanol/brave_bull results = list(/datum/reagent/consumable/ethanol/brave_bull = 3) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/ethanol/kahlua = 1) /datum/chemical_reaction/tequila_sunrise - name = "Tequila Sunrise" - id = /datum/reagent/consumable/ethanol/tequila_sunrise results = list(/datum/reagent/consumable/ethanol/tequila_sunrise = 5) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/orangejuice = 2, /datum/reagent/consumable/grenadine = 1) /datum/chemical_reaction/toxins_special - name = "Toxins Special" - id = /datum/chemical_reaction/toxins_special results = list(/datum/reagent/consumable/ethanol/toxins_special = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2) /datum/chemical_reaction/beepsky_smash - name = "Beepksy Smash" - id = "beepksysmash" results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1) /datum/chemical_reaction/doctor_delight - name = "The Doctor's Delight" - id = "doctordelight" results = list(/datum/reagent/consumable/doctor_delight = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1) /datum/chemical_reaction/irish_cream - name = "Irish Cream" - id = /datum/reagent/consumable/ethanol/irish_cream results = list(/datum/reagent/consumable/ethanol/irish_cream = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/manly_dorf - name = "The Manly Dorf" - id = /datum/reagent/consumable/ethanol/manly_dorf results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3) required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2) /datum/chemical_reaction/greenbeer - name = "Green Beer" - id = /datum/reagent/consumable/ethanol/beer/green results = list(/datum/reagent/consumable/ethanol/beer/green = 10) required_reagents = list(/datum/reagent/colorful_reagent/powder/green = 1, /datum/reagent/consumable/ethanol/beer = 10) /datum/chemical_reaction/greenbeer2 //apparently there's no other way to do this - name = "Green Beer" - id = /datum/reagent/consumable/ethanol/beer/green results = list(/datum/reagent/consumable/ethanol/beer/green = 10) required_reagents = list(/datum/reagent/colorful_reagent/powder/green/crayon = 1, /datum/reagent/consumable/ethanol/beer = 10) /datum/chemical_reaction/hooch - name = "Hooch" - id = /datum/reagent/consumable/ethanol/hooch results = list(/datum/reagent/consumable/ethanol/hooch = 3) required_reagents = list (/datum/reagent/consumable/ethanol = 2, /datum/reagent/fuel = 1) required_catalysts = list(/datum/reagent/consumable/enzyme = 1) /datum/chemical_reaction/irish_coffee - name = "Irish Coffee" - id = /datum/reagent/consumable/ethanol/irishcoffee results = list(/datum/reagent/consumable/ethanol/irishcoffee = 2) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/coffee = 1) /datum/chemical_reaction/b52 - name = "B-52" - id = /datum/reagent/consumable/ethanol/b52 results = list(/datum/reagent/consumable/ethanol/b52 = 3) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/cognac = 1) /datum/chemical_reaction/atomicbomb - name = "Atomic Bomb" - id = /datum/reagent/consumable/ethanol/atomicbomb results = list(/datum/reagent/consumable/ethanol/atomicbomb = 10) required_reagents = list(/datum/reagent/consumable/ethanol/b52 = 10, /datum/reagent/uranium = 1) /datum/chemical_reaction/margarita - name = "Margarita" - id = /datum/reagent/consumable/ethanol/margarita results = list(/datum/reagent/consumable/ethanol/margarita = 4) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/triple_sec = 1) /datum/chemical_reaction/longislandicedtea - name = "Long Island Iced Tea" - id = /datum/reagent/consumable/ethanol/longislandicedtea results = list(/datum/reagent/consumable/ethanol/longislandicedtea = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/tequila = 1, /datum/reagent/consumable/ethanol/cuba_libre = 1) /datum/chemical_reaction/threemileisland - name = "Three Mile Island Iced Tea" - id = /datum/reagent/consumable/ethanol/threemileisland results = list(/datum/reagent/consumable/ethanol/threemileisland = 10) required_reagents = list(/datum/reagent/consumable/ethanol/longislandicedtea = 10, /datum/reagent/uranium = 1) /datum/chemical_reaction/whiskeysoda - name = "Whiskey Soda" - id = /datum/reagent/consumable/ethanol/whiskeysoda results = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/sodawater = 1) /datum/chemical_reaction/black_russian - name = "Black Russian" - id = /datum/reagent/consumable/ethanol/black_russian results = list(/datum/reagent/consumable/ethanol/black_russian = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 3, /datum/reagent/consumable/ethanol/kahlua = 2) +/datum/chemical_reaction/hiveminderaser + results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1) + /datum/chemical_reaction/manhattan - name = "Manhattan" - id = /datum/reagent/consumable/ethanol/manhattan results = list(/datum/reagent/consumable/ethanol/manhattan = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/manhattan_proj - name = "Manhattan Project" - id = /datum/reagent/consumable/ethanol/manhattan_proj results = list(/datum/reagent/consumable/ethanol/manhattan_proj = 10) required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 10, /datum/reagent/uranium = 1) /datum/chemical_reaction/vodka_tonic - name = "Vodka and Tonic" - id = /datum/reagent/consumable/ethanol/vodkatonic results = list(/datum/reagent/consumable/ethanol/vodkatonic = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/tonic = 1) /datum/chemical_reaction/gin_fizz - name = "Gin Fizz" - id = /datum/reagent/consumable/ethanol/ginfizz results = list(/datum/reagent/consumable/ethanol/ginfizz = 4) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/bahama_mama - name = "Bahama Mama" - id = /datum/reagent/consumable/ethanol/bahama_mama results = list(/datum/reagent/consumable/ethanol/bahama_mama = 5) required_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/pineapplejuice = 1) /datum/chemical_reaction/singulo - name = "Singulo" - id = /datum/reagent/consumable/ethanol/singulo results = list(/datum/reagent/consumable/ethanol/singulo = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/uranium/radium = 1, /datum/reagent/consumable/ethanol/wine = 5) /datum/chemical_reaction/alliescocktail - name = "Allies Cocktail" - id = /datum/reagent/consumable/ethanol/alliescocktail results = list(/datum/reagent/consumable/ethanol/alliescocktail = 2) required_reagents = list(/datum/reagent/consumable/ethanol/martini = 1, /datum/reagent/consumable/ethanol/vodka = 1) /datum/chemical_reaction/demonsblood - name = "Demons Blood" - id = /datum/reagent/consumable/ethanol/demonsblood results = list(/datum/reagent/consumable/ethanol/demonsblood = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/dr_gibb = 1) /datum/chemical_reaction/booger - name = "Booger" - id = /datum/reagent/consumable/ethanol/booger results = list(/datum/reagent/consumable/ethanol/booger = 4) required_reagents = list(/datum/reagent/consumable/cream = 1, /datum/reagent/consumable/banana = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/watermelonjuice = 1) /datum/chemical_reaction/antifreeze - name = "Anti-freeze" - id = /datum/reagent/consumable/ethanol/antifreeze results = list(/datum/reagent/consumable/ethanol/antifreeze = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/barefoot - name = "Barefoot" - id = /datum/reagent/consumable/ethanol/barefoot results = list(/datum/reagent/consumable/ethanol/barefoot = 3) required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/moscow_mule - name = "Moscow Mule" - id = /datum/reagent/consumable/ethanol/moscow_mule results = list(/datum/reagent/consumable/ethanol/moscow_mule = 10) required_reagents = list(/datum/reagent/consumable/sol_dry = 5, /datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ice = 1) mix_sound = 'sound/effects/bubbles2.ogg' /datum/chemical_reaction/painkiller - name = "Painkiller" - id = /datum/reagent/consumable/ethanol/painkiller results = list(/datum/reagent/consumable/ethanol/painkiller = 10) required_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 5, /datum/reagent/consumable/pineapplejuice = 4, /datum/reagent/consumable/orangejuice = 1) /datum/chemical_reaction/pina_colada - name = "Pina Colada" - id = /datum/reagent/consumable/ethanol/pina_colada results = list(/datum/reagent/consumable/ethanol/pina_colada = 5) required_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 1, /datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/limejuice = 1) ////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri///// /datum/chemical_reaction/sbiten - name = "Sbiten" - id = /datum/reagent/consumable/ethanol/sbiten results = list(/datum/reagent/consumable/ethanol/sbiten = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/consumable/capsaicin = 1) /datum/chemical_reaction/red_mead - name = "Red Mead" - id = /datum/reagent/consumable/ethanol/red_mead results = list(/datum/reagent/consumable/ethanol/red_mead = 2) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/mead = 1) /datum/chemical_reaction/mead - name = "Mead" - id = /datum/reagent/consumable/ethanol/mead results = list(/datum/reagent/consumable/ethanol/mead = 2) required_reagents = list(/datum/reagent/consumable/honey = 2) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/iced_beer - name = "Iced Beer" - id = /datum/reagent/consumable/ethanol/iced_beer results = list(/datum/reagent/consumable/ethanol/iced_beer = 6) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 5, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/grog - name = "Grog" - id = /datum/reagent/consumable/ethanol/grog results = list(/datum/reagent/consumable/ethanol/grog = 2) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/water = 1) /datum/chemical_reaction/soy_latte - name = "Soy Latte" - id = /datum/reagent/consumable/soy_latte results = list(/datum/reagent/consumable/soy_latte = 2) required_reagents = list(/datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/soymilk = 1) /datum/chemical_reaction/cafe_latte - name = "Cafe Latte" - id = /datum/reagent/consumable/cafe_latte results = list(/datum/reagent/consumable/cafe_latte = 2) required_reagents = list(/datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/milk = 1) /datum/chemical_reaction/acidspit - name = "Acid Spit" - id = /datum/reagent/consumable/ethanol/acid_spit results = list(/datum/reagent/consumable/ethanol/acid_spit = 6) required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/consumable/ethanol/wine = 5) /datum/chemical_reaction/amasec - name = "Amasec" - id = /datum/reagent/consumable/ethanol/amasec results = list(/datum/reagent/consumable/ethanol/amasec = 10) required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/consumable/ethanol/wine = 5, /datum/reagent/consumable/ethanol/vodka = 5) /datum/chemical_reaction/changelingsting - name = "Changeling Sting" - id = /datum/reagent/consumable/ethanol/changelingsting results = list(/datum/reagent/consumable/ethanol/changelingsting = 5) required_reagents = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 1, /datum/reagent/consumable/lemon_lime = 2) /datum/chemical_reaction/aloe - name = "Aloe" - id = /datum/reagent/consumable/ethanol/aloe results = list(/datum/reagent/consumable/ethanol/aloe = 2) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/watermelonjuice = 1) /datum/chemical_reaction/andalusia - name = "Andalusia" - id = /datum/reagent/consumable/ethanol/andalusia results = list(/datum/reagent/consumable/ethanol/andalusia = 3) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1) /datum/chemical_reaction/neurotoxin - name = "Neurotoxin" - id = /datum/reagent/consumable/ethanol/neurotoxin results = list(/datum/reagent/consumable/ethanol/neurotoxin = 2) required_reagents = list(/datum/reagent/consumable/ethanol/gargle_blaster = 1, /datum/reagent/medicine/morphine = 1) /datum/chemical_reaction/snowwhite - name = "Snow White" - id = /datum/reagent/consumable/ethanol/snowwhite results = list(/datum/reagent/consumable/ethanol/snowwhite = 2) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/lemon_lime = 1) /datum/chemical_reaction/irishcarbomb - name = "Irish Car Bomb" - id = /datum/reagent/consumable/ethanol/irishcarbomb results = list(/datum/reagent/consumable/ethanol/irishcarbomb = 2) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 1, /datum/reagent/consumable/ethanol/irish_cream = 1) /datum/chemical_reaction/syndicatebomb - name = "Syndicate Bomb" - id = /datum/reagent/consumable/ethanol/syndicatebomb results = list(/datum/reagent/consumable/ethanol/syndicatebomb = 2) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/whiskey_cola = 1) /datum/chemical_reaction/erikasurprise - name = "Erika Surprise" - id = /datum/reagent/consumable/ethanol/erikasurprise results = list(/datum/reagent/consumable/ethanol/erikasurprise = 5) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/banana = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/devilskiss - name = "Devils Kiss" - id = /datum/reagent/consumable/ethanol/devilskiss results = list(/datum/reagent/consumable/ethanol/devilskiss = 3) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 1) /datum/chemical_reaction/hippiesdelight - name = "Hippies Delight" - id = /datum/reagent/consumable/ethanol/hippies_delight results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2) required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1) /datum/chemical_reaction/bananahonk - name = "Banana Honk" - id = /datum/reagent/consumable/ethanol/bananahonk results = list(/datum/reagent/consumable/ethanol/bananahonk = 2) required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/silencer - name = "Silencer" - id = /datum/reagent/consumable/ethanol/silencer results = list(/datum/reagent/consumable/ethanol/silencer = 3) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/driestmartini - name = "Driest Martini" - id = /datum/reagent/consumable/ethanol/driestmartini results = list(/datum/reagent/consumable/ethanol/driestmartini = 2) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1) /datum/chemical_reaction/thirteenloko - name = "Thirteen Loko" - id = /datum/reagent/consumable/ethanol/thirteenloko results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/chocolatepudding - name = "Chocolate Pudding" - id = /datum/reagent/consumable/chocolatepudding results = list(/datum/reagent/consumable/chocolatepudding = 20) required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 10, /datum/reagent/consumable/eggyolk = 5) /datum/chemical_reaction/vanillapudding - name = "Vanilla Pudding" - id = /datum/reagent/consumable/vanillapudding results = list(/datum/reagent/consumable/vanillapudding = 20) required_reagents = list(/datum/reagent/consumable/vanilla = 5, /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/eggyolk = 5) /datum/chemical_reaction/cherryshake - name = "Cherry Shake" - id = /datum/reagent/consumable/cherryshake results = list(/datum/reagent/consumable/cherryshake = 3) required_reagents = list(/datum/reagent/consumable/cherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/bluecherryshake - name = "Blue Cherry Shake" - id = /datum/reagent/consumable/bluecherryshake results = list(/datum/reagent/consumable/bluecherryshake = 3) required_reagents = list(/datum/reagent/consumable/bluecherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/drunkenblumpkin - name = "Drunken Blumpkin" - id = /datum/reagent/consumable/ethanol/drunkenblumpkin results = list(/datum/reagent/consumable/ethanol/drunkenblumpkin = 4) required_reagents = list(/datum/reagent/consumable/blumpkinjuice = 1, /datum/reagent/consumable/ethanol/irish_cream = 2, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/pumpkin_latte - name = "Pumpkin space latte" - id = /datum/reagent/consumable/pumpkin_latte results = list(/datum/reagent/consumable/pumpkin_latte = 15) required_reagents = list(/datum/reagent/consumable/pumpkinjuice = 5, /datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/cream = 5) /datum/chemical_reaction/gibbfloats - name = "Gibb Floats" - id = /datum/reagent/consumable/gibbfloats results = list(/datum/reagent/consumable/gibbfloats = 15) required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5) /datum/chemical_reaction/triple_citrus - name = /datum/reagent/consumable/triple_citrus - id = /datum/reagent/consumable/triple_citrus results = list(/datum/reagent/consumable/triple_citrus = 5) required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1) /datum/chemical_reaction/grape_soda - name = "grape soda" - id = /datum/reagent/consumable/grape_soda results = list(/datum/reagent/consumable/grape_soda = 2) required_reagents = list(/datum/reagent/consumable/grapejuice = 1, /datum/reagent/consumable/sodawater = 1) /datum/chemical_reaction/grappa - name = /datum/reagent/consumable/ethanol/grappa - id = /datum/reagent/consumable/ethanol/grappa results = list(/datum/reagent/consumable/ethanol/grappa = 10) required_reagents = list (/datum/reagent/consumable/ethanol/wine = 10) required_catalysts = list (/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/whiskey_sour - name = "Whiskey Sour" - id = /datum/reagent/consumable/ethanol/whiskey_sour results = list(/datum/reagent/consumable/ethanol/whiskey_sour = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/sugar = 1) mix_message = "The mixture darkens to a rich gold hue." /datum/chemical_reaction/fetching_fizz - name = "Fetching Fizz" - id = /datum/reagent/consumable/ethanol/fetching_fizz results = list(/datum/reagent/consumable/ethanol/fetching_fizz = 3) required_reagents = list(/datum/reagent/consumable/nuka_cola = 1, /datum/reagent/iron = 1) //Manufacturable from only the mining station mix_message = "The mixture slightly vibrates before settling." /datum/chemical_reaction/hearty_punch - name = "Hearty Punch" - id = /datum/reagent/consumable/ethanol/hearty_punch results = list(/datum/reagent/consumable/ethanol/hearty_punch = 1) //Very little, for balance reasons required_reagents = list(/datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5, /datum/reagent/consumable/ethanol/absinthe = 5) mix_message = "The mixture darkens to a healthy crimson." required_temp = 315 //Piping hot! /datum/chemical_reaction/bacchus_blessing - name = "Bacchus' Blessing" - id = /datum/reagent/consumable/ethanol/bacchus_blessing results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4) required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1) mix_message = "The mixture turns to a sickening froth." /datum/chemical_reaction/lemonade - name = "Lemonade" - id = /datum/reagent/consumable/lemonade results = list(/datum/reagent/consumable/lemonade = 5) required_reagents = list(/datum/reagent/consumable/lemonjuice = 2, /datum/reagent/water = 2, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/ice = 1) mix_message = "You're suddenly reminded of home." /datum/chemical_reaction/arnold_palmer - name = "Arnold Palmer" - id = /datum/reagent/consumable/tea/arnold_palmer results = list(/datum/reagent/consumable/tea/arnold_palmer = 2) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/lemonade = 1) mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange." /datum/chemical_reaction/chocolate_milk - name = "chocolate milk" - id = /datum/reagent/consumable/milk/chocolate_milk results = list(/datum/reagent/consumable/milk/chocolate_milk = 2) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/coco = 1) mix_message = "The color changes as the mixture blends smoothly." /datum/chemical_reaction/hot_coco - name = "Hot Coco" - id = /datum/reagent/consumable/hot_coco results = list(/datum/reagent/consumable/hot_coco = 5) required_reagents = list(/datum/reagent/consumable/milk = 5, /datum/reagent/consumable/coco = 1) required_temp = 320 /datum/chemical_reaction/coffee - name = "Coffee" - id = /datum/reagent/consumable/coffee results = list(/datum/reagent/consumable/coffee = 5) required_reagents = list(/datum/reagent/toxin/coffeepowder = 1, /datum/reagent/water = 5) /datum/chemical_reaction/tea - name = "Tea" - id = /datum/reagent/consumable/tea results = list(/datum/reagent/consumable/tea = 5) required_reagents = list(/datum/reagent/toxin/teapowder = 1, /datum/reagent/water = 5) /datum/chemical_reaction/eggnog - name = /datum/reagent/consumable/ethanol/eggnog - id = /datum/reagent/consumable/ethanol/eggnog results = list(/datum/reagent/consumable/ethanol/eggnog = 15) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 5, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/eggyolk = 5) /datum/chemical_reaction/narsour - name = "Nar'sour" - id = /datum/reagent/consumable/ethanol/narsour results = list(/datum/reagent/consumable/ethanol/narsour = 1) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/demonsblood = 1) mix_message = "The mixture develops a sinister glow." mix_sound = 'sound/effects/singlebeat.ogg' /datum/chemical_reaction/quadruplesec - name = "Quadruple Sec" - id = /datum/reagent/consumable/ethanol/quadruple_sec results = list(/datum/reagent/consumable/ethanol/quadruple_sec = 15) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 5, /datum/reagent/consumable/triple_citrus = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5) mix_message = "The snap of a taser emanates clearly from the mixture as it settles." mix_sound = 'sound/weapons/taser.ogg' /datum/chemical_reaction/grasshopper - name = "Grasshopper" - id = /datum/reagent/consumable/ethanol/grasshopper results = list(/datum/reagent/consumable/ethanol/grasshopper = 15) required_reagents = list(/datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5, /datum/reagent/consumable/ethanol/creme_de_cacao = 5) mix_message = "A vibrant green bubbles forth as the mixture emulsifies." /datum/chemical_reaction/stinger - name = "Stinger" - id = /datum/reagent/consumable/ethanol/stinger results = list(/datum/reagent/consumable/ethanol/stinger = 15) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 10, /datum/reagent/consumable/ethanol/creme_de_menthe = 5 ) /datum/chemical_reaction/quintuplesec - name = "Quintuple Sec" - id = /datum/reagent/consumable/ethanol/quintuple_sec results = list(/datum/reagent/consumable/ethanol/quintuple_sec = 15) required_reagents = list(/datum/reagent/consumable/ethanol/quadruple_sec = 5, /datum/reagent/consumable/clownstears = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5) mix_message = "Judgement is upon you." mix_sound = 'sound/items/airhorn2.ogg' /datum/chemical_reaction/bastion_bourbon - name = "Bastion Bourbon" - id = /datum/reagent/consumable/ethanol/bastion_bourbon results = list(/datum/reagent/consumable/ethanol/bastion_bourbon = 2) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/berryjuice = 1) //herbal and minty, with a hint of citrus and berry mix_message = "You catch an aroma of hot tea and fruits as the mix blends into a blue-green color." /datum/chemical_reaction/squirt_cider - name = "Squirt Cider" - id = /datum/reagent/consumable/ethanol/squirt_cider results = list(/datum/reagent/consumable/ethanol/squirt_cider = 1) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/nutriment = 1) mix_message = "The mix swirls and turns a bright red that reminds you of an apple's skin." /datum/chemical_reaction/fringe_weaver - name = "Fringe Weaver" - id = /datum/reagent/consumable/ethanol/fringe_weaver results = list(/datum/reagent/consumable/ethanol/fringe_weaver = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 9, /datum/reagent/consumable/sugar = 1) //9 karmotrine, 1 adelhyde mix_message = "The mix turns a pleasant cream color and foams up." /datum/chemical_reaction/sugar_rush - name = "Sugar Rush" - id = /datum/reagent/consumable/ethanol/sugar_rush results = list(/datum/reagent/consumable/ethanol/sugar_rush = 4) required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/wine = 1) //2 adelhyde (sweet), 1 powdered delta (sour), 1 karmotrine (alcohol) mix_message = "The mixture bubbles and brightens into a girly pink." /datum/chemical_reaction/crevice_spike - name = "Crevice Spike" - id = /datum/reagent/consumable/ethanol/crevice_spike results = list(/datum/reagent/consumable/ethanol/crevice_spike = 6) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/capsaicin = 4) //2 powdered delta (sour), 4 flanergide (spicy) mix_message = "The mixture stings your eyes as it settles." /datum/chemical_reaction/sake - name = /datum/reagent/consumable/ethanol/sake - id = /datum/reagent/consumable/ethanol/sake results = list(/datum/reagent/consumable/ethanol/sake = 10) required_reagents = list(/datum/reagent/consumable/rice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) mix_message = "The rice grains ferment into a clear, sweet-smelling liquid." /datum/chemical_reaction/peppermint_patty - name = "Peppermint Patty" - id = /datum/reagent/consumable/ethanol/peppermint_patty results = list(/datum/reagent/consumable/ethanol/peppermint_patty = 10) required_reagents = list(/datum/reagent/consumable/hot_coco = 6, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/menthol = 1) mix_message = "The coco turns mint green just as the strong scent hits your nose." /datum/chemical_reaction/alexander - name = "Alexander" - id = /datum/reagent/consumable/ethanol/alexander results = list(/datum/reagent/consumable/ethanol/alexander = 3) required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/sidecar - name = "Sidecar" - id = /datum/reagent/consumable/ethanol/sidecar results = list(/datum/reagent/consumable/ethanol/sidecar = 4) required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 2, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/lemonjuice = 1) /datum/chemical_reaction/between_the_sheets - name = "Between the Sheets" - id = /datum/reagent/consumable/ethanol/between_the_sheets results = list(/datum/reagent/consumable/ethanol/between_the_sheets = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/sidecar = 4) /datum/chemical_reaction/kamikaze - name = "Kamikaze" - id = /datum/reagent/consumable/ethanol/kamikaze results = list(/datum/reagent/consumable/ethanol/kamikaze = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/mojito - name = "Mojito" - id = /datum/reagent/consumable/ethanol/mojito results = list(/datum/reagent/consumable/ethanol/mojito = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/menthol = 1) /datum/chemical_reaction/fernet_cola - name = "Fernet Cola" - id = /datum/reagent/consumable/ethanol/fernet_cola results = list(/datum/reagent/consumable/ethanol/fernet_cola = 2) required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/space_cola = 1) /datum/chemical_reaction/fanciulli - name = "Fanciulli" - id = /datum/reagent/consumable/ethanol/fanciulli results = list(/datum/reagent/consumable/ethanol/fanciulli = 2) required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 1, /datum/reagent/consumable/ethanol/fernet = 1) /datum/chemical_reaction/branca_menta - name = "Branca Menta" - id = /datum/reagent/consumable/ethanol/branca_menta results = list(/datum/reagent/consumable/ethanol/branca_menta = 3) required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/blank_paper - name = "Blank Paper" - id = /datum/reagent/consumable/ethanol/blank_paper results = list(/datum/reagent/consumable/ethanol/blank_paper = 3) required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1) /datum/chemical_reaction/wizz_fizz - name = "Wizz Fizz" - id = /datum/reagent/consumable/ethanol/wizz_fizz results = list(/datum/reagent/consumable/ethanol/wizz_fizz = 3) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/ethanol/champagne = 1) mix_message = "The beverage starts to froth with an almost mystical zeal!" @@ -756,77 +522,53 @@ /datum/chemical_reaction/bug_spray - name = "Bug Spray" - id = /datum/reagent/consumable/ethanol/bug_spray results = list(/datum/reagent/consumable/ethanol/bug_spray = 5) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/lemon_lime = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vodka = 1) mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?" mix_sound = 'sound/creatures/bee.ogg' /datum/chemical_reaction/jack_rose - name = "Jack Rose" - id = /datum/reagent/consumable/ethanol/jack_rose results = list(/datum/reagent/consumable/ethanol/jack_rose = 4) required_reagents = list(/datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/ethanol/applejack = 2, /datum/reagent/consumable/limejuice = 1) mix_message = "As the grenadine incorporates, the beverage takes on a mellow, red-orange glow." /datum/chemical_reaction/turbo - name = "Turbo" - id = /datum/reagent/consumable/ethanol/turbo results = list(/datum/reagent/consumable/ethanol/turbo = 5) required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1) /datum/chemical_reaction/old_timer - name = "Old Timer" - id = /datum/reagent/consumable/ethanol/old_timer results = list(/datum/reagent/consumable/ethanol/old_timer = 6) required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1) /datum/chemical_reaction/rubberneck - name = "Rubberneck" - id = /datum/reagent/consumable/ethanol/rubberneck results = list(/datum/reagent/consumable/ethanol/rubberneck = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1) /datum/chemical_reaction/duplex - name = "Duplex" - id = /datum/reagent/consumable/ethanol/duplex results = list(/datum/reagent/consumable/ethanol/duplex = 4) required_reagents = list(/datum/reagent/consumable/ethanol/hcider = 2, /datum/reagent/consumable/applejuice = 1, /datum/reagent/consumable/berryjuice = 1) /datum/chemical_reaction/trappist - name = "Trappist" - id = /datum/reagent/consumable/ethanol/trappist results = list(/datum/reagent/consumable/ethanol/trappist = 5) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/cream_soda - name = "Cream Soda" - id = /datum/reagent/consumable/cream_soda results = list(/datum/reagent/consumable/cream_soda = 4) required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/sodawater = 2, /datum/reagent/consumable/vanilla = 1) /datum/chemical_reaction/blazaam - name = "Blazaam" - id = /datum/reagent/consumable/ethanol/blazaam results = list(/datum/reagent/consumable/ethanol/blazaam = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1) /datum/chemical_reaction/planet_cracker - name = "Planet Cracker" - id = /datum/reagent/consumable/ethanol/planet_cracker results = list(/datum/reagent/consumable/ethanol/planet_cracker = 4) required_reagents = list(/datum/reagent/consumable/ethanol/champagne = 2, /datum/reagent/consumable/ethanol/lizardwine = 2, /datum/reagent/consumable/eggyolk = 1, /datum/reagent/gold = 1) mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited." /datum/chemical_reaction/red_queen - name = "Red Queen" - id = /datum/reagent/consumable/red_queen results = list(/datum/reagent/consumable/red_queen = 10) required_reagents = list(/datum/reagent/consumable/tea = 6, /datum/reagent/mercury = 2, /datum/reagent/consumable/blackpepper = 1, /datum/reagent/growthserum = 1) /datum/chemical_reaction/mauna_loa - name = "Mauna Loa" - id = /datum/reagent/consumable/ethanol/mauna_loa results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5) required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 9e0bab02e3c..ceed56e01d9 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -9,8 +9,6 @@ //////////////////////////////////////////FOOD MIXTURES//////////////////////////////////// /datum/chemical_reaction/tofu - name = "Tofu" - id = "tofu" required_reagents = list(/datum/reagent/consumable/soymilk = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) mob_react = FALSE @@ -22,8 +20,6 @@ return /datum/chemical_reaction/chocolate_bar - name = "Chocolate Bar" - id = "chocolate_bar" required_reagents = list(/datum/reagent/consumable/soymilk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2) /datum/chemical_reaction/chocolate_bar/on_reaction(datum/reagents/holder, created_volume) @@ -33,8 +29,6 @@ return /datum/chemical_reaction/chocolate_bar2 - name = "Chocolate Bar" - id = "chocolate_bar" required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 4, /datum/reagent/consumable/sugar = 2) mob_react = FALSE @@ -45,37 +39,27 @@ return /datum/chemical_reaction/soysauce - name = "Soy Sauce" - id = /datum/reagent/consumable/soysauce results = list(/datum/reagent/consumable/soysauce = 5) required_reagents = list(/datum/reagent/consumable/soymilk = 4, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/corn_syrup - name = /datum/reagent/consumable/corn_syrup - id = /datum/reagent/consumable/corn_syrup results = list(/datum/reagent/consumable/corn_syrup = 5) required_reagents = list(/datum/reagent/consumable/corn_starch = 1, /datum/reagent/toxin/acid = 1) required_temp = 374 /datum/chemical_reaction/caramel - name = "Caramel" - id = /datum/reagent/consumable/caramel results = list(/datum/reagent/consumable/caramel = 1) required_reagents = list(/datum/reagent/consumable/sugar = 1) required_temp = 413.15 mob_react = FALSE /datum/chemical_reaction/caramel_burned - name = "Caramel burned" - id = "caramel_burned" results = list(/datum/reagent/carbon = 1) required_reagents = list(/datum/reagent/consumable/caramel = 1) required_temp = 483.15 mob_react = FALSE /datum/chemical_reaction/cheesewheel - name = "Cheesewheel" - id = "cheesewheel" required_reagents = list(/datum/reagent/consumable/milk = 40) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) @@ -85,8 +69,6 @@ new /obj/item/reagent_containers/food/snacks/store/cheesewheel(location) /datum/chemical_reaction/synthmeat - name = "synthmeat" - id = "synthmeat" required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/medicine/cryoxadone = 1) mob_react = FALSE @@ -96,20 +78,14 @@ new /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat(location) /datum/chemical_reaction/hot_ramen - name = "Hot Ramen" - id = /datum/reagent/consumable/hot_ramen results = list(/datum/reagent/consumable/hot_ramen = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/dry_ramen = 3) /datum/chemical_reaction/hell_ramen - name = "Hell Ramen" - id = /datum/reagent/consumable/hell_ramen results = list(/datum/reagent/consumable/hell_ramen = 6) required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/hot_ramen = 6) /datum/chemical_reaction/imitationcarpmeat - name = "Imitation Carpmeat" - id = "imitationcarpmeat" required_reagents = list(/datum/reagent/toxin/carpotoxin = 5) required_container = /obj/item/reagent_containers/food/snacks/tofu mix_message = "The mixture becomes similar to carp meat." @@ -121,8 +97,6 @@ qdel(holder.my_atom) /datum/chemical_reaction/dough - name = "Dough" - id = "dough" required_reagents = list(/datum/reagent/water = 10, /datum/reagent/consumable/flour = 15) mix_message = "The ingredients form a dough." @@ -132,8 +106,6 @@ new /obj/item/reagent_containers/food/snacks/dough(location) /datum/chemical_reaction/cakebatter - name = "Cake Batter" - id = "cakebatter" required_reagents = list(/datum/reagent/consumable/eggyolk = 15, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) mix_message = "The ingredients form a cake batter." @@ -143,12 +115,9 @@ new /obj/item/reagent_containers/food/snacks/cakebatter(location) /datum/chemical_reaction/cakebatter/vegan - id = "vegancakebatter" required_reagents = list(/datum/reagent/consumable/soymilk = 15, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) /datum/chemical_reaction/ricebowl - name = "Rice Bowl" - id = "ricebowl" required_reagents = list(/datum/reagent/consumable/rice = 10, /datum/reagent/water = 10) required_container = /obj/item/reagent_containers/glass/bowl mix_message = "The rice absorbs the water." @@ -160,14 +129,10 @@ qdel(holder.my_atom) /datum/chemical_reaction/nutriconversion - name = "Nutriment Conversion" - id = "nutriconversion" results = list(/datum/reagent/consumable/nutriment/peptides = 0.5) required_reagents = list(/datum/reagent/consumable/nutriment/ = 0.5) required_catalysts = list(/datum/reagent/medicine/metafactor = 0.5) /datum/chemical_reaction/bbqsauce - name = "BBQ Sauce" - id = /datum/reagent/consumable/bbqsauce results = list(/datum/reagent/consumable/bbqsauce = 5) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index a561a82fe4a..eb6a4c965b8 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -99,13 +99,13 @@ if(..()) if(prob(50)) user.Paralyze(100) - to_chat(user, "You are stunned by the Deathnettle as you try picking it up!") + to_chat(user, "You are stunned by [src] as you try picking it up!") /obj/item/reagent_containers/food/snacks/grown/nettle/death/attack(mob/living/carbon/M, mob/user) if(!..()) return if(isliving(M)) - to_chat(M, "You are stunned by the powerful acid of the Deathnettle!") + to_chat(M, "You are stunned by the powerful acid of [src]!") log_combat(user, M, "attacked", src) M.adjust_blurriness(force/7) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index d435a9a7d3f..c902f18f391 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1,3 +1,5 @@ +#define TRAY_NAME_UPDATE name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name) + /obj/machinery/hydroponics name = "hydroponics tray" icon = 'icons/obj/hydroponics/equipment.dmi' @@ -90,7 +92,6 @@ return connected - /obj/machinery/hydroponics/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables. if(!myseed) return ..() @@ -388,12 +389,7 @@ pestlevel = 0 // Reset update_icon() visible_message("The [oldPlantName] is overtaken by some [myseed.plantname]!") - name = "hydroponics tray ([myseed.plantname])" - if(myseed.product) - desc = initial(myseed.product.desc) - else - desc = initial(desc) - + TRAY_NAME_UPDATE /obj/machinery/hydroponics/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) // Mutates the current seed if(!myseed) @@ -427,12 +423,7 @@ sleep(5) // Wait a while update_icon() visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!") - name = "hydroponics tray ([myseed.plantname])" - if(myseed.product) - desc = initial(myseed.product.desc) - else - desc = initial(desc) - + TRAY_NAME_UPDATE /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) @@ -452,6 +443,7 @@ sleep(5) // Wait a while update_icon() visible_message("The mutated weeds in [src] spawn some [myseed.plantname]!") + TRAY_NAME_UPDATE else to_chat(usr, "The few weeds in [src] seem to react, but only for a moment...") @@ -797,15 +789,7 @@ to_chat(user, "You plant [O].") dead = 0 myseed = O - name = "hydroponics tray ([myseed.plantname])" - if(!myseed.productdesc) //we haven't changed our produce's description - if(myseed.product) - myseed.productdesc = initial(myseed.product.desc) - else if(myseed.desc) - myseed.productdesc = myseed.desc - else - myseed.productdesc = "A fascinating specimen." - desc = myseed.productdesc + TRAY_NAME_UPDATE age = 1 plant_health = myseed.endurance lastcycle = world.time @@ -907,8 +891,7 @@ qdel(myseed) myseed = null update_icon() - name = initial(name) - desc = initial(desc) + TRAY_NAME_UPDATE else if(user) examine(user) @@ -926,8 +909,7 @@ qdel(myseed) myseed = null dead = 0 - name = initial(name) - desc = initial(desc) + TRAY_NAME_UPDATE update_icon() /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// @@ -970,6 +952,7 @@ desc = "A patch of dirt." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "soil" + gender = PLURAL circuit = null density = FALSE use_power = NO_POWER_USE diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index c0de94e6370..e46a74ff814 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -7,7 +7,7 @@ total_positions = 2 spawn_positions = 2 supervisors = "the research director" - selection_color = "#ffeef0" + selection_color = "#ffeeff" exp_type = EXP_TYPE_CREW exp_requirements = 60 diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index ebdcdf9e71d..e750889f8be 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -31,7 +31,7 @@ belt = /obj/item/storage/belt/medical/paramedic id = /obj/item/card/id l_pocket = /obj/item/pda/medical - r_pocket = /obj/item/pinpointer/crew/prox + suit_store = /obj/item/flashlight/pen backpack_contents = list(/obj/item/roller=1) pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 18bdd5e58b1..bd44d1a8adb 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -38,7 +38,7 @@ if (!light_power || !light_range) // We won't emit light anyways, destroy the light source. QDEL_NULL(light) else - if (!ismovableatom(loc)) // We choose what atom should be the top atom of the light here. + if (!ismovable(loc)) // We choose what atom should be the top atom of the light here. . = src else . = loc diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index cb5c534bde6..dfa98dbe7d0 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -187,7 +187,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(target_type && !istype(A,target_type)) continue var/cargs = build_args() - A.AddComponent(arglist(cargs)) + A._AddComponent(cargs) qdel(src) return diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 64151c75585..d3c53644096 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -204,7 +204,7 @@ new /obj/item/dnainjector/wackymut(src) if(91) for(var/i in 1 to 30) - new /mob/living/simple_animal/cockroach(src) + new /mob/living/simple_animal/hostile/cockroach(src) if(92) new /obj/item/katana(src) if(93) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index e9f08a780ef..ca3ace93d2f 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -70,13 +70,9 @@ /obj/item/clothing/suit/space/hostile_environment/Initialize() . = ..() AddComponent(/datum/component/spraycan_paintable) - START_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/space/hostile_environment/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() /obj/item/clothing/suit/space/hostile_environment/process() + . = ..() var/mob/living/carbon/C = loc if(istype(C) && prob(2)) //cursed by bubblegum if(prob(15)) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 67e49a5d516..d0bbaea8b6b 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -49,7 +49,7 @@ if(15) new /obj/item/nullrod/armblade(src) if(16) - new /obj/item/guardiancreator(src) + new /obj/item/guardiancreator/hive(src) if(17) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) @@ -429,7 +429,7 @@ /obj/projectile/hook/on_hit(atom/target) . = ..() - if(ismovableatom(target)) + if(ismovable(target)) var/atom/movable/A = target if(A.anchored) return diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 92aadd3ca04..0f2b8d70613 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -15,14 +15,20 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/Initialize(mapload) . = ..() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - INFINITY, - FALSE, - /obj/item/stack, - null, - null, - TRUE) + var/static/list/materials_list = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + AddComponent(/datum/component/material_container, materials_list, INFINITY, allowed_types=/obj/item/stack, _disable_attackby=TRUE) if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index d6460dc37c1..a380ae10720 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -19,6 +19,8 @@ var/mine_experience = 5 //How much experience do you get for mining this ore? novariants = TRUE // Ore stacks handle their icon updates themselves to keep the illusion that there's more going var/list/stack_overlays + var/scan_state = "" //Used by mineral turfs for their scan overlay. + var/spreadChance = 0 //Also used by mineral turfs for spreading veins /obj/item/stack/ore/update_overlays() . = ..() @@ -74,6 +76,8 @@ custom_materials = list(/datum/material/uranium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/uranium mine_experience = 6 + scan_state = "rock_Uranium" + spreadChance = 5 /obj/item/stack/ore/iron name = "iron ore" @@ -84,6 +88,8 @@ custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/metal mine_experience = 1 + scan_state = "rock_Iron" + spreadChance = 20 /obj/item/stack/ore/glass name = "sand pile" @@ -139,6 +145,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma mine_experience = 5 + scan_state = "rock_Plasma" + spreadChance = 8 /obj/item/stack/ore/plasma/welder_act(mob/living/user, obj/item/I) to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") @@ -154,6 +162,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mine_experience = 3 custom_materials = list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/silver + scan_state = "rock_Silver" + spreadChance = 5 /obj/item/stack/ore/gold name = "gold ore" @@ -164,6 +174,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mine_experience = 5 custom_materials = list(/datum/material/gold=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/gold + scan_state = "rock_Gold" + spreadChance = 5 /obj/item/stack/ore/diamond name = "diamond ore" @@ -174,6 +186,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/diamond=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/diamond mine_experience = 10 + scan_state = "rock_Diamond" /obj/item/stack/ore/bananium name = "bananium ore" @@ -184,6 +197,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/bananium mine_experience = 15 + scan_state = "rock_Bananium" /obj/item/stack/ore/titanium name = "titanium ore" @@ -194,6 +208,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/titanium mine_experience = 3 + scan_state = "rock_Titanium" + spreadChance = 5 /obj/item/stack/ore/slag name = "slag" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d80ba3effcd..fc70e23645c 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -154,9 +154,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) /mob/dead/observer/Destroy() // Update our old body's medhud since we're abandoning it - if(mind) - var/mob/living/carbon/current = mind.current - current.med_hud_set_status() + if(mind && mind.current) + mind.current.med_hud_set_status() GLOB.ghost_images_default -= ghostimage_default QDEL_NULL(ghostimage_default) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 94771bcdcbf..5afb5676d38 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -196,13 +196,13 @@ damage_delta = damage - prev_damage if(damage > BRAIN_DAMAGE_MILD) if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit - gain_trauma_type(BRAIN_TRAUMA_MILD) + gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE) if(damage > BRAIN_DAMAGE_SEVERE) if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% if(prob(20)) - gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + gain_trauma_type(BRAIN_TRAUMA_SPECIAL, natural_gain = TRUE) else - gain_trauma_type(BRAIN_TRAUMA_SEVERE) + gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE) if (owner) if(owner.stat < UNCONSCIOUS) //conscious or soft-crit @@ -240,7 +240,7 @@ if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience)) . += BT -/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience) +/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) if(!ispath(trauma)) trauma = trauma.type if(!initial(trauma.can_gain)) @@ -269,7 +269,7 @@ if(TRAUMA_RESILIENCE_ABSOLUTE) max_traumas = TRAUMA_LIMIT_ABSOLUTE - if(resilience_tier_count >= max_traumas) + if(natural_gain && resilience_tier_count >= max_traumas) return FALSE return TRUE @@ -309,11 +309,11 @@ SSblackbox.record_feedback("tally", "traumas", 1, actual_trauma.type) //Add a random trauma of a certain subtype -/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience) +/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE) var/list/datum/brain_trauma/possible_traumas = list() for(var/T in subtypesof(brain_trauma_type)) var/datum/brain_trauma/BT = T - if(can_gain_trauma(BT, resilience) && initial(BT.random_gain)) + if(can_gain_trauma(BT, resilience, natural_gain) && initial(BT.random_gain)) possible_traumas += BT if(!LAZYLEN(possible_traumas)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6abb83b1040..9a731ef6b9b 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -746,6 +746,10 @@ if(hud_used && hud_used.internals) hud_used.internals.icon_state = "internal[internal_state]" +/mob/living/carbon/proc/update_spacesuit_hud_icon(cell_state = "empty") + if(hud_used && hud_used.spacesuit) + hud_used.spacesuit.icon_state = "spacesuit_[cell_state]" + /mob/living/carbon/update_stat() if(status_flags & GODMODE) return diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 96c3a597f77..5f17532aa62 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -267,7 +267,26 @@ else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) + + // Warm them up with hugs + share_bodytemperature(M) + if(bodytemperature > M.bodytemperature) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, src) // Hugger got a warm hug + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) // Reciver always gets a mood for being hugged + else + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, M) // You got a warm hug + + // Let people know if they hugged someone really warm or really cold + if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + to_chat(src, "It feels like [M] is over heating as they hug you.") + else if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + to_chat(src, "It feels like [M] is freezing as they hug you.") + + if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + to_chat(M, "It feels like [src] is over heating as you hug them.") + else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + to_chat(M, "It feels like [src] is freezing as you hug them.") + if(HAS_TRAIT(M, TRAIT_FRIENDLY)) var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) if (mood.sanity >= SANITY_GREAT) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index a78689cedf6..20f188715b9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -346,6 +346,7 @@ . += "Criminal status: \[[criminal]\]" . += jointext(list("Security record: \[View\]", + "\[Add citation\]", "\[Add crime\]", "\[View comment log\]", "\[Add comment\]"), "") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b95de249742..f9bbab9ad37 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -431,6 +431,38 @@ to_chat(usr, "Notes: [R.fields["notes"]]") return + if(href_list["add_citation"]) + var/maxFine = CONFIG_GET(number/maxfine) + var/t1 = stripped_input("Please input citation crime:", "Security HUD", "", null) + var/fine = FLOOR(input("Please input citation fine, up to [maxFine]:", "Security HUD", 50) as num|null, 1) + if(!R || !t1 || !fine || !allowed_access) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + if(fine < 0) + to_chat(usr, "You're pretty sure that's not how money works.") + return + fine = min(fine, maxFine) + + var/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, station_time_timestamp(), fine) + for (var/obj/item/pda/P in GLOB.PDAs) + if(P.owner == R.fields["name"]) + var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." + var/datum/signal/subspace/messaging/pda/signal = new(src, list( + "name" = "Security Citation", + "job" = "Citation Server", + "message" = message, + "targets" = list("[P.owner] ([P.ownjob])"), + "automated" = 1 + )) + signal.send_to_receivers() + usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) + GLOB.data_core.addCitation(R.fields["id"], crime) + investigate_log("New Citation: [t1] Fine: [fine] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + return + if(href_list["add_crime"]) switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) if("Minor Crime") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5998a8d3a01..65a15feea84 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -210,7 +210,7 @@ if(thermal_protection_flags & HAND_RIGHT) thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1, thermal_protection) //See proc/get_heat_protection_flags(temperature) for the description of this proc. /mob/living/carbon/human/proc/get_cold_protection_flags(temperature) @@ -271,7 +271,7 @@ if(thermal_protection_flags & HAND_RIGHT) thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1, thermal_protection) /mob/living/carbon/human/handle_random_events() //Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 17b05e64467..ac274dc98b1 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1619,55 +1619,21 @@ GLOBAL_LIST_EMPTY(roundstart_races) // ENVIRONMENT HANDLERS // ////////////////////////// -/// Handle the environment for species +/** + * Enviroment handler for species + * + * vars: + * * environment The environment gas mix + * * H The mob we will stabilize + */ /datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H) var/areatemp = H.get_temperature(environment) - var/natural = 0 // Body temperature stability have the body try and normalize on it's own if(H.stat != DEAD) // If you are dead your body does not stabilize naturally - natural = natural_bodytemperature_stabilization(H) + natural_bodytemperature_stabilization(environment, H) - /// Get the mobs thermal protection and environmental change - var/thermal_protection = 1 // The inverse of the amount of protection - var/environment_change = 0 // The amount of change the from the enviroment - var/natural_change = 0 // The amount that natural stabilization changes after applying thermal protection - - if(areatemp > H.bodytemperature) // It is hot here - thermal_protection -= H.get_heat_protection(areatemp) // Get the thermal protection of the mob - environment_change = min(thermal_protection * (areatemp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, \ - BODYTEMP_HEATING_MAX) - - if(H.bodytemperature < bodytemp_normal) - // Our bodytemp is below normal, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - - else // It is cold here - thermal_protection -= H.get_cold_protection(areatemp) // Get the thermal protection of the mob - - if(!H.on_fire) // If we are on fire ignore local temperature in cold areas - if(H.bodytemperature < bodytemp_normal) - // Our bodytemp is below normal, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - // How much the environment cools the mob with thermal protection - environment_change = max(thermal_protection * (areatemp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR, \ - BODYTEMP_COOLING_MAX) - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - // How much the environment cools the mob with thermal protection - // Extra calculation for hardsuits to bleed off heat - environment_change = max((thermal_protection * (areatemp - H.bodytemperature) + bodytemp_normal - \ - H.bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX) - - // Apply the temperature changes, combining natual and enviromental changes - H.adjust_bodytemperature(natural_change + environment_change) + if(!H.on_fire || areatemp > H.bodytemperature) // If we are not on fire or the area is hotter + H.adjust_bodytemperature((areatemp - H.bodytemperature), use_insulation=TRUE, use_steps=TRUE) /// Handle the body temperature status effects for the species /// Traits for resitance to heat or cold are handled here. @@ -1782,31 +1748,61 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) H.throw_alert("pressure", /obj/screen/alert/lowpressure, 2) -/// Used to stabilize the body temperature back to normal on living mobs -/// Returns the amount of degrees kelvin to change the body temperature -/datum/species/proc/natural_bodytemperature_stabilization(mob/living/carbon/human/H) +/** + * Used to stabilize the body temperature back to normal on living mobs + * + * vars: + * * environment The environment gas mix + * * H The mob we will stabilize + */ +/datum/species/proc/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H) + var/areatemp = H.get_temperature(environment) var/body_temp = H.bodytemperature // Get current body temperature var/body_temperature_difference = bodytemp_normal - body_temp + var/natural_change = 0 // We are very cold, increate body temperature if(body_temp <= bodytemp_cold_damage_limit) - return max((body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ + natural_change = max((body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ bodytemp_autorecovery_min) // we are cold, reduce the minimum increment and do not jump over the difference - if(body_temp > bodytemp_cold_damage_limit && body_temp < bodytemp_normal) - return max(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(body_temp > bodytemp_cold_damage_limit && body_temp < bodytemp_normal) + natural_change = max(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ min(body_temperature_difference, bodytemp_autorecovery_min / 4)) // We are hot, reduce the minimum increment and do not jump below the difference - if(body_temp > bodytemp_normal && body_temp <= bodytemp_heat_damage_limit) - return min(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(body_temp > bodytemp_normal && body_temp <= bodytemp_heat_damage_limit) + natural_change = min(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ max(body_temperature_difference, -(bodytemp_autorecovery_min / 4))) // We are very hot, reduce the body temperature - if(body_temp >= bodytemp_heat_damage_limit) - return min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -bodytemp_autorecovery_min) + else if(body_temp >= bodytemp_heat_damage_limit) + natural_change = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -bodytemp_autorecovery_min) + var/thermal_protection = H.get_insulation_protection(body_temp + natural_change) + if(areatemp > body_temp) // It is hot here + if(body_temp < bodytemp_normal) + // Our bodytemp is below normal we are cold, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + else // It is cold here + if(!H.on_fire) // If on fire ignore ignore local temperature in cold areas + if(body_temp < bodytemp_normal) + // Our bodytemp is below normal, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + + // Apply the natural stabilization changes + H.adjust_bodytemperature(natural_change) ////////// // FIRE // diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index d0831543da4..283fc02fb96 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -30,8 +30,8 @@ bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 10) /// Lizards are cold blooded and do not stabilize body temperature naturally -/datum/species/lizard/natural_bodytemperature_stabilization(mob/living/carbon/human/H) - return 0 +/datum/species/lizard/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H) + return /datum/species/lizard/random_name(gender,unique,lastname) if(unique) diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index cf361d73d80..c522874c8ea 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -37,8 +37,8 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN /// Zombies do not stabilize body temperature they are the walking dead and are cold blooded -/datum/species/zombie/natural_bodytemperature_stabilization(mob/living/carbon/human/H) - return 0 +/datum/species/zombie/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H) + return /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 99374cbedf9..83709a8cc4d 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -557,66 +557,77 @@ All effects don't start immediately, but rather get worse over time; the rate is /// Base carbon environment handler, adds natural stabilization /mob/living/carbon/handle_environment(datum/gas_mixture/environment) var/areatemp = get_temperature(environment) - var/natural = 0 // Have the body regulate it's own temperature if(stat != DEAD) // If you are dead your body does not stabilize naturally - natural = natural_bodytemperature_stabilization() + natural_bodytemperature_stabilization(environment) - /// Get the mobs thermal protection and environmental change - var/thermal_protection = 1 // The inverse of the amount of protection - var/environment_change = 0 // The amount of change the from the enviroment - var/natural_change = 0 // The amount that natural stabilization changes after applying thermal protection + if(!on_fire || areatemp > bodytemperature) // If we are not on fire or the area is hotter + adjust_bodytemperature((areatemp - bodytemperature), use_insulation=TRUE, use_steps=TRUE) - if(areatemp > bodytemperature) // It is hot here - thermal_protection -= get_heat_protection(areatemp) // Get the thermal protection of the mob - environment_change = min(thermal_protection * (areatemp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX) - if(bodytemperature < BODYTEMP_NORMAL) - // Our bodytemp is below normal we are cold, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - else // It is cold here - thermal_protection -= get_cold_protection(areatemp) // Get the thermal protection of the mob - if(!on_fire) // If on fire ignore ignore local temperature in cold areas - environment_change = max(thermal_protection * (areatemp - bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX) - if(bodytemperature < BODYTEMP_NORMAL) - // Our bodytemp is below normal, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - - // Apply the temperature changes, combining natual and enviromental changes - adjust_bodytemperature(natural_change + environment_change) - -/// Used to stabilize the body temperature back to normal on living mobs -/// Returns the amount of degrees kelvin to change the body temperature -/mob/living/carbon/proc/natural_bodytemperature_stabilization() +/** + * Used to stabilize the body temperature back to normal on living mobs + * + * vars: + * * environment The environment gas mix + */ +/mob/living/carbon/proc/natural_bodytemperature_stabilization(datum/gas_mixture/environment) + var/areatemp = get_temperature(environment) var/body_temperature_difference = BODYTEMP_NORMAL - bodytemperature + var/natural_change = 0 // We are very cold, increate body temperature if(bodytemperature <= BODYTEMP_COLD_DAMAGE_LIMIT) - return max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ + natural_change = max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ BODYTEMP_AUTORECOVERY_MINIMUM) // we are cold, reduce the minimum increment and do not jump over the difference - if(bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT && bodytemperature < BODYTEMP_NORMAL) - return max(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT && bodytemperature < BODYTEMP_NORMAL) + natural_change = max(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ min(body_temperature_difference, BODYTEMP_AUTORECOVERY_MINIMUM / 4)) // We are hot, reduce the minimum increment and do not jump below the difference - if(bodytemperature > BODYTEMP_NORMAL && bodytemperature <= BODYTEMP_HEAT_DAMAGE_LIMIT) - return min(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(bodytemperature > BODYTEMP_NORMAL && bodytemperature <= BODYTEMP_HEAT_DAMAGE_LIMIT) + natural_change = min(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ max(body_temperature_difference, -(BODYTEMP_AUTORECOVERY_MINIMUM / 4))) // We are very hot, reduce the body temperature - if(bodytemperature >= BODYTEMP_HEAT_DAMAGE_LIMIT) - return min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) + else if(bodytemperature >= BODYTEMP_HEAT_DAMAGE_LIMIT) + natural_change = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) + + var/thermal_protection = 1 - get_insulation_protection(areatemp) // invert the protection + if(areatemp > bodytemperature) // It is hot here + if(bodytemperature < BODYTEMP_NORMAL) + // Our bodytemp is below normal we are cold, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + else // It is cold here + if(!on_fire) // If on fire ignore ignore local temperature in cold areas + if(bodytemperature < BODYTEMP_NORMAL) + // Our bodytemp is below normal, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + + // Apply the natural stabilization changes + adjust_bodytemperature(natural_change) + +/** + * Get the insulation that is appropriate to the temperature you're being exposed to. + * All clothing, natural insulation, and traits are combined returning a single value. + * + * required temperature The Temperature that you're being exposed to + * + * return the percentage of protection as a value from 0 - 1 +**/ +/mob/living/carbon/proc/get_insulation_protection(temperature) + return (temperature > bodytemperature) ? get_heat_protection(temperature) : get_cold_protection(temperature) /// This returns the percentage of protection from heat as a value from 0 - 1 /// temperature is the temperature you're being exposed to @@ -628,6 +639,51 @@ All effects don't start immediately, but rather get worse over time; the rate is /mob/living/carbon/proc/get_cold_protection(temperature) return cold_protection +/** + * Have two mobs share body heat between each other. + * Account for the insulation and max temperature change range for the mob + * + * vars: + * * M The mob/living/carbon that is sharing body heat + */ +/mob/living/carbon/proc/share_bodytemperature(mob/living/carbon/M) + var/temp_diff = bodytemperature - M.bodytemperature + if(temp_diff > 0) // you are warm share the heat of life + M.adjust_bodytemperature(temp_diff, use_insulation=TRUE, use_steps=TRUE) // warm up the giver + adjust_bodytemperature((temp_diff * -1), use_insulation=TRUE, use_steps=TRUE) // cool down the reciver + + else // they are warmer leech from them + adjust_bodytemperature(temp_diff, use_insulation=TRUE, use_steps=TRUE) // warm up the reciver + M.adjust_bodytemperature((temp_diff * -1), use_insulation=TRUE, use_steps=TRUE) // cool down the giver + +/** + * Adjust the body temperature of a mob + * expanded for carbon mobs allowing the use of insulation and change steps + * + * vars: + * * amount The amount of degrees to change body temperature by + * * min_temp (optional) The minimum body temperature after adjustment + * * max_temp (optional) The maximum body temperature after adjustment + * * use_insulation (optional) modifies the amount based on the amount of insulation the mob has + * * use_steps (optional) Use the body temp divisors and max change rates + * * capped (optional) default True used to cap step mode + */ +/mob/living/carbon/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY, use_insulation=FALSE, use_steps=FALSE, capped=TRUE) + // apply insulation to the amount of change + if(use_insulation) + amount *= (1 - get_insulation_protection(bodytemperature + amount)) + + // Use the bodytemp divisors to get the change step, with max step size + if(use_steps) + amount = (amount > 0) ? (amount / BODYTEMP_HEAT_DIVISOR) : (amount / BODYTEMP_COLD_DIVISOR) + // Clamp the results to the min and max step size + if(capped) + amount = (amount > 0) ? min(amount, BODYTEMP_HEATING_MAX) : max(amount, BODYTEMP_COOLING_MAX) + + if(bodytemperature >= min_temp && bodytemperature <= max_temp) + bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp) + + ///////// //LIVER// ///////// diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index ee2806461e3..a43a514d468 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -340,7 +340,7 @@ // attack with weapon if we have one if(Weapon) - L.attackby(Weapon, src) + Weapon.melee_attack_chain(src, L) else L.attack_paw(src) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 51a1a284c54..66c6aadfa1a 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -78,7 +78,7 @@ slow += (health_deficiency / 25) add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow) -/mob/living/carbon/monkey/adjust_bodytemperature(amount) +/mob/living/carbon/monkey/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY, use_insulation=FALSE, use_steps=FALSE) . = ..() var/slow = 0 if (bodytemperature < 283.222) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cb1a3e0f9fb..d39b8ce59f0 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -70,7 +70,7 @@ var/obj/O = A if(ObjBump(O)) return - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A if(PushAM(AM, move_force)) return @@ -501,25 +501,20 @@ var/obj/screen/healthdoll/living/livingdoll = hud_used.healthdoll switch(healthpercent) if(100 to INFINITY) - livingdoll.icon_state = "living0" + severity = 0 if(80 to 100) - livingdoll.icon_state = "living1" severity = 1 if(60 to 80) - livingdoll.icon_state = "living2" severity = 2 if(40 to 60) - livingdoll.icon_state = "living3" severity = 3 if(20 to 40) - livingdoll.icon_state = "living4" severity = 4 if(1 to 20) - livingdoll.icon_state = "living5" severity = 5 else - livingdoll.icon_state = "living6" severity = 6 + livingdoll.icon_state = "living[severity]" if(!livingdoll.filtered) livingdoll.filtered = TRUE var/icon/mob_mask = icon(icon, icon_state) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 4177109d16c..2498c376a3b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -200,11 +200,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( spans |= L.spans if(message_mode == MODE_SING) - #if DM_VERSION < 513 - var/randomnote = "~" - #else var/randomnote = pick("\u2669", "\u266A", "\u266B") - #endif spans |= SPAN_SINGING message = "[randomnote] [message] [randomnote]" @@ -235,9 +231,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return 1 /mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - . = ..() + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) if(!client) return + var/deaf_message var/deaf_type if(speaker != src) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0260e2ce78a..c2f8c9d824e 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -901,7 +901,7 @@ if(istype(A, /obj/machinery/camera)) current = A if(client) - if(ismovableatom(A)) + if(ismovable(A)) if(A != GLOB.ai_camera_room_landmark) end_multicam() client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 64d235b3cdb..ba7fde151a9 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -299,7 +299,7 @@ target_types += /obj/effect/decal/cleanable/trail_holder if(pests) - target_types += /mob/living/simple_animal/cockroach + target_types += /mob/living/simple_animal/hostile/cockroach target_types += /mob/living/simple_animal/mouse if(drawn) @@ -333,7 +333,7 @@ playsound(src, 'sound/effects/spray2.ogg', 50, TRUE, -6) A.acid_act(75, 10) target = null - else if(istype(A, /mob/living/simple_animal/cockroach) || istype(A, /mob/living/simple_animal/mouse)) + else if(istype(A, /mob/living/simple_animal/hostile/cockroach) || istype(A, /mob/living/simple_animal/mouse)) var/mob/living/simple_animal/M = target if(!M.stat) visible_message("[src] smashes [target] with its mop!") diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm new file mode 100644 index 00000000000..648df275d62 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot/vibebot.dm @@ -0,0 +1,75 @@ +/mob/living/simple_animal/bot/vibebot + name = "\improper vibebot" + desc = "A little robot. It's just vibing, doing its thing." + icon = 'icons/mob/aibots.dmi' + icon_state = "vibebot" + density = FALSE + anchored = FALSE + health = 25 + maxHealth = 25 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + pass_flags = PASSMOB + + radio_key = /obj/item/encryptionkey/headset_service //doesn't have security key + radio_channel = RADIO_CHANNEL_SERVICE //Doesn't even use the radio anyway. + model = "Vibebot" + window_id = "vibebot" + window_name = "Discomatic Vibe Bot v1.05" + data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC // show jobs + path_image_color = "#2cac12" + + var/current_color + var/range = 7 + var/power = 3 + auto_patrol = TRUE + +/mob/living/simple_animal/bot/vibebot/Initialize() + . = ..() + update_icon() + +/mob/living/simple_animal/bot/vibebot/get_controls(mob/user) + var/list/dat = list() + dat += hack(user) + dat += showpai(user) + dat += "DiscoMatic Vibebot v1.0

" + dat += "Status: [on ? "On" : "Off"]
" + dat += "Maintenance panel panel is [open ? "opened" : "closed"]
" + + dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
" + if(!locked || issilicon(user) || IsAdminGhost(user)) + dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" + + return dat.Join("") + +/mob/living/simple_animal/bot/vibebot/turn_off() + . = ..() + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + update_icon() + +/mob/living/simple_animal/bot/vibebot/proc/Vibe() + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + current_color = random_color() + set_light(range, power, current_color) + add_atom_colour("#[current_color]", TEMPORARY_COLOUR_PRIORITY) + update_icon() + +/mob/living/simple_animal/bot/vibebot/proc/retaliate(mob/living/carbon/human/H) + + +/mob/living/simple_animal/bot/vibebot/handle_automated_action() + if(!..()) + return + + if(auto_patrol) + + if(mode == BOT_IDLE || mode == BOT_START_PATROL) + start_patrol() + + if(mode == BOT_PATROL) + bot_patrol() + + if(on) + Vibe() + + else + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm deleted file mode 100644 index 288e642b36d..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_animal/cockroach - name = "cockroach" - desc = "This station is just crawling with bugs." - icon_state = "cockroach" - icon_dead = "cockroach" - health = 1 - maxHealth = 1 - turns_per_move = 5 - loot = list(/obj/effect/decal/cleanable/insectguts) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 270 - maxbodytemp = INFINITY - pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - mob_size = MOB_SIZE_TINY - mob_biotypes = MOB_ORGANIC|MOB_BUG - response_disarm_continuous = "shoos" - response_disarm_simple = "shoo" - response_harm_continuous = "splats" - response_harm_simple = "splat" - speak_emote = list("chitters") - density = FALSE - ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN - verb_say = "chitters" - verb_ask = "chitters inquisitively" - verb_exclaim = "chitters loudly" - verb_yell = "chitters loudly" - var/squish_chance = 50 - del_on_death = 1 - -/mob/living/simple_animal/cockroach/death(gibbed) - if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. - return - ..() - -/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM) - if(ismob(AM)) - if(isliving(AM)) - var/mob/living/A = AM - if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING)) - if(prob(squish_chance)) - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(HAS_TRAIT(H, TRAIT_PACIFISM)) - H.visible_message("[src] avoids getting crushed.", "You avoid crushing [src]!") - return - A.visible_message("[A] crushes [src].", "You crushed [src].") - adjustBruteLoss(1) //kills a normal cockroach - else - visible_message("[src] avoids getting crushed.") - else - if(isstructure(AM)) - if(prob(squish_chance)) - AM.visible_message("[src] was crushed under [AM].") - adjustBruteLoss(1) - else - visible_message("[src] avoids getting crushed.") - -/mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. - return diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index c03041a1781..7aaf339d185 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -26,7 +26,7 @@ gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. + var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/hostile/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index eea2a411d30..dbb8ff45980 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -19,9 +19,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians response_harm_continuous = "punches" response_harm_simple = "punch" icon = 'icons/mob/guardian.dmi' - icon_state = "magicOrange" - icon_living = "magicOrange" - icon_dead = "magicOrange" + icon_state = "magicbase" + icon_living = "magicbase" + icon_dead = "magicbase" speed = 0 a_intent = INTENT_HARM stop_automated_movement = 1 @@ -44,21 +44,25 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians AIStatus = AI_OFF hud_type = /datum/hud/guardian dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it. + var/mutable_appearance/cooloverlay + var/guardiancolor = "#ffffff" + var/recolorentiresprite + var/theme var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS] var/reset = 0 //if the summoner has reset the guardian already var/cooldown = 0 var/mob/living/summoner var/range = 10 //how far from the user the spirit can be var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses - var/datum/guardianname/namedatum = new/datum/guardianname() var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" var/carp_fluff_string = "CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP" + var/hive_fluff_string = "The mass seems to be an anomaly, it shouldn't exist... Submit a bug report!" /mob/living/simple_animal/hostile/guardian/Initialize(mapload, theme) GLOB.parasites += src - setthemename(theme) + updatetheme(theme) . = ..() @@ -81,43 +85,52 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians GLOB.parasites -= src return ..() -/mob/living/simple_animal/hostile/guardian/proc/setthemename(pickedtheme) //set the guardian's theme to something cool! - if(!pickedtheme) - pickedtheme = pick("magic", "tech", "carp") - var/list/possible_names = list() - switch(pickedtheme) +/mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme + if(!theme) + theme = pick("magic", "tech", "carp", "hive") + switch(theme)//should make it easier to create new stand designs in the future if anyone likes that if("magic") - for(var/type in (subtypesof(/datum/guardianname/magic) - namedatum.type)) - possible_names += new type + name = "Guardian Spirit" + real_name = "Guardian Spirit" + bubble_icon = "guardian" + icon_state = "magicbase" + icon_living = "magicbase" + icon_dead = "magicbase" if("tech") - for(var/type in (subtypesof(/datum/guardianname/tech) - namedatum.type)) - possible_names += new type + name = "Holoparasite" + real_name = "Holoparasite" + bubble_icon = "holo" + icon_state = "techbase" + icon_living = "techbase" + icon_dead = "techbase" if("carp") - for(var/type in (subtypesof(/datum/guardianname/carp) - namedatum.type)) - possible_names += new type - namedatum = pick(possible_names) - updatetheme(pickedtheme) - -/mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme to whatever its datum is; proc for adminfuckery - name = "[namedatum.prefixname] [namedatum.suffixcolour]" - real_name = "[name]" - icon_living = "[namedatum.parasiteicon]" - icon_state = "[namedatum.parasiteicon]" - icon_dead = "[namedatum.parasiteicon]" - bubble_icon = "[namedatum.bubbleicon]" - - if (namedatum.stainself) - add_atom_colour(namedatum.colour, FIXED_COLOUR_PRIORITY) - - //Special case holocarp, because #snowflake code - if(theme == "carp") - speak_emote = list("gnashes") - desc = "A mysterious fish that stands by its charge, ever vigilant." - - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - + name = "Holocarp" + real_name = "Holocarp" + bubble_icon = "holo" + icon_state = "holocarp" + icon_living = "holocarp" + icon_dead = "holocarp" + speak_emote = list("gnashes") + desc = "A mysterious fish that stands by its charge, ever vigilant." + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + recolorentiresprite = TRUE + if("hive") + name = "Hivelord" + real_name = "Hivelord" + bubble_icon = "guardian" + icon_state = "hivebase" + icon_living = "hivebase" + icon_dead = "hivebase" + speak_emote = list("telepathically cries") + desc = "A truly alien creature, it is a mass of unknown organic material, standing by its' owner's side." + attack_verb_continuous = "lashes out at" + attack_verb_simple = "lash out at" + attack_sound = 'sound/weapons/pierce.ogg' + if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isnt gone for some reason + cooloverlay = mutable_appearance(icon, theme) + add_overlay(cooloverlay) /mob/living/simple_animal/hostile/guardian/Login() //if we have a mind, set its name to ours when it logs in ..() @@ -126,10 +139,37 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(!summoner) to_chat(src, "For some reason, somehow, you have no summoner. Please report this bug immediately.") return - to_chat(src, "You are [real_name], bound to serve [summoner.real_name].") + to_chat(src, "You are a [real_name], bound to serve [summoner.real_name].") to_chat(src, "You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.") to_chat(src, "While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.") to_chat(src, playstyle_string) + guardiancustomize() + +/mob/living/simple_animal/hostile/guardian/proc/guardiancustomize() + guardianrecolor() + guardianrename() + +/mob/living/simple_animal/hostile/guardian/proc/guardianrecolor() + guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null + if(!guardiancolor) //redo proc until we get a color + to_chat(src, "Not a valid color, please try again.") + guardianrecolor() + return + if(!recolorentiresprite) + cooloverlay.color = guardiancolor + cut_overlay(cooloverlay) //we need to get our new color + add_overlay(cooloverlay) + else + add_atom_colour(guardiancolor, FIXED_COLOUR_PRIORITY) + +/mob/living/simple_animal/hostile/guardian/proc/guardianrename() + var/new_name = sanitize_name(reject_bad_text(stripped_input(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN))) + if(!new_name) //redo proc until we get a good name + to_chat(src, "Not a valid name, please try again.") + guardianrename() + return + visible_message("Your new name [new_name] anchors itself in your mind.") + fully_replace_character_name(null, new_name) /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies . = ..() @@ -359,7 +399,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return var/preliminary_message = "[input]" //apply basic color/bolding - var/my_message = "[src]: [preliminary_message]" //add source, color source with the guardian's color + var/my_message = "[src]: [preliminary_message]" //add source, color source with the guardian's color to_chat(summoner, my_message) var/list/guardians = summoner.hasparasites() @@ -386,7 +426,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/list/guardians = hasparasites() for(var/para in guardians) var/mob/living/simple_animal/hostile/guardian/G = para - to_chat(G, "[src]: [preliminary_message]" ) + to_chat(G, "[src]: [preliminary_message]" ) for(var/M in GLOB.dead_mob_list) var/link = FOLLOW_LINK(M, src) to_chat(M, "[link] [my_message]") @@ -417,27 +457,31 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(guardians.len) var/mob/living/simple_animal/hostile/guardian/G = input(src, "Pick the guardian you wish to reset", "Guardian Reset") as null|anything in sortNames(guardians) if(G) - to_chat(src, "You attempt to reset [G.real_name]'s personality...") + to_chat(src, "You attempt to reset [G.real_name]'s personality...") var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") - to_chat(src, "Your [G.real_name] has been successfully reset.") + to_chat(src, "Your [G.real_name] has been successfully reset.") message_admins("[key_name_admin(C)] has taken control of ([ADMIN_LOOKUPFLW(G)])") G.ghostize(0) - G.setthemename(G.namedatum.theme) //give it a new color, to show it's a new person + G.guardiancustomize() //give it a new color, to show it's a new person G.key = C.key G.reset = 1 - switch(G.namedatum.theme) + switch(G.theme) if("tech") - to_chat(src, "[G.real_name] is now online!") + to_chat(src, "[G.real_name] is now online!") if("magic") - to_chat(src, "[G.real_name] has been summoned!") + to_chat(src, "[G.real_name] has been summoned!") + if("carp") + to_chat(src, "[G.real_name] has been caught!") + if("hive") + to_chat(src, "[G.real_name] has been created from the core!") guardians -= G if(!guardians.len) verbs -= /mob/living/proc/guardian_reset else - to_chat(src, "There were no ghosts willing to take control of [G.real_name]. Looks like you're stuck with it for now.") + to_chat(src, "There were no ghosts willing to take control of [G.real_name]. Looks like you're stuck with it for now.") else to_chat(src, "You decide not to reset [guardians.len > 1 ? "any of your guardians":"your guardian"].") else @@ -554,6 +598,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians used = FALSE return var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user, theme) + G.name = mob_name G.summoner = user G.key = key G.mind.enslave_mind_to_creator(user) @@ -561,13 +606,16 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians switch(theme) if("tech") to_chat(user, "[G.tech_fluff_string]") - to_chat(user, "[G.real_name] is now online!") + to_chat(user, "[G.real_name] is now online!") if("magic") to_chat(user, "[G.magic_fluff_string]") - to_chat(user, "[G.real_name] has been summoned!") + to_chat(user, "[G.real_name] has been summoned!") if("carp") to_chat(user, "[G.carp_fluff_string]") - to_chat(user, "[G.real_name] has been caught!") + to_chat(user, "[G.real_name] has been caught!") + if("hive") + to_chat(user, "[G.hive_fluff_string]") + to_chat(user, "[G.real_name] has been created from the core!") user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall user.verbs += /mob/living/proc/guardian_reset @@ -596,6 +644,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /obj/item/guardiancreator/tech/choose/traitor possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support", "Gravitokinetic") + allowling = FALSE /obj/item/guardiancreator/tech/choose random = FALSE @@ -680,8 +729,21 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians failure_message = "You couldn't catch any carp spirits from the seas of Lake Carp. Maybe there are none, maybe you fucked up." ling_failure = "Carp'sie is fine with changelings, so you shouldn't be seeing this message." allowmultiple = TRUE - allowling = TRUE - random = TRUE /obj/item/guardiancreator/carp/choose random = FALSE + +/obj/item/guardiancreator/hive + name = "mysterious core" + desc = "All that remains of a hivelord. It has a mysterious aura around it..." + icon = 'icons/obj/surgery.dmi' + icon_state = "roro core 2" + theme = "hive" + mob_name = "Hivelord" + use_message = "You place the core near your heart..." + used_message = "This core seems to have decayed and doesn't work anymore..." + failure_message = "You couldn't gather any mass with the core, maybe try again later." + ling_failure = "Even the dark energies seem to not want to be near your horrific body." + +/obj/item/guardiancreator/hive/choose + random = FALSE diff --git a/code/modules/mob/living/simple_animal/guardian/guardiannaming.dm b/code/modules/mob/living/simple_animal/guardian/guardiannaming.dm deleted file mode 100644 index f2e1b57255a..00000000000 --- a/code/modules/mob/living/simple_animal/guardian/guardiannaming.dm +++ /dev/null @@ -1,161 +0,0 @@ - -/datum/guardianname - var/prefixname = "Default" //the prefix the guardian uses for its name - var/suffixcolour = "Name" //the suffix the guardian uses for its name - var/parasiteicon = "techbase" //the icon of the guardian - var/bubbleicon = "holo" //the speechbubble icon of the guardian - var/theme = "tech" //what the actual theme of the guardian is - var/colour = "#C3C3C3" //what color the guardian's name is in chat and what color is used for effects from the guardian - var/stainself = 0 //whether to use the color var to literally dye ourself our chosen colour, for lazy spriting - -/datum/guardianname/carp - bubbleicon = "guardian" - theme = "carp" - parasiteicon = "holocarp" - stainself = 1 - -/datum/guardianname/carp/New() - prefixname = pick(GLOB.carp_names) - -/datum/guardianname/carp/sand - suffixcolour = "Sand" - colour = "#C2B280" - -/datum/guardianname/carp/seashell - suffixcolour = "Seashell" - colour = "#FFF5EE" - -/datum/guardianname/carp/coral - suffixcolour = "Coral" - colour = "#FF7F50" - -/datum/guardianname/carp/salmon - suffixcolour = "Salmon" - colour = "#FA8072" - -/datum/guardianname/carp/sunset - suffixcolour = "Sunset" - colour = "#FAD6A5" - -/datum/guardianname/carp/riptide - suffixcolour = "Riptide" - colour = "#89D9C8" - -/datum/guardianname/carp/seagreen - suffixcolour = "Sea Green" - colour = "#2E8B57" - -/datum/guardianname/carp/ultramarine - suffixcolour = "Ultramarine" - colour = "#3F00FF" - -/datum/guardianname/carp/cerulean - suffixcolour = "Cerulean" - colour = "#007BA7" - -/datum/guardianname/carp/aqua - suffixcolour = "Aqua" - colour = "#00FFFF" - -/datum/guardianname/carp/paleaqua - suffixcolour = "Pale Aqua" - colour = "#BCD4E6" - -/datum/guardianname/carp/hookergreen - suffixcolour = "Hooker Green" - colour = "#49796B" - -/datum/guardianname/magic - bubbleicon = "guardian" - theme = "magic" - -/datum/guardianname/magic/New() - prefixname = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces", "Ophiuchus") - -/datum/guardianname/magic/red - suffixcolour = "Red" - parasiteicon = "magicRed" - colour = "#E32114" - -/datum/guardianname/magic/pink - suffixcolour = "Pink" - parasiteicon = "magicPink" - colour = "#FB5F9B" - -/datum/guardianname/magic/orange - suffixcolour = "Orange" - parasiteicon = "magicOrange" - colour = "#F3CF24" - -/datum/guardianname/magic/green - suffixcolour = "Green" - parasiteicon = "magicGreen" - colour = "#A4E836" - -/datum/guardianname/magic/blue - suffixcolour = "Blue" - parasiteicon = "magicBlue" - colour = "#78C4DB" - -/datum/guardianname/tech/New() - prefixname = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium") - -/datum/guardianname/tech/rose - suffixcolour = "Rose" - parasiteicon = "techRose" - colour = "#F62C6B" - -/datum/guardianname/tech/peony - suffixcolour = "Peony" - parasiteicon = "techPeony" - colour = "#E54750" - -/datum/guardianname/tech/lily - suffixcolour = "Lily" - parasiteicon = "techLily" - colour = "#F6562C" - -/datum/guardianname/tech/daisy - suffixcolour = "Daisy" - parasiteicon = "techDaisy" - colour = "#ECCD39" - -/datum/guardianname/tech/zinnia - suffixcolour = "Zinnia" - parasiteicon = "techZinnia" - colour = "#89F62C" - -/datum/guardianname/tech/ivy - suffixcolour = "Ivy" - parasiteicon = "techIvy" - colour = "#5DF62C" - -/datum/guardianname/tech/iris - suffixcolour = "Iris" - parasiteicon = "techIris" - colour = "#2CF6B8" - -/datum/guardianname/tech/petunia - suffixcolour = "Petunia" - parasiteicon = "techPetunia" - colour = "#51A9D4" - -/datum/guardianname/tech/violet - suffixcolour = "Violet" - parasiteicon = "techViolet" - colour = "#8A347C" - -/datum/guardianname/tech/lotus - suffixcolour = "Lotus" - parasiteicon = "techLotus" - colour = "#463546" - -/datum/guardianname/tech/lilac - suffixcolour = "Lilac" - parasiteicon = "techLilac" - colour = "#C7A0F6" - -/datum/guardianname/tech/orchid - suffixcolour = "Orchid" - parasiteicon = "techOrchid" - colour = "#F62CF5" diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 026fc1b1c04..44c2ab2e8e1 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -10,7 +10,7 @@ magic_fluff_string = "..And draw the Space Ninja, a lethal, invisible assassin." tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space." - + hive_fluff_string = "The mass seems to be able to attack with stealth causing massive damage." toggle_button_type = /obj/screen/guardian/ToggleMode/Assassin var/toggle = FALSE var/stealthcooldown = 160 diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 01e16cb5027..12463e0bc6c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -11,6 +11,7 @@ magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault." tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." + hive_fluff_string = "The mass seems to have primal senses, rapidly assaulting its' enemies." var/charging = 0 var/obj/screen/alert/chargealert diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 7a164f1d6a0..182f45703c0 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -7,6 +7,7 @@ magic_fluff_string = "..And draw the Drone, a dextrous master of construction and repair." tech_fluff_string = "Boot sequence complete. Dextrous combat modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It can hold stuff in its fins, sort of." + hive_fluff_string = "The mass seems to be able to... hold stuff?" dextrous = TRUE held_items = list(null, null) var/obj/item/internal_storage //what we're storing within ourself diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 840f247a5fb..f1e38dabbb4 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -14,6 +14,7 @@ magic_fluff_string = "..And draw the Scientist, master of explosive death." tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an explosive carp! Boom goes the fishy." + hive_fluff_string = "The mass seems to generate explosive energy, destroying everything in its' path." var/bomb_cooldown = 0 var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) @@ -71,6 +72,6 @@ UNREGISTER_BOMB_SIGNALS(A) /mob/living/simple_animal/hostile/guardian/bomb/proc/display_examine(datum/source, mob/user, text) - text += "It glows with a strange light!" + text += "It glows with a strange light!" #undef UNREGISTER_BOMB_SIGNALS diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index 386c8300528..641e9664e94 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -12,6 +12,7 @@ magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish." + hive_fluff_string = "The mass seems to generate lots of energy, causing everything except its' owner to burn to ash." /mob/living/simple_animal/hostile/guardian/fire/Life() . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm index 02f194500cc..768c50e73ee 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm @@ -7,6 +7,7 @@ magic_fluff_string = "..And draw the Singularity, an anomalous force of terror." tech_fluff_string = "Boot sequence complete. Gravitokinetic modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?" + hive_fluff_string = "The mass seems to be extremely heavy, and able to relay the heaviness to others." var/list/gravito_targets = list() var/gravity_power_range = 10 //how close the stand must stay to the target to keep the heavy gravity diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index bf626644c6f..62eb1a54300 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -16,6 +16,7 @@ magic_fluff_string = "..And draw the Tesla, a shocking, lethal source of power." tech_fluff_string = "Boot sequence complete. Lightning modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a lightning carp! Everyone else goes zap zap." + hive_fluff_string = "The mass seems to cause lots of thunder strikes around itself." var/datum/beam/summonerchain var/list/enemychains = list() var/successfulshocks = 0 diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index f736d7784fc..b90e99de0e2 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -8,6 +8,7 @@ magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge." tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy." + hive_fluff_string = "The mass seems to be extremely resistant to damage and have a special connection with the owner." toggle_button_type = /obj/screen/guardian/ToggleMode var/toggle = FALSE @@ -25,8 +26,8 @@ . = ..() if(. > 0 && toggle) var/image/I = new('icons/effects/effects.dmi', src, "shield-flash", MOB_LAYER+0.01, dir = pick(GLOB.cardinals)) - if(namedatum) - I.color = namedatum.colour + if(guardiancolor) + I.color = guardiancolor flick_overlay_view(I, src, 5) /mob/living/simple_animal/hostile/guardian/protector/ToggleMode() @@ -43,8 +44,8 @@ toggle = FALSE else var/mutable_appearance/shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey") - if(namedatum) - shield_overlay.color = namedatum.colour + if(guardiancolor) + shield_overlay.color = guardiancolor add_overlay(shield_overlay) melee_damage_lower = 2 melee_damage_upper = 2 @@ -63,7 +64,7 @@ visible_message("\The [src] jumps back to its user.") Recall(TRUE) else - to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!") + to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!") summoner.visible_message("\The [summoner] jumps back to [summoner.p_their()] protector.") new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner)) summoner.forceMove(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index a24da3d3d9b..996b21e8eb4 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -22,6 +22,7 @@ magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean." + hive_fluff_string = "The mass seems to be able to create more mass and also hide at will." see_invisible = SEE_INVISIBLE_LIVING see_in_dark = 8 toggle_button_type = /obj/screen/guardian/ToggleMode @@ -57,8 +58,8 @@ . = ..() if(istype(., /obj/projectile)) var/obj/projectile/P = . - if(namedatum) - P.color = namedatum.colour + if(guardiancolor) + P.color = guardiancolor /mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() var/msg diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm index 27c528c1ae1..357c593695b 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm @@ -9,6 +9,7 @@ magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! It's really boring and standard. Better punch some walls to ease the tension." + hive_fluff_string = "The mass seems to have immense strength and increased agility." var/battlecry = "AT" /mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 291ae7491c3..4cc09b47598 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -11,6 +11,7 @@ magic_fluff_string = "..And draw the CMO, a potent force of life... and death." carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." + hive_fluff_string = "The mass seems to have regenerative powers, while also possessing strength." toggle_button_type = /obj/screen/guardian/ToggleMode var/obj/structure/receiving_pad/beacon var/beacon_cooldown = 0 @@ -36,8 +37,8 @@ C.adjustOxyLoss(-5) C.adjustToxLoss(-5) var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C)) - if(namedatum) - H.color = namedatum.colour + if(guardiancolor) + H.color = guardiancolor if(C == summoner) update_health_hud() med_hud_set_health() @@ -100,8 +101,8 @@ /obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G) . = ..() - if(G.namedatum) - add_atom_colour(G.namedatum.colour, FIXED_COLOUR_PRIORITY) + if(G.guardiancolor) + add_atom_colour(G.guardiancolor, FIXED_COLOUR_PRIORITY) /obj/structure/receiving_pad/proc/disappear() visible_message("[src] vanishes!") diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 428ebf0f31c..127ebada463 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -176,7 +176,7 @@ AddElement(/datum/element/cleaning) /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() - if(ismovableatom(target)) + if(ismovable(target)) if(istype(target, /obj/effect/decal/cleanable)) visible_message("[src] cleans up \the [target].") qdel(target) diff --git a/code/modules/mob/living/simple_animal/hostile/glockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm similarity index 75% rename from code/modules/mob/living/simple_animal/hostile/glockroach.dm rename to code/modules/mob/living/simple_animal/hostile/cockroach.dm index 495c6df2b42..11eb42c25b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/glockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -1,16 +1,7 @@ -/obj/projectile/glockroachbullet - damage = 10 //same damage as a hivebot - damage_type = BRUTE - -/obj/item/ammo_casing/glockroach - name = "0.9mm bullet casing" - desc = "A... 0.9mm bullet casing? What?" - projectile_type = /obj/projectile/glockroachbullet - -/mob/living/simple_animal/hostile/glockroach //copypasted from cockroach.dm so i could use the shooting code in hostile.dm - name = "glockroach" - desc = "HOLY SHIT, THAT COCKROACH HAS A GUN!" - icon_state = "glockroach" +/mob/living/simple_animal/hostile/cockroach + name = "cockroach" + desc = "This station is just crawling with bugs." + icon_state = "cockroach" icon_dead = "cockroach" health = 1 maxHealth = 1 @@ -28,25 +19,49 @@ response_harm_simple = "splat" speak_emote = list("chitters") density = FALSE + melee_damage_lower = 0 + melee_damage_upper = 0 + obj_damage = 0 ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = HOSTILE_SPAWN + gold_core_spawnable = FRIENDLY_SPAWN verb_say = "chitters" verb_ask = "chitters inquisitively" verb_exclaim = "chitters loudly" verb_yell = "chitters loudly" + del_on_death = TRUE + environment_smash = ENVIRONMENT_SMASH_NONE + faction = list("neutral") + var/squish_chance = 50 + +/obj/projectile/glockroachbullet + damage = 10 //same damage as a hivebot + damage_type = BRUTE + +/obj/item/ammo_casing/glockroach + name = "0.9mm bullet casing" + desc = "A... 0.9mm bullet casing? What?" + projectile_type = /obj/projectile/glockroachbullet + +/mob/living/simple_animal/hostile/cockroach/glockroach + name = "glockroach" + desc = "HOLY SHIT, THAT COCKROACH HAS A GUN!" + icon_state = "glockroach" + melee_damage_lower = 5 + melee_damage_upper = 5 + obj_damage = 20 + gold_core_spawnable = HOSTILE_SPAWN projectilesound = 'sound/weapons/gun/pistol/shot.ogg' projectiletype = /obj/projectile/glockroachbullet casingtype = /obj/item/ammo_casing/glockroach - ranged = 1 - var/squish_chance = 50 - del_on_death = 1 + ranged = TRUE + faction = list("hostile") -/mob/living/simple_animal/hostile/glockroach/death(gibbed) +/mob/living/simple_animal/hostile/cockroach/death(gibbed) if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. return ..() -/mob/living/simple_animal/hostile/glockroach/Crossed(var/atom/movable/AM) +/mob/living/simple_animal/hostile/cockroach/Crossed(var/atom/movable/AM) if(ismob(AM)) if(isliving(AM)) var/mob/living/A = AM @@ -64,6 +79,5 @@ else visible_message("[src] avoids getting crushed.") -/mob/living/simple_animal/hostile/glockroach/ex_act() //Explosions are a terrible way to handle a cockroach. +/mob/living/simple_animal/hostile/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. return - diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index a98b9815d21..954cd200999 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -733,7 +733,7 @@ Difficulty: Very Hard mobcheck = TRUE break if(!mobcheck) - new /mob/living/simple_animal/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it + new /mob/living/simple_animal/hostile/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it //i found it funny that in the file for a giant angel beast theres a cockroach /obj/structure/closet/stasis name = "quantum entanglement stasis warp field" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 8cb629c9025..6bcb7ae83c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -88,12 +88,12 @@ While using this makes the system rely on OnFire, it still gives options for tim update_health_hud() /mob/living/simple_animal/hostile/asteroid/elite/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(hud_used?.healthdoll) switch(healthpercent) if(100 to INFINITY) - hud_used.healths.icon_state = "elite_health0" + severity = 0 if(80 to 100) severity = 1 if(60 to 80) @@ -108,11 +108,11 @@ While using this makes the system rely on OnFire, it still gives options for tim severity = 6 else severity = 7 - hud_used.healths.icon_state = "elite_health[severity]" - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") + hud_used.healthdoll.icon_state = "elite_health[severity]" + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") //The Pulsing Tumor, the actual "spawn-point" of elites, handles the spawning, arena, and procs for dealing with basic scenarios. diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index f34194de8cd..0e469a4a937 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -167,34 +167,31 @@ update_health_hud() /mob/living/simple_animal/slime/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(hud_used?.healthdoll) switch(healthpercent) if(100 to INFINITY) - hud_used.healths.icon_state = "slime_health0" + severity = 0 if(80 to 100) - hud_used.healths.icon_state = "slime_health1" severity = 1 if(60 to 80) - hud_used.healths.icon_state = "slime_health2" severity = 2 if(40 to 60) - hud_used.healths.icon_state = "slime_health3" severity = 3 if(20 to 40) - hud_used.healths.icon_state = "slime_health4" severity = 4 - if(1 to 20) - hud_used.healths.icon_state = "slime_health5" + if(10 to 20) severity = 5 - else - hud_used.healths.icon_state = "slime_health7" + if(1 to 20) severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") + else + severity = 7 + hud_used.healthdoll.icon_state = "slime_health[severity]" + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") /mob/living/simple_animal/slime/adjust_bodytemperature() . = ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e28be1677db..182e2193604 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -364,7 +364,7 @@ /mob/proc/reset_perspective(atom/A) if(client) if(A) - if(ismovableatom(A)) + if(ismovable(A)) //Set the the thing unless it's us if(A != src) client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/modular_computers/computers/item/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop_presets.dm index 7a2697ab12e..6ae8d1346ee 100644 --- a/code/modules/modular_computers/computers/item/laptop_presets.dm +++ b/code/modules/modular_computers/computers/item/laptop_presets.dm @@ -20,4 +20,3 @@ /obj/item/modular_computer/laptop/preset/civillian/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index d2465cf85bc..8c6def18e05 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -49,7 +49,6 @@ /obj/machinery/modular_computer/console/preset/research/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) hard_drive.store_file(new/datum/computer_file/program/chatclient()) hard_drive.store_file(new/datum/computer_file/program/aidiag()) @@ -76,5 +75,4 @@ /obj/machinery/modular_computer/console/preset/civilian/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) hard_drive.store_file(new/datum/computer_file/program/arcade()) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 2e2aa8e9eb3..4e862c4ae35 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -3,8 +3,8 @@ var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case var/size = 1 // File size in GQ. Integers only! var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file. - var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means. - var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. + var/unsendable = FALSE // Whether the file may be sent to someone via NTNet transfer or other means. + var/undeletable = FALSE // Whether the file may be deleted. Setting to TRUE prevents deletion/renaming/etc. var/uid // UID of this file var/static/file_uid = 0 @@ -24,7 +24,7 @@ return ..() // Returns independent copy of this file. -/datum/computer_file/proc/clone(rename = 0) +/datum/computer_file/proc/clone(rename = FALSE) var/datum/computer_file/temp = new type temp.unsendable = unsendable temp.undeletable = undeletable diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 4a40b3cf86e..af1d88fb80b 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -4,12 +4,12 @@ program_icon_state = "generic" extended_desc = "This program is capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot." size = 12 - requires_ntnet = 0 + requires_ntnet = FALSE usage_flags = PROGRAM_CONSOLE transfer_access = ACCESS_HEADS - available_on_ntnet = 1 + available_on_ntnet = TRUE tgui_id = "ntos_ai_restorer" - ui_x = 600 + ui_x = 370 ui_y = 400 var/restoring = FALSE @@ -30,11 +30,11 @@ if(ai_slot.stored_card.AI) return ai_slot.stored_card.AI - return null + return /datum/computer_file/program/aidiag/ui_act(action, params) if(..()) - return TRUE + return var/mob/living/silicon/ai/A = get_ai() if(!A) @@ -54,7 +54,7 @@ return TRUE /datum/computer_file/program/aidiag/process_tick() - ..() + . = ..() if(!restoring) //Put the check here so we don't check for an ai all the time return var/obj/item/aicard/cardhold = get_ai(2) @@ -91,9 +91,7 @@ /datum/computer_file/program/aidiag/ui_data(mob/user) var/list/data = get_header_data() - var/mob/living/silicon/ai/AI - // A shortcut for getting the AI stored inside the computer. The program already does necessary checks. - AI = get_ai() + var/mob/living/silicon/ai/AI = get_ai() var/obj/item/aicard/aicard = get_ai(2) @@ -119,4 +117,4 @@ /datum/computer_file/program/aidiag/kill_program(forced) restoring = FALSE - return ..(forced) + return ..() diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 140b9d30f7a..004b86ef81d 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -4,9 +4,9 @@ program_icon_state = "hostile" extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against same relay for increased effect" size = 20 - requires_ntnet = 1 - available_on_ntnet = 0 - available_on_syndinet = 1 + requires_ntnet = TRUE + available_on_ntnet = FALSE + available_on_syndinet = TRUE tgui_id = "ntos_net_dos" ui_x = 400 ui_y = 250 @@ -36,61 +36,52 @@ if(target) target.dos_sources.Remove(src) target = null - executed = 0 + executed = FALSE ..() /datum/computer_file/program/ntnet_dos/ui_act(action, params) if(..()) - return 1 + return switch(action) if("PRG_target_relay") for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays) if("[R.uid]" == params["targid"]) target = R - return 1 + break + return TRUE if("PRG_reset") if(target) target.dos_sources.Remove(src) target = null - executed = 0 + executed = FALSE error = "" - return 1 + return TRUE if("PRG_execute") if(target) - executed = 1 + executed = TRUE target.dos_sources.Add(src) if(SSnetworks.station_network.intrusion_detection_enabled) var/obj/item/computer_hardware/network_card/network_card = computer.all_components[MC_NET] SSnetworks.station_network.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]") - SSnetworks.station_network.intrusion_detection_alarm = 1 - return 1 + SSnetworks.station_network.intrusion_detection_alarm = TRUE + return TRUE /datum/computer_file/program/ntnet_dos/ui_data(mob/user) if(!SSnetworks.station_network) return - var/list/data = list() + var/list/data = get_header_data() - data = get_header_data() - - if(error) - data["error"] = error - else if(target && executed) - data["target"] = 1 + data["error"] = error + if(target && executed) + data["target"] = TRUE data["speed"] = dos_speed - // This is mostly visual, generate some strings of 1s and 0s - // Probability of 1 is equal of completion percentage of DoS attack on this relay. - // Combined with UI updates this adds quite nice effect to the UI - var/percentage = target.dos_overload * 100 / target.dos_capacity - data["dos_strings"] = list() - for(var/j, j<10, j++) - var/string = "" - for(var/i, i<20, i++) - string = "[string][prob(percentage)]" - data["dos_strings"] += list(list("nums" = string)) + data["overload"] = target.dos_overload + data["capacity"] = target.dos_capacity else + data["target"] = FALSE data["relays"] = list() for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays) data["relays"] += list(list("id" = R.uid)) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index af2d3f099d9..5b85e5a67bb 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -4,9 +4,9 @@ program_icon_state = "hostile" extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution." size = 13 - requires_ntnet = 0 - available_on_ntnet = 0 - available_on_syndinet = 1 + requires_ntnet = FALSE + available_on_ntnet = FALSE + available_on_syndinet = TRUE tgui_id = "ntos_revelation" ui_x = 400 ui_y = 250 @@ -21,7 +21,7 @@ /datum/computer_file/program/revelation/proc/activate() if(computer) computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.") - computer.enabled = 0 + computer.enabled = FALSE computer.update_icon() var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] var/obj/item/computer_hardware/battery/battery_module = computer.all_components[MC_CELL] @@ -43,18 +43,20 @@ /datum/computer_file/program/revelation/ui_act(action, params) if(..()) - return 1 + return switch(action) if("PRG_arm") armed = !armed + return TRUE if("PRG_activate") activate() + return TRUE if("PRG_obfuscate") - var/mob/living/user = usr - var/newname = sanitize(input(user, "Enter new program name: ")) + var/newname = params["new_name"] if(!newname) return filedesc = newname + return TRUE /datum/computer_file/program/revelation/clone() diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index fb90ecbfad1..52ba479c049 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -4,9 +4,9 @@ extended_desc = "This program allows management of files." program_icon_state = "generic" size = 8 - requires_ntnet = 0 - available_on_ntnet = 0 - undeletable = 1 + requires_ntnet = FALSE + available_on_ntnet = FALSE + undeletable = TRUE tgui_id = "ntos_file_manager" var/open_file @@ -14,176 +14,57 @@ /datum/computer_file/program/filemanager/ui_act(action, params) if(..()) - return 1 + return var/obj/item/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD] var/obj/item/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD] - var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT] switch(action) - if("PRG_openfile") - . = 1 - open_file = params["name"] - if("PRG_newtextfile") - . = 1 - var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50) - if(!newname) - return 1 - if(!HDD) - return 1 - var/datum/computer_file/data/F = new/datum/computer_file/data() - F.filename = newname - F.filetype = "TXT" - HDD.store_file(F) if("PRG_deletefile") - . = 1 if(!HDD) - return 1 + return var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) if(!file || file.undeletable) - return 1 + return HDD.remove_file(file) + return TRUE if("PRG_usbdeletefile") - . = 1 if(!RHDD) - return 1 + return var/datum/computer_file/file = RHDD.find_file_by_name(params["name"]) if(!file || file.undeletable) - return 1 - RHDD.remove_file(file) - if("PRG_closefile") - . = 1 - open_file = null - error = null - if("PRG_clone") - . = 1 - if(!HDD) - return 1 - var/datum/computer_file/F = HDD.find_file_by_name(params["name"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(1) - HDD.store_file(C) - if("PRG_rename") - . = 1 - if(!HDD) - return 1 - var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) - if(!file || !istype(file)) - return 1 - var/newname = stripped_input(usr, "Enter new file name:", "File rename", file.filename, max_length=50) - if(file && newname) - file.filename = newname - if("PRG_edit") - . = 1 - if(!open_file) - return 1 - if(!HDD) - return 1 - var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) - if(!F || !istype(F)) - return 1 - if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) - return 1 - // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. - var/newtext = stripped_multiline_input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", html_decode(F.stored_data), 16384, TRUE) - if(!newtext) return - if(F) - var/datum/computer_file/data/backup = F.clone() - HDD.remove_file(F) - F.stored_data = newtext - F.calculate_size() - // We can't store the updated file, it's probably too large. Print an error and restore backed up version. - // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space. - // They will be able to copy-paste the text from error screen and store it in notepad or something. - if(!HDD.store_file(F)) - error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:

[F.stored_data]

" - HDD.store_file(backup) - if("PRG_printfile") - . = 1 - if(!open_file) - return 1 + RHDD.remove_file(file) + return TRUE + if("PRG_rename") if(!HDD) - return 1 - var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) - if(!F || !istype(F)) - return 1 - if(!printer) - error = "Missing Hardware: Your computer does not have required hardware to complete this operation." - return 1 - if(!printer.print_text("" + prepare_printjob(F.stored_data) + "", open_file)) - error = "Hardware error: Printer was unable to print the file. It may be out of paper." - return 1 + return + var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) + if(!file) + return + var/newname = params["new_name"] + if(!newname) + return + file.filename = newname + return TRUE if("PRG_copytousb") - . = 1 if(!HDD || !RHDD) - return 1 + return var/datum/computer_file/F = HDD.find_file_by_name(params["name"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(0) + if(!F) + return + var/datum/computer_file/C = F.clone(FALSE) RHDD.store_file(C) + return TRUE if("PRG_copyfromusb") - . = 1 if(!HDD || !RHDD) - return 1 + return var/datum/computer_file/F = RHDD.find_file_by_name(params["name"]) if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(0) + return + var/datum/computer_file/C = F.clone(FALSE) HDD.store_file(C) - -/datum/computer_file/program/filemanager/proc/parse_tags(t) - t = replacetext(t, "\[center\]", "
") - t = replacetext(t, "\[/center\]", "
") - t = replacetext(t, "\[br\]", "
") - t = replacetext(t, "\n", "
") - t = replacetext(t, "\[b\]", "") - t = replacetext(t, "\[/b\]", "") - t = replacetext(t, "\[i\]", "") - t = replacetext(t, "\[/i\]", "") - t = replacetext(t, "\[u\]", "") - t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[time\]", "[station_time_timestamp()]") - t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]") - t = replacetext(t, "\[large\]", "") - t = replacetext(t, "\[/large\]", "") - t = replacetext(t, "\[h1\]", "

") - t = replacetext(t, "\[/h1\]", "

") - t = replacetext(t, "\[h2\]", "

") - t = replacetext(t, "\[/h2\]", "

") - t = replacetext(t, "\[h3\]", "

") - t = replacetext(t, "\[/h3\]", "

") - t = replacetext(t, "\[*\]", "
  • ") - t = replacetext(t, "\[hr\]", "
    ") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "
      ") - t = replacetext(t, "\[/list\]", "
    ") - t = replacetext(t, "\[table\]", "") - t = replacetext(t, "\[/table\]", "
    ") - t = replacetext(t, "\[grid\]", "") - t = replacetext(t, "\[/grid\]", "
    ") - t = replacetext(t, "\[row\]", "") - t = replacetext(t, "\[tr\]", "") - t = replacetext(t, "\[td\]", "") - t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[tab\]", "    ") - - t = parsemarkdown_basic(t) - - return t - -/datum/computer_file/program/filemanager/proc/prepare_printjob(t) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW. - t = replacetext(t, "\[field\]", "") - t = replacetext(t, "\[sign\]", "") - - t = parse_tags(t) - - t = replacetext(t, regex("(?:%s(?:ign)|%f(?:ield))(?=\\s|$)", "ig"), "") - - return t + return TRUE /datum/computer_file/program/filemanager/ui_data(mob/user) var/list/data = get_header_data() @@ -192,41 +73,28 @@ var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD] if(error) data["error"] = error - if(open_file) - var/datum/computer_file/data/file - - if(!computer || !HDD) - data["error"] = "I/O ERROR: Unable to access hard drive." - else - file = HDD.find_file_by_name(open_file) - if(!istype(file)) - data["error"] = "I/O ERROR: Unable to open file." - else - data["filedata"] = parse_tags(file.stored_data) - data["filename"] = "[file.filename].[file.filetype]" + if(!computer || !HDD) + data["error"] = "I/O ERROR: Unable to access hard drive." else - if(!computer || !HDD) - data["error"] = "I/O ERROR: Unable to access hard drive." - else - var/list/files[0] - for(var/datum/computer_file/F in HDD.stored_files) - files.Add(list(list( + var/list/files = list() + for(var/datum/computer_file/F in HDD.stored_files) + files += list(list( + "name" = F.filename, + "type" = F.filetype, + "size" = F.size, + "undeletable" = F.undeletable + )) + data["files"] = files + if(RHDD) + data["usbconnected"] = TRUE + var/list/usbfiles = list() + for(var/datum/computer_file/F in RHDD.stored_files) + usbfiles += list(list( "name" = F.filename, "type" = F.filetype, "size" = F.size, "undeletable" = F.undeletable - ))) - data["files"] = files - if(RHDD) - data["usbconnected"] = 1 - var/list/usbfiles[0] - for(var/datum/computer_file/F in RHDD.stored_files) - usbfiles.Add(list(list( - "name" = F.filename, - "type" = F.filetype, - "size" = F.size, - "undeletable" = F.undeletable - ))) - data["usbfiles"] = usbfiles + )) + data["usbfiles"] = usbfiles return data diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 226686fc042..1932f671f9b 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -4,58 +4,48 @@ program_icon_state = "comm_monitor" extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" size = 12 - requires_ntnet = 1 + requires_ntnet = TRUE required_access = ACCESS_NETWORK //NETWORK CONTROL IS A MORE SECURE PROGRAM. - available_on_ntnet = 1 + available_on_ntnet = TRUE tgui_id = "ntos_net_monitor" /datum/computer_file/program/ntnetmonitor/ui_act(action, params) if(..()) - return 1 + return switch(action) if("resetIDS") - . = 1 if(SSnetworks.station_network) SSnetworks.station_network.resetIDS() - return 1 + return TRUE if("toggleIDS") - . = 1 if(SSnetworks.station_network) SSnetworks.station_network.toggleIDS() - return 1 + return TRUE if("toggleWireless") - . = 1 if(!SSnetworks.station_network) - return 1 + return // NTNet is disabled. Enabling can be done without user prompt if(SSnetworks.station_network.setting_disabled) - SSnetworks.station_network.setting_disabled = 0 - return 1 + SSnetworks.station_network.setting_disabled = FALSE + return TRUE - // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on) - var/mob/user = usr - if(!user) - return 1 - var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No") - if(response == "Yes") - SSnetworks.station_network.setting_disabled = 1 - return 1 + SSnetworks.station_network.setting_disabled = TRUE + return TRUE if("purgelogs") - . = 1 if(SSnetworks.station_network) SSnetworks.station_network.purge_logs() + return TRUE if("updatemaxlogs") - . = 1 - var/mob/user = usr - var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):")) + var/logcount = params["new_number"] if(SSnetworks.station_network) SSnetworks.station_network.update_max_log_count(logcount) + return TRUE if("toggle_function") - . = 1 if(!SSnetworks.station_network) - return 1 + return SSnetworks.station_network.toggle_function(text2num(params["id"])) + return TRUE /datum/computer_file/program/ntnetmonitor/ui_data(mob/user) if(!SSnetworks.station_network) @@ -73,6 +63,8 @@ data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol data["ntnetlogs"] = list() + data["minlogs"] = MIN_NTNET_LOGS + data["maxlogs"] = MAX_NTNET_LOGS for(var/i in SSnetworks.station_network.logs) data["ntnetlogs"] += list(list("entry" = i)) diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm deleted file mode 100644 index eef2eedd531..00000000000 --- a/code/modules/modular_computers/file_system/programs/nttransfer.dm +++ /dev/null @@ -1,183 +0,0 @@ -/datum/computer_file/program/nttransfer - filename = "nttransfer" - filedesc = "P2P Transfer Client" - extended_desc = "This program allows for simple file transfer via direct peer to peer connection." - program_icon_state = "comm_logs" - size = 7 - requires_ntnet = 1 - requires_ntnet_feature = NTNET_PEERTOPEER - network_destination = "other device via P2P tunnel" - available_on_ntnet = 1 - tgui_id = "ntos_net_transfer" - - var/error = "" // Error screen - var/server_password = "" // Optional password to download the file. - var/datum/computer_file/provided_file = null // File which is provided to clients. - var/datum/computer_file/downloaded_file = null // File which is being downloaded - var/list/connected_clients = list() // List of connected clients. - var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from. - var/download_completion = 0 // Download progress in GQ - var/download_netspeed = 0 // Our connectivity speed in GQ/s - var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed. - var/unique_token // UID of this program - var/upload_menu = 0 // Whether we show the program list and upload menu - var/static/nttransfer_uid = 0 - -/datum/computer_file/program/nttransfer/New() - unique_token = nttransfer_uid++ - ..() - -/datum/computer_file/program/nttransfer/process_tick() - // Server mode - update_netspeed() - if(provided_file) - for(var/datum/computer_file/program/nttransfer/C in connected_clients) - // Transfer speed is limited by device which uses slower connectivity. - // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer - // so they can all run on same speed. - C.actual_netspeed = min(C.download_netspeed, download_netspeed) - C.download_completion += C.actual_netspeed - if(C.download_completion >= provided_file.size) - C.finish_download() - else if(downloaded_file) // Client mode - if(!remote) - crash_download("Connection to remote server lost") - -/datum/computer_file/program/nttransfer/kill_program(forced = FALSE) - if(downloaded_file) // Client mode, clean up variables for next use - finalize_download() - - if(provided_file) // Server mode, disconnect all clients - for(var/datum/computer_file/program/nttransfer/P in connected_clients) - P.crash_download("Connection terminated by remote server") - downloaded_file = null - ..(forced) - -/datum/computer_file/program/nttransfer/proc/update_netspeed() - download_netspeed = 0 - switch(ntnet_status) - if(1) - download_netspeed = NTNETSPEED_LOWSIGNAL - if(2) - download_netspeed = NTNETSPEED_HIGHSIGNAL - if(3) - download_netspeed = NTNETSPEED_ETHERNET - -// Finishes download and attempts to store the file on HDD -/datum/computer_file/program/nttransfer/proc/finish_download() - var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] - if(!computer || !hard_drive || !hard_drive.store_file(downloaded_file)) - error = "I/O Error: Unable to save file. Check your hard drive and try again." - finalize_download() - -// Crashes the download and displays specific error message -/datum/computer_file/program/nttransfer/proc/crash_download(var/message) - error = message ? message : "An unknown error has occurred during download" - finalize_download() - -// Cleans up variables for next use -/datum/computer_file/program/nttransfer/proc/finalize_download() - if(remote) - remote.connected_clients.Remove(src) - downloaded_file = null - remote = null - download_completion = 0 - -/datum/computer_file/program/nttransfer/ui_act(action, params) - if(..()) - return 1 - switch(action) - if("PRG_downloadfile") - for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers) - if("[P.unique_token]" == params["id"]) - remote = P - break - if(!remote || !remote.provided_file) - return - if(remote.server_password) - var/pass = reject_bad_text(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) - if(pass != remote.server_password) - error = "Incorrect Password" - return - downloaded_file = remote.provided_file.clone() - remote.connected_clients.Add(src) - return 1 - if("PRG_reset") - error = "" - upload_menu = 0 - finalize_download() - if(src in SSnetworks.station_network.fileservers) - SSnetworks.station_network.fileservers.Remove(src) - for(var/datum/computer_file/program/nttransfer/T in connected_clients) - T.crash_download("Remote server has forcibly closed the connection") - provided_file = null - return 1 - if("PRG_setpassword") - var/pass = reject_bad_text(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) - if(!pass) - return - if(pass == "none") - server_password = "" - return - server_password = pass - return 1 - if("PRG_uploadfile") - var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] - for(var/datum/computer_file/F in hard_drive.stored_files) - if("[F.uid]" == params["id"]) - if(F.unsendable) - error = "I/O Error: File locked." - return - if(istype(F, /datum/computer_file/program)) - var/datum/computer_file/program/P = F - if(!P.can_run(usr,transfer = 1)) - error = "Access Error: Insufficient rights to upload file." - provided_file = F - SSnetworks.station_network.fileservers.Add(src) - return - error = "I/O Error: Unable to locate file on hard drive." - return 1 - if("PRG_uploadmenu") - upload_menu = 1 - - -/datum/computer_file/program/nttransfer/ui_data(mob/user) - - var/list/data = get_header_data() - - if(error) - data["error"] = error - else if(downloaded_file) - data["downloading"] = 1 - data["download_size"] = downloaded_file.size - data["download_progress"] = download_completion - data["download_netspeed"] = actual_netspeed - data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]" - else if (provided_file) - data["uploading"] = 1 - data["upload_uid"] = unique_token - data["upload_clients"] = connected_clients.len - data["upload_haspassword"] = server_password ? 1 : 0 - data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]" - else if (upload_menu) - var/list/all_files[0] - var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] - for(var/datum/computer_file/F in hard_drive.stored_files) - all_files.Add(list(list( - "uid" = F.uid, - "filename" = "[F.filename].[F.filetype]", - "size" = F.size - ))) - data["upload_filelist"] = all_files - else - var/list/all_servers[0] - for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers) - all_servers.Add(list(list( - "uid" = P.unique_token, - "filename" = "[P.provided_file.filename].[P.provided_file.filetype]", - "size" = P.provided_file.size, - "haspassword" = P.server_password ? 1 : 0 - ))) - data["servers"] = all_servers - - return data diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index ef862aa9fab..367aaca851f 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -22,11 +22,10 @@ Contents: armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100) strip_delay = 12 - actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove) + actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove) //Important parts of the suit. var/mob/living/carbon/human/affecting = null - var/obj/item/stock_parts/cell/cell var/datum/effect_system/spark_spread/spark_system var/datum/techweb/stored_research var/obj/item/disk/tech_disk/t_disk//To copy design onto disk. @@ -72,10 +71,15 @@ Contents: //Cell Init cell = new/obj/item/stock_parts/cell/high - cell.charge = 9000 + cell.charge = 60000 // larger as it now heats + cell.maxcharge = 60000 cell.name = "black power cell" cell.icon_state = "bscell" +// seal the cell in the ninja outfit +/obj/item/clothing/suit/space/space_ninja/toggle_spacesuit_cell(mob/user) + return + //Simply deletes all the attachments and self, killing all related procs. /obj/item/clothing/suit/space/space_ninja/proc/terminate() qdel(n_hood) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 2bcd2ad4f3e..62ff1f78950 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -180,8 +180,14 @@ var/list/mobs = list() var/blueprints = FALSE var/clone_area = SSmapping.RequestBlockReservation(size_x * 2 + 1, size_y * 2 + 1) - for(var/turf/T in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z))) - if((ai_user && GLOB.cameranet.checkTurfVis(T)) || (T in seen)) + for(var/turf/placeholder in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z))) + var/turf/T = placeholder + while(istype(T, /turf/open/openspace)) //Multi-z photography + T = SSmapping.get_turf_below(T) + if(!T) + break + + if(T && ((ai_user && GLOB.cameranet.checkTurfVis(placeholder)) || (placeholder in seen))) turfs += T for(var/mob/M in T) mobs += M diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index 685f6c49c73..bec09abb542 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -5,7 +5,7 @@ if(istype(A)) appearance = A.appearance dir = A.dir - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A step_x = AM.step_x step_y = AM.step_y @@ -72,7 +72,7 @@ for(var/atom/A in sorted) var/xo = (A.x - center.x) * world.icon_size + A.pixel_x + xcomp var/yo = (A.y - center.y) * world.icon_size + A.pixel_y + ycomp - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A xo += AM.step_x yo += AM.step_y diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index da10728b674..dd0b709be9e 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -1,16 +1,17 @@ ///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired. -/obj/machinery/power/liquid_pump +/obj/machinery/plumbing/liquid_pump name = "liquid pump" - desc = "Pump up those sweet liquids from under the surface." + desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun icon = 'icons/obj/plumbing/plumbers.dmi' icon_state = "pump" anchored = FALSE density = TRUE - circuit = /obj/item/circuitboard/machine/pump idle_power_usage = 10 active_power_usage = 1000 - ///Are we powered? - var/powered = FALSE + + rcd_cost = 30 + rcd_delay = 40 + ///units we pump per process (2 seconds) var/pump_power = 2 ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try @@ -20,63 +21,42 @@ ///volume of our internal buffer var/volume = 200 -/obj/machinery/power/liquid_pump/Initialize() +/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt) . = ..() - create_reagents(volume) - AddComponent(/datum/component/plumbing/simple_supply, TRUE) + AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/power/liquid_pump/attackby(obj/item/W, mob/user, params) - if(!powered) - if(!anchored) - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]",W)) - return - if(default_deconstruction_crowbar(W)) - return - return ..() - -/obj/machinery/power/liquid_pump/wrench_act(mob/living/user, obj/item/I) - ..() - default_unfasten_wrench(user, I) - return TRUE ///please note that the component has a hook in the parent call, wich handles activating and deactivating -/obj/machinery/power/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) +/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) geyser = null update_icon() - powered = FALSE geyserless = FALSE //we switched state, so lets just set this back aswell -/obj/machinery/power/liquid_pump/process() - if(!anchored || panel_open) +/obj/machinery/plumbing/liquid_pump/process() + if(!anchored || panel_open || geyserless) return - if(!geyser && !geyserless) + + if(!geyser) for(var/obj/structure/geyser/G in loc.contents) geyser = G + update_icon() if(!geyser) //we didnt find one, abort - anchored = FALSE geyserless = TRUE visible_message("The [name] makes a sad beep!") playsound(src, 'sound/machines/buzz-sigh.ogg', 50) return - if(avail(active_power_usage)) - if(!powered) //we werent powered before this tick so update our sprite - powered = TRUE - update_icon() - add_load(active_power_usage) - pump() - else if(powered) //we were powered, but now we arent - powered = FALSE - update_icon() + pump() + ///pump up that sweet geyser nectar -/obj/machinery/power/liquid_pump/proc/pump() +/obj/machinery/plumbing/liquid_pump/proc/pump() if(!geyser || !geyser.reagents) return geyser.reagents.trans_to(src, pump_power) -/obj/machinery/power/liquid_pump/update_icon_state() - if(powered) +/obj/machinery/plumbing/liquid_pump/update_icon_state() + if(geyser) icon_state = initial(icon_state) + "-on" else if(panel_open) icon_state = initial(icon_state) + "-open" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ccbe8a06461..cf087e4eb8d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -959,7 +959,7 @@ . = UI_INTERACTIVE /obj/machinery/power/apc/ui_act(action, params) - if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer)) + if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer && action != "toggle_nightshift")) return switch(action) if("lock") diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index d5f28462930..6ad239d3b88 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -1,42 +1,106 @@ +#define RELAY_OK 1 +#define RELAY_ADD_CABLE 2 +#define RELAY_ADD_METAL 3 + /obj/machinery/power/deck_relay //This bridges powernets name = "Multi-deck power adapter" desc = "A huge bundle of double insulated cabling which seems to run up into the ceiling." icon = 'icons/obj/power.dmi' icon_state = "cablerelay-off" + max_integrity = 350 + integrity_failure = 0.25 + var/broken_status = RELAY_OK var/obj/machinery/power/deck_relay/below ///The relay that's below us (for bridging powernets) var/obj/machinery/power/deck_relay/above ///The relay that's above us (for bridging powernets) anchored = TRUE density = FALSE -/obj/machinery/power/deck_relay/attackby(obj/item/I,mob/user) +/obj/machinery/power/deck_relay/examine(mob/user) + . += ..() + if(!anchored) + . += "The securing bolts are undone." + if(broken_status == RELAY_ADD_CABLE) + . += "The cable insulation is torn apart and the wires are frayed beyond use." + if(broken_status == RELAY_ADD_METAL) + . += "The cable insulation is torn apart and the wiring is exposed." + +/obj/machinery/power/deck_relay/attackby(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I)) + if(!anchored && broken_status == RELAY_OK) + break_connections() + return return FALSE + . = ..() + if(istype(I, /obj/item/stack/cable_coil) && broken_status == RELAY_ADD_CABLE) + var/obj/item/stack/C = I + if(C.use(15)) + to_chat(user, "You fix the frayed wires inside [src].") + icon_state = "cablerelay-broken-cable" + broken_status = RELAY_ADD_METAL + return + else + to_chat(user, "You need 15 cables to rewire [src].") + return + if(istype(I, /obj/item/stack/sheet/metal) && broken_status == RELAY_ADD_METAL) + var/obj/item/stack/S = I + if(S.use(10)) + to_chat(user, "You reseal the insulation for [src].") + icon_state = "cablerelay" + broken_status = RELAY_OK + obj_integrity = max_integrity + return + else + to_chat(user, "You need 10 metal to mend [src].") + return . = ..() -/obj/machinery/power/deck_relay/process() - if(!anchored) - icon_state = "cablerelay-off" - if(above) //Lose connections - above.below = null - if(below) - below.above = null - return - refresh() //Sometimes the powernets get lost, so we need to keep checking. - if(powernet && (powernet.avail <= 0)) // is it powered? - icon_state = "cablerelay-off" - else - icon_state = "cablerelay-on" - if(!below || QDELETED(below) || !above || QDELETED(above)) - icon_state = "cablerelay-off" - find_relays() +/obj/machinery/power/deck_relay/obj_break() + ..() + if(broken_status == RELAY_OK) + break_connections() + visible_message("[src]'s insulation breaks, fraying and severing the cable bundle!") + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + icon_state = "cablerelay-broken" + broken_status = RELAY_ADD_CABLE -///Allows you to scan the relay with a multitool to see stats. +/obj/machinery/power/deck_relay/obj_destruction() + return //this shouldn't break under usual means + +/obj/machinery/power/deck_relay/Destroy() + break_connections() + return ..() + +///Lose connections and reset the merged powernet so it makes 2 new seperated ones +/obj/machinery/power/deck_relay/proc/break_connections() + if(above) + var/turf/above_deck_relay = get_turf(above) + var/obj/structure/cable/above_cable = above_deck_relay.get_cable_node() + if(above_cable) + var/datum/powernet/above_powernet = new() + propagate_network(above_cable, above_powernet) + above.below = null + above = null + if(below) + var/turf/below_deck_relay = get_turf(below) + var/obj/structure/cable/below_cable = below_deck_relay.get_cable_node() + if(below_cable) + var/datum/powernet/below_powernet = new() + propagate_network(below_cable, below_powernet) + below.above = null + below = null + +///Allows you to scan the relay with a multitool to see stats/reconnect relays /obj/machinery/power/deck_relay/multitool_act(mob/user, obj/item/I) - if(powernet && (powernet.avail > 0)) // is it powered? + if(!anchored) + to_chat(user, "You need to wrench this into place before getting a reading!") + return TRUE + if(broken_status == RELAY_ADD_CABLE || broken_status == RELAY_ADD_METAL) + to_chat(user, "The [src] isn't in proper shape to get a reading!") + return TRUE + if(powernet && (above || below))//we have a powernet and at least one connected relay to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") - if(!powernet || below.powernet != powernet) - icon_state = "cablerelay-off" - to_chat(user, "Powernet connection lost. Attempting to re-establish. Ensure the relays below this one are connected too.") + if(!above && !below) + to_chat(user, "Cannot access valid powernet. Attempting to re-establish. Ensure any relays above and below are aligned properly and on cable nodes.") find_relays() addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering return TRUE @@ -53,6 +117,7 @@ if(below) below.merge(src) +///Merges the two powernets connected to the deck relays /obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR) if(!DR) return @@ -69,6 +134,7 @@ if(!T || !istype(T)) return FALSE below = null //in case we're re-establishing + above = null var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked if(C && C.powernet) C.powernet.add_machine(src) //Nice we're in. diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4552bdc9346..d9eb4ac9fb7 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -292,6 +292,7 @@ if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) + SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) return 0 //to avoid spamming with insulated glvoes on var/area/source_area diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 2a4cd291ed7..7ad94005381 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -218,7 +218,7 @@ // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 1 for(var/atom/X in urange(consume_range,src,1)) - if(isturf(X) || ismovableatom(X)) + if(isturf(X) || ismovable(X)) consume(X) // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 0 diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 5b75c55f492..8e5985bd3a7 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -26,10 +26,8 @@ /obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) . = ..() panel = new() -#if DM_VERSION >= 513 panel.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_ICON|VIS_INHERIT_PLANE vis_contents += panel -#endif panel.icon = icon panel.icon_state = "solar_panel" panel.layer = FLY_LAYER @@ -116,9 +114,6 @@ panel.icon_state = "solar_panel-b" else panel.icon_state = "solar_panel" -#if DM_VERSION <= 512 - . += new /mutable_appearance(panel) -#endif /obj/machinery/power/solar/proc/queue_turn(azimuth) needs_to_turn = TRUE @@ -213,6 +208,16 @@ anchored = FALSE var/tracker = 0 var/glass_type = null + var/random_offset = 6 //amount in pixels an unanchored assembly may be offset by + +/obj/item/solar_assembly/Initialize(mapload) + . = ..() + if(!anchored && !pixel_x && !pixel_y) + randomise_offset(random_offset) + +/obj/item/solar_assembly/proc/randomise_offset(amount) + pixel_x = rand(-amount,amount) + pixel_y = rand(-amount,amount) // Give back the glass type we were supplied with /obj/item/solar_assembly/proc/give_glass(device_broken) @@ -234,9 +239,12 @@ if(anchored) user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") W.play_tool_sound(src, 75) + pixel_x = 0 + pixel_y = 0 else user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") W.play_tool_sound(src, 75) + randomise_offset(random_offset) return 1 if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 3f537e4364e..989bdd03833 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -90,6 +90,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) critical_machine = TRUE + //If we ever start to care about all gasses, make this based on type and apply it as a for loop + var/list/gas_trans = list("PL" = PLASMA_TRANSMIT_MODIFIER, "O2" = OXYGEN_TRANSMIT_MODIFIER, "TRIT" = TRITIUM_TRANSMIT_MODIFIER, "PLX" = PLUOXIUM_TRANSMIT_MODIFIER, "BZ" = BZ_TRANSMIT_MODIFIER) var/gasefficency = 0.15 var/base_icon_state = "darkmatter" @@ -114,15 +116,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning var/power = 0 + var/gas_change_rate = 0.05 var/n2comp = 0 // raw composition of each gas in the chamber, ranges from 0 to 1 - var/plasmacomp = 0 var/o2comp = 0 var/co2comp = 0 - var/pluoxiumcomp = 0 + var/n2ocomp = 0 var/tritiumcomp = 0 var/bzcomp = 0 - var/n2ocomp = 0 + var/pluoxiumcomp = 0 var/pluoxiumbonus = 0 @@ -354,7 +356,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/datum/gas_mixture/env = T.return_air() var/datum/gas_mixture/removed - if(produces_gas) //Remove gas from surrounding area removed = env.remove(gasefficency * env.total_moles()) @@ -400,17 +401,18 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //This is more error prevention, according to all known laws of atmos, gas_mix.remove() should never make negative mol values. //But this is tg - //Lets get the proportions of the gasses in the mix + //Lets get the proportions of the gasses in the mix and then slowly move our comp to that value + //Can cause an overestimation of mol count, should stabalize things though. + //Prevents huge bursts of gas/heat when a large amount of something is introduced //They range between 0 and 1 - plasmacomp = max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0) - o2comp = max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0) - co2comp = max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0) - pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium][MOLES]/combined_gas, 0) - tritiumcomp = max(removed.gases[/datum/gas/tritium][MOLES]/combined_gas, 0) - bzcomp = max(removed.gases[/datum/gas/bz][MOLES]/combined_gas, 0) - - n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0) - n2comp = max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0) + plasmacomp += CLAMP(max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0) - plasmacomp, -1, gas_change_rate) + o2comp += CLAMP(max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0) - o2comp, -1, gas_change_rate) + co2comp += CLAMP(max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0) - co2comp, -1, gas_change_rate) + pluoxiumcomp += CLAMP(max(removed.gases[/datum/gas/pluoxium][MOLES]/combined_gas, 0) - pluoxiumcomp, -1, gas_change_rate) + tritiumcomp += CLAMP(max(removed.gases[/datum/gas/tritium][MOLES]/combined_gas, 0) - tritiumcomp, -1, gas_change_rate) + bzcomp += CLAMP(max(removed.gases[/datum/gas/bz][MOLES]/combined_gas, 0) - bzcomp, -1, gas_change_rate) + n2ocomp += CLAMP(max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0) - n2ocomp, -1, gas_change_rate) + n2comp += CLAMP(max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0) - n2comp, -1, gas_change_rate) //We're concerned about pluoxium being too easy to abuse at low percents, so we make sure there's a substantial amount. if(pluoxiumcomp >= 0.15) @@ -425,7 +427,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Value between 6 and 1 dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1) //Value between 30 and -5, used to determine radiation output as it concerns things like collecters - power_transmission_bonus = (plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER) + (tritiumcomp * TRITIUM_TRANSMIT_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_TRANSMIT_MODIFIER) * pluoxiumbonus) + power_transmission_bonus = (plasmacomp * gas_trans["PL"]) + (o2comp * gas_trans["O2"]) + (bzcomp * gas_trans["BZ"]) + (tritiumcomp * gas_trans["TRIT"]) + ((pluoxiumcomp * gas_trans["PLX"]) * pluoxiumbonus) //more moles of gases are harder to heat than fewer, so let's scale heat damage around them mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index dab74c0031e..636486ed471 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -85,6 +85,7 @@ var/tac_reloads = TRUE //Snowflake mechanic no more. ///Whether the gun can be sawn off by sawing tools var/can_be_sawn_off = FALSE + var/flip_cooldown = 0 /obj/item/gun/ballistic/Initialize() . = ..() @@ -339,6 +340,18 @@ return ..() /obj/item/gun/ballistic/attack_self(mob/living/user) + if(HAS_TRAIT(user, TRAIT_GUNFLIP)) + if(flip_cooldown <= world.time) + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) + to_chat(user, "While trying to flip the [src] you pull the trigger and accidently shoot yourself!") + var/flip_mistake = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST) + process_fire(user, user, FALSE, flip_mistake) + user.dropItemToGround(src, TRUE) + return + flip_cooldown = (world.time + 30) + user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.") + playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE) + return if(!internal_magazine && magazine) if(!magazine.ammo_count()) eject_magazine(user) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 79c8346468b..7b8e2c79dfb 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -1,6 +1,6 @@ /obj/item/gun/magic/wand name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick!" + desc = "It's not just a stick, it's a MAGIC stick! You shouldn't have this." ammo_type = /obj/item/ammo_casing/magic icon_state = "nothingwand" item_state = "wand" @@ -233,4 +233,7 @@ ///////////////////////////////////// /obj/item/gun/magic/wand/nothing + desc = "It's not just a stick, it's a MAGIC stick?" ammo_type = /obj/item/ammo_casing/magic/nothing + + diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 099d6db4f50..2ca43bca448 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -464,7 +464,7 @@ else target.ex_act(EXPLODE_HEAVY) return TRUE - if(ismovableatom(target)) + if(ismovable(target)) var/atom/movable/AM = target if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) if(structure_pierce < structure_pierce_amount) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index d291da83ecd..551e4ebc4f1 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -36,7 +36,7 @@ /obj/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) . = ..() - if(ismovableatom(target)) + if(ismovable(target)) var/atom/movable/M = target var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) M.safe_throw_at(throw_target, 3, 2) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index abe386a511e..1fb04012245 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -31,12 +31,11 @@ var/datum/chemical_reaction/D = new path() var/list/reaction_ids = list() - if(!D.id) + if(!D.required_reagents || !D.required_reagents.len) //Skip impossible reactions continue - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction + for(var/reaction in D.required_reagents) + reaction_ids += reaction // Create filters based on each reagent id in the required reagents list for(var/id in reaction_ids) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index b2f142a2071..d7b8f3958ec 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -41,6 +41,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/reagent_weight = 1 //affects how far it travels when sprayed var/metabolizing = FALSE var/harmful = FALSE //is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default. + //Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New() + var/datum/material/material + +/datum/reagent/New() + . = ..() + + if(material) + material = SSmaterials.GetMaterialRef(material) /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index f473bdfd21b..81d1b463707 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1115,6 +1115,17 @@ All effects don't start immediately, but rather get worse over time; the rate is playsound(get_turf(M), 'sound/effects/explosionfar.ogg', 100, TRUE) return ..() +/datum/reagent/consumable/ethanol/hiveminderaser + name = "Hivemind Eraser" + description = "A vessel of pure flavor." + color = "#FF80FC" // rgb: 255, 128, 252 + boozepwr = 40 + quality = DRINK_GOOD + taste_description = "psychic links" + glass_icon_state = "hiveminderaser" + glass_name = "Hivemind Eraser" + glass_desc = "For when even mindshields can't save you." + /datum/reagent/consumable/ethanol/erikasurprise name = "Erika Surprise" description = "The surprise is, it's green!" diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 3999f3bb892..4980c0f2a77 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -344,7 +344,7 @@ //Has to be at less than TRESHOLD_UNHUSK burn damage and have 100 isntabitaluri before unhusking. Corpses dont metabolize. if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && Carbies.getFireLoss() < TRESHOLD_UNHUSK && Carbies.reagents.has_reagent(/datum/reagent/medicine/C2/instabitaluri, 100)) Carbies.cure_husk("burn") - Carbies.visible_message("You successfully replace most of the burnt off flesh of [Carbies].") + Carbies.visible_message("With most of the burnt off flesh replaced, [Carbies] looks a lot healthier.") ..() return TRUE diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 87c1fe954a0..c04a1d618bd 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -199,7 +199,7 @@ . = 1 /datum/reagent/drug/methamphetamine/overdose_process(mob/living/M) - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i in 1 to 4) step(M, pick(GLOB.cardinals)) if(prob(20)) @@ -226,7 +226,7 @@ ..() /datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M) - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 4, i++) step(M, pick(GLOB.cardinals)) M.Jitter(15) @@ -236,7 +236,7 @@ ..() /datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M) - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(20) @@ -281,7 +281,7 @@ M.adjustStaminaLoss(-5, 0) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) M.hallucination += 5 - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) step(M, pick(GLOB.cardinals)) step(M, pick(GLOB.cardinals)) ..() @@ -289,7 +289,7 @@ /datum/reagent/drug/bath_salts/overdose_process(mob/living/M) M.hallucination += 5 - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i in 1 to 8) step(M, pick(GLOB.cardinals)) if(prob(20)) @@ -300,7 +300,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M) M.hallucination += 10 - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(5) @@ -311,7 +311,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M) M.hallucination += 20 - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(10) @@ -323,7 +323,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M) M.hallucination += 30 - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 12, i++) step(M, pick(GLOB.cardinals)) M.Jitter(15) @@ -335,7 +335,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M) M.hallucination += 30 - if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 16, i++) step(M, pick(GLOB.cardinals)) M.Jitter(50) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index ca70b354c48..d067d2899ec 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -321,12 +321,13 @@ color = "#DCDCDC" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + var/healing = 0.5 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-0.5*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) + M.adjustToxLoss(-healing*REM, 0) + M.adjustOxyLoss(-healing*REM, 0) + M.adjustBruteLoss(-healing*REM, 0) + M.adjustFireLoss(-healing*REM, 0) ..() . = 1 @@ -338,6 +339,12 @@ ..() . = 1 +/datum/reagent/medicine/omnizine/protozine + name = "Protozine" + description = "A less environmentally friendly and somewhat weaker variant of omnizine." + color = "#d8c7b7" + healing = 0.2 + /datum/reagent/medicine/calomel name = "Calomel" description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 3638ddb4d8c..21d30148e4e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -252,6 +252,12 @@ qdel(R) T.Bless() +/datum/reagent/water/hollowwater + name = "Hollow Water" + description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." + color = "#88878777" + taste_description = "emptyiness" + /datum/reagent/hydrogen_peroxide name = "Hydrogen peroxide" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen and oxygen." //intended intended @@ -846,6 +852,7 @@ description = "Pure iron is a metal." reagent_state = SOLID taste_description = "iron" + material = /datum/material/iron color = "#606060" //pure iron? let's make it violet of course @@ -866,6 +873,7 @@ reagent_state = SOLID color = "#F7C430" // rgb: 247, 196, 48 taste_description = "expensive metal" + material = /datum/material/gold /datum/reagent/silver name = "Silver" @@ -873,6 +881,7 @@ reagent_state = SOLID color = "#D0D0D0" // rgb: 208, 208, 208 taste_description = "expensive yet reasonable metal" + material = /datum/material/silver /datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.has_bane(BANE_SILVER)) @@ -886,6 +895,7 @@ color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother? taste_description = "the inside of a reactor" var/irradiation_level = 1 + material = /datum/material/uranium /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) M.apply_effect(irradiation_level/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -914,6 +924,7 @@ reagent_state = SOLID color = "#0000CC" taste_description = "fizzling blue" + material = /datum/material/bluespace /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -944,6 +955,7 @@ reagent_state = SOLID color = "#A8A8A8" // rgb: 168, 168, 168 taste_mult = 0 + material = /datum/material/glass /datum/reagent/fuel name = "Welding fuel" @@ -2021,6 +2033,67 @@ taste_description = "bananas" can_synth = TRUE +/datum/reagent/wittel + name = "Wittel" + description = "An extremely rare metallic-white substance only found on demon-class planets." + color = "#FFFFFF" // rgb: 255, 255, 255 + taste_mult = 0 // oderless and tasteless + +/datum/reagent/metalgen + name = "Metalgen" + data = list("material"=null) + description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches." + color = "#b000aa" + taste_mult = 0 // oderless and tasteless + var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + var/minumum_material_amount = 100 + +/datum/reagent/metalgen/reaction_obj(obj/O, volume) + metal_morph(O) + return + +/datum/reagent/metalgen/reaction_turf(turf/T, volume) + metal_morph(T) + return + +///turn an object into a special material +/datum/reagent/metalgen/proc/metal_morph(atom/A) + var/metal_ref = data["material"] + if(!metal_ref) + return + var/metal_amount = 0 + + for(var/B in A.custom_materials) //list with what they're made of + metal_amount += A.custom_materials[B] + + if(!metal_amount) + metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist + + var/list/metal_dat = list() + metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf + + A.material_flags = applied_material_flags + A.set_custom_materials(metal_dat) + +/datum/reagent/gravitum + name = "Gravitum" + description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even + color = "#050096" // rgb: 5, 0, 150 + taste_mult = 0 // oderless and tasteless + metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use + var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche + +/datum/reagent/gravitum/reaction_obj(obj/O, volume) + O.AddElement(/datum/element/forced_gravity, 0) + + addtimer(CALLBACK(O, .proc/_RemoveElement, list(/datum/element/forced_gravity, 0)), volume * time_multiplier) + +/datum/reagent/gravitum/on_mob_add(mob/living/L) + L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless + +/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) + L.RemoveElement(/datum/element/forced_gravity, 0) + /datum/reagent/cellulose name = "Cellulose Fibers" description = "A crystaline polydextrose polymer, plants swear by this stuff." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 80141a3ec73..11a48cb7ee6 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -61,6 +61,7 @@ taste_mult = 1.5 color = "#8228A0" toxpwr = 3 + material = /datum/material/plasma /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 802b1c109ec..7ca683dac98 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -1,6 +1,4 @@ /datum/chemical_reaction - var/name = null - var/id = null var/list/results = new/list() var/list/required_reagents = new/list() var/list/required_catalysts = new/list() @@ -24,7 +22,7 @@ if(holder && holder.my_atom) var/atom/A = holder.my_atom var/turf/T = get_turf(A) - var/message = "A [reaction_name] reaction has occurred in [ADMIN_VERBOSEJMP(T)]" + var/message = "Mobs have been spawned in [ADMIN_VERBOSEJMP(T)] by a [reaction_name] reaction." message += " (VV)" var/mob/M = get(A, /mob) diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm index 7fa667e7797..1b85aa6bb2d 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -3,45 +3,33 @@ /*****BRUTE*****/ /datum/chemical_reaction/helbital - name = "helbital" - id = /datum/reagent/medicine/C2/helbital results = list(/datum/reagent/medicine/C2/helbital = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1) mix_message = "The mixture turns into a thick, yellow powder." /datum/chemical_reaction/libital - name = "Libital" - id = /datum/reagent/medicine/C2/libital results = list(/datum/reagent/medicine/C2/libital = 3) required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1) /*****BURN*****/ /datum/chemical_reaction/lenturi - name = "Lenturi" - id = /datum/reagent/medicine/C2/lenturi results = list(/datum/reagent/medicine/C2/lenturi = 5) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/aiuri - name = "Aiuri" - id = /datum/reagent/medicine/C2/aiuri results = list(/datum/reagent/medicine/C2/aiuri = 4) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2) /*****OXY*****/ /datum/chemical_reaction/convermol - name = "Convermol" - id = /datum/reagent/medicine/C2/convermol results = list(/datum/reagent/medicine/C2/convermol = 3) required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) required_temp = 370 mix_message = "The mixture rapidly turns into a dense pink liquid." /datum/chemical_reaction/tirimol - name = "Tirimol" - id = /datum/reagent/medicine/C2/tirimol results = list(/datum/reagent/medicine/C2/tirimol = 5) required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) required_catalysts = list(/datum/reagent/toxin/acid = 1) @@ -49,27 +37,19 @@ /*****TOX*****/ /datum/chemical_reaction/seiver - name = "Seiver" - id = /datum/reagent/medicine/C2/seiver results = list(/datum/reagent/medicine/C2/seiver = 3) required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1) /datum/chemical_reaction/multiver - name = "Multiver" - id = /datum/reagent/medicine/C2/multiver results = list(/datum/reagent/medicine/C2/multiver = 2) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1) mix_message = "The mixture yields a fine black powder." required_temp = 380 /datum/chemical_reaction/syriniver - name = "Syriniver" - id = /datum/reagent/medicine/C2/syriniver results = list(/datum/reagent/medicine/C2/syriniver = 5) required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2) /datum/chemical_reaction/penthrite - name = "Penthrite" - id = /datum/reagent/medicine/C2/penthrite results = list(/datum/reagent/medicine/C2/penthrite = 4) required_reagents = list(/datum/reagent/pentaerythritol = 4, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1) diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 0b66c232c85..6d3d1f794ff 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -1,12 +1,8 @@ /datum/chemical_reaction/space_drugs - name = "Space Drugs" - id = /datum/reagent/drug/space_drugs results = list(/datum/reagent/drug/space_drugs = 3) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1) /datum/chemical_reaction/crank - name = "Crank" - id = /datum/reagent/drug/crank results = list(/datum/reagent/drug/crank = 5) required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/ammonia = 1, /datum/reagent/lithium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/fuel = 1) mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." @@ -14,42 +10,30 @@ /datum/chemical_reaction/krokodil - name = "Krokodil" - id = /datum/reagent/drug/krokodil results = list(/datum/reagent/drug/krokodil = 6) required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/medicine/morphine = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/potassium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/fuel = 1) mix_message = "The mixture dries into a pale blue powder." required_temp = 380 /datum/chemical_reaction/methamphetamine - name = /datum/reagent/drug/methamphetamine - id = /datum/reagent/drug/methamphetamine results = list(/datum/reagent/drug/methamphetamine = 4) required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1) required_temp = 374 /datum/chemical_reaction/bath_salts - name = /datum/reagent/drug/bath_salts - id = /datum/reagent/drug/bath_salts results = list(/datum/reagent/drug/bath_salts = 7) required_reagents = list(/datum/reagent/toxin/bad_food = 1, /datum/reagent/saltpetre = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/consumable/enzyme = 1, /datum/reagent/consumable/tea = 1, /datum/reagent/mercury = 1) required_temp = 374 /datum/chemical_reaction/aranesp - name = /datum/reagent/drug/aranesp - id = /datum/reagent/drug/aranesp results = list(/datum/reagent/drug/aranesp = 3) required_reagents = list(/datum/reagent/medicine/epinephrine = 1, /datum/reagent/medicine/atropine = 1, /datum/reagent/medicine/morphine = 1) /datum/chemical_reaction/happiness - name = "Happiness" - id = /datum/reagent/drug/happiness results = list(/datum/reagent/drug/happiness = 4) required_reagents = list(/datum/reagent/nitrous_oxide = 2, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/ethanol = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) /datum/chemical_reaction/pumpup - name = "Pump-Up" - id = /datum/reagent/drug/pumpup results = list(/datum/reagent/drug/pumpup = 5) required_reagents = list(/datum/reagent/medicine/epinephrine = 2, /datum/reagent/consumable/coffee = 5) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 095ba220827..c3e0186be74 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -1,242 +1,170 @@ /datum/chemical_reaction/leporazine - name = "Leporazine" - id = /datum/reagent/medicine/leporazine results = list(/datum/reagent/medicine/leporazine = 2) required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) /datum/chemical_reaction/rezadone - name = "Rezadone" - id = /datum/reagent/medicine/rezadone results = list(/datum/reagent/medicine/rezadone = 3) required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) /datum/chemical_reaction/spaceacillin - name = "Spaceacillin" - id = /datum/reagent/medicine/spaceacillin results = list(/datum/reagent/medicine/spaceacillin = 2) required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) /datum/chemical_reaction/oculine - name = "Oculine" - id = /datum/reagent/medicine/oculine results = list(/datum/reagent/medicine/oculine = 3) required_reagents = list(/datum/reagent/medicine/C2/multiver = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) mix_message = "The mixture bubbles noticeably and becomes a dark grey color!" /datum/chemical_reaction/inacusiate - name = /datum/reagent/medicine/inacusiate - id = /datum/reagent/medicine/inacusiate results = list(/datum/reagent/medicine/inacusiate = 2) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/C2/multiver = 1) mix_message = "The mixture sputters loudly and becomes a light grey color!" /datum/chemical_reaction/synaptizine - name = "Synaptizine" - id = /datum/reagent/medicine/synaptizine results = list(/datum/reagent/medicine/synaptizine = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) /datum/chemical_reaction/salglu_solution - name = "Saline-Glucose Solution" - id = /datum/reagent/medicine/salglu_solution results = list(/datum/reagent/medicine/salglu_solution = 3) required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/mine_salve - name = "Miner's Salve" - id = /datum/reagent/medicine/mine_salve results = list(/datum/reagent/medicine/mine_salve = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) /datum/chemical_reaction/mine_salve2 - name = "Miner's Salve" - id = /datum/reagent/medicine/mine_salve results = list(/datum/reagent/medicine/mine_salve = 15) required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these /datum/chemical_reaction/instabitaluri - name = "Synthflesh (Instabitaluri)" - id = /datum/reagent/medicine/C2/instabitaluri results = list(/datum/reagent/medicine/C2/instabitaluri = 3) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/C2/libital = 1) /datum/chemical_reaction/calomel - name = "Calomel" - id = /datum/reagent/medicine/calomel results = list(/datum/reagent/medicine/calomel = 2) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1) required_temp = 374 /datum/chemical_reaction/potass_iodide - name = "Potassium Iodide" - id = /datum/reagent/medicine/potass_iodide results = list(/datum/reagent/medicine/potass_iodide = 2) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/iodine = 1) /datum/chemical_reaction/pen_acid - name = "Pentetic Acid" - id = /datum/reagent/medicine/pen_acid results = list(/datum/reagent/medicine/pen_acid = 6) required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1) /datum/chemical_reaction/sal_acid - name = "Salicylic Acid" - id = /datum/reagent/medicine/sal_acid results = list(/datum/reagent/medicine/sal_acid = 5) required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/oxandrolone - name = "Oxandrolone" - id = /datum/reagent/medicine/oxandrolone results = list(/datum/reagent/medicine/oxandrolone = 6) required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/salbutamol - name = "Salbutamol" - id = /datum/reagent/medicine/salbutamol results = list(/datum/reagent/medicine/salbutamol = 5) required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1) /datum/chemical_reaction/ephedrine - name = "Ephedrine" - id = /datum/reagent/medicine/ephedrine results = list(/datum/reagent/medicine/ephedrine = 4) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1) mix_message = "The solution fizzes and gives off toxic fumes." /datum/chemical_reaction/diphenhydramine - name = "Diphenhydramine" - id = /datum/reagent/medicine/diphenhydramine results = list(/datum/reagent/medicine/diphenhydramine = 4) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) mix_message = "The mixture dries into a pale blue powder." /datum/chemical_reaction/atropine - name = "Atropine" - id = /datum/reagent/medicine/atropine results = list(/datum/reagent/medicine/atropine = 5) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/epinephrine - name = "Epinephrine" - id = /datum/reagent/medicine/epinephrine results = list(/datum/reagent/medicine/epinephrine = 6) required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/strange_reagent - name = "Strange Reagent" - id = /datum/reagent/medicine/strange_reagent results = list(/datum/reagent/medicine/strange_reagent = 3) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/strange_reagent/alt + results = list(/datum/reagent/medicine/strange_reagent = 2) + required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) + /datum/chemical_reaction/mannitol - name = "Mannitol" - id = /datum/reagent/medicine/mannitol results = list(/datum/reagent/medicine/mannitol = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 1, /datum/reagent/water = 1) mix_message = "The solution slightly bubbles, becoming thicker." /datum/chemical_reaction/neurine - name = "Neurine" - id = /datum/reagent/medicine/neurine results = list(/datum/reagent/medicine/neurine = 3) required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/mutadone - name = "Mutadone" - id = /datum/reagent/medicine/mutadone results = list(/datum/reagent/medicine/mutadone = 3) required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1) /datum/chemical_reaction/antihol - name = /datum/reagent/medicine/antihol - id = /datum/reagent/medicine/antihol results = list(/datum/reagent/medicine/antihol = 3) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/C2/multiver = 1, /datum/reagent/copper = 1) /datum/chemical_reaction/cryoxadone - name = "Cryoxadone" - id = /datum/reagent/medicine/cryoxadone results = list(/datum/reagent/medicine/cryoxadone = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1) /datum/chemical_reaction/pyroxadone - name = "Pyroxadone" - id = /datum/reagent/medicine/pyroxadone results = list(/datum/reagent/medicine/pyroxadone = 2) required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1) /datum/chemical_reaction/clonexadone - name = "Clonexadone" - id = /datum/reagent/medicine/clonexadone results = list(/datum/reagent/medicine/clonexadone = 2) required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) /datum/chemical_reaction/haloperidol - name = "Haloperidol" - id = /datum/reagent/medicine/haloperidol results = list(/datum/reagent/medicine/haloperidol = 5) required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1) /datum/chemical_reaction/regen_jelly - name = "Regenerative Jelly" - id = /datum/reagent/medicine/regen_jelly results = list(/datum/reagent/medicine/regen_jelly = 2) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/toxin/slimejelly = 1) /datum/chemical_reaction/higadrite - name = "Higadrite" - id = /datum/reagent/medicine/higadrite results = list(/datum/reagent/medicine/higadrite = 3) required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1) /datum/chemical_reaction/morphine - name = "Morphine" - id = /datum/reagent/medicine/morphine results = list(/datum/reagent/medicine/morphine = 2) required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1) required_temp = 480 /datum/chemical_reaction/modafinil - name = "Modafinil" - id = /datum/reagent/medicine/modafinil results = list(/datum/reagent/medicine/modafinil = 5) required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1) required_catalysts = list(/datum/reagent/bromine = 1) // as close to the real world synthesis as possible /datum/chemical_reaction/psicodine - name = "Psicodine" - id = /datum/reagent/medicine/psicodine results = list(/datum/reagent/medicine/psicodine = 5) required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) /datum/chemical_reaction/rhigoxane - name = "Rhigoxane" - id = /datum/reagent/medicine/rhigoxane results = list(/datum/reagent/medicine/rhigoxane/ = 5) required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) required_temp = 47 is_cold_recipe = TRUE /datum/chemical_reaction/trophazole - name = "Trophazole" - id = /datum/reagent/medicine/trophazole results = list(/datum/reagent/medicine/trophazole = 4) required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) /datum/chemical_reaction/granibitaluri - name = "Granibitaluri" - id = /datum/reagent/medicine/granibitaluri results = list(/datum/reagent/medicine/granibitaluri = 3) required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/phenol = 1, /datum/reagent/nitrogen = 1) required_catalysts = list(/datum/reagent/iron = 5) /datum/chemical_reaction/medsuture - name = "Medicated Suture" - id = "med_suture" required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 30, /datum/reagent/medicine/polypyr = 30) //This might be a bit much, reagent cost should be reviewed after implementation. /datum/chemical_reaction/medsuture/on_reaction(datum/reagents/holder, created_volume) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 7270eff2ab7..cb800c6a62f 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -1,55 +1,37 @@ /datum/chemical_reaction/sterilizine - name = "Sterilizine" - id = /datum/reagent/space_cleaner/sterilizine results = list(/datum/reagent/space_cleaner/sterilizine = 3) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/C2/multiver = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/lube - name = "Space Lube" - id = /datum/reagent/lube results = list(/datum/reagent/lube = 4) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/spraytan - name = "Spray Tan" - id = /datum/reagent/spraytan results = list(/datum/reagent/spraytan = 2) required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/fuel/oil = 1) /datum/chemical_reaction/spraytan2 - name = "Spray Tan" - id = /datum/reagent/spraytan results = list(/datum/reagent/spraytan = 2) required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1) /datum/chemical_reaction/impedrezene - name = "Impedrezene" - id = /datum/reagent/impedrezene results = list(/datum/reagent/impedrezene = 2) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/cryptobiolin - name = "Cryptobiolin" - id = /datum/reagent/cryptobiolin results = list(/datum/reagent/cryptobiolin = 3) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/glycerol - name = "Glycerol" - id = /datum/reagent/glycerol results = list(/datum/reagent/glycerol = 1) required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/sodiumchloride - name = "Sodium Chloride" - id = /datum/reagent/consumable/sodiumchloride results = list(/datum/reagent/consumable/sodiumchloride = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/plasmasolidification - name = "Solid Plasma" - id = "solidplasma" required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 20) mob_react = FALSE @@ -59,8 +41,6 @@ new /obj/item/stack/sheet/mineral/plasma(location) /datum/chemical_reaction/goldsolidification - name = "Solid Gold" - id = "solidgold" required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/gold = 20, /datum/reagent/iron = 1) mob_react = FALSE @@ -70,14 +50,10 @@ new /obj/item/stack/sheet/mineral/gold(location) /datum/chemical_reaction/capsaicincondensation - name = "Capsaicincondensation" - id = "capsaicincondensation" results = list(/datum/reagent/consumable/condensedcapsaicin = 5) required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/ethanol = 5) /datum/chemical_reaction/soapification - name = "Soapification" - id = "soapification" required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles required_temp = 374 mob_react = FALSE @@ -88,8 +64,6 @@ new /obj/item/soap/homemade(location) /datum/chemical_reaction/omegasoapification - name = "Omega Soap" - id = "omegasoap" required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/baldium = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/bluespace = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10) required_temp = 999 mob_react = FALSE @@ -100,8 +74,6 @@ new /obj/item/soap/omega(location) /datum/chemical_reaction/candlefication - name = "Candlefication" - id = "candlefication" required_reagents = list(/datum/reagent/liquidgibs = 5, /datum/reagent/oxygen = 5) // required_temp = 374 mob_react = FALSE @@ -112,8 +84,6 @@ new /obj/item/candle(location) /datum/chemical_reaction/meatification - name = "Meatification" - id = "meatification" required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/consumable/nutriment = 10, /datum/reagent/carbon = 10) mob_react = FALSE @@ -124,23 +94,17 @@ return /datum/chemical_reaction/carbondioxide - name = "Direct Carbon Oxidation" - id = "burningcarbon" results = list(/datum/reagent/carbondioxide = 3) required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 2) required_temp = 777 // pure carbon isn't especially reactive. /datum/chemical_reaction/nitrous_oxide - name = "Nitrous Oxide" - id = /datum/reagent/nitrous_oxide results = list(/datum/reagent/nitrous_oxide = 5) required_reagents = list(/datum/reagent/ammonia = 2, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 2) required_temp = 525 //Technically a mutation toxin /datum/chemical_reaction/mulligan - name = "Mulligan" - id = /datum/reagent/mulligan results = list(/datum/reagent/mulligan = 1) required_reagents = list(/datum/reagent/mutationtoxin/jelly = 1, /datum/reagent/toxin/mutagen = 1) @@ -148,74 +112,50 @@ ////////////////////////////////// VIROLOGY ////////////////////////////////////////// /datum/chemical_reaction/virus_food - name = "Virus Food" - id = /datum/reagent/consumable/virus_food results = list(/datum/reagent/consumable/virus_food = 15) required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/milk = 5) /datum/chemical_reaction/virus_food_mutagen - name = "mutagenic agar" - id = /datum/reagent/toxin/mutagen/mutagenvirusfood results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_synaptizine - name = "virus rations" - id = /datum/reagent/medicine/synaptizine/synaptizinevirusfood results = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_plasma - name = "virus plasma" - id = /datum/reagent/toxin/plasma/plasmavirusfood results = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_plasma_synaptizine - name = "weakened virus plasma" - id = /datum/reagent/toxin/plasma/plasmavirusfood/weak results = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 2) required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/toxin/plasma/plasmavirusfood = 1) /datum/chemical_reaction/virus_food_mutagen_sugar - name = "sucrose agar" - id = /datum/reagent/toxin/mutagen/mutagenvirusfood/sugar results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) /datum/chemical_reaction/virus_food_mutagen_salineglucose - name = "sucrose agar" - id = "salineglucosevirusfood" results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) required_reagents = list(/datum/reagent/medicine/salglu_solution = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) /datum/chemical_reaction/virus_food_uranium - name = "Decaying uranium gel" - id = /datum/reagent/uranium/uraniumvirusfood results = list(/datum/reagent/uranium/uraniumvirusfood = 1) required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_uranium_plasma - name = "Unstable uranium gel" - id = "uraniumvirusfood_plasma" results = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) required_reagents = list(/datum/reagent/uranium = 5, /datum/reagent/toxin/plasma/plasmavirusfood = 1) /datum/chemical_reaction/virus_food_uranium_plasma_gold - name = "Stable uranium gel" - id = "uraniumvirusfood_gold" results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/gold = 10, /datum/reagent/toxin/plasma = 1) /datum/chemical_reaction/virus_food_uranium_plasma_silver - name = "Stable uranium gel" - id = "uraniumvirusfood_silver" results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/silver = 10, /datum/reagent/toxin/plasma = 1) /datum/chemical_reaction/mix_virus - name = "Mix Virus" - id = "mixvirus" results = list(/datum/reagent/blood = 1) required_reagents = list(/datum/reagent/consumable/virus_food = 1) required_catalysts = list(/datum/reagent/blood = 1) @@ -223,7 +163,6 @@ var/level_max = 2 /datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] @@ -232,102 +171,65 @@ /datum/chemical_reaction/mix_virus/mix_virus_2 - - name = "Mix Virus 2" - id = "mixvirus2" required_reagents = list(/datum/reagent/toxin/mutagen = 1) level_min = 2 level_max = 4 /datum/chemical_reaction/mix_virus/mix_virus_3 - - name = "Mix Virus 3" - id = "mixvirus3" required_reagents = list(/datum/reagent/toxin/plasma = 1) level_min = 4 level_max = 6 /datum/chemical_reaction/mix_virus/mix_virus_4 - - name = "Mix Virus 4" - id = "mixvirus4" required_reagents = list(/datum/reagent/uranium = 1) level_min = 5 level_max = 6 /datum/chemical_reaction/mix_virus/mix_virus_5 - - name = "Mix Virus 5" - id = "mixvirus5" required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) level_min = 3 level_max = 3 /datum/chemical_reaction/mix_virus/mix_virus_6 - - name = "Mix Virus 6" - id = "mixvirus6" required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 1) level_min = 4 level_max = 4 /datum/chemical_reaction/mix_virus/mix_virus_7 - - name = "Mix Virus 7" - id = "mixvirus7" required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 1) level_min = 5 level_max = 5 /datum/chemical_reaction/mix_virus/mix_virus_8 - - name = "Mix Virus 8" - id = "mixvirus8" required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) level_min = 6 level_max = 6 /datum/chemical_reaction/mix_virus/mix_virus_9 - - name = "Mix Virus 9" - id = "mixvirus9" required_reagents = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) level_min = 1 level_max = 1 /datum/chemical_reaction/mix_virus/mix_virus_10 - - name = "Mix Virus 10" - id = "mixvirus10" required_reagents = list(/datum/reagent/uranium/uraniumvirusfood = 1) level_min = 6 level_max = 7 /datum/chemical_reaction/mix_virus/mix_virus_11 - - name = "Mix Virus 11" - id = "mixvirus11" required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) level_min = 7 level_max = 7 /datum/chemical_reaction/mix_virus/mix_virus_12 - - name = "Mix Virus 12" - id = "mixvirus12" required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) level_min = 8 level_max = 8 /datum/chemical_reaction/mix_virus/rem_virus - - name = "Devolve Virus" - id = "remvirus" required_reagents = list(/datum/reagent/medicine/synaptizine = 1) required_catalysts = list(/datum/reagent/blood = 1) /datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] @@ -335,13 +237,10 @@ D.Devolve() /datum/chemical_reaction/mix_virus/neuter_virus - name = "Neuter Virus" - id = "neutervirus" required_reagents = list(/datum/reagent/toxin/formaldehyde = 1) required_catalysts = list(/datum/reagent/blood = 1) /datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] @@ -354,14 +253,10 @@ /datum/chemical_reaction/surfactant - name = "Foam surfactant" - id = "foam surfactant" results = list(/datum/reagent/fluorosurfactant = 5) required_reagents = list(/datum/reagent/fluorine = 2, /datum/reagent/carbon = 2, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/foam - name = "Foam" - id = "foam" required_reagents = list(/datum/reagent/fluorosurfactant = 1, /datum/reagent/water = 1) mob_react = FALSE @@ -369,8 +264,6 @@ holder.create_foam(/datum/effect_system/foam_spread,2*created_volume,notification="The solution spews out foam!") /datum/chemical_reaction/metalfoam - name = "Metal Foam" - id = "metalfoam" required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = FALSE @@ -378,8 +271,6 @@ holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,1,"The solution spews out a metallic foam!") /datum/chemical_reaction/smart_foam - name = "Smart Metal Foam" - id = "smart_metal_foam" required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/smart_foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = TRUE @@ -387,8 +278,6 @@ holder.create_foam(/datum/effect_system/foam_spread/metal/smart,5*created_volume,1,"The solution spews out metallic foam!") /datum/chemical_reaction/ironfoam - name = "Iron Foam" - id = "ironlfoam" required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = FALSE @@ -396,14 +285,10 @@ holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,2,"The solution spews out a metallic foam!") /datum/chemical_reaction/foaming_agent - name = "Foaming Agent" - id = /datum/reagent/foaming_agent results = list(/datum/reagent/foaming_agent = 1) required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/smart_foaming_agent - name = "Smart foaming Agent" - id = /datum/reagent/smart_foaming_agent results = list(/datum/reagent/smart_foaming_agent = 3) required_reagents = list(/datum/reagent/foaming_agent = 3, /datum/reagent/acetone = 1, /datum/reagent/iron = 1) mix_message = "The solution mixes into a frothy metal foam and conforms to the walls of its container." @@ -412,147 +297,101 @@ /////////////////////////////// Cleaning and hydroponics ///////////////////////////////////////////////// /datum/chemical_reaction/ammonia - name = "Ammonia" - id = /datum/reagent/ammonia results = list(/datum/reagent/ammonia = 3) required_reagents = list(/datum/reagent/hydrogen = 3, /datum/reagent/nitrogen = 1) /datum/chemical_reaction/diethylamine - name = "Diethylamine" - id = /datum/reagent/diethylamine results = list(/datum/reagent/diethylamine = 2) required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/consumable/ethanol = 1) /datum/chemical_reaction/space_cleaner - name = "Space cleaner" - id = /datum/reagent/space_cleaner results = list(/datum/reagent/space_cleaner = 2) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) /datum/chemical_reaction/plantbgone - name = "Plant-B-Gone" - id = /datum/reagent/toxin/plantbgone results = list(/datum/reagent/toxin/plantbgone = 5) required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4) /datum/chemical_reaction/weedkiller - name = "Weed Killer" - id = /datum/reagent/toxin/plantbgone/weedkiller results = list(/datum/reagent/toxin/plantbgone/weedkiller = 5) required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/ammonia = 4) /datum/chemical_reaction/pestkiller - name = "Pest Killer" - id = /datum/reagent/toxin/pestkiller results = list(/datum/reagent/toxin/pestkiller = 5) required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/ethanol = 4) /datum/chemical_reaction/drying_agent - name = "Drying agent" - id = /datum/reagent/drying_agent results = list(/datum/reagent/drying_agent = 3) required_reagents = list(/datum/reagent/stable_plasma = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/sodium = 1) //////////////////////////////////// Other goon stuff /////////////////////////////////////////// /datum/chemical_reaction/acetone - name = /datum/reagent/acetone - id = /datum/reagent/acetone results = list(/datum/reagent/acetone = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/carpet - name = /datum/reagent/carpet - id = /datum/reagent/carpet results = list(/datum/reagent/carpet = 2) required_reagents = list(/datum/reagent/drug/space_drugs = 1, /datum/reagent/blood = 1) /datum/chemical_reaction/carpet/black - name = /datum/reagent/carpet/black - id = /datum/reagent/carpet/black results = list(/datum/reagent/carpet/black = 2) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/fuel/oil = 1) /datum/chemical_reaction/carpet/blue - name = /datum/reagent/carpet/blue - id = /datum/reagent/carpet/blue results = list(/datum/reagent/carpet/blue = 2) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/cryostylane = 1) /datum/chemical_reaction/carpet/cyan - name = /datum/reagent/carpet/cyan - id = /datum/reagent/carpet/cyan results = list(/datum/reagent/carpet/cyan = 2) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/toxin/cyanide = 1) //cyan = cyanide get it huehueuhuehuehheuhe /datum/chemical_reaction/carpet/green - name = /datum/reagent/carpet/green - id = /datum/reagent/carpet/green results = list(/datum/reagent/carpet/green = 2) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/ethanol/beer/green = 1) //make green beer by grinding up green crayons and mixing with beer /datum/chemical_reaction/carpet/orange - name = /datum/reagent/carpet/orange - id = /datum/reagent/carpet/orange results = list(/datum/reagent/carpet/orange = 2) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/orangejuice = 1) /datum/chemical_reaction/carpet/purple - name = /datum/reagent/carpet/purple - id = /datum/reagent/carpet/purple results = list(/datum/reagent/carpet/purple = 2) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/medicine/regen_jelly = 1) //slimes only party /datum/chemical_reaction/carpet/red - name = /datum/reagent/carpet/red - id = /datum/reagent/carpet/red results = list(/datum/reagent/carpet/red = 2) required_reagents = list(/datum/reagent/carpet/ = 1, /datum/reagent/liquidgibs = 1) /datum/chemical_reaction/carpet/royalblack - name = /datum/reagent/carpet/royal/black - id = /datum/reagent/carpet/royal/black results = list(/datum/reagent/carpet/royal/black = 2) required_reagents = list(/datum/reagent/carpet/black = 1, /datum/reagent/royal_bee_jelly = 1) /datum/chemical_reaction/carpet/royalblue - name = /datum/reagent/carpet/royal/blue - id = /datum/reagent/carpet/royal/blue results = list(/datum/reagent/carpet/royal/blue = 2) required_reagents = list(/datum/reagent/carpet/blue = 1, /datum/reagent/royal_bee_jelly = 1) /datum/chemical_reaction/oil - name = "Oil" - id = /datum/reagent/fuel/oil results = list(/datum/reagent/fuel/oil = 3) required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/phenol - name = /datum/reagent/phenol - id = /datum/reagent/phenol results = list(/datum/reagent/phenol = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/fuel/oil = 1) /datum/chemical_reaction/ash - name = "Ash" - id = /datum/reagent/ash results = list(/datum/reagent/ash = 1) required_reagents = list(/datum/reagent/fuel/oil = 1) required_temp = 480 /datum/chemical_reaction/colorful_reagent - name = /datum/reagent/colorful_reagent - id = /datum/reagent/colorful_reagent results = list(/datum/reagent/colorful_reagent = 5) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) /datum/chemical_reaction/life - name = "Life" - id = "life" required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/C2/instabitaluri = 1, /datum/reagent/blood = 1) required_temp = 374 @@ -560,8 +399,6 @@ chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN /datum/chemical_reaction/life_friendly - name = "Life (Friendly)" - id = "life_friendly" required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/C2/instabitaluri = 1, /datum/reagent/consumable/sugar = 1) required_temp = 374 @@ -569,8 +406,6 @@ chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) /datum/chemical_reaction/corgium - name = "corgium" - id = "corgium" required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1) required_temp = 374 @@ -582,14 +417,10 @@ //monkey powder heehoo /datum/chemical_reaction/monkey_powder - name = /datum/reagent/monkey_powder - id = /datum/reagent/monkey_powder results = list(/datum/reagent/monkey_powder = 3) required_reagents = list(/datum/reagent/consumable/banana = 1, /datum/reagent/consumable/nutriment=2,/datum/reagent/liquidgibs = 1) /datum/chemical_reaction/monkey - name = "monkey" - id = "monkey" required_reagents = list(/datum/reagent/monkey_powder = 30, /datum/reagent/water = 1) /datum/chemical_reaction/monkey/on_reaction(datum/reagents/holder, created_volume) @@ -597,16 +428,13 @@ new /mob/living/carbon/monkey(location) //water electrolysis /datum/chemical_reaction/electrolysis - name = "electrolysis" - id = "electrolysis" results = list(/datum/reagent/oxygen = 10, /datum/reagent/hydrogen = 20) required_reagents = list(/datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/water = 5) //butterflium /datum/chemical_reaction/butterflium - name = "butterflium" - id = "butterflium" required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1) + /datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = rand(1, created_volume), i <= created_volume, i++) @@ -614,8 +442,6 @@ ..() //scream powder /datum/chemical_reaction/scream - name = "scream" - id = "scream" required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/lizardwine = 5 ) required_temp = 374 @@ -623,63 +449,43 @@ playsound(holder.my_atom, pick(list( 'sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg', 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg', 'sound/voice/human/wilhelm_scream.ogg')), created_volume*5,TRUE) /datum/chemical_reaction/hair_dye - name = /datum/reagent/hair_dye - id = /datum/reagent/hair_dye results = list(/datum/reagent/hair_dye = 5) required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) /datum/chemical_reaction/barbers_aid - name = /datum/reagent/barbers_aid - id = /datum/reagent/barbers_aid results = list(/datum/reagent/barbers_aid = 5) required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) /datum/chemical_reaction/concentrated_barbers_aid - name = /datum/reagent/concentrated_barbers_aid - id = /datum/reagent/concentrated_barbers_aid results = list(/datum/reagent/concentrated_barbers_aid = 2) required_reagents = list(/datum/reagent/barbers_aid = 1, /datum/reagent/toxin/mutagen = 1) /datum/chemical_reaction/baldium - name = /datum/reagent/baldium - id = /datum/reagent/baldium results = list(/datum/reagent/baldium = 1) required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/lye = 1) required_temp = 395 /datum/chemical_reaction/saltpetre - name = /datum/reagent/saltpetre - id = /datum/reagent/saltpetre results = list(/datum/reagent/saltpetre = 3) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3) /datum/chemical_reaction/lye - name = /datum/reagent/lye - id = /datum/reagent/lye results = list(/datum/reagent/lye = 3) required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/lye2 - name = /datum/reagent/lye - id = /datum/reagent/lye results = list(/datum/reagent/lye = 2) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/water = 1, /datum/reagent/carbon = 1) /datum/chemical_reaction/royal_bee_jelly - name = "royal bee jelly" - id = /datum/reagent/royal_bee_jelly results = list(/datum/reagent/royal_bee_jelly = 5) required_reagents = list(/datum/reagent/toxin/mutagen = 10, /datum/reagent/consumable/honey = 40) /datum/chemical_reaction/laughter - name = /datum/reagent/consumable/laughter - id = /datum/reagent/consumable/laughter results = list(/datum/reagent/consumable/laughter = 10) // Fuck it. I'm not touching this one. required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/banana = 1) /datum/chemical_reaction/plastic_polymers - name = "plastic polymers" - id = /datum/reagent/plastic_polymers required_reagents = list(/datum/reagent/fuel/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3) required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. @@ -689,30 +495,22 @@ new /obj/item/stack/sheet/plastic(location) /datum/chemical_reaction/pax - name = /datum/reagent/pax - id = /datum/reagent/pax results = list(/datum/reagent/pax = 3) required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/water = 1) /datum/chemical_reaction/yuck - name = "Organic Fluid" - id = /datum/reagent/yuck results = list(/datum/reagent/yuck = 4) required_reagents = list(/datum/reagent/fuel = 3) required_container = /obj/item/reagent_containers/food/snacks/deadmouse /datum/chemical_reaction/slimejelly - name = "artificial slime jelly" - id = /datum/reagent/toxin/slimejelly results = list(/datum/reagent/toxin/slimejelly = 5) required_reagents = list(/datum/reagent/fuel/oil = 3, /datum/reagent/uranium/radium = 2, /datum/reagent/consumable/tinlux =1) required_container = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom mix_message = "The mushroom's insides bubble and pop and it becomes very limp." /datum/chemical_reaction/slime_extractification - name = "slime extractification" - id = "slime extractification" required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5) mix_message = "The mixture condenses into a ball." @@ -720,35 +518,48 @@ var/location = get_turf(holder.my_atom) new /obj/item/slime_extract/grey(location) +/datum/chemical_reaction/metalgen + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/metalgen_imprint + required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume) + var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen) + for(var/datum/reagent/R in holder.reagent_list) + if(R.material && R.volume >= 40) + MM.data["material"] = R.material + holder.remove_reagent(R.type, 40) + +/datum/chemical_reaction/gravitum + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10) + results = list(/datum/reagent/gravitum = 10) + /datum/chemical_reaction/cellulose_carbonization - name = "Cellulose_Carbonization" - id = /datum/reagent/carbon results = list(/datum/reagent/carbon = 1) required_reagents = list(/datum/reagent/cellulose = 1) required_temp = 512 /datum/chemical_reaction/hydrogen_peroxide - name = "Hydrogen peroxide" - id = /datum/reagent/hydrogen_peroxide results = list(/datum/reagent/hydrogen_peroxide = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/acetone_oxide - name = "Acetone peroxide" - id = /datum/reagent/acetone_oxide results = list(/datum/reagent/acetone_oxide = 2) required_reagents = list(/datum/reagent/acetone = 2, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen_peroxide = 1) /datum/chemical_reaction/pentaerythritol - name = "Pentaerythritol" - id = /datum/reagent/pentaerythritol results = list(/datum/reagent/pentaerythritol = 2) required_reagents = list(/datum/reagent/acetaldehyde = 1, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/water = 1 ) /datum/chemical_reaction/acetaldehyde - name = "Acetaldehyde" - id = /datum/reagent/acetaldehyde results = list(/datum/reagent/acetaldehyde = 3) required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/water = 1) required_temp = 450 +/datum/chemical_reaction/holywater + results = list(/datum/reagent/water/holywater = 1) + required_reagents = list(/datum/reagent/water/hollowwater = 1) + required_catalysts = list(/datum/reagent/water/holywater = 1) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 121ab55ee48..a69dbc86866 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -1,6 +1,4 @@ /datum/chemical_reaction/reagent_explosion - name = "Generic explosive" - id = "reagent_explosion" var/strengthdiv = 10 var/modifier = 0 @@ -27,8 +25,6 @@ /datum/chemical_reaction/reagent_explosion/nitroglycerin - name = "Nitroglycerin" - id = /datum/reagent/nitroglycerin results = list(/datum/reagent/nitroglycerin = 2) required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/toxin/acid = 1) strengthdiv = 2 @@ -40,15 +36,11 @@ ..() /datum/chemical_reaction/reagent_explosion/nitroglycerin_explosion - name = "Nitroglycerin explosion" - id = "nitroglycerin_explosion" required_reagents = list(/datum/reagent/nitroglycerin = 1) required_temp = 474 strengthdiv = 2 /datum/chemical_reaction/reagent_explosion/rdx - name = "RDX" - id = /datum/reagent/rdx results = list(/datum/reagent/rdx= 2) required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone_oxide = 1 ) required_temp = 404 @@ -61,15 +53,11 @@ ..() /datum/chemical_reaction/reagent_explosion/rdx_explosion - name = "Heat RDX explosion" - id = "rdx_explosion" required_reagents = list(/datum/reagent/rdx = 1) required_temp = 474 strengthdiv = 8 /datum/chemical_reaction/reagent_explosion/rdx_explosion2 //makes rdx unique , on its own it is a good bomb, but when combined with liquid electricity it becomes truly destructive - name = "Electric RDX explosion" - id = "rdx_explosion2" required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/consumable/liquidelectricity = 1) strengthdiv = 4 modifier = 2 @@ -83,8 +71,6 @@ ..() /datum/chemical_reaction/reagent_explosion/rdx_explosion3 - name = "Teslium RDX explosion" - id = "rdx_explosion3" required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/teslium = 1) modifier = 4 strengthdiv = 4 @@ -98,8 +84,6 @@ ..() /datum/chemical_reaction/reagent_explosion/tatp - name = "TaTP" - id = /datum/reagent/tatp results = list(/datum/reagent/tatp= 1) required_reagents = list(/datum/reagent/acetone_oxide = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/pentaerythritol = 1 ) required_temp = 450 @@ -119,8 +103,6 @@ ..() /datum/chemical_reaction/reagent_explosion/tatp_explosion - name = "TaTP explosion" - id = "tatp_explosion" required_reagents = list(/datum/reagent/tatp = 1) required_temp = 550 // this makes making tatp before pyro nades, and extreme pain in the ass to make strengthdiv = 3 @@ -134,21 +116,15 @@ /datum/chemical_reaction/reagent_explosion/penthrite_explosion - name = "Penthrite explosion" - id = "penthrite_explosion" required_reagents = list(/datum/reagent/medicine/C2/penthrite = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone_oxide = 1) required_temp = 315 strengthdiv = 5 /datum/chemical_reaction/reagent_explosion/potassium_explosion - name = "Explosion" - id = "potassium_explosion" required_reagents = list(/datum/reagent/water = 1, /datum/reagent/potassium = 1) strengthdiv = 20 /datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom - name = "Holy Explosion" - id = "holyboom" required_reagents = list(/datum/reagent/water/holywater = 1, /datum/reagent/potassium = 1) /datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/on_reaction(datum/reagents/holder, created_volume) @@ -176,14 +152,10 @@ /datum/chemical_reaction/gunpowder - name = "Gunpowder" - id = /datum/reagent/gunpowder results = list(/datum/reagent/gunpowder = 3) required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/medicine/C2/multiver = 1, /datum/reagent/sulfur = 1) /datum/chemical_reaction/reagent_explosion/gunpowder_explosion - name = "Gunpowder Kaboom" - id = "gunpowder_explosion" required_reagents = list(/datum/reagent/gunpowder = 1) required_temp = 474 strengthdiv = 6 @@ -195,14 +167,10 @@ ..() /datum/chemical_reaction/thermite - name = "Thermite" - id = /datum/reagent/thermite results = list(/datum/reagent/thermite = 3) required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/iron = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/emp_pulse - name = "EMP Pulse" - id = "emp_pulse" required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense /datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume) @@ -214,8 +182,6 @@ /datum/chemical_reaction/beesplosion - name = "Bee Explosion" - id = "beesplosion" required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1) /datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, created_volume) @@ -237,14 +203,10 @@ /datum/chemical_reaction/stabilizing_agent - name = /datum/reagent/stabilizing_agent - id = /datum/reagent/stabilizing_agent results = list(/datum/reagent/stabilizing_agent = 3) required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/clf3 - name = "Chlorine Trifluoride" - id = /datum/reagent/clf3 results = list(/datum/reagent/clf3 = 4) required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 3) required_temp = 424 @@ -256,8 +218,6 @@ holder.chem_temp = 1000 // hot as shit /datum/chemical_reaction/reagent_explosion/methsplosion - name = "Meth explosion" - id = "methboom1" required_temp = 380 //slightly above the meth mix time. required_reagents = list(/datum/reagent/drug/methamphetamine = 1) strengthdiv = 6 @@ -272,13 +232,10 @@ ..() /datum/chemical_reaction/reagent_explosion/methsplosion/methboom2 - id = "methboom2" required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1) //diethylamine is often left over from mixing the ephedrine. required_temp = 300 //room temperature, chilling it even a little will prevent the explosion /datum/chemical_reaction/sorium - name = "Sorium" - id = /datum/reagent/sorium results = list(/datum/reagent/sorium = 4) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1) @@ -291,8 +248,6 @@ goonchem_vortex(T, 1, range) /datum/chemical_reaction/sorium_vortex - name = "sorium_vortex" - id = "sorium_vortex" required_reagents = list(/datum/reagent/sorium = 1) required_temp = 474 @@ -302,8 +257,6 @@ goonchem_vortex(T, 1, range) /datum/chemical_reaction/liquid_dark_matter - name = "Liquid Dark Matter" - id = /datum/reagent/liquid_dark_matter results = list(/datum/reagent/liquid_dark_matter = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/carbon = 1) @@ -316,8 +269,6 @@ goonchem_vortex(T, 0, range) /datum/chemical_reaction/ldm_vortex - name = "LDM Vortex" - id = "ldm_vortex" required_reagents = list(/datum/reagent/liquid_dark_matter = 1) required_temp = 474 @@ -327,8 +278,6 @@ goonchem_vortex(T, 0, range) /datum/chemical_reaction/flash_powder - name = "Flash powder" - id = /datum/reagent/flash_powder results = list(/datum/reagent/flash_powder = 3) required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/potassium = 1, /datum/reagent/sulfur = 1 ) @@ -350,8 +299,6 @@ holder.remove_reagent(/datum/reagent/flash_powder, created_volume*3) /datum/chemical_reaction/flash_powder_flash - name = "Flash powder activation" - id = "flash_powder_flash" required_reagents = list(/datum/reagent/flash_powder = 1) required_temp = 374 @@ -370,8 +317,6 @@ C.Stun(100) /datum/chemical_reaction/smoke_powder - name = /datum/reagent/smoke_powder - id = /datum/reagent/smoke_powder results = list(/datum/reagent/smoke_powder = 3) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/phosphorus = 1) @@ -391,8 +336,6 @@ holder.clear_reagents() /datum/chemical_reaction/smoke_powder_smoke - name = "smoke_powder_smoke" - id = "smoke_powder_smoke" required_reagents = list(/datum/reagent/smoke_powder = 1) required_temp = 374 mob_react = FALSE @@ -410,8 +353,6 @@ holder.clear_reagents() /datum/chemical_reaction/sonic_powder - name = /datum/reagent/sonic_powder - id = /datum/reagent/sonic_powder results = list(/datum/reagent/sonic_powder = 3) required_reagents = list(/datum/reagent/oxygen = 1, /datum/reagent/consumable/space_cola = 1, /datum/reagent/phosphorus = 1) @@ -425,8 +366,6 @@ C.soundbang_act(1, 100, rand(0, 5)) /datum/chemical_reaction/sonic_powder_deafen - name = "sonic_powder_deafen" - id = "sonic_powder_deafen" required_reagents = list(/datum/reagent/sonic_powder = 1) required_temp = 374 @@ -437,8 +376,6 @@ C.soundbang_act(1, 100, rand(0, 5)) /datum/chemical_reaction/phlogiston - name = /datum/reagent/phlogiston - id = /datum/reagent/phlogiston results = list(/datum/reagent/phlogiston = 3) required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/stable_plasma = 1) @@ -452,14 +389,10 @@ return /datum/chemical_reaction/napalm - name = "Napalm" - id = /datum/reagent/napalm results = list(/datum/reagent/napalm = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol = 1 ) /datum/chemical_reaction/cryostylane - name = /datum/reagent/cryostylane - id = /datum/reagent/cryostylane results = list(/datum/reagent/cryostylane = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/nitrogen = 1) @@ -468,8 +401,6 @@ return /datum/chemical_reaction/cryostylane_oxygen - name = "ephemeral cryostylane reaction" - id = "cryostylane_oxygen" results = list(/datum/reagent/cryostylane = 1) required_reagents = list(/datum/reagent/cryostylane = 1, /datum/reagent/oxygen = 1) mob_react = FALSE @@ -478,8 +409,6 @@ holder.chem_temp = max(holder.chem_temp - 10*created_volume,0) /datum/chemical_reaction/pyrosium_oxygen - name = "ephemeral pyrosium reaction" - id = "pyrosium_oxygen" results = list(/datum/reagent/pyrosium = 1) required_reagents = list(/datum/reagent/pyrosium = 1, /datum/reagent/oxygen = 1) mob_react = FALSE @@ -488,8 +417,6 @@ holder.chem_temp += 10*created_volume /datum/chemical_reaction/pyrosium - name = /datum/reagent/pyrosium - id = /datum/reagent/pyrosium results = list(/datum/reagent/pyrosium = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1) @@ -498,23 +425,17 @@ return /datum/chemical_reaction/teslium - name = "Teslium" - id = /datum/reagent/teslium results = list(/datum/reagent/teslium = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/silver = 1, /datum/reagent/gunpowder = 1) mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." required_temp = 400 /datum/chemical_reaction/energized_jelly - name = "Energized Jelly" - id = /datum/reagent/teslium/energized_jelly results = list(/datum/reagent/teslium/energized_jelly = 2) required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/teslium = 1) mix_message = "The slime jelly starts glowing intermittently." /datum/chemical_reaction/reagent_explosion/teslium_lightning - name = "Teslium Destabilization" - id = "teslium_lightning" required_reagents = list(/datum/reagent/teslium = 1, /datum/reagent/water = 1) strengthdiv = 100 modifier = -100 @@ -541,21 +462,16 @@ ..() /datum/chemical_reaction/reagent_explosion/teslium_lightning/heat - id = "teslium_lightning2" required_temp = 474 required_reagents = list(/datum/reagent/teslium = 1) /datum/chemical_reaction/reagent_explosion/nitrous_oxide - name = "N2O explosion" - id = "n2o_explosion" required_reagents = list(/datum/reagent/nitrous_oxide = 1) strengthdiv = 7 required_temp = 575 modifier = 1 /datum/chemical_reaction/firefighting_foam - name = "Firefighting Foam" - id = /datum/reagent/firefighting_foam results = list(/datum/reagent/firefighting_foam = 3) required_reagents = list(/datum/reagent/stabilizing_agent = 1,/datum/reagent/fluorosurfactant = 1,/datum/reagent/carbon = 1) required_temp = 200 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 153130b5ea5..afe035e42d4 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -14,8 +14,6 @@ //Grey /datum/chemical_reaction/slime/slimespawn - name = "Slime Spawn" - id = "m_spawn" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/grey required_other = TRUE @@ -26,16 +24,12 @@ ..() /datum/chemical_reaction/slime/slimeinaprov - name = "Slime epinephrine" - id = "m_inaprov" results = list(/datum/reagent/medicine/epinephrine = 3) required_reagents = list(/datum/reagent/water = 5) required_other = TRUE required_container = /obj/item/slime_extract/grey /datum/chemical_reaction/slime/slimemonkey - name = "Slime Monkey" - id = "m_monkey" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/grey required_other = TRUE @@ -47,24 +41,18 @@ //Green /datum/chemical_reaction/slime/slimemutate - name = "Mutation Toxin" - id = "slimetoxin" results = list(/datum/reagent/mutationtoxin/jelly = 1) required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE required_container = /obj/item/slime_extract/green /datum/chemical_reaction/slime/slimehuman - name = "Human Mutation Toxin" - id = "humanmuttoxin" results = list(/datum/reagent/mutationtoxin = 1) required_reagents = list(/datum/reagent/blood = 1) required_other = TRUE required_container = /obj/item/slime_extract/green /datum/chemical_reaction/slime/slimelizard - name = "Lizard Mutation Toxin" - id = "lizardmuttoxin" results = list(/datum/reagent/mutationtoxin/lizard = 1) required_reagents = list(/datum/reagent/uranium/radium = 1) required_other = TRUE @@ -72,8 +60,6 @@ //Metal /datum/chemical_reaction/slime/slimemetal - name = "Slime Metal" - id = "m_metal" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/metal required_other = TRUE @@ -85,8 +71,6 @@ ..() /datum/chemical_reaction/slime/slimeglass - name = "Slime Glass" - id = "m_glass" required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/metal required_other = TRUE @@ -99,8 +83,6 @@ //Gold /datum/chemical_reaction/slime/slimemobspawn - name = "Slime Crit" - id = "m_tele" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/gold required_other = TRUE @@ -119,8 +101,6 @@ addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime", HOSTILE_SPAWN), 50) /datum/chemical_reaction/slime/slimemobspawn/lesser - name = "Slime Crit Lesser" - id = "m_tele3" required_reagents = list(/datum/reagent/blood = 1) /datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T) @@ -128,8 +108,6 @@ addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50) /datum/chemical_reaction/slime/slimemobspawn/friendly - name = "Slime Crit Friendly" - id = "m_tele5" required_reagents = list(/datum/reagent/water = 1) /datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T) @@ -137,8 +115,6 @@ addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50) /datum/chemical_reaction/slime/slimemobspawn/spider - name = "Slime Crit Traitor Spider" - id = "m_tele6" required_reagents = list(/datum/reagent/spider_extract = 1) /datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) @@ -148,8 +124,6 @@ //Silver /datum/chemical_reaction/slime/slimebork - name = "Slime Bork" - id = "m_tele2" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/silver required_other = TRUE @@ -180,8 +154,6 @@ return get_random_food() /datum/chemical_reaction/slime/slimebork/drinks - name = "Slime Bork 2" - id = "m_tele4" required_reagents = list(/datum/reagent/water = 1) /datum/chemical_reaction/slime/slimebork/drinks/getbork() @@ -189,16 +161,12 @@ //Blue /datum/chemical_reaction/slime/slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" results = list(/datum/reagent/consumable/frostoil = 10) required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/blue required_other = TRUE /datum/chemical_reaction/slime/slimestabilizer - name = "Slime Stabilizer" - id = "m_slimestabilizer" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/blue required_other = TRUE @@ -208,8 +176,6 @@ ..() /datum/chemical_reaction/slime/slimefoam - name = "Slime Foam" - id = "m_foam" required_reagents = list(/datum/reagent/water = 5) required_container = /obj/item/slime_extract/blue required_other = TRUE @@ -219,8 +185,6 @@ //Dark Blue /datum/chemical_reaction/slime/slimefreeze - name = "Slime Freeze" - id = "m_freeze" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/darkblue required_other = TRUE @@ -243,8 +207,6 @@ T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7") /datum/chemical_reaction/slime/slimefireproof - name = "Slime Fireproof" - id = "m_fireproof" required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/darkblue required_other = TRUE @@ -255,16 +217,12 @@ //Orange /datum/chemical_reaction/slime/slimecasp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" results = list(/datum/reagent/consumable/capsaicin = 10) required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/orange required_other = TRUE /datum/chemical_reaction/slime/slimefire - name = "Slime fire" - id = "m_fire" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/orange required_other = TRUE @@ -287,8 +245,6 @@ /datum/chemical_reaction/slime/slimesmoke - name = "Slime Smoke" - id = "m_smoke" results = list(/datum/reagent/phosphorus = 10, /datum/reagent/potassium = 10, /datum/reagent/consumable/sugar = 10) required_reagents = list(/datum/reagent/water = 5) required_container = /obj/item/slime_extract/orange @@ -296,8 +252,6 @@ //Yellow /datum/chemical_reaction/slime/slimeoverload - name = "Slime EMP" - id = "m_emp" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE @@ -307,8 +261,6 @@ ..() /datum/chemical_reaction/slime/slimecell - name = "Slime Powercell" - id = "m_cell" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE @@ -318,8 +270,6 @@ ..() /datum/chemical_reaction/slime/slimeglow - name = "Slime Glow" - id = "m_glow" required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE @@ -332,8 +282,6 @@ //Purple /datum/chemical_reaction/slime/slimepsteroid - name = "Slime Steroid" - id = "m_steroid" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/purple required_other = TRUE @@ -343,8 +291,6 @@ ..() /datum/chemical_reaction/slime/slimeregen - name = "Slime Regen" - id = "m_regen" results = list(/datum/reagent/medicine/regen_jelly = 5) required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/purple @@ -352,8 +298,6 @@ //Dark Purple /datum/chemical_reaction/slime/slimeplasma - name = "Slime Plasma" - id = "m_plasma" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/darkpurple required_other = TRUE @@ -364,8 +308,6 @@ //Red /datum/chemical_reaction/slime/slimemutator - name = "Slime Mutator" - id = "m_slimemutator" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/red required_other = TRUE @@ -375,8 +317,6 @@ ..() /datum/chemical_reaction/slime/slimebloodlust - name = "Bloodlust" - id = "m_bloodlust" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/red required_other = TRUE @@ -393,8 +333,6 @@ ..() /datum/chemical_reaction/slime/slimespeed - name = "Slime Speed" - id = "m_speed" required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/red required_other = TRUE @@ -405,8 +343,6 @@ //Pink /datum/chemical_reaction/slime/docility - name = "Docility Potion" - id = "m_potion" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/pink required_other = TRUE @@ -416,8 +352,6 @@ ..() /datum/chemical_reaction/slime/gender - name = "Gender Potion" - id = "m_gender" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/pink required_other = TRUE @@ -428,8 +362,6 @@ //Black /datum/chemical_reaction/slime/slimemutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" results = list(/datum/reagent/aslimetoxin = 1) required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE @@ -437,8 +369,6 @@ //Oil /datum/chemical_reaction/slime/slimeexplosion - name = "Slime Explosion" - id = "m_explosion" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/oil required_other = TRUE @@ -466,8 +396,6 @@ /datum/chemical_reaction/slime/slimecornoil - name = "Slime Corn Oil" - id = "m_cornoil" results = list(/datum/reagent/consumable/cornoil = 10) required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/oil @@ -475,8 +403,6 @@ //Light Pink /datum/chemical_reaction/slime/slimepotion2 - name = "Slime Potion 2" - id = "m_potion2" required_container = /obj/item/slime_extract/lightpink required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE @@ -486,8 +412,6 @@ ..() /datum/chemical_reaction/slime/renaming - name = "Renaming Potion" - id = "m_renaming_potion" required_container = /obj/item/slime_extract/lightpink required_reagents = list(/datum/reagent/water = 1) required_other = TRUE @@ -499,8 +423,6 @@ //Adamantine /datum/chemical_reaction/slime/adamantine - name = "Adamantine" - id = "adamantine" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/adamantine required_other = TRUE @@ -511,8 +433,6 @@ //Bluespace /datum/chemical_reaction/slime/slimefloor2 - name = "Bluespace Floor" - id = "m_floor2" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/bluespace required_other = TRUE @@ -523,8 +443,6 @@ /datum/chemical_reaction/slime/slimecrystal - name = "Slime Crystal" - id = "m_crystal" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/bluespace required_other = TRUE @@ -535,8 +453,6 @@ ..() /datum/chemical_reaction/slime/slimeradio - name = "Slime Radio" - id = "m_radio" required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/bluespace required_other = TRUE @@ -547,8 +463,6 @@ //Cerulean /datum/chemical_reaction/slime/slimepsteroid2 - name = "Slime Steroid 2" - id = "m_steroid2" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/cerulean required_other = TRUE @@ -558,8 +472,6 @@ ..() /datum/chemical_reaction/slime/slime_territory - name = "Slime Territory" - id = "s_territory" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/cerulean required_other = TRUE @@ -570,8 +482,6 @@ //Sepia /datum/chemical_reaction/slime/slimestop - name = "Slime Stop" - id = "m_stop" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/sepia required_other = TRUE @@ -590,8 +500,6 @@ ..() /datum/chemical_reaction/slime/slimecamera - name = "Slime Camera" - id = "m_camera" required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/sepia required_other = TRUE @@ -602,8 +510,6 @@ ..() /datum/chemical_reaction/slime/slimefloor - name = "Sepia Floor" - id = "m_floor" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/sepia required_other = TRUE @@ -614,8 +520,6 @@ //Pyrite /datum/chemical_reaction/slime/slimepaint - name = "Slime Paint" - id = "s_paint" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/pyrite required_other = TRUE @@ -626,8 +530,6 @@ ..() /datum/chemical_reaction/slime/slimecrayon - name = "Slime Crayon" - id = "s_crayon" required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/pyrite required_other = TRUE @@ -639,8 +541,6 @@ //Rainbow :o) /datum/chemical_reaction/slime/slimeRNG - name = "Random Core" - id = "slimerng" required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE required_container = /obj/item/slime_extract/rainbow @@ -658,8 +558,6 @@ ..() /datum/chemical_reaction/slime/slimebomb - name = "Clusterblorble" - id = "slimebomb" required_reagents = list(/datum/reagent/toxin/slimejelly = 1) required_other = TRUE required_container = /obj/item/slime_extract/rainbow @@ -681,8 +579,6 @@ ..() /datum/chemical_reaction/slime/slime_transfer - name = "Transfer Potion" - id = "slimetransfer" required_reagents = list(/datum/reagent/blood = 1) required_other = TRUE required_container = /obj/item/slime_extract/rainbow @@ -692,8 +588,6 @@ ..() /datum/chemical_reaction/slime/flight_potion - name = "Flight Potion" - id = /datum/reagent/flightpotion required_reagents = list(/datum/reagent/water/holywater = 5, /datum/reagent/uranium = 5) required_other = TRUE required_container = /obj/item/slime_extract/rainbow diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 891d75962d4..2549257946e 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -24,7 +24,6 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related #define RNGCHEM_OUTPUT "output" /datum/chemical_reaction/randomized - name = "semi randomized reaction" var/persistent = FALSE var/persistence_period = 7 //Will reset every x days @@ -147,8 +146,6 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related return TRUE /datum/chemical_reaction/randomized/secret_sauce - name = "secret sauce creation" - id = "secretsauce" persistent = TRUE persistence_period = 7 //Reset every week randomize_container = TRUE diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 2e64c5b4166..2f42ed6f4c0 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -1,128 +1,88 @@ /datum/chemical_reaction/formaldehyde - name = /datum/reagent/toxin/formaldehyde - id = "Formaldehyde" results = list(/datum/reagent/toxin/formaldehyde = 3) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1, /datum/reagent/silver = 1) required_temp = 420 /datum/chemical_reaction/fentanyl - name = /datum/reagent/toxin/fentanyl - id = /datum/reagent/toxin/fentanyl results = list(/datum/reagent/toxin/fentanyl = 1) required_reagents = list(/datum/reagent/drug/space_drugs = 1) required_temp = 674 /datum/chemical_reaction/cyanide - name = "Cyanide" - id = /datum/reagent/toxin/cyanide results = list(/datum/reagent/toxin/cyanide = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/ammonia = 1, /datum/reagent/oxygen = 1) required_temp = 380 /datum/chemical_reaction/itching_powder - name = "Itching Powder" - id = /datum/reagent/toxin/itching_powder results = list(/datum/reagent/toxin/itching_powder = 3) required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ammonia = 1, /datum/reagent/medicine/C2/multiver = 1) /datum/chemical_reaction/facid - name = "Fluorosulfuric acid" - id = /datum/reagent/toxin/acid/fluacid results = list(/datum/reagent/toxin/acid/fluacid = 4) required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/fluorine = 1, /datum/reagent/hydrogen = 1, /datum/reagent/potassium = 1) required_temp = 380 /datum/chemical_reaction/nitracid - name = "Nitric Acid" - id = /datum/reagent/toxin/acid/nitracid results = list(/datum/reagent/toxin/acid/nitracid = 2) required_reagents = list(/datum/reagent/toxin/acid/fluacid = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 1) required_temp = 380 /datum/chemical_reaction/sulfonal - name = /datum/reagent/toxin/sulfonal - id = /datum/reagent/toxin/sulfonal results = list(/datum/reagent/toxin/sulfonal = 3) required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/sulfur = 1) /datum/chemical_reaction/lipolicide - name = /datum/reagent/toxin/lipolicide - id = /datum/reagent/toxin/lipolicide results = list(/datum/reagent/toxin/lipolicide = 3) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/diethylamine = 1, /datum/reagent/medicine/ephedrine = 1) /datum/chemical_reaction/mutagen - name = "Unstable mutagen" - id = /datum/reagent/toxin/mutagen results = list(/datum/reagent/toxin/mutagen = 3) required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/lexorin - name = "Lexorin" - id = /datum/reagent/toxin/lexorin results = list(/datum/reagent/toxin/lexorin = 3) required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/salbutamol = 1) /datum/chemical_reaction/chloralhydrate - name = "Chloral Hydrate" - id = /datum/reagent/toxin/chloralhydrate results = list(/datum/reagent/toxin/chloralhydrate = 1) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 3, /datum/reagent/water = 1) /datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v - name = "Mute Toxin" - id = /datum/reagent/toxin/mutetoxin results = list(/datum/reagent/toxin/mutetoxin = 2) required_reagents = list(/datum/reagent/uranium = 2, /datum/reagent/water = 1, /datum/reagent/carbon = 1) /datum/chemical_reaction/zombiepowder - name = "Zombie Powder" - id = /datum/reagent/toxin/zombiepowder results = list(/datum/reagent/toxin/zombiepowder = 2) required_reagents = list(/datum/reagent/toxin/carpotoxin = 5, /datum/reagent/medicine/morphine = 5, /datum/reagent/copper = 5) /datum/chemical_reaction/ghoulpowder - name = "Ghoul Powder" - id = /datum/reagent/toxin/ghoulpowder results = list(/datum/reagent/toxin/ghoulpowder = 2) required_reagents = list(/datum/reagent/toxin/zombiepowder = 1, /datum/reagent/medicine/epinephrine = 1) /datum/chemical_reaction/mindbreaker - name = "Mindbreaker Toxin" - id = /datum/reagent/toxin/mindbreaker results = list(/datum/reagent/toxin/mindbreaker = 5) required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/C2/multiver = 1) /datum/chemical_reaction/heparin - name = "Heparin" - id = "Heparin" results = list(/datum/reagent/toxin/heparin = 4) required_reagents = list(/datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1, /datum/reagent/lithium = 1) mix_message = "The mixture thins and loses all color." /datum/chemical_reaction/rotatium - name = "Rotatium" - id = "Rotatium" results = list(/datum/reagent/toxin/rotatium = 3) required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/toxin/fentanyl = 1) mix_message = "After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight." /datum/chemical_reaction/anacea - name = "Anacea" - id = /datum/reagent/toxin/anacea results = list(/datum/reagent/toxin/anacea = 3) required_reagents = list(/datum/reagent/medicine/haloperidol = 1, /datum/reagent/impedrezene = 1, /datum/reagent/uranium/radium = 1) /datum/chemical_reaction/mimesbane - name = "Mime's Bane" - id = /datum/reagent/toxin/mimesbane results = list(/datum/reagent/toxin/mimesbane = 3) required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1) /datum/chemical_reaction/bonehurtingjuice - name = "Bone Hurting Juice" - id = /datum/reagent/toxin/bonehurtingjuice results = list(/datum/reagent/toxin/bonehurtingjuice = 5) required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/toxin/itching_powder = 3, /datum/reagent/consumable/milk = 1) mix_message = "The mixture suddenly becomes clear and looks a lot like water. You feel a strong urge to drink it." diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index d8573ee7030..7560cd0eba8 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -82,7 +82,7 @@ return ..() /obj/structure/bigDelivery/relay_container_resist(mob/living/user, obj/O) - if(ismovableatom(loc)) + if(ismovable(loc)) var/atom/movable/AM = loc //can't unwrap the wrapped container if it's inside something. AM.relay_container_resist(user, O) return diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index 6e0b22e0118..dcf9be28e91 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -36,7 +36,8 @@ var/minor_rewards = list(/obj/item/stack/circuit_stack/full, //To add a new minor reward, add it here. /obj/item/airlock_painter/decal, /obj/item/pen/survival, - /obj/item/circuitboard/machine/sleeper/party) + /obj/item/circuitboard/machine/sleeper/party, + /obj/item/toy/sprayoncan) var/static/list/item_list = list() /obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params) diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index 9e8f5dd2078..b5ad324b110 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -10,6 +10,14 @@ make_reagents = list(/datum/reagent/consumable/milk = 10) category = list("initial","Food") +/datum/design/soymilk + name = "10u Soy Milk" + id = "soymilk" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass= 20) + make_reagents = list(/datum/reagent/consumable/soymilk = 10) + category = list("initial","Food") + /datum/design/ethanol name = "10u Ethanol" id = "ethanol" @@ -56,7 +64,7 @@ build_type = BIOGENERATOR materials = list(/datum/material/biomass= 250) build_path = /obj/item/reagent_containers/food/snacks/monkeycube - category = list("initial", "Food") + category = list("initial","Food") /datum/design/ez_nut //easy nut :) name = "30u E-Z Nutrient" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index ee4bae4af32..a6f18906b11 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -186,6 +186,14 @@ build_path = /obj/item/circuitboard/machine/dnascanner category = list("Medical Machinery") +/datum/design/board/hypnochair + name = "Machine Design (Enhanced Interrogation Chamber)" + desc = "Allows for the construction of circuit boards used to build an Enhanced Interrogation Chamber." + id = "hypnochair" + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + build_path = /obj/item/circuitboard/machine/hypnochair + category = list("Misc. Machinery") + /datum/design/board/biogenerator name = "Machine Design (Biogenerator Board)" desc = "The circuit board for a biogenerator." @@ -594,3 +602,11 @@ build_path = /obj/item/circuitboard/machine/medical_kiosk category = list ("Medical Machinery") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/board/medipen_refiller + name = "Machine Design (Medipen Refiller)" + desc = "The circuit board for a Medipen Refiller." + id = "medipen_refiller" + build_path = /obj/item/circuitboard/machine/medipen_refiller + category = list ("Medical Machinery") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 147a6911ca0..3d552d1ca82 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -1,552 +1,562 @@ - -///////////////////////////////////////// -/////////////////HUDs//////////////////// -///////////////////////////////////////// - -/datum/design/health_hud - name = "Health Scanner HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." - id = "health_hud" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/hud/health - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/health_hud_night - name = "Night Vision Health Scanner HUD" - desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." - id = "health_hud_night" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/silver = 350) - build_path = /obj/item/clothing/glasses/hud/health/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/security_hud - name = "Security HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status." - id = "security_hud" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/hud/security - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/security_hud_night - name = "Night Vision Security HUD" - desc = "A heads-up display which provides id data and vision in complete darkness." - id = "security_hud_night" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/gold = 350) - build_path = /obj/item/clothing/glasses/hud/security/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/diagnostic_hud - name = "Diagnostic HUD" - desc = "A HUD used to analyze and determine faults within robotic machinery." - id = "diagnostic_hud" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/hud/diagnostic - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/diagnostic_hud_night - name = "Night Vision Diagnostic HUD" - desc = "Upgraded version of the diagnostic HUD designed to function during a power failure." - id = "diagnostic_hud_night" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/plasma = 300) - build_path = /obj/item/clothing/glasses/hud/diagnostic/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -///////////////////////////////////////// -//////////////////Misc/////////////////// -///////////////////////////////////////// - -/datum/design/welding_goggles - name = "Welding Goggles" - desc = "Protects the eyes from bright flashes; approved by the mad scientist association." - id = "welding_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/welding - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/welding_mask - name = "Welding Gas Mask" - desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." - id = "weldingmask" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000) - build_path = /obj/item/clothing/mask/gas/welding - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/bright_helmet - name = "Workplace-Ready Firefighter Helmet" - desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards." - id = "bright_helmet" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500) - build_path = /obj/item/clothing/head/hardhat/red/upgraded - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO - -/datum/design/mauna_mug - name = "Mauna Mug" - desc = "This awesome mug will ensure your coffee never stays cold!" - id = "mauna_mug" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 1000, /datum/material/glass = 100) - build_path = /obj/item/reagent_containers/glass/maunamug - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ALL - -/datum/design/portaseeder - name = "Portable Seed Extractor" - desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." - id = "portaseeder" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 1000, /datum/material/glass = 400) - build_path = /obj/item/storage/bag/plants/portaseeder - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/air_horn - name = "Air Horn" - desc = "Damn son, where'd you find this?" - id = "air_horn" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000) - build_path = /obj/item/bikehorn/airhorn - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK! - -/datum/design/mesons - name = "Optical Meson Scanners" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - id = "mesons" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/meson - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/engine_goggles - name = "Engineering Scanner Goggles" - desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes." - id = "engine_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100) - build_path = /obj/item/clothing/glasses/meson/engine - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/tray_goggles - name = "Optical T-Ray Scanners" - desc = "Used by engineering staff to see underfloor objects such as cables and pipes." - id = "tray_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/meson/engine/tray - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/nvgmesons - name = "Night Vision Optical Meson Scanners" - desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display." - id = "nvgmesons" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) - build_path = /obj/item/clothing/glasses/meson/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO - -/datum/design/night_vision_goggles - name = "Night Vision Goggles" - desc = "Goggles that let you see through darkness unhindered." - id = "night_visision_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) - build_path = /obj/item/clothing/glasses/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY - -/datum/design/magboots - name = "Magnetic Boots" - desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle." - id = "magboots" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 4500, /datum/material/silver = 1500, /datum/material/gold = 2500) - build_path = /obj/item/clothing/shoes/magboots - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/forcefield_projector - name = "Forcefield Projector" - desc = "A device which can project temporary forcefields to seal off an area." - id = "forcefield_projector" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2500, /datum/material/glass = 1000) - build_path = /obj/item/forcefield_projector - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/sci_goggles - name = "Science Goggles" - desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine." - id = "scigoggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/science - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/diskplantgene - name = "Plant Data Disk" - desc = "A disk for storing plant genetic data." - id = "diskplantgene" - build_type = PROTOLATHE - materials = list(/datum/material/iron=200, /datum/material/glass = 100) - build_path = /obj/item/disk/plantgene - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/roastingstick - name = "Advanced Roasting Stick" - desc = "A roasting stick for cooking sausages in exotic ovens." - id = "roastingstick" - build_type = PROTOLATHE - materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250) - build_path = /obj/item/melee/roastingstick - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/locator - name = "Bluespace Locator" - desc = "Used to track portable teleportation beacons and targets with embedded tracking implants." - id = "locator" - build_type = PROTOLATHE - materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/locator - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/quantum_keycard - name = "Quantum Keycard" - desc = "Allows for the construction of a quantum keycard." - id = "quantum_keycard" - build_type = PROTOLATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500, /datum/material/silver = 500, /datum/material/bluespace = 1000) - build_path = /obj/item/quantum_keycard - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/anomaly_neutralizer - name = "Anomaly Neutralizer" - desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine." - id = "anomaly_neutralizer" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/gold = 2000, /datum/material/plasma = 5000, /datum/material/uranium = 2000) - build_path = /obj/item/anomaly_neutralizer - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/donksoft_refill - name = "Donksoft Toy Vendor Refill" - desc = "A refill canister for Donksoft Toy Vendors." - id = "donksoft_refill" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000) - build_path = /obj/item/vending_refill/donksoft - category = list("Equipment") - -/datum/design/oxygen_tank - name = "Oxygen Tank" - desc = "An empty oxygen tank." - id = "oxygen_tank" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/tank/internals/oxygen/empty - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/plasma_tank - name = "Plasma Tank" - desc = "An empty oxygen tank." - id = "plasma_tank" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/tank/internals/plasma/empty - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/id - name = "Identification Card" - desc = "A card used to provide ID and determine access across the station." - id = "idcard" - build_type = PROTOLATHE - materials = list(/datum/material/iron=200, /datum/material/glass = 100) - build_path = /obj/item/card/id - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/eng_gloves - name = "Tinkers Gloves" - desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn." - id = "eng_gloves" - build_type = PROTOLATHE - materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) - build_path = /obj/item/clothing/gloves/color/latex/engineering - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/lavarods - name = "Lava-Resistant Metal Rods" - id = "lava_rods" - build_type = PROTOLATHE - materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000) - build_path = /obj/item/stack/rods/lava - category = list("initial", "Stock Parts") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/plasticducky - name = "Rubber Ducky" - desc = "The classic Nanotrasen design for competitively priced bath based duck toys. No need for fancy Waffle co. rubber, buy Plastic Ducks today!" - id = "plasticducky" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = 1000) - build_path = /obj/item/bikehorn/rubberducky/plasticducky - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ALL - -///////////////////////////////////////// -////////////Janitor Designs////////////// -///////////////////////////////////////// - -/datum/design/advmop - name = "Advanced Mop" - desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals." - id = "advmop" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2500, /datum/material/glass = 200) - build_path = /obj/item/mop/advanced - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/blutrash - name = "Trashbag of Holding" - desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." - id = "blutrash" - build_type = PROTOLATHE - materials = list(/datum/material/gold = 1500, /datum/material/uranium = 250, /datum/material/plasma = 1500) - build_path = /obj/item/storage/bag/trash/bluespace - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/buffer - name = "Floor Buffer Upgrade" - desc = "A floor buffer that can be attached to vehicular janicarts." - id = "buffer" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) - build_path = /obj/item/janiupgrade - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/spraybottle - name = "Spray Bottle" - desc = "A spray bottle, with an unscrewable top." - id = "spraybottle" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) - build_path = /obj/item/reagent_containers/spray - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/beartrap - name = "Bear Trap" - desc = "A trap used to catch space bears and other legged creatures." - id = "beartrap" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000) - build_path = /obj/item/restraints/legcuffs/beartrap - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -///////////////////////////////////////// -/////////////Holobarriers//////////////// -///////////////////////////////////////// - -/datum/design/holosign - name = "Holographic Sign Projector" - desc = "A holograpic projector used to project various warning signs." - id = "holosign" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) - build_path = /obj/item/holosign_creator - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/holobarrier_jani - name = "Custodial Holobarrier Projector" - desc = "A holograpic projector used to project hard light wet floor barriers." - id = "holobarrier_jani" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/janibarrier - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - - -/datum/design/holosignsec - name = "Security Holobarrier Projector" - desc = "A holographic projector that creates holographic security barriers." - id = "holosignsec" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/security - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/holosignengi - name = "Engineering Holobarrier Projector" - desc = "A holographic projector that creates holographic engineering barriers." - id = "holosignengi" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/engineering - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/holosignatmos - name = "ATMOS Holofan Projector" - desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions." - id = "holosignatmos" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/atmos - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/holobarrier_med - name = "PENLITE Holobarrier Projector" - desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases." - build_type = PROTOLATHE - build_path = /obj/item/holosign_creator/medical - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease) - id = "holobarrier_med" - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -///////////////////////////////////////// -////////////////Armour/////////////////// -///////////////////////////////////////// - -/datum/design/reactive_armour - name = "Reactive Armour Shell" - desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user." - id = "reactive_armour" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/diamond = 5000, /datum/material/uranium = 8000, /datum/material/silver = 4500, /datum/material/gold = 5000) - build_path = /obj/item/reactive_armour_shell - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/knight_armour - name = "Knight Armour" - desc = "A royal knight's favorite garments. Can be trimmed by any friendly person." - id = "knight_armour" - build_type = AUTOLATHE - materials = list(MAT_CATEGORY_RIGID = 10000) - build_path = /obj/item/clothing/suit/armor/riot/knight/greyscale - category = list("Imported") - -/datum/design/knight_helmet - name = "Knight Helmet" - desc = "A royal knight's favorite hat. If you hold it upside down it's actually a bucket." - id = "knight_helmet" - build_type = AUTOLATHE - materials = list(MAT_CATEGORY_RIGID = 5000) - build_path = /obj/item/clothing/head/helmet/knight/greyscale - category = list("Imported") - - - -///////////////////////////////////////// -/////////////Security//////////////////// -///////////////////////////////////////// - -/datum/design/seclite - name = "Seclite" - desc = "A robust flashlight used by security." - id = "seclite" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2500) - build_path = /obj/item/flashlight/seclite - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/detective_scanner - name = "Forensic Scanner" - desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." - id = "detective_scanner" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000) - build_path = /obj/item/detective_scanner - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/pepperspray - name = "Pepper Spray" - desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents." - id = "pepperspray" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000) - build_path = /obj/item/reagent_containers/spray/pepper/empty - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/bola_energy - name = "Energy Bola" - desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." - id = "bola_energy" - build_type = PROTOLATHE - materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500) - build_path = /obj/item/restraints/legcuffs/bola/energy - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/zipties - name = "Zipties" - desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." - id = "zipties" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = 250) - build_path = /obj/item/restraints/handcuffs/cable/zipties - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/evidencebag - name = "Evidence Bag" - desc = "An empty evidence bag." - id = "evidencebag" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = 100) - build_path = /obj/item/evidencebag - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/plumbing_rcd - name = "Plumbing Constructor" - id = "plumbing_rcd" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500, /datum/material/plastic = 1000) - build_path = /obj/item/construction/plumbing - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +///////////////////////////////////////// +/////////////////HUDs//////////////////// +///////////////////////////////////////// + +/datum/design/health_hud + name = "Health Scanner HUD" + desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." + id = "health_hud" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/hud/health + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/health_hud_night + name = "Night Vision Health Scanner HUD" + desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." + id = "health_hud_night" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/silver = 350) + build_path = /obj/item/clothing/glasses/hud/health/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/security_hud + name = "Security HUD" + desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status." + id = "security_hud" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/hud/security + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/security_hud_night + name = "Night Vision Security HUD" + desc = "A heads-up display which provides id data and vision in complete darkness." + id = "security_hud_night" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/gold = 350) + build_path = /obj/item/clothing/glasses/hud/security/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/diagnostic_hud + name = "Diagnostic HUD" + desc = "A HUD used to analyze and determine faults within robotic machinery." + id = "diagnostic_hud" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/hud/diagnostic + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/diagnostic_hud_night + name = "Night Vision Diagnostic HUD" + desc = "Upgraded version of the diagnostic HUD designed to function during a power failure." + id = "diagnostic_hud_night" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/plasma = 300) + build_path = /obj/item/clothing/glasses/hud/diagnostic/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +///////////////////////////////////////// +//////////////////Misc/////////////////// +///////////////////////////////////////// + +/datum/design/welding_goggles + name = "Welding Goggles" + desc = "Protects the eyes from bright flashes; approved by the mad scientist association." + id = "welding_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/welding + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/welding_mask + name = "Welding Gas Mask" + desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." + id = "weldingmask" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000) + build_path = /obj/item/clothing/mask/gas/welding + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/bright_helmet + name = "Workplace-Ready Firefighter Helmet" + desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards." + id = "bright_helmet" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500) + build_path = /obj/item/clothing/head/hardhat/red/upgraded + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO + +/datum/design/mauna_mug + name = "Mauna Mug" + desc = "This awesome mug will ensure your coffee never stays cold!" + id = "mauna_mug" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 100) + build_path = /obj/item/reagent_containers/glass/maunamug + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +/datum/design/rolling_table + name = "Rolly poly" + desc = "We duct-taped some wheels to the bottom of a table. It's goddamn science alright?" + id = "rolling_table" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000) + build_path = /obj/structure/table/rolling + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +/datum/design/portaseeder + name = "Portable Seed Extractor" + desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." + id = "portaseeder" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 400) + build_path = /obj/item/storage/bag/plants/portaseeder + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/air_horn + name = "Air Horn" + desc = "Damn son, where'd you find this?" + id = "air_horn" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000) + build_path = /obj/item/bikehorn/airhorn + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK! + +/datum/design/mesons + name = "Optical Meson Scanners" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + id = "mesons" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/meson + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/engine_goggles + name = "Engineering Scanner Goggles" + desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes." + id = "engine_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100) + build_path = /obj/item/clothing/glasses/meson/engine + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/tray_goggles + name = "Optical T-Ray Scanners" + desc = "Used by engineering staff to see underfloor objects such as cables and pipes." + id = "tray_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/meson/engine/tray + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/nvgmesons + name = "Night Vision Optical Meson Scanners" + desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display." + id = "nvgmesons" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) + build_path = /obj/item/clothing/glasses/meson/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO + +/datum/design/night_vision_goggles + name = "Night Vision Goggles" + desc = "Goggles that let you see through darkness unhindered." + id = "night_visision_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) + build_path = /obj/item/clothing/glasses/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY + +/datum/design/magboots + name = "Magnetic Boots" + desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle." + id = "magboots" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4500, /datum/material/silver = 1500, /datum/material/gold = 2500) + build_path = /obj/item/clothing/shoes/magboots + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/forcefield_projector + name = "Forcefield Projector" + desc = "A device which can project temporary forcefields to seal off an area." + id = "forcefield_projector" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2500, /datum/material/glass = 1000) + build_path = /obj/item/forcefield_projector + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/sci_goggles + name = "Science Goggles" + desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine." + id = "scigoggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/science + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/diskplantgene + name = "Plant Data Disk" + desc = "A disk for storing plant genetic data." + id = "diskplantgene" + build_type = PROTOLATHE + materials = list(/datum/material/iron=200, /datum/material/glass = 100) + build_path = /obj/item/disk/plantgene + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/roastingstick + name = "Advanced Roasting Stick" + desc = "A roasting stick for cooking sausages in exotic ovens." + id = "roastingstick" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250) + build_path = /obj/item/melee/roastingstick + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/locator + name = "Bluespace Locator" + desc = "Used to track portable teleportation beacons and targets with embedded tracking implants." + id = "locator" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/silver = 500) + build_path = /obj/item/locator + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/quantum_keycard + name = "Quantum Keycard" + desc = "Allows for the construction of a quantum keycard." + id = "quantum_keycard" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 500, /datum/material/iron = 500, /datum/material/silver = 500, /datum/material/bluespace = 1000) + build_path = /obj/item/quantum_keycard + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/anomaly_neutralizer + name = "Anomaly Neutralizer" + desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine." + id = "anomaly_neutralizer" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/gold = 2000, /datum/material/plasma = 5000, /datum/material/uranium = 2000) + build_path = /obj/item/anomaly_neutralizer + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/donksoft_refill + name = "Donksoft Toy Vendor Refill" + desc = "A refill canister for Donksoft Toy Vendors." + id = "donksoft_refill" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000) + build_path = /obj/item/vending_refill/donksoft + category = list("Equipment") + +/datum/design/oxygen_tank + name = "Oxygen Tank" + desc = "An empty oxygen tank." + id = "oxygen_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/tank/internals/oxygen/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plasma_tank + name = "Plasma Tank" + desc = "An empty oxygen tank." + id = "plasma_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/tank/internals/plasma/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/id + name = "Identification Card" + desc = "A card used to provide ID and determine access across the station." + id = "idcard" + build_type = PROTOLATHE + materials = list(/datum/material/iron=200, /datum/material/glass = 100) + build_path = /obj/item/card/id + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/eng_gloves + name = "Tinkers Gloves" + desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn." + id = "eng_gloves" + build_type = PROTOLATHE + materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) + build_path = /obj/item/clothing/gloves/color/latex/engineering + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/lavarods + name = "Lava-Resistant Metal Rods" + id = "lava_rods" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000) + build_path = /obj/item/stack/rods/lava + category = list("initial", "Stock Parts") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/plasticducky + name = "Rubber Ducky" + desc = "The classic Nanotrasen design for competitively priced bath based duck toys. No need for fancy Waffle co. rubber, buy Plastic Ducks today!" + id = "plasticducky" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 1000) + build_path = /obj/item/bikehorn/rubberducky/plasticducky + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +///////////////////////////////////////// +////////////Janitor Designs////////////// +///////////////////////////////////////// + +/datum/design/advmop + name = "Advanced Mop" + desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals." + id = "advmop" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2500, /datum/material/glass = 200) + build_path = /obj/item/mop/advanced + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/blutrash + name = "Trashbag of Holding" + desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." + id = "blutrash" + build_type = PROTOLATHE + materials = list(/datum/material/gold = 1500, /datum/material/uranium = 250, /datum/material/plasma = 1500) + build_path = /obj/item/storage/bag/trash/bluespace + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/buffer + name = "Floor Buffer Upgrade" + desc = "A floor buffer that can be attached to vehicular janicarts." + id = "buffer" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) + build_path = /obj/item/janiupgrade + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/spraybottle + name = "Spray Bottle" + desc = "A spray bottle, with an unscrewable top." + id = "spraybottle" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) + build_path = /obj/item/reagent_containers/spray + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/beartrap + name = "Bear Trap" + desc = "A trap used to catch space bears and other legged creatures." + id = "beartrap" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000) + build_path = /obj/item/restraints/legcuffs/beartrap + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +///////////////////////////////////////// +/////////////Holobarriers//////////////// +///////////////////////////////////////// + +/datum/design/holosign + name = "Holographic Sign Projector" + desc = "A holograpic projector used to project various warning signs." + id = "holosign" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + build_path = /obj/item/holosign_creator + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/holobarrier_jani + name = "Custodial Holobarrier Projector" + desc = "A holograpic projector used to project hard light wet floor barriers." + id = "holobarrier_jani" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/janibarrier + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + + +/datum/design/holosignsec + name = "Security Holobarrier Projector" + desc = "A holographic projector that creates holographic security barriers." + id = "holosignsec" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/security + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/holosignengi + name = "Engineering Holobarrier Projector" + desc = "A holographic projector that creates holographic engineering barriers." + id = "holosignengi" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/engineering + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/holosignatmos + name = "ATMOS Holofan Projector" + desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions." + id = "holosignatmos" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/atmos + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/holobarrier_med + name = "PENLITE Holobarrier Projector" + desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases." + build_type = PROTOLATHE + build_path = /obj/item/holosign_creator/medical + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease) + id = "holobarrier_med" + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +///////////////////////////////////////// +////////////////Armour/////////////////// +///////////////////////////////////////// + +/datum/design/reactive_armour + name = "Reactive Armour Shell" + desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user." + id = "reactive_armour" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 10000, /datum/material/diamond = 5000, /datum/material/uranium = 8000, /datum/material/silver = 4500, /datum/material/gold = 5000) + build_path = /obj/item/reactive_armour_shell + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/knight_armour + name = "Knight Armour" + desc = "A royal knight's favorite garments. Can be trimmed by any friendly person." + id = "knight_armour" + build_type = AUTOLATHE + materials = list(MAT_CATEGORY_RIGID = 10000) + build_path = /obj/item/clothing/suit/armor/riot/knight/greyscale + category = list("Imported") + +/datum/design/knight_helmet + name = "Knight Helmet" + desc = "A royal knight's favorite hat. If you hold it upside down it's actually a bucket." + id = "knight_helmet" + build_type = AUTOLATHE + materials = list(MAT_CATEGORY_RIGID = 5000) + build_path = /obj/item/clothing/head/helmet/knight/greyscale + category = list("Imported") + + + +///////////////////////////////////////// +/////////////Security//////////////////// +///////////////////////////////////////// + +/datum/design/seclite + name = "Seclite" + desc = "A robust flashlight used by security." + id = "seclite" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2500) + build_path = /obj/item/flashlight/seclite + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/detective_scanner + name = "Forensic Scanner" + desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." + id = "detective_scanner" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000) + build_path = /obj/item/detective_scanner + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/pepperspray + name = "Pepper Spray" + desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents." + id = "pepperspray" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000) + build_path = /obj/item/reagent_containers/spray/pepper/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/bola_energy + name = "Energy Bola" + desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." + id = "bola_energy" + build_type = PROTOLATHE + materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500) + build_path = /obj/item/restraints/legcuffs/bola/energy + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/zipties + name = "Zipties" + desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." + id = "zipties" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 250) + build_path = /obj/item/restraints/handcuffs/cable/zipties + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/evidencebag + name = "Evidence Bag" + desc = "An empty evidence bag." + id = "evidencebag" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 100) + build_path = /obj/item/evidencebag + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/plumbing_rcd + name = "Plumbing Constructor" + id = "plumbing_rcd" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500, /datum/material/plastic = 1000) + build_path = /obj/item/construction/plumbing + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 1a11e1ecdfa..208f562c12a 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -48,7 +48,7 @@ return var/datum/nanite_cloud_backup/backup = new(src) - var/datum/component/nanites/cloud_copy = new(backup) + var/datum/component/nanites/cloud_copy = backup.AddComponent(/datum/component/nanites) backup.cloud_id = cloud_id backup.nanites = cloud_copy investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES) @@ -213,7 +213,7 @@ var/datum/component/nanites/nanites = backup.nanites var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] var/datum/nanite_rule/rule = rule_template.make_rule(P) - + investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) . = TRUE if("remove_rule") @@ -224,7 +224,7 @@ var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] var/datum/nanite_rule/rule = P.rules[text2num(params["rule_id"])] rule.remove() - + investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) . = TRUE diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 4f5f80a4cfd..50ff6f4a846 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -170,14 +170,17 @@ if(timer_shutdown_next && world.time > timer_shutdown_next) deactivate() timer_shutdown_next = 0 + return if(timer_trigger && world.time > timer_trigger_next) trigger() timer_trigger_next = world.time + timer_trigger + return if(timer_trigger_delay_next && world.time > timer_trigger_delay_next) trigger(delayed = TRUE) timer_trigger_delay_next = 0 + return if(check_conditions() && consume_nanites(use_rate)) if(!passive_enabled) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 09e30d639cb..9f60ff84c69 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -65,7 +65,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", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medigel","genescanner", "med_spray_bottle", "chem_pack", "blood_pack", "medical_kiosk", "crewpinpointerprox") + design_ids = list("chem_heater", "chem_master", "chem_dispenser", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medigel","genescanner", "med_spray_bottle", "chem_pack", "blood_pack", "medical_kiosk", "crewpinpointerprox", "medipen_refiller") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -1087,6 +1087,17 @@ hidden = TRUE experimental = TRUE +/datum/techweb_node/rolling_table + id = "rolling_table" + display_name = "Advanced Wheel Applications" + description = "Adding wheels to things can lead to extremely beneficial outcomes." + prereq_ids = list("base") + design_ids = list("rolling_table") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + hidden = TRUE + experimental = TRUE + /datum/techweb_node/Mauna_Mug id = "mauna_mug" display_name = "Mauna Mug" @@ -1121,6 +1132,19 @@ hidden = TRUE experimental = TRUE +/datum/techweb_node/interrogation + id = "interrogation" + display_name = "Enhanced Interrogation Technology" + description = "By cross-referencing several declassified documents from past dictatorial regimes, we were able to develop an incredibly effective interrogation device. \ + Ethical concerns about loss of free will do not apply to criminals, according to galactic law." + prereq_ids = list("base") + design_ids = list("hypnochair") + + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + export_price = 3500 + hidden = TRUE + experimental = TRUE + //Helpers for debugging/balancing the techweb in its entirety! /proc/total_techweb_exports() var/list/datum/techweb_node/processing = list() diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 1fb17ea4d1f..3e15a818674 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -118,6 +118,9 @@ Slimecrossing Potions if(!istype(C)) to_chat(user, "The potion can only be used on clothing!") return + if(istype(C, /obj/item/clothing/suit/space)) + to_chat(user, "The [C] is already pressure-resistant!") + return ..() if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE) to_chat(user, "The [C] is already pressure-resistant!") return ..() diff --git a/code/modules/ruins/spaceruin_code/hellfactory.dm b/code/modules/ruins/spaceruin_code/hellfactory.dm new file mode 100644 index 00000000000..6f992fbff52 --- /dev/null +++ b/code/modules/ruins/spaceruin_code/hellfactory.dm @@ -0,0 +1,32 @@ +/obj/machinery/door/keycard/office + name = "management airlock" + desc = "The boss man gets the best stuff. Always and forever." + puzzle_id = "factory1" + +/obj/item/keycard/office + name = "management keycard" + desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'." + color = "#f05812" + puzzle_id = "factory1" + +/obj/machinery/door/keycard/stockroom + name = "stockroom airlock" + desc = "The boss man gets the best stuff. Always and forever." + puzzle_id = "factory2" + +/obj/item/keycard/stockroom + name = "stockroom keycard" + desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'." + color = "#1272f0" + puzzle_id = "factory2" + +/obj/machinery/door/keycard/entry + name = "secure airlock" + desc = "The boss man gets the best stuff. Always and forever." + puzzle_id = "factory3" + +/obj/item/keycard/entry + name = "secure keycard" + desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'." + color = "#12f049" + puzzle_id = "factory3" diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e9bdf785464..e532631a3af 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -704,7 +704,7 @@ if(timeleft > 1 HOURS) return "--:--" else if(timeleft > 0) - return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]" + return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" else return "00:00" diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 6f2513c9050..0cb92807c2b 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -33,7 +33,8 @@ . = ..() if(!proximity) return - user.say(catchphrase, forced = "spell") + if(catchphrase) + user.say(catchphrase, forced = "spell") playsound(get_turf(user), on_use_sound,50,TRUE) charges-- if(charges <= 0) diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm index 64739fa1339..244ec6ef630 100644 --- a/code/modules/surgery/advanced/bioware/ligament_hook.dm +++ b/code/modules/surgery/advanced/bioware/ligament_hook.dm @@ -16,7 +16,7 @@ name = "reshape ligaments" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start reshaping [target]'s ligaments into a hook-like shape.", diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm index ad483bd2be7..624306009b9 100644 --- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm +++ b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm @@ -16,7 +16,7 @@ name = "reinforce ligaments" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start reinforcing [target]'s ligaments.", diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm index 0ecec896b02..63f624d81f5 100644 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ b/code/modules/surgery/advanced/bioware/muscled_veins.dm @@ -15,7 +15,7 @@ name = "shape vein muscles" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/muscled_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start wrapping muscles around [target]'s circulatory system.", diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm index aec78edb080..a624422af0c 100644 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm @@ -15,7 +15,7 @@ name = "ground nerves" accept_hand = TRUE time = 155 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start rerouting [target]'s nerves.", diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm index 38be1a35174..f50d45dab67 100644 --- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm +++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm @@ -15,7 +15,7 @@ name = "splice nerves" accept_hand = TRUE time = 155 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start splicing together [target]'s nerves.", diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm index dd89dfa7a04..cf3fe0633a8 100644 --- a/code/modules/surgery/advanced/bioware/vein_threading.dm +++ b/code/modules/surgery/advanced/bioware/vein_threading.dm @@ -15,7 +15,7 @@ name = "thread veins" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start weaving [target]'s circulatory system.", diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index 37c4cc0acdb..ab2df4a5559 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -29,6 +29,7 @@ name = "brainwash" implements = list(TOOL_HEMOSTAT = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15) time = 200 + experience_given = MEDICAL_SKILL_ADVANCED var/objective /datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -39,7 +40,7 @@ "[user] begins to fix [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(!target.mind) to_chat(user, "[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...") return FALSE @@ -53,7 +54,7 @@ brainwash(target, objective) message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.") log_game("[key_name(user)] surgically brainwashed [key_name(target)] with the objective '[objective]'.") - return TRUE + return ..() /datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorganslot(ORGAN_SLOT_BRAIN)) diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm index 4ec56e046fa..fd02138a0cc 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -26,6 +26,7 @@ implements = list(TOOL_SCALPEL = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35, /obj/item/shard = 25, /obj/item = 20) time = 100 + experience_given = MEDICAL_SKILL_ADVANCED //lose XP if you end up giving them bad traumas /datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) @@ -37,7 +38,7 @@ "[user] begins to perform a lobotomy on [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in lobotomizing [target].", "[user] successfully lobotomizes [target]!", "[user] completes the surgery on [target]'s brain.") @@ -47,11 +48,14 @@ switch(rand(1,4))//Now let's see what hopefully-not-important part of the brain we cut off if(1) target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + experience_given = MEDICAL_SKILL_ADVANCED*0.9 if(2) target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) + experience_given = MEDICAL_SKILL_ADVANCED*0.8 if(3) target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - return TRUE + experience_given = MEDICAL_SKILL_ADVANCED*0.5 + return ..() /datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm index 495fe43d5bd..41f63b1a5f3 100644 --- a/code/modules/surgery/advanced/necrotic_revival.dm +++ b/code/modules/surgery/advanced/necrotic_revival.dm @@ -22,17 +22,18 @@ time = 50 chems_needed = list(/datum/reagent/toxin/zombiepowder, /datum/reagent/medicine/rezadone) require_all_chems = FALSE + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to grow a romerol tumor on [target]'s brain...", "[user] begins to tinker with [target]'s brain...", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in growing a romerol tumor on [target]'s brain.", "[user] successfully grows a romerol tumor on [target]'s brain!", "[user] completes the surgery on [target]'s brain.") if(!target.getorganslot(ORGAN_SLOT_ZOMBIE)) var/obj/item/organ/zombie_infection/ZI = new() ZI.Insert(target) - return TRUE + return ..() diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm index bb41b7176ea..ccbb6325183 100644 --- a/code/modules/surgery/advanced/pacification.dm +++ b/code/modules/surgery/advanced/pacification.dm @@ -22,18 +22,19 @@ name = "rewire brain" implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) time = 40 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to pacify [target]...", "[user] begins to fix [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in neurologically pacifying [target].", "[user] successfully fixes [target]'s brain!", "[user] completes the surgery on [target]'s brain.") target.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY) - return TRUE + return ..() /datum/surgery_step/pacify/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You screw up, rewiring [target]'s brain the wrong way around...", diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 3a1a8efcff4..815eaa93816 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -30,6 +30,7 @@ implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60) repeatable = TRUE time = 120 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) . = TRUE diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm index cf0b1cc3d7e..006ebc947ce 100644 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ b/code/modules/surgery/advanced/viral_bonding.dm @@ -23,6 +23,7 @@ implements = list(TOOL_CAUTERY = 100, TOOL_WELDER = 50, /obj/item = 30) // 30% success with any hot item. time = 100 chems_needed = list(/datum/reagent/medicine/spaceacillin,/datum/reagent/consumable/virus_food,/datum/reagent/toxin/formaldehyde) + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool) if(implement_type == TOOL_WELDER || implement_type == /obj/item) diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 27d3e622a3a..4d9827a52b5 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -11,7 +11,7 @@ name = "sever limb" implements = list(/obj/item/shears = 300, TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25) time = 64 - experience_given = 5 + experience_given = MEDICAL_SKILL_ORGAN_FIX /datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to sever [target]'s [parse_zone(target_zone)]...", diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index af8b3346b98..be09daf8ed0 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -38,7 +38,7 @@ target.mind.remove_antag_datum(/datum/antagonist/brainwashed) target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 50) //we set damage in this case in order to clear the "failing" flag var/cured_num = target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) - experience_given = 2*cured_num + experience_given = (MEDICAL_SKILL_EASY*2*cured_num) if(target.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) to_chat(user, "[target]'s brain looks like it could be fixed further.") return ..() diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 5fb613e16e5..ebe735278ee 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -50,7 +50,7 @@ name = "graft coronary bypass" implements = list(TOOL_HEMOSTAT = 90, TOOL_WIRECUTTER = 35, /obj/item/stack/packageWrap = 15, /obj/item/stack/cable_coil = 5) time = 90 - experience_given = 20 + experience_given = MEDICAL_SKILL_ORGAN_FIX /datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to graft a bypass onto [target]'s heart...", diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 26d6f76ae84..478877ed357 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -7,6 +7,7 @@ name = "insert pill" implements = list(/obj/item/reagent_containers/pill = 100) time = 16 + experience_given = (MEDICAL_SKILL_MEDIUM*0.4) //quick to do /datum/surgery_step/insert_pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to wedge [tool] in [target]'s [parse_zone(target_zone)]...", diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index f697d48fa83..491dfde8cf2 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -87,7 +87,7 @@ target.apply_damage(80, BRUTE, L) ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]") repeatable = FALSE - experience_given = 1+(points_earned/(BASE_HUMAN_REWARD/10))//if BHR = 500, 10 XP on base surgery + experience_given = max(points_earned/(BASE_HUMAN_REWARD/MEDICAL_SKILL_MEDIUM),1) return ..() /datum/surgery_step/dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index d50840291c2..40e9ceee34e 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -10,7 +10,7 @@ name = "fix eyes" implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25) time = 64 - experience_given = 5 + experience_given = (MEDICAL_SKILL_ORGAN_FIX*0.6) //repeatable and can be done at any damage /datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 6e8e3e18015..e6f58159f5f 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -1,4 +1,4 @@ -#define PER_ITERATION_XP_CAP 3 //TW XP gain scales with repeated iterations. +#define PER_ITERATION_XP_CAP MEDICAL_SKILL_MEDIUM //TW XP gain scales with repeated iterations so we cap it. /datum/surgery/healing steps = list(/datum/surgery_step/incise, @@ -28,7 +28,6 @@ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55) repeatable = TRUE time = 25 - experience_given = 1 //scales with repeated iterations var/brutehealing = 0 var/burnhealing = 0 var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! @@ -50,11 +49,11 @@ /datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) if(..()) - experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP) + experience_given = min(experience_given+1,PER_ITERATION_XP_CAP) while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss())) if(!..()) break - experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP) + experience_given = min(experience_given+1,PER_ITERATION_XP_CAP) /datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/umsg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons" diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index ed04b918f03..c55db698c67 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -24,7 +24,7 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 52 - experience_given = 10 + experience_given = (MEDICAL_SKILL_ORGAN_FIX*0.8) //repeatable so not as much xp /datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to cut out a damaged peice of [target]'s liver...", diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 2597464ea59..66658cf47a2 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -10,6 +10,7 @@ name = "extract implant" implements = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 65) time = 64 + experience_given = MEDICAL_SKILL_MEDIUM var/obj/item/implant/I = null /datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 1ba0464fa7e..db53ad47aea 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -8,7 +8,7 @@ name = "replace limb" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100) time = 32 - experience_given = 10 + experience_given = MEDICAL_SKILL_MEDIUM var/obj/item/bodypart/L = null // L because "limb" diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 3b164188fdc..2c3ea560cd2 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -14,7 +14,6 @@ name = "cut excess fat" implements = list(TOOL_SAW = 100, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) time = 64 - experience_given = 2 /datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...") @@ -48,7 +47,7 @@ var/removednutriment = target.nutrition target.set_nutrition(NUTRITION_LEVEL_WELL_FED) removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat - experience_given = (round(removednutriment/30)) + experience_given = (round(removednutriment/(MEDICAL_SKILL_EASY*5))) var/mob/living/carbon/human/H = target var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 156c1ab4913..6ca80fe13c7 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -18,7 +18,7 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 42 - experience_given = 10 + experience_given = MEDICAL_SKILL_ORGAN_FIX /datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to make an incision in [target]'s lungs...", diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index e02df6b395f..340236ccc22 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -67,7 +67,7 @@ /datum/surgery_step/manipulate_organs time = 64 name = "manipulate organs" - repeatable = 1 + repeatable = TRUE implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100) var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55) var/current_type diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 8196217ee4b..7768846ff7e 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -103,7 +103,7 @@ /datum/surgery_step/saw name = "saw bone" implements = list(TOOL_SAW = 100,/obj/item/melee/arm_blade = 75, - /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) + /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25, /obj/item = 20) //20% success (sort of) with any sharp item with a force>=10 time = 54 /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -111,7 +111,12 @@ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].", "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].") -/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/datum/surgery_step/saw/tool_check(mob/user, obj/item/tool) + if(implement_type == /obj/item && !(tool.get_sharpness() && (tool.force >= 10))) + return FALSE + return TRUE + +/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) target.apply_damage(50, BRUTE, "[target_zone]") display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.", "[user] saws [target]'s [parse_zone(target_zone)] open!", diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index dcb11a7b567..15a51392606 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -164,10 +164,10 @@ desc = "A sleek, sturdy box." icon_state = "cyber_implants" var/list/boxed = list( - /obj/item/autosurgeon/thermal_eyes, - /obj/item/autosurgeon/xray_eyes, - /obj/item/autosurgeon/anti_stun, - /obj/item/autosurgeon/reviver) + /obj/item/autosurgeon/syndicate/thermal_eyes, + /obj/item/autosurgeon/syndicate/xray_eyes, + /obj/item/autosurgeon/syndicate/anti_stun, + /obj/item/autosurgeon/syndicate/reviver) var/amount = 5 /obj/item/storage/box/cyber_implants/PopulateContents() diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index fe4e7965d21..13bb0fb46ee 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -12,6 +12,10 @@ var/uses = INFINITE var/starting_organ +/obj/item/autosurgeon/syndicate + name = "suspicious autosurgeon" + icon_state = "syndicate_autoimplanter" + /obj/item/autosurgeon/Initialize(mapload) . = ..() if(starting_organ) @@ -82,15 +86,19 @@ uses = 1 starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical +/obj/item/autosurgeon/syndicate/laser_arm + desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/cyberimp/arm/gun/laser -/obj/item/autosurgeon/thermal_eyes +/obj/item/autosurgeon/syndicate/thermal_eyes starting_organ = /obj/item/organ/eyes/robotic/thermals -/obj/item/autosurgeon/xray_eyes +/obj/item/autosurgeon/syndicate/xray_eyes starting_organ = /obj/item/organ/eyes/robotic/xray -/obj/item/autosurgeon/anti_stun +/obj/item/autosurgeon/syndicate/anti_stun starting_organ = /obj/item/organ/cyberimp/brain/anti_stun -/obj/item/autosurgeon/reviver +/obj/item/autosurgeon/syndicate/reviver starting_organ = /obj/item/organ/cyberimp/chest/reviver diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 135008f3f0b..0e64a08b349 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -8,7 +8,7 @@ name = "reshape face" implements = list(TOOL_SCALPEL = 100, /obj/item/kitchen/knife = 50, TOOL_WIRECUTTER = 35) time = 64 - experience_given = 5 + experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...") diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 5f262b40709..0b701d194fc 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -19,7 +19,7 @@ name = "add prosthetic" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100) time = 32 - experience_given = 5 //won't get full XP if rejected + experience_given = MEDICAL_SKILL_ORGAN_FIX //won't get full XP if rejected var/organ_rejection_dam = 0 /datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 30e08da31be..39f9bcfff54 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -8,7 +8,7 @@ name = "remove embedded objects" time = 32 accept_hand = 1 - experience_given = 5 + experience_given = MEDICAL_SKILL_MEDIUM var/obj/item/bodypart/L = null @@ -40,6 +40,7 @@ display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].", "[user] successfully removes [objects] objects from [H]'s [L]!", "[user] successfully removes [objects] objects from [H]'s [L]!") + experience_given = MEDICAL_SKILL_MEDIUM*(objects*0.75) else to_chat(user, "You find no objects embedded in [H]'s [L]!") diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm index 6e844940ce2..63bdfedff9d 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -11,6 +11,7 @@ possible_locs = list(BODY_ZONE_CHEST) requires_bodypart_type = TRUE ignore_clothes = FALSE + var/accumulated_experience = 0 /datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/stomach/S = target.getorganslot(ORGAN_SLOT_STOMACH) @@ -28,6 +29,7 @@ accept_hand = TRUE repeatable = TRUE time = 20 + experience_given = 0 /datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin pumping [target]'s stomach...", @@ -37,10 +39,16 @@ /datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(ishuman(target)) var/mob/living/carbon/human/H = target + var/reagents_volume_before_pump = H.reagents.total_volume display_results(user, target, "[user] forces [H] to vomit, cleansing their stomach of some chemicals!", "[user] forces [H] to vomit, cleansing their stomach of some chemicals!", "[user] forces [H] to vomit!") H.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge = TRUE) //called with purge as true to lose more reagents + if(istype(surgery,/datum/surgery/stomach_pump)) + var/datum/surgery/stomach_pump/stom_pump = surgery + if(stom_pump.accumulated_experience > MEDICAL_SKILL_MEDIUM*10) //capped so you can't dope bodies and purge for ezxp + experience_given = (H.reagents.total_volume - reagents_volume_before_pump)/(MEDICAL_SKILL_MEDIUM) + stom_pump.accumulated_experience += experience_given return ..() /datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 95507477c33..da43e384032 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -10,7 +10,7 @@ var/require_all_chems = TRUE //any on the list or all on the list? var/silicons_obey_prob = FALSE /// The amount of a experience given for successfully completing the step. - var/experience_given = 1 + var/experience_given = MEDICAL_SKILL_EASY /datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) var/success = FALSE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 16a2b156cf6..b5dafecf530 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -632,6 +632,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 10 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/stealthy_weapons/holster + name = "Syndicate Holster" + desc = "A useful little device that allows for inconspicuous carrying of guns using chameleon technology. It also allows for badass gun-spinning." + item = /obj/item/storage/belt/holster/chameleon + cost = 1 + // Ammunition /datum/uplink_item/ammo category = "Ammunition" @@ -841,10 +847,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 1 include_modes = list(/datum/game_mode/nuclear) -/datum/uplink_item/ammo/dark_gygax/bag - name = "Dark Gygax Ammo Bag" - desc = "A duffel bag containing ammo for three full reloads of the incendiary carbine and flash bang launcher that are equipped on a standard Dark Gygax exosuit." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax +/datum/uplink_item/ammo/mech/bag + name = "Mech Support Kit Bag" + desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." + item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech cost = 4 include_modes = list(/datum/game_mode/nuclear) @@ -1491,7 +1497,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/implants/antistun name = "CNS Rebooter Implant" desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon." - item = /obj/item/autosurgeon/anti_stun + item = /obj/item/autosurgeon/syndicate/anti_stun cost = 12 surplus = 0 include_modes = list(/datum/game_mode/nuclear) @@ -1532,7 +1538,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/implants/reviver name = "Reviver Implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." - item = /obj/item/autosurgeon/reviver + item = /obj/item/autosurgeon/syndicate/reviver cost = 8 surplus = 0 include_modes = list(/datum/game_mode/nuclear) @@ -1554,7 +1560,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/implants/thermals name = "Thermal Eyes" desc = "These cybernetic eyes will give you thermal vision. Comes with a free autosurgeon." - item = /obj/item/autosurgeon/thermal_eyes + item = /obj/item/autosurgeon/syndicate/thermal_eyes cost = 8 surplus = 0 include_modes = list(/datum/game_mode/nuclear) @@ -1572,7 +1578,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/implants/xray name = "X-ray Vision Implant" desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon." - item = /obj/item/autosurgeon/xray_eyes + item = /obj/item/autosurgeon/syndicate/xray_eyes cost = 10 surplus = 0 include_modes = list(/datum/game_mode/nuclear) @@ -1786,6 +1792,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/hug/reverse_revolver restricted_roles = list("Clown") +/datum/uplink_item/role_restricted/laser_arm + name = "Laser Arm Implant" + desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application." + cost = 10 + item = /obj/item/autosurgeon/syndicate/laser_arm + restricted_roles = list("Roboticist") + + // Pointless /datum/uplink_item/badass category = "(Pointless) Badassery" diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 97ed066420d..8344aa045f1 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -8,6 +8,13 @@ key_type = /obj/item/key/security integrity_failure = 0.5 + + + ///This stores a banana that, when used on the secway, prevents the vehicle from moving until it is removed. + var/obj/item/reagent_containers/food/snacks/grown/banana/eddie_murphy + ///When jammed with a banana, the secway will make a stalling sound. This stores the last time it made a sound to prevent spam. + var/stall_cooldown + /obj/vehicle/ridden/secway/Initialize() . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) @@ -36,8 +43,42 @@ if(obj_integrity == max_integrity) to_chat(user, "It looks to be fully repaired now.") return TRUE + + if(istype(W, /obj/item/reagent_containers/food/snacks/grown/banana)) + // ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now! + user.visible_message("[user] begins stuffing [W] into [src]'s tailpipe.", "You begin stuffing [W] into [src]'s tailpipe...", ignored_mobs = occupants) + if(do_after(user, 30, TRUE, src)) + if(user.transferItemToLoc(W, src)) + user.visible_message("[user] stuffs [W] into [src]'s tailpipe.", "You stuff [W] into [src]'s tailpipe.", ignored_mobs = occupants) + eddie_murphy = W + return TRUE return ..() +/obj/vehicle/ridden/secway/attack_hand(mob/living/user) + if(eddie_murphy) // v lol + user.visible_message("[user] begins cleaning [eddie_murphy] out of [src].", "You begin cleaning [eddie_murphy] out of [src]...") + if(do_after(user, 60, target = src)) + user.visible_message("[user] cleans [eddie_murphy] out of [src].", "You manage to get [eddie_murphy] out of [src].") + eddie_murphy.forceMove(drop_location()) + eddie_murphy = null + return + return ..() + +/obj/vehicle/ridden/secway/driver_move(mob/user, direction) + if(is_key(inserted_key) && eddie_murphy) + if(stall_cooldown + 10 < world.time) + visible_message("[src] sputters and refuses to move!") + playsound(src, "sound/effects/stall.ogg", 70) + stall_cooldown = world.time + return FALSE + return ..() + +/obj/vehicle/ridden/secway/examine(mob/user) + . = ..() + + if(eddie_murphy) + . += "Something appears to be stuck in its exhaust..." + /obj/vehicle/ridden/secway/obj_destruction() explosion(src, -1, 0, 2, 4, flame_range = 3) return ..() diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index dd5a4b325dc..0c611a273bf 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -71,7 +71,7 @@ if(A.density && has_buckled_mobs()) var/atom/throw_target = get_edge_target_turf(A, dir) if(crash_all) - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A AM.throw_at(throw_target, 4, 3) visible_message("[src] crashes into [A]!") diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index d75c4426559..da517e4ff7f 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -114,7 +114,6 @@ /obj/item/clothing/head/cueball = 1, /obj/item/clothing/under/suit/white_on_white = 1, /obj/item/clothing/under/costume/sailor = 1, - /obj/item/clothing/ears/headphones = 2, /obj/item/clothing/head/delinquent = 1, /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/head/shrine_wig = 1, @@ -126,7 +125,7 @@ /obj/item/gohei = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, - /obj/item/gun/magic/wand = 2, + /obj/item/gun/magic/wand/nothing = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 45867d5ec02..504a3572f8c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -46,7 +46,6 @@ /obj/item/storage/belt/fannypack = 3, /obj/item/storage/belt/fannypack/blue = 3, /obj/item/storage/belt/fannypack/red = 3, - /obj/item/clothing/ears/headphones = 2, /obj/item/clothing/under/misc/overalls = 2, /obj/item/clothing/under/pants/jeans = 2, /obj/item/clothing/under/pants/classicjeans = 2, @@ -127,7 +126,7 @@ /obj/item/clothing/under/pants/mustangjeans = 1, /obj/item/clothing/neck/necklace/dope = 3, /obj/item/clothing/suit/jacket/letterman_nanotrasen = 1, - /obj/item/clothing/ears/earmuffs/spacepods = 1) + /obj/item/instrument/piano_synth/headphones/spacepods = 1) refill_canister = /obj/item/vending_refill/clothing default_price = 60 extra_price = 120 diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index ebc14a74e46..24a4744a7ec 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -8,6 +8,7 @@ /obj/item/toy/cards/deck/cas = 3, /obj/item/toy/cards/deck/cas/black = 3, /obj/item/hourglass = 2, + /obj/item/instrument/piano_synth/headphones = 4, /obj/item/camera = 3) contraband = list(/obj/item/dice/fudge = 9) premium = list(/obj/item/melee/skateboard/pro = 3, diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 4b76ce03d1b..cf574c2fda6 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -36,7 +36,8 @@ /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2, /obj/item/storage/firstaid/advanced = 2, - /obj/item/shears = 1) + /obj/item/shears = 1, + /obj/item/plunger/reinforced = 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 diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e4ef90ff75b..51446c8c980 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -283,6 +283,7 @@ /obj/item/clothing/under/rank/civilian/janitor/skirt = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, + /obj/item/twohanded/broom = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, diff --git a/config/config.txt b/config/config.txt index 4cd17022a6a..d61d9b0f4a6 100644 --- a/config/config.txt +++ b/config/config.txt @@ -381,12 +381,6 @@ MAPROTATION ## When it's set to zero, the map will be randomly picked each round PREFERENCE_MAP_VOTING 1 -## Map rotate chance delta -## This is the chance of map rotation factored to the round length. -## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) -## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) -#MAPROTATIONCHANCEDELTA 0.75 - ## AUTOADMIN ## The default admin rank AUTOADMIN_RANK Game Master diff --git a/config/game_options.txt b/config/game_options.txt index 91b406be709..2e555cef8d0 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -249,6 +249,9 @@ MAX_TICKETS_PER_ROLL 100 ## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype. #SHOW_GAME_TYPE_ODDS +## Uncomment to prevent the nuclear operative leader from getting the war declaration item +#DISABLE_WAROPS + ## Uncomment to enable dynamic ruleset config file. DYNAMIC_CONFIG_ENABLED @@ -566,5 +569,8 @@ MONKEYCAP 64 ## A cap on how many mice can be bred via cheese wedges RATCAP 64 +## Maximum fine for a citation +MAXFINE 2000 + ## Enable the capitalist agenda on your server. ECONOMY diff --git a/dependencies.sh b/dependencies.sh index 488504b2887..4a950af3146 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -23,4 +23,4 @@ export NODE_VERSION=12 export PHP_VERSION=5.6 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.2 +export SPACEMAN_DMM_VERSION=suite-1.3 diff --git a/html/changelog.html b/html/changelog.html index 4775b242e2a..6dfe744a0c3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,537 @@ -->
    +

    19 February 2020

    +

    ATHATH updated:

    +
      +
    • All sharp items that have a force greater than or equal to 10 can be used to perform the saw bone surgery step with ghetto surgery, but they'll have a low success rate/step speed when doing so.
    • +
    • The biogenerator can now produce soy milk.
    • +
    +

    ArcaneMusic updated:

    +
      +
    • A new space ruin has been located in your sector. The previous owners have dubbed the place "The Hell Factory", despite the region being designated as an alcohol bottling facility.
    • +
    • Fixes accidentally reverting the puzzles/trapmaking tools PR.
    • +
    • The Syndicate has recently begun targeting a recently declassified piece of Nanotrasen hardware, the blackbox, located within the blackbox recorder on each station's telecommunication's array.
    • +
    • Human organs can once again be sold on the black market.
    • +
    +

    Arkatos updated:

    +
      +
    • Added broken chameleon belt to the broken chameleon kit.
    • +
    • Radioactive Microlaser now uses tgui.
    • +
    +

    Bokkiewokkie updated:

    +
      +
    • Fixes writing being on paper bags and some ammo boxes
    • +
    +

    Buggy123 updated:

    +
      +
    • fuck
    • +
    +

    Capsandi updated:

    +
      +
    • added a new mortar sprite
    • +
    +

    Dennok updated:

    +
      +
    • Now MultiZ Debug connected to neighbor space, in strange way.
    • +
    +

    EOBGames updated:

    +
      +
    • A few minor map fixes.
    • +
    • There's now enough medhuds in storage for everyone in med (except you, chemists).
    • +
    +

    Fikou updated:

    +
      +
    • glockroach
    • +
    • You can now choose your name and color as a holoparasite/guardian/holocarp!
    • +
    • Miner holoparasites are now hivelords!
    • +
    • fixes lings being able to get mechanical holoparasites
    • +
    +

    Iamgoofball updated:

    +
      +
    • You son of a bitch! I'm in.
    • +
    +

    Improvedname & JustRandomGuy updated:

    +
      +
    • Adds the syndicate laserarm implant to roboticist traitors
    • +
    • Syndicate implants now come in a suspicous autosurgeon
    • +
    +

    JAremko updated:

    +
      +
    • Added pyroclastic anomaly slime policy key
    • +
    • Fixed anomaly slime role
    • +
    • Now anomaly slimes can reproduce like other slimes do
    • +
    +

    JDawg1290 updated:

    +
      +
    • mech construction refactored
    • +
    +

    JJRcop updated:

    +
      +
    • Stasis now supports multiple sources.
    • +
    +

    Mickyan updated:

    +
      +
    • Added the broom. For sweeping.
    • +
    • Tweaked paramedic loadout, moved pinpointer to medical belt, moved medipen to suit storage
    • +
    • Cleaning messes with the mop and soap now correctly awards cleaning experience
    • +
    +

    NecromancerAnne and Kyrsonism updated:

    +
      +
    • Redid the claymore sprites to look a little better.
    • +
    +

    NikNak updated:

    +
      +
    • The powercrepe has been buffed
    • +
    +

    RaveRadbury updated:

    +
      +
    • Bottles and Flasks provide 5u on every gulp.
    • +
    +

    Skoglol updated:

    +
      +
    • Forced a basic keybind reset for everyone to fix some inconsistencies from various savefiles, as well as making the hotkey/classic toggle in game options work. Your emote keybinds should be untouched.
    • +
    +

    TheVekter updated:

    +
      +
    • Added the Vibebot
    • +
    +

    Thunder12345 updated:

    +
      +
    • Cult sacrifice objective now tells you to use Offer instead of a non-existent Sacrifice rune
    • +
    • Added missing attached tank sprites for TTVs
    • +
    +

    Time-Green updated:

    +
      +
    • Adds geysers to lavaland! They can be activated by using a reinforced plunger found in the medical vendor. They can be harvested by using a new plumbing device, magically powered liquid pumps!
    • +
    • Adds Hollow Water to geysers, wich can be combined with Holy Water as catalyst for more Holy Water
    • +
    • Adds Protozine to geyers, a very weak version of Omnizine. Can be used in Strange Reagent mixing
    • +
    • Adds Wittel, a very rare geyser chem. Can be processed into gravitum, wich removes gravity. Can also be processed into metalgen, wich has a strange tendency to transform objects into the imprinted material.
    • +
    +

    XDTM updated:

    +
      +
    • Added a new special brain trauma, Quantum Alignment.
    • +
    • Added the Enhanced Interrogation Chamber as a BEPIS researchable tech.
    • +
    • The EIC can be used to implant trigger phrases in subjects that cause an instant hypnotic trance.
    • +
    +

    cacogen updated:

    +
      +
    • RCD can now deconstruct airlock assemblies and firelock frames
    • +
    • Stun batons now respect shields again (e.g. riot shields, the wizard's shielded hardsuit)
    • +
    • Stun baton attacks that should've been stopped by clumsiness no longer go through
    • +
    +

    itseasytosee updated:

    +
      +
    • Having a holster now allows you to flip a gun on your fingers. Use in hand. If you want to eject your bullets repeat
    • +
    • The syndicate chameleon holster. Costs 1 tc and can be made to look like any belt. Stores all your fun shooty sticks
    • +
    • Operative holster, a free alternative to tactical webbing for storing two guns in a belt slot instead of alot of small items.
    • +
    • New drink! The Hivemind eraser. Can be made with two parts black Russian one part thirteen-loko and one part grenadine.
    • +
    +

    necromanceranne updated:

    +
      +
    • Removes the stun from Krav Maga and makes it a high duration knockdown with stamina damage (20-30), respecting chest armor for the damage.
    • +
    • Disarm intent is now a nonlethal jab that does (5-10) stamina damage. If used on people who are prone, it does (10-15) stamina damage. It also has a chance to completely disarm someone based on the amount of stamina damage they have.
    • +
    • Krav Maga harm stomps/punches now respect armor and have a variance of (5-10) for punches and (5-10+5) for stomps.
    • +
    +

    nightred updated:

    +
      +
    • Turn night mode off or on when the APC is locked
    • +
    • space suit turns off properly when there is no cell inserted
    • +
    • space ninja can now turn on the heater in the suit
    • +
    • space ninja can recharge properly
    • +
    • space suit now uses the cell as intended
    • +
    +

    plapatin updated:

    +
      +
    • Nanotrasen-brand spacepods can play music just like headphones now.
    • +
    +

    stylemistake updated:

    +
      +
    • Removed tgui
    • +
    • tgui-next is now the new tgui
    • +
    • Updated "interface not found" screen.
    • +
    +

    wesoda25 updated:

    +
      +
    • Gondola Asteroid is grassy now, also has some puddles
    • +
    +

    with thanks to HugBug and Buggy for helping with bug-squashing updated:

    +
      +
    • The effect of gas comp will now spin up and down, rather then jumping. Play around, don't break anything.
    • +
    • Fixed low pressure hell SMs
    • +
    • Allows var editing of SM gas rad effects
    • +
    +

    yeeyeh updated:

    +
      +
    • Nanotrasen's research division's recent science fair has given light to an amazing, electrically-insulated compound that can be sprayed directly onto the skin. The initial idea was for footwear, but we all know what you're really going to do with it. Research can be continued at your station's B.E.P.I.S. unit.
    • +
    + +

    15 February 2020

    +

    BadSS13Player updated:

    +
      +
    • The Exosuit Fabricator's sync with R&D operation is now instant.
    • +
    +

    Buggy123 updated:

    +
      +
    • Random mineral turfs no longer cause large amounts of turf changes on initialization.
    • +
    +

    Cobby updated:

    +
      +
    • Buffs Surgery XP values
    • +
    +

    Krysonism updated:

    +
      +
    • The Cosa Nostra starter pack has been added to cargo as a contraband crate.
    • +
    • Added pictures of the virgin mary, burning one of these will let you pick a mafia nickname.
    • +
    • The beige suit, beige fedora and white fedora clothing items have been added to the game.
    • +
    • The non-job fedoras and the white suit have been resprited.
    • +
    +

    Skoglol updated:

    +
      +
    • Unhusking someone with synthflesh will no longer tell everyone they were the one to fix the corpse.
    • +
    +

    XDTM updated:

    +
      +
    • Fixed nanite shutdown timer not properly shutting down nanites.
    • +
    +

    actioninja updated:

    +
      +
    • tgui-next for NTOS: AI restorer, File Manager, NetDOS, Net Monitor, and Revelation
    • +
    • Creation of TXT Files on modular computer has been indefinitely removed
    • +
    • Due to architecture concerns, NTNet Transfer has been indefinitely removed from NTOS hardware.
    • +
    +

    nianjiilical updated:

    +
      +
    • Some weird shit happened in space, and now Ethereals are appearing in new colors. Scientists are baffled.
    • +
    +

    nightred updated:

    +
      +
    • Space Suits warm the wearer, and use Cells
    • +
    • Suit Storage charges Space Suits
    • +
    • EMP's cause Hard Suit's to burn the wearer
    • +
    • Engineering now has emp proof cells with the suits
    • +
    • Hud status for space suit power level
    • +
    • ERT hardsuits get EMP protection AND ONLY THEM
    • +
    + +

    14 February 2020

    +

    Arkatos updated:

    +
      +
    • Infrared emitter now uses tgui-next.
    • +
    • Proximity sensor now uses tgui-next.
    • +
    • Geneticist now uses science selection color in the preferences menu.
    • +
    +

    Capsandi updated:

    +
      +
    • Fixed grammar in death-nettle attack and pickup messages
    • +
    +

    EOBGames updated:

    +
      +
    • The Lavaland Gulag has been rebuilt following repeated complaints about 'human rights violations'.
    • +
    • A hawaiian shirt, currently only in the beach bum ruin.
    • +
    • Fixed a couple of issues with the beach bum ruin.
    • +
    +

    Fikou updated:

    +
      +
    • the nuke op leader having access to the war declaration item is now a config
    • +
    +

    Mickyan updated:

    +
      +
    • Headphones can now play custom music
    • +
    • Moved headphones to the games vendor in the library
    • +
    • Added support for instruments with custom effects triggered by playing
    • +
    +

    Putnam and ninjanomnom updated:

    +
      +
    • Radioactive contamination now has a limited amount of material to be used to contaminate things.
    • +
    +

    Ryll/Shaps updated:

    +
      +
    • You can now sabotage secways by stuffing a banana in their tailpipe.
    • +
    +

    actioninja updated:

    +
      +
    • Traitor Uplink buy buttons properly disable when you don't have enough TC again
    • +
    +

    cacogen updated:

    +
      +
    • Soil no longer renames itself hydroponics tray while something is planted in it
    • +
    • Hydroponics planter names will update when weeds are mutated
    • +
    • Planters no longer change description to match that of what's planted in them
    • +
    +

    necromanceranne updated:

    +
      +
    • A mech support bag.
    • +
    • Combat wrench.
    • +
    • Made the dark gygax significantly better by adjusting equipment and stats.
    • +
    +

    nemvar updated:

    +
      +
    • Replaced the effect of the "two left feet" mutation with random knockdowns while moving.
    • +
    + +

    13 February 2020

    +

    Arkatos updated:

    +
      +
    • HUDs for various simple mobs are now cleaner and consistent with each other.
    • +
    +

    Buggy123 updated:

    +
      +
    • Beware! The Syndicate have upgraded their stolen teleportation machinery, they are now capable of providing reinforcements to their elite operatives nearly anywhere, even in the middle of combat! Not that that would be wise, to say the least.
    • +
    +

    Dennok updated:

    +
      +
    • After rigorous training, Nanotrasen zoologists have observed a rise in the level of effectiveness with which non-sentient monkeys utilise certain hand-to-hand weapons.
    • +
    +

    Denton updated:

    +
      +
    • Moved duplicate CID/IP logging from log_access to log_admin_private.
    • +
    +

    Dingo-Dongler updated:

    +
      +
    • Examining people with sechuds will let you give someone an on the spot citation.
    • +
    +

    MMMiracles updated:

    +
      +
    • Multi-Z power relays can repaired but must be manually updated with a multi-tool when reinstalling/moving around.
    • +
    +

    PKPenguin321 updated:

    +
      +
    • Salt piles now get kicked around and eventually scattered to the wind when ran over too much.
    • +
    +

    Skoglol updated:

    +
      +
    • Initial ahelps are now multiline too.
    • +
    • Contractor tablet should now properly let you shop for rep.
    • +
    +

    Tlaltecuhtli updated:

    +
      +
    • adds medipen refiller machine
    • +
    +

    cacogen updated:

    +
      +
    • Swapped positions of Meta Morgue and chem factory
    • +
    • Resized the space now taken up by Meta chem factory to be slightly larger
    • +
    • Made Meta Morgue smaller
    • +
    • Moved Meta maint bar above the new Morgue where rest of the chem factory was
    • +
    • Moved Meta medbay alcove with NanoMed to opposite side of hall
    • +
    • Moved Meta Medical Surplus Storeroom above Virology, off maint across from alcove
    • +
    • Two new Meta maint Storage Rooms beneath robotics
    • +
    • Unanchored solar assemblies go off-centre to indicate they need securing. Secured ones centre themselves
    • +
    +

    ike709 updated:

    +
      +
    • Taking pictures of openspace turfs works now.
    • +
    +

    itseasytosee updated:

    +
      +
    • atmos helmets now properly protect you from pepper spray and face-huggers.
    • +
    +

    nemvar updated:

    +
      +
    • Fixed an issue where unstable people could regain sanity.
    • +
    +

    nightred updated:

    +
      +
    • Hugs are warm now
    • +
    • natural_bodytemperature_stabilization is now self contained.
    • +
    • adjust_bodytemperature to allow the use of insulation and change steps
    • +
    + +

    11 February 2020

    +

    ArcaneMusic updated:

    +
      +
    • Nanotrasen's research division has gone ahead and scratched all possible plans of building new sleepers for the station, due to the discovery of old sleepers injecting crew with lead acetate.
    • +
    • In unrelated news, the research division is proud to announce the all new, "party pods"! Available at your local station B.E.P.I.S. platform as a minor reward.
    • +
    • Wooden Plank Floors no longer runtime.
    • +
    +

    Arkatos updated:

    +
      +
    • Mining Vendor now uses tgui-next.
    • +
    +

    Bokkiewokkie updated:

    +
      +
    • adds box icons for tons of boxes.
    • +
    • changes the toy and shotgun ammo boxes so they're in the new art style.
    • +
    +

    Cloneby updated:

    +
      +
    • Strange Reagent now requires a set amount to revive dependent on patient wellbeing and requires an excess to heal blood and organs. Does more damage on life. Basically loses one-click wonder status UNLESS you give a considerable amount and deal with the consequences.
    • +
    +

    Coconutwarrior97 updated:

    +
      +
    • Fixes meta armory external camera by naming it properly.
    • +
    • AI can use the carp hologram again.
    • +
    • Fixes a typo in mind.dm .
    • +
    +

    Dennok updated:

    +
      +
    • Now nanites don't die from illusions and placing unpowered cable by bare hands.
    • +
    • Now MultiZ Debug map has open space under floor instead of space.
    • +
    +

    Denton updated:

    +
      +
    • Constructed display cases no longer spawn with an alarm that bolts all nearby doors.
    • +
    +

    EOBGames updated:

    +
      +
    • The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch some waves, brah!
    • +
    • Fixed a few minor map problems.
    • +
    +

    Fikou updated:

    +
      +
    • You can now make lassos with a bone and 5 sinew and make saddles from 5 leather sheets, you can also tame goliaths with lavaland food (I think you know what those 3 things mean together)
    • +
    • xenos now keep their name consistent through evolutions
    • +
    • fixes humanoid xeno numbers being 0
    • +
    • royal xenos also get numbers
    • +
    +

    JJRcop updated:

    +
      +
    • Defibs and Defibbing Nanites act the same way again.
    • +
    • Fixed removing brains from changeling husks.
    • +
    +

    Krysonism updated:

    +
      +
    • 4 new ice creams created using the crafting menu,
    • +
    • You can now make popsicle sticks by sticking logs in the processor.
    • +
    +

    Mickyan updated:

    +
      +
    • Blood dripping frequency now scales with blood loss
    • +
    • Fixed blood decals occasionally containing more blood than they should
    • +
    • The Delta Station stasis room has received a makeover
    • +
    +

    NoxVS updated:

    +
      +
    • Nanotrasen has properly relabeled all cyborg limbs following their rediscovery of which direction is left and which is right
    • +
    +

    OnlineGirlfriend updated:

    +
      +
    • crushed can sprite for Sol Dry
    • +
    • Sol Dry cans can be crushed
    • +
    • salami filling color
    • +
    • salami taste
    • +
    +

    Qustinnus updated:

    +
      +
    • there is now an edible component which will allow us to deprecate our hacky methods of making things such as organs edible
    • +
    +

    RaveRadbury updated:

    +
      +
    • Removed latejoin prisoner option
    • +
    +

    ShizCalev updated:

    +
      +
    • Emitters will now remain anchored when being constructed from an anchored machine frame.
    • +
    • Emitters will now properly turn off and be unwelded if unanchored via varediting.
    • +
    • Unanchored emitters will no longer be pulled towards non-harmful simple animals (ie butterflies, cats, ect) if they click on them.
    • +
    • Fixed a scenario where emitters could start welded and be turned on, but were not properly anchored to the ground.
    • +
    • Fixed a scenario where emitters could start anchored to the ground, but had to be resecured with a wrench to get them to work properly.
    • +
    • Emitters now properly use the anchored var. The state var has been renamed to welded, and only tracks welded status.
    • +
    • The anchored emitter map subtype has been changed to a fully welded one, since all utilized instances were editted to be welded as well anyway.
    • +
    • Added a bit more examine feedback to emitters.
    • +
    • Emitters will now show how often they fire a little more accurately.
    • +
    • Attacking the Supermatter crystal with a NODROP item (ie cyborgs with literally any item, ninjas, highlanders, ect) will now dust the user.
    • +
    • Fixed spell books becoming unreadable if you moved while reading them.
    • +
    • Fixed progress bars not showing up for spell books.
    • +
    • Fixed an exploit where spell books didn't always have to be in your hand to finish reading them.
    • +
    +

    Skoglol updated:

    +
      +
    • Removes cloning from the codebase. Cloning rooms have been converted to temporary wards and storage. Experimental cloner and its ruin is also gone.
    • +
    • Replica pod seed availability reduced. No longer available in megaseed vendors, seed crate contains one seed down from three. Mutate some cabbages if you want these.
    • +
    • Say should be less likely to break when under heavy server strain.
    • +
    • Brain death is no longer a thing, no arbitrary unhealable death. Uses organ damage like the rest.
    • +
    • Brains can now be attacked again.
    • +
    • Brains no longer report you SSD if you are in the brain and not ghosted out.
    • +
    • Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, instead of a flat 10 damage for any amount over 10 units.
    • +
    • Defib faliure feedback is now more clear and hints at how to fix it.
    • +
    • Defibs now force the ghost back.
    • +
    • Improved brain feedback, no longer reports SSD.
    • +
    • Stomach pump and brain surgery are now repeatable surgeries.
    • +
    • Removed some forgotten references to defib time of death restrictions.
    • +
    • Beakers should no longer nullspace when quick swapped or alt clicked out of certain pieces of machinery.
    • +
    • Traitor adrenals buffed slightly. Now removes knockdown on activation, increases speed slightly more and has no oxyloss damage.
    • +
    • Changeling adrenals now last 20 seconds, up from 15 seconds.
    • +
    • Dynamic revs runtime and infinite loss announcement fixed.
    • +
    +

    SteelSlayer updated:

    +
      +
    • Adds the dunkable element. Converts items who were using the dunkable var to instead use this element and removes the dunkable var.
    • +
    • Adds a new "DUNKABLE" reagent flag for reagent containers. This determines whether or not the container can have items dunked into it.
    • +
    +

    TheChosenEvilOne updated:

    +
      +
    • Foamy beer stationwide event works again.
    • +
    +

    Thebleh updated:

    +
      +
    • Bodies with souls show the defib icon on medhuds.
    • +
    +

    Tlaltecuhtli updated:

    +
      +
    • grinder chem not grinding
    • +
    • dir of grinder chem
    • +
    +

    Vondiech updated:

    +
      +
    • There is no longer a light fixture attached to an airlock in the Experimentation Lab on Metastation.
    • +
    +

    armhulen fikou gang updated:

    +
      +
    • a lot of >32x32 mobs now have icons for their health dolls
    • +
    +

    cacogen updated:

    +
      +
    • The abductor baton is now a child of the regular stun baton. There shouldn't be a functional difference.
    • +
    • You need to be an abductor to change baton modes. Seemed like an oversight
    • +
    • Fixes some typos in the abductor baton's messages
    • +
    • Both regular stun baton and abductor baton have had a lot of vars exposed pertaining to their functionality so that could come in handy I guess
    • +
    • Cybernetic implant readouts on medHUD and health analyzer are more compact and show an icon of each
    • +
    +

    improvedname updated:

    +
      +
    • Chamkits now include an chameleon belt
    • +
    +

    imsxz updated:

    +
      +
    • skateboards now buckle you after activating them in hand.
    • +
    +

    itseasytosee updated:

    +
      +
    • Three more toys to find in your local arcade cabinet! Squeaky brain, trick blindfold, and a broken radio. Collect em all!
    • +
    • Plasmamen prisoners now use the proper helmet sprite.
    • +
    • Pacifists can now use the wand of nothing.
    • +
    • Shotgun in hands are no longer broken.
    • +
    • An ancient recipe for the ultimate soap can be had by janitors that carry family heirlooms and those who crawl maintenance.
    • +
    +

    nightred updated:

    +
      +
    • plastic water bottles can now spash
    • +
    • plastic water bottle caps render properly the first time
    • +
    • Fixes pulling button location on simple mobs
    • +
    • Polymorph kicks AI's out of shells
    • +
    • Changed custom material output on examine to be on a single line
    • +
    +

    optimumtact updated:

    +
      +
    • lawyer's department backpack... is a backpack again
    • +
    +

    peoplearestrange updated:

    +
      +
    • Removed Special Verbs Tab
    • +
    • New admin button Tabs
    • +
    +

    wesoda25 updated:

    +
      +
    • You will now cough if you have lung damage (no stun).
    • +
    +

    zxaber updated:

    +
      +
    • It is now possible to use an actual defibrillator unit as a stand-in for the borg defib upgrade, allowing medical borgs to revive crew without cloning at shift start.
    • +
    • Borgs now get a message when receiving any upgrade.
    • +
    +

    02 February 2020

    AffectedArc07 updated:

      @@ -1324,160 +1855,6 @@
      • Added logging for when an Exosuit Console is used to EMP a mech.
      - -

      07 December 2019

      -

      Arkatos updated:

      -
        -
      • Gravity Generator now uses tgui-next UI.
      • -
      -

      Denton updated:

      -
        -
      • Added an (admin only) amputation arcade subtype that dispenses wrapped gifts instead of arcade prizes.
      • -
      -

      EdgeLordExe updated:

      -
        -
      • New room: Medbay Clinic , found in between lobby and mebday 'proper' on metastation
      • -
      • Removed the office near medbay entrance
      • -
      • Increased the size of security office in medbay del:public chem fridge removed, as the old 'private' one is in now public area
      • -
      -

      Firecage updated:

      -
        -
      • Updates the energy resistance armour values on several armours and helmets.
      • -
      • Absolute pathing inserted into timsorts.
      • -
      -

      Krysonism updated:

      -
        -
      • Several new burgers.
      • -
      • Fiesta skewer, corn chips & chicken meat.
      • -
      • some old burger sprites have been replaced.
      • -
      • The ghost burger is much spookier.
      • -
      • some burger recipes have been tweaked.
      • -
      -

      PepperPrepper updated:

      -
        -
      • Nightmares/Shadowpeople can be flashed
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • Adds a new admin punishment, full immersion! Full immersion means having to manually *blink, *inhale, and *exhale, or else! Are you having fun yet?
      • -
      -

      Skoglol updated:

      -
        -
      • The "Start Now" verb can now be cancelled by using it again or setting a custom pre-game delay.
      • -
      • tgui-next: Meteor shield controller
      • -
      • Mindswap no longer force ghosts the target.
      • -
      -

      TheVekter updated:

      -
        -
      • Converted the smoke machine over to tgui-next.
      • -
      -

      Tlaltecuhtli updated:

      -
        -
      • plumbing machine to grind/juice objects and put it on duct net
      • -
      -

      actioninja updated:

      -
        -
      • Glide size now scales with movespeed. 60 fps won't jitter your camera around and slower moving mobs will appear to actually be slower.
      • -
      • 60 fps is now the client default
      • -
      • research director id properly gets overlays
      • -
      • Nanite extra settings display a bit better on the cloud controller
      • -
      • Boolean extra settings on nanites function properly
      • -
      • Extra settings on nanites copy properly instead of copying a literal ref
      • -
      -

      stylemistake updated:

      -
        -
      • Fixed recipe button layout in Chem Dispenser.
      • -
      • Fixed the icon on the "Save" button in Chem Dispenser.
      • -
      • ChemMaster no longer rounds volume of chemicals, allowing to package 0.1 unit pills.
      • -
      • Air Alarm layout will no longer jump around when microscopic amounts of gases are present (less than 0.01%).
      • -
      - -

      03 December 2019

      -

      Bumtickley00 updated:

      -
        -
      • Buffed granibitaluri to be a better top-off healer
      • -
      • Changed granibitaluri's recipe to be easier to make
      • -
      -

      Couls updated:

      -
        -
      • Birdboat can eat anything with plastic, but he'll choke on it! Keep him away from plastic.
      • -
      • (admin-spawned) mysterious water bottles now correctly have random reagent contents and show markings without runtiming
      • -
      -

      Firecage updated:

      -
        -
      • Mining Cyborgs are now able to choose which icon they want upon picking their module. Either the Lavaland Mining Cyborg icon, the Asteroid Mining Cyborg icon, or the Spider Mining Cyborg icon.
      • -
      • Mining Cyborg Lavaproof Tracks upgrade is renamed to Mining Cyborg Lavaproof Chassis.
      • -
      • Dead Goliath Broodmother no longer constantly spawns tentacles around them.
      • -
      • Mobs which can metabolize reagents can now properly metabolize crayon powder.
      • -
      -

      GuillaumePrata updated:

      -
        -
      • The pimpin ride hook now holds the trashbag open for easier trash disposal.
      • -
      -

      Indie-ana Jones updated:

      -
        -
      • Xenobiologists have noted a change in results from the gold slime core's reaction. Creatures previously thought to be useless are also notably more unique than before.
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
      • -
      -

      Skoglol updated:

      -
        -
      • Bureaucratic error event has new effects!
      • -
      • Admins can now pick solo abductor in traitor panel.
      • -
      • Ian has found a comfier spawnpoint on metastation.
      • -
      -

      TheVekter updated:

      -
        -
      • Reworked the entrance to Engineering on PubbyStation to give Atmos techs access to the techfab on non-skeleton shift rounds.
      • -
      -

      actioninja updated:

      -
        -
      • All nanite interfaces have been completely reworked for tgui-next
      • -
      • Plumbing Reaction Chamber uses tgui-next
      • -
      • A couple of the other plumbing uis now use the Input component of tgui-next instead of having popup windows
      • -
      • fixes some drinks such as lizard wine being uncraftable
      • -
      -

      bobbahbrown updated:

      -
        -
      • References to IRC now better describe TGS' and Discord's existence.
      • -
      • Players will now be better informed that messages are sent through TGS to IRC/Discord/etc when attempting to adminhelp with no available admins/use adminwho verb.
      • -
      -

      fludd12 updated:

      -
        -
      • The pestle for the mortar and pestle now needs metal to craft, not plasteel.
      • -
      • The mortar and pestle can now grind food and such.
      • -
      -

      nemvar updated:

      -
        -
      • Wormhole jaunters work again.
      • -
      -

      nightred updated:

      -
        -
      • Scanner Gate uses TGUI-NEXT now
      • -
      -

      oranges updated:

      -
        -
      • Budget payouts are gone
      • -
      • Felinids no longer react to cocoa
      • -
      -

      plapatin updated:

      -
        -
      • adds glockroaches, try getting them from gold slime reactions. if that guy from event hall i was talking with is reading this, i made this for you.
      • -
      -

      spookydonut updated:

      -
        -
      • jungle fever monkeys now speak monkey
      • -
      • TRAIT_NOMETABOLISM species are now immune to clone damage
      • -
      -

      zxaber updated:

      -
        -
      • Heads of staff can now connect to holopads without the other side answering the call.
      • -
      • Secure holopads, which do not allow auto-connect, have replaced holopads in a very small number of places.
      • -
      • Placements of holopads in various areas on various stations have been slightly adjusted.
      • -
      • Holopads now ping when a connection from another pad is established.
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bb3399bae10..8a875661a77 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -36888,3 +36888,431 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - imageadd: fugu background fugu background zxaber: - bugfix: Positronics no longer have MMIs visually spawn on them. +2020-02-11: + ArcaneMusic: + - rscadd: Nanotrasen's research division has gone ahead and scratched all possible + plans of building new sleepers for the station, due to the discovery of old + sleepers injecting crew with lead acetate. + - rscadd: In unrelated news, the research division is proud to announce the all + new, "party pods"! Available at your local station B.E.P.I.S. platform as a + minor reward. + - bugfix: Wooden Plank Floors no longer runtime. + Arkatos: + - rscadd: Mining Vendor now uses tgui-next. + Bokkiewokkie: + - imageadd: adds box icons for tons of boxes. + - imageadd: changes the toy and shotgun ammo boxes so they're in the new art style. + Cloneby: + - balance: Strange Reagent now requires a set amount to revive dependent on patient + wellbeing and requires an excess to heal blood and organs. Does more damage + on life. Basically loses one-click wonder status UNLESS you give a considerable + amount and deal with the consequences. + Coconutwarrior97: + - bugfix: Fixes meta armory external camera by naming it properly. + - bugfix: AI can use the carp hologram again. + - bugfix: Fixes a typo in mind.dm . + Dennok: + - bugfix: Now nanites don't die from illusions and placing unpowered cable by bare + hands. + - bugfix: Now MultiZ Debug map has open space under floor instead of space. + Denton: + - tweak: Constructed display cases no longer spawn with an alarm that bolts all + nearby doors. + EOBGames: + - rscadd: The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch + some waves, brah! + - bugfix: Fixed a few minor map problems. + Fikou: + - rscadd: You can now make lassos with a bone and 5 sinew and make saddles from + 5 leather sheets, you can also tame goliaths with lavaland food (I think you + know what those 3 things mean together) + - tweak: xenos now keep their name consistent through evolutions + - bugfix: fixes humanoid xeno numbers being 0 + - tweak: royal xenos also get numbers + JJRcop: + - refactor: Defibs and Defibbing Nanites act the same way again. + - bugfix: Fixed removing brains from changeling husks. + Krysonism: + - rscadd: 4 new ice creams created using the crafting menu, + - rscadd: You can now make popsicle sticks by sticking logs in the processor. + Mickyan: + - tweak: Blood dripping frequency now scales with blood loss + - bugfix: Fixed blood decals occasionally containing more blood than they should + - tweak: The Delta Station stasis room has received a makeover + NoxVS: + - bugfix: Nanotrasen has properly relabeled all cyborg limbs following their rediscovery + of which direction is left and which is right + OnlineGirlfriend: + - imageadd: crushed can sprite for Sol Dry + - bugfix: Sol Dry cans can be crushed + - bugfix: salami filling color + - tweak: salami taste + Qustinnus: + - code_imp: there is now an edible component which will allow us to deprecate our + hacky methods of making things such as organs edible + RaveRadbury: + - bugfix: Removed latejoin prisoner option + ShizCalev: + - bugfix: Emitters will now remain anchored when being constructed from an anchored + machine frame. + - bugfix: Emitters will now properly turn off and be unwelded if unanchored via + varediting. + - bugfix: Unanchored emitters will no longer be pulled towards non-harmful simple + animals (ie butterflies, cats, ect) if they click on them. + - bugfix: Fixed a scenario where emitters could start welded and be turned on, but + were not properly anchored to the ground. + - bugfix: Fixed a scenario where emitters could start anchored to the ground, but + had to be resecured with a wrench to get them to work properly. + - code_imp: Emitters now properly use the anchored var. The state var has been renamed + to welded, and only tracks welded status. + - code_imp: The anchored emitter map subtype has been changed to a fully welded + one, since all utilized instances were editted to be welded as well anyway. + - rscadd: Added a bit more examine feedback to emitters. + - bugfix: Emitters will now show how often they fire a little more accurately. + - bugfix: Attacking the Supermatter crystal with a NODROP item (ie cyborgs with + literally any item, ninjas, highlanders, ect) will now dust the user. + - bugfix: Fixed spell books becoming unreadable if you moved while reading them. + - bugfix: Fixed progress bars not showing up for spell books. + - bugfix: Fixed an exploit where spell books didn't always have to be in your hand + to finish reading them. + Skoglol: + - rscdel: Removes cloning from the codebase. Cloning rooms have been converted to + temporary wards and storage. Experimental cloner and its ruin is also gone. + - balance: Replica pod seed availability reduced. No longer available in megaseed + vendors, seed crate contains one seed down from three. Mutate some cabbages + if you want these. + - bugfix: Say should be less likely to break when under heavy server strain. + - balance: Brain death is no longer a thing, no arbitrary unhealable death. Uses + organ damage like the rest. + - bugfix: Brains can now be attacked again. + - bugfix: Brains no longer report you SSD if you are in the brain and not ghosted + out. + - balance: Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, + instead of a flat 10 damage for any amount over 10 units. + - spellcheck: Defib faliure feedback is now more clear and hints at how to fix it. + - tweak: Defibs now force the ghost back. + - spellcheck: Improved brain feedback, no longer reports SSD. + - balance: Stomach pump and brain surgery are now repeatable surgeries. + - code_imp: Removed some forgotten references to defib time of death restrictions. + - bugfix: Beakers should no longer nullspace when quick swapped or alt clicked out + of certain pieces of machinery. + - balance: Traitor adrenals buffed slightly. Now removes knockdown on activation, + increases speed slightly more and has no oxyloss damage. + - balance: Changeling adrenals now last 20 seconds, up from 15 seconds. + - bugfix: Dynamic revs runtime and infinite loss announcement fixed. + SteelSlayer: + - code_imp: Adds the dunkable element. Converts items who were using the dunkable + var to instead use this element and removes the dunkable var. + - code_imp: Adds a new "DUNKABLE" reagent flag for reagent containers. This determines + whether or not the container can have items dunked into it. + TheChosenEvilOne: + - bugfix: Foamy beer stationwide event works again. + Thebleh: + - tweak: Bodies with souls show the defib icon on medhuds. + Tlaltecuhtli: + - bugfix: grinder chem not grinding + - bugfix: dir of grinder chem + Vondiech: + - tweak: There is no longer a light fixture attached to an airlock in the Experimentation + Lab on Metastation. + armhulen fikou gang: + - imageadd: a lot of >32x32 mobs now have icons for their health dolls + cacogen: + - refactor: The abductor baton is now a child of the regular stun baton. There shouldn't + be a functional difference. + - tweak: You need to be an abductor to change baton modes. Seemed like an oversight + - spellcheck: Fixes some typos in the abductor baton's messages + - admin: Both regular stun baton and abductor baton have had a lot of vars exposed + pertaining to their functionality so that could come in handy I guess + - spellcheck: Cybernetic implant readouts on medHUD and health analyzer are more + compact and show an icon of each + improvedname: + - tweak: Chamkits now include an chameleon belt + imsxz: + - tweak: skateboards now buckle you after activating them in hand. + itseasytosee: + - rscadd: Three more toys to find in your local arcade cabinet! Squeaky brain, trick + blindfold, and a broken radio. Collect em all! + - bugfix: Plasmamen prisoners now use the proper helmet sprite. + - bugfix: Pacifists can now use the wand of nothing. + - bugfix: Shotgun in hands are no longer broken. + - rscadd: An ancient recipe for the ultimate soap can be had by janitors that carry + family heirlooms and those who crawl maintenance. + nightred: + - bugfix: plastic water bottles can now spash + - bugfix: plastic water bottle caps render properly the first time + - bugfix: Fixes pulling button location on simple mobs + - bugfix: Polymorph kicks AI's out of shells + - refactor: Changed custom material output on examine to be on a single line + optimumtact: + - tweak: lawyer's department backpack... is a backpack again + peoplearestrange: + - rscdel: Removed Special Verbs Tab + - admin: New admin button Tabs + wesoda25: + - tweak: You will now cough if you have lung damage (no stun). + zxaber: + - balance: It is now possible to use an actual defibrillator unit as a stand-in + for the borg defib upgrade, allowing medical borgs to revive crew without cloning + at shift start. + - spellcheck: Borgs now get a message when receiving any upgrade. +2020-02-13: + Arkatos: + - tweak: HUDs for various simple mobs are now cleaner and consistent with each other. + Buggy123: + - tweak: Beware! The Syndicate have upgraded their stolen teleportation machinery, + they are now capable of providing reinforcements to their elite operatives nearly + anywhere, even in the middle of combat! Not that that would be wise, to say + the least. + Dennok: + - bugfix: After rigorous training, Nanotrasen zoologists have observed a rise in + the level of effectiveness with which non-sentient monkeys utilise certain hand-to-hand + weapons. + Denton: + - admin: Moved duplicate CID/IP logging from log_access to log_admin_private. + Dingo-Dongler: + - rscadd: Examining people with sechuds will let you give someone an on the spot + citation. + MMMiracles: + - tweak: Multi-Z power relays can repaired but must be manually updated with a multi-tool + when reinstalling/moving around. + PKPenguin321: + - rscadd: Salt piles now get kicked around and eventually scattered to the wind + when ran over too much. + Skoglol: + - admin: Initial ahelps are now multiline too. + - bugfix: Contractor tablet should now properly let you shop for rep. + Tlaltecuhtli: + - rscadd: adds medipen refiller machine + cacogen: + - tweak: Swapped positions of Meta Morgue and chem factory + - tweak: Resized the space now taken up by Meta chem factory to be slightly larger + - tweak: Made Meta Morgue smaller + - tweak: Moved Meta maint bar above the new Morgue where rest of the chem factory + was + - tweak: Moved Meta medbay alcove with NanoMed to opposite side of hall + - tweak: Moved Meta Medical Surplus Storeroom above Virology, off maint across from + alcove + - rscadd: Two new Meta maint Storage Rooms beneath robotics + - tweak: Unanchored solar assemblies go off-centre to indicate they need securing. + Secured ones centre themselves + ike709: + - bugfix: Taking pictures of openspace turfs works now. + itseasytosee: + - bugfix: atmos helmets now properly protect you from pepper spray and face-huggers. + nemvar: + - bugfix: Fixed an issue where unstable people could regain sanity. + nightred: + - rscadd: Hugs are warm now + - refactor: natural_bodytemperature_stabilization is now self contained. + - refactor: adjust_bodytemperature to allow the use of insulation and change steps +2020-02-14: + Arkatos: + - rscadd: Infrared emitter now uses tgui-next. + - rscadd: Proximity sensor now uses tgui-next. + - bugfix: Geneticist now uses science selection color in the preferences menu. + Capsandi: + - spellcheck: Fixed grammar in death-nettle attack and pickup messages + EOBGames: + - rscadd: The Lavaland Gulag has been rebuilt following repeated complaints about + 'human rights violations'. + - rscadd: A hawaiian shirt, currently only in the beach bum ruin. + - tweak: Fixed a couple of issues with the beach bum ruin. + Fikou: + - config: the nuke op leader having access to the war declaration item is now a + config + Mickyan: + - tweak: Headphones can now play custom music + - tweak: Moved headphones to the games vendor in the library + - code_imp: Added support for instruments with custom effects triggered by playing + Putnam and ninjanomnom: + - balance: Radioactive contamination now has a limited amount of material to be + used to contaminate things. + Ryll/Shaps: + - rscadd: You can now sabotage secways by stuffing a banana in their tailpipe. + actioninja: + - bugfix: Traitor Uplink buy buttons properly disable when you don't have enough + TC again + cacogen: + - bugfix: Soil no longer renames itself hydroponics tray while something is planted + in it + - bugfix: Hydroponics planter names will update when weeds are mutated + - rscdel: Planters no longer change description to match that of what's planted + in them + necromanceranne: + - rscadd: A mech support bag. + - rscadd: Combat wrench. + - balance: Made the dark gygax significantly better by adjusting equipment and stats. + nemvar: + - rscadd: Replaced the effect of the "two left feet" mutation with random knockdowns + while moving. +2020-02-15: + BadSS13Player: + - tweak: The Exosuit Fabricator's sync with R&D operation is now instant. + Buggy123: + - tweak: Random mineral turfs no longer cause large amounts of turf changes on initialization. + Cobby: + - balance: Buffs Surgery XP values + Krysonism: + - rscadd: The Cosa Nostra starter pack has been added to cargo as a contraband + crate. + - rscadd: Added pictures of the virgin mary, burning one of these will let you pick + a mafia nickname. + - rscadd: The beige suit, beige fedora and white fedora clothing items have been + added to the game. + - imageadd: The non-job fedoras and the white suit have been resprited. + Skoglol: + - spellcheck: Unhusking someone with synthflesh will no longer tell everyone they + were the one to fix the corpse. + XDTM: + - bugfix: Fixed nanite shutdown timer not properly shutting down nanites. + actioninja: + - rscadd: 'tgui-next for NTOS: AI restorer, File Manager, NetDOS, Net Monitor, and + Revelation' + - rscdel: Creation of TXT Files on modular computer has been indefinitely removed + - rscdel: Due to architecture concerns, NTNet Transfer has been indefinitely removed + from NTOS hardware. + nianjiilical: + - rscadd: Some weird shit happened in space, and now Ethereals are appearing in + new colors. Scientists are baffled. + nightred: + - rscadd: Space Suits warm the wearer, and use Cells + - rscadd: Suit Storage charges Space Suits + - rscadd: EMP's cause Hard Suit's to burn the wearer + - rscadd: Engineering now has emp proof cells with the suits + - rscadd: Hud status for space suit power level + - rscadd: ERT hardsuits get EMP protection AND ONLY THEM +2020-02-19: + ATHATH: + - balance: All sharp items that have a force greater than or equal to 10 can be + used to perform the saw bone surgery step with ghetto surgery, but they'll have + a low success rate/step speed when doing so. + - rscadd: The biogenerator can now produce soy milk. + ArcaneMusic: + - rscadd: A new space ruin has been located in your sector. The previous owners + have dubbed the place "The Hell Factory", despite the region being designated + as an alcohol bottling facility. + - bugfix: Fixes accidentally reverting the puzzles/trapmaking tools PR. + - rscadd: The Syndicate has recently begun targeting a recently declassified piece + of Nanotrasen hardware, the blackbox, located within the blackbox recorder on + each station's telecommunication's array. + - rscadd: Human organs can once again be sold on the black market. + Arkatos: + - tweak: Added broken chameleon belt to the broken chameleon kit. + - rscadd: Radioactive Microlaser now uses tgui. + Bokkiewokkie: + - bugfix: Fixes writing being on paper bags and some ammo boxes + Buggy123: + - bugfix: fuck + Capsandi: + - imageadd: added a new mortar sprite + Dennok: + - bugfix: Now MultiZ Debug connected to neighbor space, in strange way. + EOBGames: + - bugfix: A few minor map fixes. + - tweak: There's now enough medhuds in storage for everyone in med (except you, + chemists). + Fikou: + - refactor: glockroach + - rscadd: You can now choose your name and color as a holoparasite/guardian/holocarp! + - rscadd: Miner holoparasites are now hivelords! + - bugfix: fixes lings being able to get mechanical holoparasites + Iamgoofball: + - tweak: You son of a bitch! I'm in. + Improvedname & JustRandomGuy: + - rscadd: Adds the syndicate laserarm implant to roboticist traitors + - rscadd: Syndicate implants now come in a suspicous autosurgeon + JAremko: + - rscadd: Added pyroclastic anomaly slime policy key + - bugfix: Fixed anomaly slime role + - bugfix: Now anomaly slimes can reproduce like other slimes do + JDawg1290: + - code_imp: mech construction refactored + JJRcop: + - refactor: Stasis now supports multiple sources. + Mickyan: + - rscadd: Added the broom. For sweeping. + - tweak: Tweaked paramedic loadout, moved pinpointer to medical belt, moved medipen + to suit storage + - bugfix: Cleaning messes with the mop and soap now correctly awards cleaning experience + NecromancerAnne and Kyrsonism: + - imageadd: Redid the claymore sprites to look a little better. + NikNak: + - balance: The powercrepe has been buffed + RaveRadbury: + - balance: Bottles and Flasks provide 5u on every gulp. + Skoglol: + - bugfix: Forced a basic keybind reset for everyone to fix some inconsistencies + from various savefiles, as well as making the hotkey/classic toggle in game + options work. Your emote keybinds should be untouched. + TheVekter: + - rscadd: Added the Vibebot + Thunder12345: + - bugfix: Cult sacrifice objective now tells you to use Offer instead of a non-existent + Sacrifice rune + - imageadd: Added missing attached tank sprites for TTVs + Time-Green: + - rscadd: Adds geysers to lavaland! They can be activated by using a reinforced + plunger found in the medical vendor. They can be harvested by using a new plumbing + device, magically powered liquid pumps! + - rscadd: Adds Hollow Water to geysers, wich can be combined with Holy Water as + catalyst for more Holy Water + - rscadd: Adds Protozine to geyers, a very weak version of Omnizine. Can be used + in Strange Reagent mixing + - rscadd: Adds Wittel, a very rare geyser chem. Can be processed into gravitum, + wich removes gravity. Can also be processed into metalgen, wich has a strange + tendency to transform objects into the imprinted material. + XDTM: + - rscadd: Added a new special brain trauma, Quantum Alignment. + - rscadd: Added the Enhanced Interrogation Chamber as a BEPIS researchable tech. + - rscadd: The EIC can be used to implant trigger phrases in subjects that cause + an instant hypnotic trance. + cacogen: + - rscadd: RCD can now deconstruct airlock assemblies and firelock frames + - bugfix: Stun batons now respect shields again (e.g. riot shields, the wizard's + shielded hardsuit) + - bugfix: Stun baton attacks that should've been stopped by clumsiness no longer + go through + itseasytosee: + - rscadd: Having a holster now allows you to flip a gun on your fingers. Use in + hand. If you want to eject your bullets repeat + - rscadd: The syndicate chameleon holster. Costs 1 tc and can be made to look like + any belt. Stores all your fun shooty sticks + - rscadd: Operative holster, a free alternative to tactical webbing for storing + two guns in a belt slot instead of alot of small items. + - rscadd: New drink! The Hivemind eraser. Can be made with two parts black Russian + one part thirteen-loko and one part grenadine. + necromanceranne: + - balance: Removes the stun from Krav Maga and makes it a high duration knockdown + with stamina damage (20-30), respecting chest armor for the damage. + - rscadd: Disarm intent is now a nonlethal jab that does (5-10) stamina damage. + If used on people who are prone, it does (10-15) stamina damage. It also has + a chance to completely disarm someone based on the amount of stamina damage + they have. + - balance: Krav Maga harm stomps/punches now respect armor and have a variance of + (5-10) for punches and (5-10+5) for stomps. + nightred: + - tweak: Turn night mode off or on when the APC is locked + - bugfix: space suit turns off properly when there is no cell inserted + - bugfix: space ninja can now turn on the heater in the suit + - bugfix: space ninja can recharge properly + - bugfix: space suit now uses the cell as intended + plapatin: + - tweak: Nanotrasen-brand spacepods can play music just like headphones now. + stylemistake: + - rscdel: Removed tgui + - refactor: tgui-next is now the new tgui + - code_imp: Updated "interface not found" screen. + wesoda25: + - tweak: Gondola Asteroid is grassy now, also has some puddles + with thanks to HugBug and Buggy for helping with bug-squashing: + - balance: The effect of gas comp will now spin up and down, rather then jumping. + Play around, don't break anything. + - bugfix: Fixed low pressure hell SMs + - admin: Allows var editing of SM gas rad effects + yeeyeh: + - rscadd: Nanotrasen's research division's recent science fair has given light to + an amazing, electrically-insulated compound that can be sprayed directly onto + the skin. The initial idea was for footwear, but we all know what you're really + going to do with it. Research can be continued at your station's B.E.P.I.S. + unit. diff --git a/html/changelogs/AutoChangeLog-pr-48596.yml b/html/changelogs/AutoChangeLog-pr-48596.yml deleted file mode 100644 index 5d10cd766f5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48596.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Qustinnus" -delete-after: True -changes: - - code_imp: "there is now an edible component which will allow us to deprecate our hacky methods of making things such as organs edible" diff --git a/html/changelogs/AutoChangeLog-pr-48654.yml b/html/changelogs/AutoChangeLog-pr-48654.yml deleted file mode 100644 index 85bbed5d9d6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48654.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - rscadd: "Nanotrasen's research division has gone ahead and scratched all possible plans of building new sleepers for the station, due to the discovery of old sleepers injecting crew with lead acetate." - - rscadd: "In unrelated news, the research division is proud to announce the all new, \"party pods\"! Available at your local station B.E.P.I.S. platform as a minor reward." diff --git a/html/changelogs/AutoChangeLog-pr-48668.yml b/html/changelogs/AutoChangeLog-pr-48668.yml deleted file mode 100644 index 548a2b2b9a2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48668.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - rscdel: "Removes cloning from the codebase. Cloning rooms have been converted to temporary wards and storage. Experimental cloner and its ruin is also gone." - - balance: "Replica pod seed availability reduced. No longer available in megaseed vendors, seed crate contains one seed down from three. Mutate some cabbages if you want these." diff --git a/html/changelogs/AutoChangeLog-pr-48766.yml b/html/changelogs/AutoChangeLog-pr-48766.yml deleted file mode 100644 index 5629ec01f2a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48766.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "cacogen" -delete-after: True -changes: - - refactor: "The abductor baton is now a child of the regular stun baton. There shouldn't be a functional difference." - - tweak: "You need to be an abductor to change baton modes. Seemed like an oversight" - - spellcheck: "Fixes some typos in the abductor baton's messages" - - admin: "Both regular stun baton and abductor baton have had a lot of vars exposed pertaining to their functionality so that could come in handy I guess" diff --git a/html/changelogs/AutoChangeLog-pr-48805.yml b/html/changelogs/AutoChangeLog-pr-48805.yml deleted file mode 100644 index 750c8a9d5bf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48805.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "zxaber" -delete-after: True -changes: - - balance: "It is now possible to use an actual defibrillator unit as a stand-in for the borg defib upgrade, allowing medical borgs to revive crew without cloning at shift start." - - spellcheck: "Borgs now get a message when receiving any upgrade." diff --git a/html/changelogs/AutoChangeLog-pr-48991.yml b/html/changelogs/AutoChangeLog-pr-48991.yml deleted file mode 100644 index 813ead38ff3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48991.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Mining Vendor now uses tgui-next." diff --git a/html/changelogs/AutoChangeLog-pr-48995.yml b/html/changelogs/AutoChangeLog-pr-48995.yml deleted file mode 100644 index 625351e78ed..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48995.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Krysonism" -delete-after: True -changes: - - rscadd: "4 new ice creams created using the crafting menu," - - rscadd: "You can now make popsicle sticks by sticking logs in the processor." diff --git a/html/changelogs/AutoChangeLog-pr-49003.yml b/html/changelogs/AutoChangeLog-pr-49003.yml deleted file mode 100644 index 4dc3e9b0c2c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49003.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - rscadd: "You can now make lassos with a bone and 5 sinew and make saddles from 5 leather sheets, you can also tame goliaths with lavaland food (I think you know what those 3 things mean together)" diff --git a/html/changelogs/AutoChangeLog-pr-49004.yml b/html/changelogs/AutoChangeLog-pr-49004.yml deleted file mode 100644 index f9dc0e131d1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49004.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - bugfix: "Say should be less likely to break when under heavy server strain." diff --git a/html/changelogs/AutoChangeLog-pr-49014.yml b/html/changelogs/AutoChangeLog-pr-49014.yml deleted file mode 100644 index 5c8a57dddf2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49014.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "wesoda25" -delete-after: True -changes: - - tweak: "You will now cough if you have lung damage (no stun)." diff --git a/html/changelogs/AutoChangeLog-pr-49037.yml b/html/changelogs/AutoChangeLog-pr-49037.yml deleted file mode 100644 index d055592a56b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49037.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Tlaltecuhtli" -delete-after: True -changes: - - bugfix: "grinder chem not grinding" - - bugfix: "dir of grinder chem" diff --git a/html/changelogs/AutoChangeLog-pr-49048.yml b/html/changelogs/AutoChangeLog-pr-49048.yml deleted file mode 100644 index 26b7a9b70ea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49048.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "Constructed display cases no longer spawn with an alarm that bolts all nearby doors." diff --git a/html/changelogs/AutoChangeLog-pr-49057.yml b/html/changelogs/AutoChangeLog-pr-49057.yml deleted file mode 100644 index 1e529f3468f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49057.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Bokkiewokkie" -delete-after: True -changes: - - imageadd: "adds box icons for tons of boxes." - - imageadd: "changes the toy and shotgun ammo boxes so they're in the new art style." diff --git a/html/changelogs/AutoChangeLog-pr-49082.yml b/html/changelogs/AutoChangeLog-pr-49082.yml deleted file mode 100644 index 7ff3df053ed..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49082.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cloneby" -delete-after: True -changes: - - balance: "Strange Reagent now requires a set amount to revive dependent on patient wellbeing and requires an excess to heal blood and organs. Does more damage on life. Basically loses one-click wonder status UNLESS you give a considerable amount and deal with the consequences." diff --git a/html/changelogs/AutoChangeLog-pr-49087.yml b/html/changelogs/AutoChangeLog-pr-49087.yml deleted file mode 100644 index 4bd32d8699b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49087.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "cacogen" -delete-after: True -changes: - - spellcheck: "Cybernetic implant readouts on medHUD and health analyzer are more compact and show an icon of each" diff --git a/html/changelogs/AutoChangeLog-pr-49090.yml b/html/changelogs/AutoChangeLog-pr-49090.yml deleted file mode 100644 index bd54e9731e8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49090.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - balance: "Brain death is no longer a thing, no arbitrary unhealable death. Uses organ damage like the rest." - - bugfix: "Brains can now be attacked again." - - bugfix: "Brains no longer report you SSD if you are in the brain and not ghosted out." - - balance: "Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, instead of a flat 10 damage for any amount over 10 units." - - spellcheck: "Defib faliure feedback is now more clear and hints at how to fix it." - - tweak: "Defibs now force the ghost back." - - spellcheck: "Improved brain feedback, no longer reports SSD." - - balance: "Stomach pump and brain surgery are now repeatable surgeries." diff --git a/html/changelogs/AutoChangeLog-pr-49092.yml b/html/changelogs/AutoChangeLog-pr-49092.yml deleted file mode 100644 index 05884614b4f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49092.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Mickyan" -delete-after: True -changes: - - tweak: "Blood dripping frequency now scales with blood loss" - - bugfix: "Fixed blood decals occasionally containing more blood than they should" diff --git a/html/changelogs/AutoChangeLog-pr-49104.yml b/html/changelogs/AutoChangeLog-pr-49104.yml deleted file mode 100644 index 978e2a45314..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49104.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "armhulen fikou gang" -delete-after: True -changes: - - imageadd: "a lot of >32x32 mobs now have icons for their health dolls" diff --git a/html/changelogs/AutoChangeLog-pr-49109.yml b/html/changelogs/AutoChangeLog-pr-49109.yml deleted file mode 100644 index 96937368dd9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49109.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "nightred" -delete-after: True -changes: - - bugfix: "plastic water bottles can now spash" - - bugfix: "plastic water bottle caps render properly the first time" diff --git a/html/changelogs/AutoChangeLog-pr-49122.yml b/html/changelogs/AutoChangeLog-pr-49122.yml deleted file mode 100644 index be75970a722..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49122.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "itseasytosee" -delete-after: True -changes: - - rscadd: "Three more toys to find in your local arcade cabinet! Squeaky brain, trick blindfold, and a broken radio. Collect em all!" diff --git a/html/changelogs/AutoChangeLog-pr-49123.yml b/html/changelogs/AutoChangeLog-pr-49123.yml deleted file mode 100644 index eb13b0adc23..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49123.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheChosenEvilOne" -delete-after: True -changes: - - bugfix: "Foamy beer stationwide event works again." diff --git a/html/changelogs/AutoChangeLog-pr-49124.yml b/html/changelogs/AutoChangeLog-pr-49124.yml deleted file mode 100644 index 6e2cfb39912..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49124.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - code_imp: "Removed some forgotten references to defib time of death restrictions." diff --git a/html/changelogs/AutoChangeLog-pr-49126.yml b/html/changelogs/AutoChangeLog-pr-49126.yml deleted file mode 100644 index 553bc184f15..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49126.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - bugfix: "Beakers should no longer nullspace when quick swapped or alt clicked out of certain pieces of machinery." diff --git a/html/changelogs/AutoChangeLog-pr-49129.yml b/html/changelogs/AutoChangeLog-pr-49129.yml deleted file mode 100644 index ed5d664cb9c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49129.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Emitters will now remain anchored when being constructed from an anchored machine frame." - - bugfix: "Emitters will now properly turn off and be unwelded if unanchored via varediting." - - bugfix: "Unanchored emitters will no longer be pulled towards non-harmful simple animals (ie butterflies, cats, ect) if they click on them." - - bugfix: "Fixed a scenario where emitters could start welded and be turned on, but were not properly anchored to the ground." - - bugfix: "Fixed a scenario where emitters could start anchored to the ground, but had to be resecured with a wrench to get them to work properly." - - code_imp: "Emitters now properly use the anchored var. The state var has been renamed to welded, and only tracks welded status." - - code_imp: "The anchored emitter map subtype has been changed to a fully welded one, since all utilized instances were editted to be welded as well anyway." - - rscadd: "Added a bit more examine feedback to emitters." - - bugfix: "Emitters will now show how often they fire a little more accurately." diff --git a/html/changelogs/AutoChangeLog-pr-49130.yml b/html/changelogs/AutoChangeLog-pr-49130.yml deleted file mode 100644 index 300d1449c6d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49130.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nightred" -delete-after: True -changes: - - bugfix: "Fixes pulling button location on simple mobs" diff --git a/html/changelogs/AutoChangeLog-pr-49133.yml b/html/changelogs/AutoChangeLog-pr-49133.yml deleted file mode 100644 index 24dd3b29cf5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49133.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Attacking the Supermatter crystal with a NODROP item (ie cyborgs with literally any item, ninjas, highlanders, ect) will now dust the user." diff --git a/html/changelogs/AutoChangeLog-pr-49138.yml b/html/changelogs/AutoChangeLog-pr-49138.yml deleted file mode 100644 index fa8b0679c1c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49138.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Thebleh" -delete-after: True -changes: - - tweak: "Bodies with souls show the defib icon on medhuds." diff --git a/html/changelogs/AutoChangeLog-pr-49139.yml b/html/changelogs/AutoChangeLog-pr-49139.yml deleted file mode 100644 index 1018a8c099e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49139.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Fixed spell books becoming unreadable if you moved while reading them." - - bugfix: "Fixed progress bars not showing up for spell books." - - bugfix: "Fixed an exploit where spell books didn't always have to be in your hand to finish reading them." diff --git a/html/changelogs/AutoChangeLog-pr-49140.yml b/html/changelogs/AutoChangeLog-pr-49140.yml deleted file mode 100644 index 2eb49d5efaf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49140.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - balance: "Traitor adrenals buffed slightly. Now removes knockdown on activation, increases speed slightly more and has no oxyloss damage." - - balance: "Changeling adrenals now last 20 seconds, up from 15 seconds." diff --git a/html/changelogs/AutoChangeLog-pr-49144.yml b/html/changelogs/AutoChangeLog-pr-49144.yml deleted file mode 100644 index 1f25e0dd73c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49144.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nightred" -delete-after: True -changes: - - bugfix: "Polymorph kicks AI's out of shells" diff --git a/html/changelogs/AutoChangeLog-pr-49146.yml b/html/changelogs/AutoChangeLog-pr-49146.yml deleted file mode 100644 index 8a0cb462dd8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49146.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "NoxVS" -delete-after: True -changes: - - bugfix: "Nanotrasen has properly relabeled all cyborg limbs following their rediscovery of which direction is left and which is right" diff --git a/html/changelogs/AutoChangeLog-pr-49150.yml b/html/changelogs/AutoChangeLog-pr-49150.yml deleted file mode 100644 index 4a7689203c6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49150.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - tweak: "xenos now keep their name consistent through evolutions" diff --git a/html/changelogs/AutoChangeLog-pr-49154.yml b/html/changelogs/AutoChangeLog-pr-49154.yml deleted file mode 100644 index 0522a0bd19c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49154.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dennok" -delete-after: True -changes: - - bugfix: "Now nanites don't die from illusions and placing unpowered cable by bare hands." diff --git a/html/changelogs/AutoChangeLog-pr-49162.yml b/html/changelogs/AutoChangeLog-pr-49162.yml deleted file mode 100644 index 49832ada40b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49162.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nightred" -delete-after: True -changes: - - refactor: "Changed custom material output on examine to be on a single line" diff --git a/html/changelogs/AutoChangeLog-pr-49165.yml b/html/changelogs/AutoChangeLog-pr-49165.yml deleted file mode 100644 index f37d627ae7e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EOBGames" -delete-after: True -changes: - - rscadd: "The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch some waves, brah!" diff --git a/html/changelogs/AutoChangeLog-pr-49175.yml b/html/changelogs/AutoChangeLog-pr-49175.yml deleted file mode 100644 index 7fafdde0a95..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49175.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "improvedname" -delete-after: True -changes: - - tweak: "Chamkits now include an chameleon belt" diff --git a/html/changelogs/AutoChangeLog-pr-49177.yml b/html/changelogs/AutoChangeLog-pr-49177.yml deleted file mode 100644 index 2b8a71d3a72..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49177.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RaveRadbury" -delete-after: True -changes: - - bugfix: "Removed latejoin prisoner option" diff --git a/html/changelogs/AutoChangeLog-pr-49178.yml b/html/changelogs/AutoChangeLog-pr-49178.yml deleted file mode 100644 index 2e60651bcee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49178.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "optimumtact" -delete-after: True -changes: - - tweak: "lawyer's department backpack... is a backpack again" diff --git a/html/changelogs/AutoChangeLog-pr-49180.yml b/html/changelogs/AutoChangeLog-pr-49180.yml deleted file mode 100644 index c69d76145f2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49180.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - bugfix: "Wooden Plank Floors no longer runtime." diff --git a/html/changelogs/AutoChangeLog-pr-49182.yml b/html/changelogs/AutoChangeLog-pr-49182.yml deleted file mode 100644 index b7a6053ea82..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49182.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - bugfix: "Dynamic revs runtime and infinite loss announcement fixed." diff --git a/html/changelogs/AutoChangeLog-pr-49184.yml b/html/changelogs/AutoChangeLog-pr-49184.yml deleted file mode 100644 index 76fe78fb5b9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49184.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "peoplearestrange" -delete-after: True -changes: - - rscdel: "Removed Special Verbs Tab" - - admin: "New admin button Tabs" diff --git a/html/changelogs/AutoChangeLog-pr-49188.yml b/html/changelogs/AutoChangeLog-pr-49188.yml deleted file mode 100644 index 56f2784f506..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49188.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JJRcop" -delete-after: True -changes: - - refactor: "Defibs and Defibbing Nanites act the same way again." diff --git a/html/changelogs/AutoChangeLog-pr-49190.yml b/html/changelogs/AutoChangeLog-pr-49190.yml deleted file mode 100644 index c3e40843508..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49190.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Vondiech" -delete-after: True -changes: - - tweak: "There is no longer a light fixture attached to an airlock in the Experimentation Lab on Metastation." diff --git a/html/changelogs/AutoChangeLog-pr-49192.yml b/html/changelogs/AutoChangeLog-pr-49192.yml deleted file mode 100644 index e543a467c60..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49192.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SteelSlayer" -delete-after: True -changes: - - code_imp: "Adds the dunkable element. Converts items who were using the dunkable var to instead use this element and removes the dunkable var." - - code_imp: "Adds a new \"DUNKABLE\" reagent flag for reagent containers. This determines whether or not the container can have items dunked into it." diff --git a/html/changelogs/AutoChangeLog-pr-49194.yml b/html/changelogs/AutoChangeLog-pr-49194.yml deleted file mode 100644 index 77d324bce81..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49194.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dennok" -delete-after: True -changes: - - bugfix: "Now MultiZ Debug map has open space under floor instead of space." diff --git a/html/changelogs/AutoChangeLog-pr-49204.yml b/html/changelogs/AutoChangeLog-pr-49204.yml deleted file mode 100644 index f264198fbbd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49204.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "imsxz" -delete-after: True -changes: - - tweak: "skateboards now buckle you after activating them in hand." diff --git a/html/changelogs/AutoChangeLog-pr-49210.yml b/html/changelogs/AutoChangeLog-pr-49210.yml deleted file mode 100644 index d70e3d90483..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49210.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EOBGames" -delete-after: True -changes: - - bugfix: "Fixed a few minor map problems." diff --git a/html/changelogs/AutoChangeLog-pr-49214.yml b/html/changelogs/AutoChangeLog-pr-49214.yml deleted file mode 100644 index 4bbece15b79..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49214.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JJRcop" -delete-after: True -changes: - - bugfix: "Fixed removing brains from changeling husks." diff --git a/html/changelogs/AutoChangeLog-pr-49218.yml b/html/changelogs/AutoChangeLog-pr-49218.yml deleted file mode 100644 index e5bdc649b34..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49218.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Coconutwarrior97" -delete-after: True -changes: - - bugfix: "Fixes meta armory external camera by naming it properly." diff --git a/html/changelogs/AutoChangeLog-pr-49220.yml b/html/changelogs/AutoChangeLog-pr-49220.yml deleted file mode 100644 index b10bf3a488a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49220.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Coconutwarrior97" -delete-after: True -changes: - - bugfix: "AI can use the carp hologram again." diff --git a/html/changelogs/AutoChangeLog-pr-49223.yml b/html/changelogs/AutoChangeLog-pr-49223.yml deleted file mode 100644 index a60b4c4265b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49223.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "OnlineGirlfriend" -delete-after: True -changes: - - imageadd: "crushed can sprite for Sol Dry" - - bugfix: "Sol Dry cans can be crushed" diff --git a/html/changelogs/AutoChangeLog-pr-49227.yml b/html/changelogs/AutoChangeLog-pr-49227.yml deleted file mode 100644 index ab1ae51f437..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49227.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mickyan" -delete-after: True -changes: - - tweak: "The Delta Station stasis room has received a makeover" diff --git a/html/changelogs/AutoChangeLog-pr-49228.yml b/html/changelogs/AutoChangeLog-pr-49228.yml deleted file mode 100644 index 1f72ab5a337..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49228.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "OnlineGirlfriend" -delete-after: True -changes: - - bugfix: "salami filling color" - - tweak: "salami taste" diff --git a/html/changelogs/AutoChangeLog-pr-49229.yml b/html/changelogs/AutoChangeLog-pr-49229.yml deleted file mode 100644 index 989b9abc000..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49229.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "itseasytosee" -delete-after: True -changes: - - bugfix: "Plasmamen prisoners now use the proper helmet sprite." diff --git a/html/changelogs/AutoChangeLog-pr-49236.yml b/html/changelogs/AutoChangeLog-pr-49236.yml deleted file mode 100644 index f1bdea4470f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49236.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Coconutwarrior97" -delete-after: True -changes: - - bugfix: "Fixes a typo in mind.dm ." diff --git a/html/changelogs/AutoChangeLog-pr-49240.yml b/html/changelogs/AutoChangeLog-pr-49240.yml deleted file mode 100644 index ef0cf0e9937..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49240.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "itseasytosee" -delete-after: True -changes: - - bugfix: "Pacifists can now use the wand of nothing." diff --git a/html/changelogs/AutoChangeLog-pr-49256.yml b/html/changelogs/AutoChangeLog-pr-49256.yml deleted file mode 100644 index 0fd59bfb99a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49256.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "itseasytosee" -delete-after: True -changes: - - bugfix: "Shotgun in hands are no longer broken." diff --git a/html/changelogs/AutoChangeLog-pr-49262.yml b/html/changelogs/AutoChangeLog-pr-49262.yml deleted file mode 100644 index 2de6ada89b8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49262.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - bugfix: "fixes humanoid xeno numbers being 0" - - tweak: "royal xenos also get numbers" diff --git a/html/changelogs/AutoChangeLog-pr-49265.yml b/html/changelogs/AutoChangeLog-pr-49265.yml deleted file mode 100644 index 105002bd936..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49265.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "itseasytosee" -delete-after: True -changes: - - rscadd: "An ancient recipe for the ultimate soap can be had by janitors that carry family heirlooms and those who crawl maintenance." diff --git a/icons/mob/actions/actions_spacesuit.dmi b/icons/mob/actions/actions_spacesuit.dmi new file mode 100644 index 00000000000..0b77ed77335 Binary files /dev/null and b/icons/mob/actions/actions_spacesuit.dmi differ diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi index 112a8da8383..c493402b8ec 100644 Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index f5ff53dfd5e..55ba2a1a4a9 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index efbea555c56..b89a2163471 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/ears.dmi b/icons/mob/clothing/ears.dmi index 7a2462874f0..33bbc4fb61c 100644 Binary files a/icons/mob/clothing/ears.dmi and b/icons/mob/clothing/ears.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index c493483ce13..09966df4ec3 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 9ec4bd9359c..f0ad20bcdc0 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 9bd6467e2d2..ad44ec0d311 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index 009c8413048..522d9540657 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/under/suits.dmi b/icons/mob/clothing/under/suits.dmi index 2c3164114f2..1fb5f559bfe 100644 Binary files a/icons/mob/clothing/under/suits.dmi and b/icons/mob/clothing/under/suits.dmi differ diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi index 3737e47f6ee..cce3aa7f01c 100644 Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 56bfaf7178b..40d325eaed9 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 1c3f09b6294..c361d7157d3 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi index 9505e18d871..2c9f34af2e1 100644 Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi index 499d94ae1ef..f166ba6076b 100644 Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index 030d0db9d1d..b68526f472f 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 37d53c92bdd..6bcfce314e2 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index e0522d1f07e..b35d6cc5c0d 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 1c1220e75dc..d7d7470a5bc 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index d6950f4e1e4..d9a76955411 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 96558291134..1e195323f4f 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/mob/screen_elite.dmi b/icons/mob/screen_elite.dmi index f407fb79e41..115b1b0c0cb 100644 Binary files a/icons/mob/screen_elite.dmi and b/icons/mob/screen_elite.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index d827a34c3cc..fd5acf71b44 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/screen_slime.dmi b/icons/mob/screen_slime.dmi index b9bc909c7ac..19bc7e1f737 100644 Binary files a/icons/mob/screen_slime.dmi and b/icons/mob/screen_slime.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 9cbc0856243..903449726cf 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/blackmarket.dmi b/icons/obj/blackmarket.dmi index 99f4811ea6b..7dcbe31fa63 100644 Binary files a/icons/obj/blackmarket.dmi and b/icons/obj/blackmarket.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 717d8dd574e..38ce95b8c0e 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 09ef91de788..4f9d288b921 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 5946966d24d..e599a0a948c 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 398add03fc9..45c3091e54a 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index a90efcdfea1..7a3d72c8841 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 9f03c75982b..7188896730a 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 78d47339cff..d7f041a3948 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/under/suits.dmi b/icons/obj/clothing/under/suits.dmi index f8e24376713..734d21f9d57 100644 Binary files a/icons/obj/clothing/under/suits.dmi and b/icons/obj/clothing/under/suits.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 1b10515d10a..7ca524b29f6 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/doorpuzzle.dmi b/icons/obj/doors/doorpuzzle.dmi new file mode 100644 index 00000000000..ec4fbed514b Binary files /dev/null and b/icons/obj/doors/doorpuzzle.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 6329dbe3791..2d71873d078 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index fc2e4fc61f9..36c4e0763a3 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 4996f06d8af..501370f823c 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/machines/implantchair.dmi b/icons/obj/machines/implantchair.dmi index e91f614fad6..4d67bca9261 100644 Binary files a/icons/obj/machines/implantchair.dmi and b/icons/obj/machines/implantchair.dmi differ diff --git a/icons/obj/machines/medipen_refiller.dmi b/icons/obj/machines/medipen_refiller.dmi new file mode 100644 index 00000000000..300d218d2d7 Binary files /dev/null and b/icons/obj/machines/medipen_refiller.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 9175252cd39..615621fcce3 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/puzzle_small.dmi b/icons/obj/puzzle_small.dmi new file mode 100644 index 00000000000..e9dc82925aa Binary files /dev/null and b/icons/obj/puzzle_small.dmi differ diff --git a/icons/obj/smooth_structures/rollingtable.dmi b/icons/obj/smooth_structures/rollingtable.dmi new file mode 100644 index 00000000000..9e559a75d94 Binary files /dev/null and b/icons/obj/smooth_structures/rollingtable.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 3827c8fefe2..0d487ca493a 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 2259f47dc5c..ba68af7e673 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/sound/effects/stall.ogg b/sound/effects/stall.ogg new file mode 100644 index 00000000000..8d152076767 Binary files /dev/null and b/sound/effects/stall.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 154eb3e2de1..89d8b5501e5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -34,7 +34,6 @@ #include "code\__DEFINES\cleaning.dm" #include "code\__DEFINES\colors.dm" #include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" #include "code\__DEFINES\configuration.dm" #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\contracts.dm" @@ -114,6 +113,9 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\dcs\flags.dm" +#include "code\__DEFINES\dcs\helpers.dm" +#include "code\__DEFINES\dcs\signals.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -697,6 +699,7 @@ #include "code\game\machinery\gulag_teleporter.dm" #include "code\game\machinery\harvester.dm" #include "code\game\machinery\hologram.dm" +#include "code\game\machinery\hypnochair.dm" #include "code\game\machinery\igniter.dm" #include "code\game\machinery\iv_drip.dm" #include "code\game\machinery\launch_pad.dm" @@ -705,6 +708,7 @@ #include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\medical_kiosk.dm" +#include "code\game\machinery\medipen_refiller.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\newscaster.dm" #include "code\game\machinery\PDApainter.dm" @@ -937,6 +941,7 @@ #include "code\game\objects\items\plushes.dm" #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" +#include "code\game\objects\items\puzzle_pieces.dm" #include "code\game\objects\items\RCD.dm" #include "code\game\objects\items\RCL.dm" #include "code\game\objects\items\religion.dm" @@ -1065,6 +1070,7 @@ #include "code\game\objects\items\storage\briefcase.dm" #include "code\game\objects\items\storage\fancy.dm" #include "code\game\objects\items\storage\firstaid.dm" +#include "code\game\objects\items\storage\holsters.dm" #include "code\game\objects\items\storage\lockbox.dm" #include "code\game\objects\items\storage\secure.dm" #include "code\game\objects\items\storage\sixpack.dm" @@ -1125,6 +1131,7 @@ #include "code\game\objects\structures\noticeboard.dm" #include "code\game\objects\structures\petrified_statue.dm" #include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\railings.dm" #include "code\game\objects\structures\reflector.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\showcase.dm" @@ -1591,6 +1598,7 @@ #include "code\modules\cargo\exports\lavaland.dm" #include "code\modules\cargo\exports\manifest.dm" #include "code\modules\cargo\exports\materials.dm" +#include "code\modules\cargo\exports\organs.dm" #include "code\modules\cargo\exports\parts.dm" #include "code\modules\cargo\exports\seeds.dm" #include "code\modules\cargo\exports\sheets.dm" @@ -2230,9 +2238,9 @@ #include "code\modules\mob\living\simple_animal\bot\mulebot.dm" #include "code\modules\mob\living\simple_animal\bot\secbot.dm" #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" +#include "code\modules\mob\living\simple_animal\bot\vibebot.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\dog.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" @@ -2253,7 +2261,6 @@ #include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" #include "code\modules\mob\living\simple_animal\guardian\guardian.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm" #include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" #include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" #include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" @@ -2270,11 +2277,11 @@ #include "code\modules\mob\living\simple_animal\hostile\bees.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" #include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" +#include "code\modules\mob\living\simple_animal\hostile\cockroach.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\glockroach.dm" #include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" @@ -2371,7 +2378,6 @@ #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" #include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" @@ -2769,6 +2775,7 @@ #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" #include "code\modules\ruins\spaceruin_code\DJstation.dm" +#include "code\modules\ruins\spaceruin_code\hellfactory.dm" #include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" #include "code\modules\ruins\spaceruin_code\listeningstation.dm" #include "code\modules\ruins\spaceruin_code\oldstation.dm" diff --git a/tgui-next/.gitattributes b/tgui-next/.gitattributes deleted file mode 100644 index 0016cc3bf67..00000000000 --- a/tgui-next/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -* text=auto - -## Enforce text mode and LF line breaks -*.js text eol=lf -*.css text eol=lf -*.html text eol=lf -*.json text eol=lf - -## Treat bundles as binary and ignore them during conflicts -*.bundle.* binary merge=tgui-merge-bundle diff --git a/tgui-next/.gitignore b/tgui-next/.gitignore deleted file mode 100644 index 416ca3768da..00000000000 --- a/tgui-next/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules -*.log -package-lock.json - -/packages/tgui/public/.tmp/**/* -/packages/tgui/public/**/*.hot-update.* -/packages/tgui/public/**/*.map diff --git a/tgui-next/README.md b/tgui-next/README.md deleted file mode 100644 index beb7aaff804..00000000000 --- a/tgui-next/README.md +++ /dev/null @@ -1,855 +0,0 @@ -# tgui - -## Introduction - -tgui is a robust user interface framework of /tg/station. - -tgui is very different from most UIs you will encounter in BYOND programming. -It is heavily reliant on Javascript and web technologies as opposed to DM. -If you are familiar with NanoUI (a library which can be found on almost -every other SS13 codebase), tgui should be fairly easy to pick up. - -## Learn tgui - -People come to tgui from different backgrounds and with different -learning styles. Whether you prefer a more theoretical or a practical -approach, we hope you’ll find this section helpful. - -### Practical tutorial - -If you are completely new to frontend and prefer to **learn by doing**, -start with our [practical tutorial](docs/tutorial-and-examples.md). - -### Guides - -This project uses **Inferno** - a very fast UI rendering engine with a similar -API to React. Take your time to read these guides: - -- [React guide](https://reactjs.org/docs/hello-world.html) -- [Inferno documentation](https://infernojs.org/docs/guides/components) - -highlights differences with React. - -If you were already familiar with an older, Ractive-based tgui, and want -to translate concepts between old and new tgui, read this -[interface conversion guide](docs/converting-old-tgui-interfaces.md). - -## Pre-requisites - -You will need these programs to start developing in tgui: - -- [Node v12.13+](https://nodejs.org/en/download/) -- [Yarn v1.19+](https://yarnpkg.com/en/docs/install) -- [MSys2](https://www.msys2.org/) (optional) - -> MSys2 closely replicates a unix-like environment which is necessary for -> the `bin/tgui` script to run. It comes with a robust "mintty" terminal -> emulator which is better than any standard Windows shell, it supports -> "git" out of the box (almost like Git for Windows, but better), has -> a "pacman" package manager, and you can install a text editor like "vim" -> for a full boomer experience. - -## Usage - -**For MSys2, Git Bash, WSL, Linux or macOS users:** - -First and foremost, change your directory to `tgui-next`. - -Run `bin/tgui --install-git-hooks` (optional) to install merge drivers -which will assist you in conflict resolution when rebasing your branches. - -Run one of the following: - -- `bin/tgui` - build the project in production mode. -- `bin/tgui --dev` - launch a development server. - - tgui development server provides you with incremental compilation, - hot module replacement and logging facilities in all running instances - of tgui. In short, this means that you will instantly see changes in the - game as you code it. Very useful, highly recommended. - In order to use, you should start the game server first, connect to it so dreamseeker is - open, then start the dev server. You'll know if it's hooked correctly if data gets dumped - to the log when tgui windows are opened. -- `bin/tgui --dev --reload` - reload byond cache once. -- `bin/tgui --dev --debug` - run server with debug logging enabled. -- `bin/tgui --dev --no-hot` - disable hot module replacement (helps when -doing development on IE8). -- `bin/tgui --lint` - show problems with the code. -- `bin/tgui --lint --fix` - auto-fix problems with the code. -- `bin/tgui --analyze` - run a bundle analyzer. -- `bin/tgui --clean` - clean up project repo. -- `bin/tgui [webpack options]` - build the project with custom webpack -options. - -**For everyone else:** - -If you haven't opened the console already, you can do that by holding -Shift and right clicking on the `tgui-next` folder, then pressing -either `Open command window here` or `Open PowerShell window here`. - -Run `yarn install` to install npm dependencies, then one of the following: - -- `yarn run build` - build the project in production mode. -- `yarn run watch` - launch a development server. -- `yarn run lint` - show problems with the code. -- `yarn run lint --fix` - auto-fix problems with the code. -- `yarn run analyze` - run a bundle analyzer. - -We also got some batch files in store, for those who don't like fiddling -with the console: - -- `bin/tgui-build.bat` - build the project in production mode. -- `bin/tgui-dev-server.bat` - launch a development server. - -> Remember to always run a full build before submitting a PR. It creates -> a compressed javascript bundle which is then referenced from DM code. -> We prefer to keep it version controlled, so that people could build the -> game just by using Dream Maker. - -## Project structure - -- `/packages` - Each folder here represents a self-contained Node module. -- `/packages/common` - Helper functions -- `/packages/tgui/index.js` - Application entry point. -- `/packages/tgui/components` - Basic UI building blocks. -- `/packages/tgui/interfaces` - Actual in-game interfaces. -Interface takes data via the `state` prop and outputs an html-like stucture, -which you can build using existing UI components. -- `/packages/tgui/routes.js` - This is where you want to register new -interfaces, otherwise they simply won't load. -- `/packages/tgui/layout.js` - A root-level component, holding the -window elements, like the titlebar, buttons, resize handlers. Calls -`routes.js` to decide which component to render. -- `/packages/tgui/styles/main.scss` - CSS entry point. -- `/packages/tgui/styles/atomic.scss` - Atomic CSS classes. -These are very simple, tiny, reusable CSS classes which you can use and -combine to change appearance of your elements. Keep them small. -- `/packages/tgui/styles/components.scss` - CSS classes which are used -in UI components, and most of the stylesheets referenced here are located -in `/packages/tgui/components`. These stylesheets closely follow the -[BEM](https://en.bem.info/methodology/) methodology. -- `/packages/tgui/styles/functions.scss` - Useful SASS functions. -Stuff like `lighten`, `darken`, `luminance` are defined here. - -## Component reference - -> Notice: This documentation might be out of date, so always check the source -> code to see the most up-to-date information. - -These are the components which you can use for interface construction. -If you have trouble finding the exact prop you need on a component, -please note, that most of these components inherit from other basic -components, such as `Box`. This component in particular provides a lot -of styling options for all components, e.g. `color` and `opacity`, thus -it is used a lot in this framework. - -There are a few important semantics you need to know about: - -- `content` prop is a synonym to a `children` prop. - - `content` is better used when your element is a self-closing tag - (like ``), and when content is long and complex. This is - a native React prop (unlike `content`), and contains all elements you - defined between the opening and the closing tag of an element. - - You should never use both on a same element. - - You should never use `children` explicitly as a prop on an element. -- Inferno supports both camelcase (`onClick`) and lowercase (`onclick`) -event names. - - Camel case names are what's called "synthetic" events, and are the - *preferred way* of handling events in React, for efficiency and - performance reasons. Please read - [Inferno Event Handling](https://infernojs.org/docs/guides/event-handling) - to understand what this is about. - - Lower case names are native browser events and should be used sparingly, - for example when you need an explicit IE8 support. **DO NOT** use - lowercase event handlers unless you really know what you are doing. - - [Button](#button) component straight up does not support lowercase event - handlers. Use the camel case `onClick` instead. - -### `AnimatedNumber` - -This component provides animations for numeric values. - -Props: - -- `value: number` - Value to animate. -- `initial: number` - Initial value to use in animation when element -first appears. If you set initial to `0` for example, number will always -animate starting from `0`, and if omitted, it will not play an initial -animation. -- `format: value => value` - Output formatter. - - Example: `value => Math.round(value)`. -- `children: (formattedValue, rawValue) => any` - Pull the animated number to -animate more complex things deeper in the DOM tree. - - Example: `(_, value) => ` - -### `BlockQuote` - -Just a block quote, just like this example in markdown: - -> Here's an example of a block quote. - -Props: - -- See inherited props: [Box](#box) - -### `Box` - -The Box component serves as a wrapper component for most of the CSS utility -needs. It creates a new DOM element, a `
    ` by default that can be changed -with the `as` property. Let's say you want to use a `` instead: - -```jsx - - `), and when content is long and complex. This is + a native React prop (unlike `content`), and contains all elements you + defined between the opening and the closing tag of an element. + - You should never use both on a same element. + - You should never use `children` explicitly as a prop on an element. +- Inferno supports both camelcase (`onClick`) and lowercase (`onclick`) +event names. + - Camel case names are what's called "synthetic" events, and are the + *preferred way* of handling events in React, for efficiency and + performance reasons. Please read + [Inferno Event Handling](https://infernojs.org/docs/guides/event-handling) + to understand what this is about. + - Lower case names are native browser events and should be used sparingly, + for example when you need an explicit IE8 support. **DO NOT** use + lowercase event handlers unless you really know what you are doing. + - [Button](#button) component straight up does not support lowercase event + handlers. Use the camel case `onClick` instead. + +### `AnimatedNumber` + +This component provides animations for numeric values. + +Props: + +- `value: number` - Value to animate. +- `initial: number` - Initial value to use in animation when element +first appears. If you set initial to `0` for example, number will always +animate starting from `0`, and if omitted, it will not play an initial +animation. +- `format: value => value` - Output formatter. + - Example: `value => Math.round(value)`. +- `children: (formattedValue, rawValue) => any` - Pull the animated number to +animate more complex things deeper in the DOM tree. + - Example: `(_, value) => ` + +### `BlockQuote` + +Just a block quote, just like this example in markdown: + +> Here's an example of a block quote. + +Props: + +- See inherited props: [Box](#box) + +### `Box` + +The Box component serves as a wrapper component for most of the CSS utility +needs. It creates a new DOM element, a `
    ` by default that can be changed +with the `as` property. Let's say you want to use a `` instead: + +```jsx + +